《C++手搓像素RPG引擎》01:环境搭建与基础移动系统
⚠️阅读前必看本文所有代码、架构设计均为个人原创实现AI辅助部分均已人工审查重构演示素材使用CC0开源资源/原创占位图未包含任何任天堂官方资源文中“宝可梦风格”仅指代像素RPG品类不涉及具体IP还原与任天堂官方无任何关联因版权合规要求本文以文字代码为主避免展示可能引发争议的图片素材创作背景因本人十分喜欢宝可梦系列游戏从最初的红蓝到现在的朱紫主系列以及宝可梦传说两部以及对C游戏开发的强烈兴趣所以打算在windows下开发一款宝可梦风格的像素RPG游戏作为C学习项目基于开发简单易于理解的原则。开发选型开发语言已经选定然后ide当然是用windows上的宇宙第一ide-virual studio版本2022了下一步就是选用C适用的界面库了windows下原生界面如win32开发复杂写一个界面通常需要20行代码MFC适合小工具开发不适用类似的游戏开发然后搜寻各种第三方库如easyxduilibsfml等最终决定用sfml开发目前最适合我。为什么不用untityue这种游戏引擎这次开发游戏的目的一个是对游戏开发感兴趣另一个是想通过这次的开发了解相应的游戏编程底层知识所以直接跳过这些已经封装好的库了。sfml的编译运行既然决定了使用sfml那么第一步就是写个简单的demo使SFML可以跑起来。下载版本3.0.2下载好sdk并在ide中设置相应路径在main程序中引入相应头文件写一个标准的游戏循环并限制帧率为60window.setFramerateLimit(60);写下第一个函数当然是显示Hello World啦编译运行出错。。。。查询各种资料得知该版本sfml需要C17以上才能运行修改编译成功显示Hello World。⚠️ 从现在开发代码大多是通过AI辅助人工查看并修改的方法产生的。小圆点移动第一步成功了然后就要实现界面上物体如NPC可以通过上下左右键来移动了。先贴上代码这部分还是比较简单的就是判断当前按下的键是哪个方向键并执行相应方向的移动就可以了这里解释下dt的作用因为每台机器的性能不一样所以代码执行的速度也不一样dt的意思是当前帧距离上一帧所经过的时间在移动时乘以这个系数可以防止不同机器移动距离不一样的问题也可以防止瞬移现象。目前为止界面上就会有一个黄色的圆点你可以通过方向键让它在绿色画布上移动了。地图显示视角移动以及碰撞物检测地图编辑器Tiled是个现成的可以用于编辑绘画地图的工具导入要使用的纹理图然后就可以直接拉到界面上了后期还可以创建很多object层比如后面有障碍物拾取的物品等都可以添加在这里可以保存为xml程序中代码读取xml并解析代码都是AI的把需求跟他说会生成很好的代码比自己一个个写好多了最多自己改些细节这里就不贴代码了并在地图类的draw函数里画整个地图这里暂时使用的是最笨的办法循环因地图文件中有对应的csv字符串标志使用的哪个纹理的哪块可以按这个id找到相应的图片。地图画好了人物就可以在地图中随意走动了但现在地图中的障碍物如房屋等是可以随意穿墙而过的现在就要引入碰撞检测功能了这里使用的是最简单易用的AABB碰撞检测算法但是它的缺点也很明显它只能近似的判断障碍物的坐标如果障碍物边界本身是斜的它有可能误判因为它的本质是默认障碍物是一个矩形现在就能用到上面提到的object层了在tiled中当前地图上创建一个新的object层例如命名collisions在需要是障碍物的地方画上多边形注tiled多边形是支持的但是画好后会在周围多出一个大的矩形那个才是真实检测框可以为每个多边形框添加一个属性 如可以直接在tiled中加也可以直接打开xml直接编辑我习惯直接用xml简单可以复制粘贴修改读取地图的代码加上障碍物坐标现在就可以在游戏循环中每次在按下方向键后随时检测障碍物了关于AABB算法网上一搜一大把就不赘述了。视角移动就简单多了就是几个API的调用在创建窗口时初始化sf::View并在最后draw完毕后再调用就可以了上述代码的作用是把当前视角的中心指向人物的位置并设置视角。未完待续。。。以上内容基于开发过程中的真实问题与解决方案整理。受限于个人技术水平难免存在疏漏或更优解法欢迎在评论区指正交流