-
详情
大一下学期学习了c++这门课程,同时得知了qt这个图形界面编程,所以自学了qt模拟实现了传统的rpg游戏口袋妖怪,由于是自学和图片等资源的缺少,所以代码实现并不完整,有一部分构想都还未实现(比如战斗界面,草丛遇怪,人物行走动画,碰撞检测,淡入和淡出等),总代码量在6000行+,下面看一下具体执行图片。
-
类图及流程图
类图:
流程图:
-
基本功能的实现原理
1 系统选题及功能简介
本游戏借鉴经典的rpg游戏口袋妖怪,搭配qt实现了开始游戏到注册再到地图人物移动及战斗界面的一系列操作,全部操作由键盘控制。
2 系统方案设计
本游戏共分为五个窗口,游戏全部操作由键盘控制
- 利用大量qt窗口类的成员函数和键盘事件实现窗口之间的交互。利用文件操作保存主角姓名等信息。
- 利用自定义信号和自定义槽在窗口之间传输变量,如设置名字时按下确认键子窗口向父窗口传输名字。
- 利用样式表setstylesheet对窗口以及文本框和显示框进行美化,同时实现无规则按钮。
- 重写绘图事件实现对窗口图片的绘制,重写键盘事件实现键盘操控游戏
- 创建角色类继承QPushButton类,用于创建主角以及npc等不规则人物。
- 窗口文字由QLabel类对象显示,所需文字用QMap容器存储。
2.1基本设计思路
- 类
Pokemon类,startconversation类,setname类,scene1类,battel类,Pokemon1类,Protagonist类
- 主要功能实现
窗口交互:整个系统的各个窗口,采用重写绘图事件paintEvent()来实现各个窗口图片的绘制,对于需要更新图片的窗口采用调用update()函数刷新painEvent函数,实现图片的对应变化。窗口的变化采用在父窗口创建子窗口的对象并设为私有成员,在需要更改窗口时调用hide()函数和show()函数,利用信号和槽或直接更改窗口,创建子窗口对象时将父窗口的this指针传参,在子窗口调用this->parentWidget()->show();函数返回父窗口。键盘控制则通过重写键盘事件keypressevent和keyreleaseevent,实现键盘控制窗口。
媒体音乐:使用了QMediaPlayer 类QAudioOutput类,将音频输出设备和QMediaPlayer相关联在调用这两个类中的成员函数,实现音频文件的播放和停止。
控件:代码中使用的较多的为QPushButton类和QLabel类,通过设置样式表setstylesheet()函数,设置不规则图形按键,以及文本框的颜色边框类型等,使用QFont类设置字体的样式。在代码中调用move函数实现控件的移动。
小动画:重写定时事件timeevent(),使用定时器实现小动画和人物的行走。
设置名字界面:利用四个QPushButton显示界面需要的界面所需要的文字,再利用几个QPushButton来显示各种按钮,利用变量和大量if-elseif判断配合键盘获取选中的文字及删除等功能。
开场对话:利用QLaBel显示所需要的文字,将所需要的语句存于QMap容器中,因为QMap里面的内容都是以对组的形式存在,所以可以又键盘事件获取特定按键的按下及释放,改变特定的变量再利用判断语句执行相应的功能。
人物移动:用键盘上下左右四个键控制人物的移动,人物初始显示在窗口的中间,人物移动就是人物在原地执行图片的变化,而地图根据按键的不同,执行地图的移动。在绘图事件中绘图的位置由两个变量控制,所以地图的移动只需对这两个变量的加减再调用update()函数即可实现上下左右移动,再通过对这两个变量的上下限的判断来控制地图的界限,同时利用这两个变量设置特定的变换图片的位置。再用一个变量来记录当前人物的朝向,在按下键盘时先判断当前人物的朝向与按下的方向键是否相同,若不相同则改变图片,若相同则利用定时器实现人物行走图片的播放(因为素材缺少和实现人物行走有点奇怪,所以实现了向下的行走动画)。
战斗画面:创建了精灵类和主角类来存放信息,因为素材的缺少以及时间的限制,只简单实现了固定宠物固定技能以及固定扣血的定点战斗画面,利用qpushbutton来实现宠物等画面的显示,再利用速度的判断计算出手顺序,利用变量及判断选择功能,对手则通过随机数生成选择战斗技能。
-
结语
由于代码量较大解释起来较复杂所以,这里就不具体解释了,完整代码在最上面的文档中,或点击下方链接访问我的gitee。需要具体解释的可以评论留言,后面我也会慢慢完善,再上传。
Pokemon/Pokemon · h3/Learning Journey - 码云 - 开源中国 (gitee.com)