你见过这样的超级马里奥吗绘制砖块
来源:IT之家 发布时间:2021-11-19 20:32 作者:肖鸥 阅读量:19226
你见过这样的超级马里奥吗。
跑着跑着突然停下来个帅气掉头,踩扁板栗仔时直接变酷:
这,就是一位油管博主用 C++ 和 SFML 自己从头制作的红白机版超级马里奥。
C++ 不用介绍,SFML 想必有很多人也熟悉,就是一个用来简化写小游戏或者多媒体应用程序的 API,包括系统,窗口,图形,音频和网络五大模块。
除了常规的功能和操作,你可以加入任何自己喜欢的元素。
由于画面看起来实在太逼真,有人甚至提醒博主:小心版权狂魔任天堂来找你哦!
心动么。
你也可以自己做一个~
话不多说,来看教程。
手把手教你用 C++ 打造超级马里奥
一共分为 4 大块。
1,基本控制
设置游戏窗口大小为 256x240。
我们先自己绘制一个留胡子的小伙子 —— 马里奥。
通过函数将它载入程序。
Mario::Mario:x,ytexture.loadFromFile,sprite.setTexture,voidMario::drawsprite.setPosition,round),i_window.draw(sprite),
得到这样的界面:
然后处理地图,由于地图的宽度不同,将它存储为数组向量。
typedefstd::vectorlt,std::arraylt,Cel1,SCREEN_HEIGHT/CELL_SIZEgt,gt,Map,
sf::Texturemap_texture,map_texture.1oadFromFile,Mapmap(SCREEN_WIDTH/CELL_SIZE),Mariomario,for(unsignedshorta=θ,alt,map.size(),a++)for(unsignedshortb=map(a).size()—2,blt,map(a).size(),b++)map(a)(b)=Cell::Wa1l,
现在画面是这样的:
接着开始集中打造马里奥。
先让他能动起来,前进后退:
并且获得重力:
voidMario::updateif(1sf::Keyboard::isKeyPressed(sf::Keyboard::Left))x—=MARIO_SPEED,elseif(1sf::Keyboard::isKeyPressed(sf::Keyboard::Right))x+=MARIO_SPEED,vertical_speed+=GRAVITY,y+=vertical_speed,
有了,但得让马里奥落到地上。
那就获取一下马里奥的坐标,用下面这些公式检查与之相交的所有单元格:
成功:
但是不能让马里奥跑出地图:
voidMario::updateif(1sf::Keyboard::isKeyPressed(sf::Keyboard::Left))x=std::maxlt,floatgt,(x—MARIO_SPEED,θ),elseif(1sf::Keyboard::isKeyPressed(sf::Keyboard::Right))x=std::minlt,floatgt,(MARIO_SPEED+x,CELL_SIZE*(i_map.size()—1)),
接下来添加碰撞。
用二进制表示马里奥碰到的单元格,用一个地图碰撞函数检查并返回 0000—1111 这 15 种可能,然后使用位运算检查方向。
成功:
接下来,看看它能不能跳过这个墙。
显然不行。
搞起来,其中,为了使马里奥的跳跃高度和我们按住键盘的时长为正比,需要创建一个跳跃计时器变量。
if)if(θvertical_speedamp,amp,θlt,map_collision(x,1+y,Cell::Wa1l,i_map))vertical_speed=MARIO_JUMP_SPEED,jump_timer=MARIO_JUMP_TIMER,elseif(θlt,jump_timer)vertical_speed=MARIO_JUMP_SPEED,jump_timer——,elsevertical_speed=std::minlt,floatgt,(GRAVITY+vertical_speed,MAX_VERTICAL_SPEED),
再来挑战一下:
完美。
最后,给它添加加速度和摩擦力,也就是我们在文章一开头看到的那种刹车特效。
if)horizontal_speed=std::max(horizontal_speed—MARIO_ACCELERATION,—MARIO_WALK_SPEED),elseif(1sf::Keyboard::isKeyPressed(sf::Keyboard::Right))horizontal_speed=std::min(MARIO_ACCELERATION+horizontal_speed,MARIO_WALK_SPEED),elseif(θlt,horizontal_speed)horizontal_speed—=MARIO_ACCELERATION,elseif(θgt,horizontal_speed)horizontal_speed+=MARIO_ACCELERATION,
至此,基本控制就完成了,进入地图绘制部分。
2,地图
使用一个新函数将图像转为 map。
Mapconvert_sketch
修改 drawback 函数获得砖块像素颜色,绘制砖块再画点云朵,基础地图就好了
接下来就是挨个绘制剩余元素了。
ifpixel)//Flagpolesprite_x=12,ifpixel_up)sprite_y=1
成果如下:
接下来,使用下面这个公式,让界面跟着马里奥前进后退。
shortview_x=std::clamplt,intgt,+0.5f*(CELL_SIZE—SCREEN_WIDTH),θ,CELL_SIZE*n)
地图搞定,上板栗仔!
3,板栗仔
板栗仔的行动和马里奥相似,代码可以基本复制不同的是一旦它们碰到东西就会改变方向
如何让板栗仔出现。
当马里奥靠近它们时,更新地图。
voidGoomba::drawif(—CELL_SIZElt,roundamp,amp,round(x)gt,static_castlt,intgt,(i_view_x)—CELL_SIZEamp,amp,round(x)sprite.setTexture,sprite.setPosition,round),i_window.draw(sprite),
然后在这部分加上板栗仔和马里奥的的死亡函数,包括两个条件,一是当马里奥跳到板栗仔头上,板栗仔挂,二是当马里奥碰到板栗仔后,马里奥挂。
ifvertical_speed=std::min(GRAVITY+vertical_speed,MAX_VERTICAL_SPEED),y+=vertical_speed,elseif(1death_timer)vertical_speed=MARIO_JUMP_SPEED,death_timer=std::max(0,death_timer—1),
经历过 n 个 bug 后,终于没问题。
到了最后一部分了。
4,优化
这部分主要就是做做代码优化,根据自己喜好改变一些原作风格什么的。
比如重新绘制一个马里奥,并分成三种状态:暂停,行走,跳跃以及 die。
还有玩家突然切换前进方向时的俏皮动作:
写一个切换状态函数进行控制。
voidAnimation::updateanimation_iterator++,while(animation_iteratorgt,=animation_speed)animation_iterator—=animation_speed,current_frame=(1+current_frame)%total_frames,
终于,全部搞定!!
怎么样还挺成功吧
过程其实也不乏挑战,有网友就表示:我以为很简单,直到我看到了代码。
下面就来认识一下。
这位博主叫 Kofybrek,今年 6 月刚刚成为一名 YouTuber,目前已有 1000 粉丝。
他用 C++ 做了很多小游戏:包括扫雷,俄罗斯方块,吃豆人等等。
也搞机器学习,比如教 AI 玩 Flappy Bird。
从他的座右铭I do programming for fun,可以看出小哥是很喜欢用编程做一些好玩的东西了,可以期待他更多的作品。
最后,如果你想试试亲手打造这样一个马里奥,可以戳下面的链接。
代码:
。郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。
站点精选
全球芯片荒正在对智能手机产业造成严重影响,不仅出货量持续放缓,元器件的价格飙涨现象也让手机厂商的千元机型发布节奏被打乱。 今年手机核心器件的价格均处于上升...
- 以众享新声为主题的科大讯飞飞鱼音效产品发布会在广州太古仓隆重2021-11-19
- 强化跨周期调节统筹今明两年政策衔接的信号频频释放2021-11-19
- 17万余条金点子为湖南发展建言献策2021-11-19
- 扇贝丁颇受欢迎割扇贝丁成为扇贝收获过程一道关键环节2021-11-19
- 爱奇艺投资海米传媒,后者致力于为广告主提升视频投放效果2021-11-19