Cqt游戏实战项目坦克大战前言
目录
C++(qt)游戏实战项目:坦克大战(前言)
坦克游戏,儿时的经典,同样是练手的经典小项目之一!
准备好开发环境
必须 | 备注1 | 备注2 |
---|---|---|
window或linux系统 | 推荐window | |
QT5.5以上 | 百度一下就知道 |
整体框架伪代码描述
游戏开始
游戏初始化
while(true){
从消息队列收集信号signal
swtich(signal){
case: 绘图信号
绘图信号处理函数
break;
case:键盘信号
键盘信号处理函数
break;
case:鼠标信号
鼠标信号处理函数
break;
case:时钟信号
时钟信号处理函数
break;
}
}
绘图信号处理函数(){
地图对象->display();
玩家坦克->display();
............
}
地图类::display(){
每个地图块对象->display();
}
键盘信号处理函数(){
if(按下M键)
游戏状态gamestatus设为地图编辑状态mapedit
//地图编辑状态
//author http://blog.csdn.net/qq_26046771/article/details/72636320
if(gamestatus==mapedit){
else if(按下S)
保存地图
else if(按下l)
载入地图 发送重绘信号
}
..................
if(gamestatus==gameing){
switch(key){
case:上
玩家坦克->setdir(UP);
break;
.....
...
case:j
玩家状态设置为攻击状态
break;
defalut:发送重绘信号
}
}
}
鼠标信号处理函数(){
if(gamestatus=mapedit)
{
.....
}
}
时钟信号处理函数(){
玩家坦克->move();//改变玩家对象的坐标 、碰撞检测等等
敌人坦克-move();
玩家炮弹->move();
敌人炮弹->move();//改变对象的坐标 、碰撞检测等等,如果碰撞到玩家要将玩家的血量减少,全局变量player.downlife();
if(玩家坦克处于攻击状态&&gamei%n==0)//gamei表示第几帧,通过调节n可以改变攻击速度
玩家->attack();
........
.....
}
attack(){
将一颗炮弹对象加入到炮弹链表
}
以上伪代码中主循环信号的收集和派发已经由Qt帮我们封装完成,我们需要完成的是各个信号处理函数和类的编写,类的结构层次如下
类 | 父类 | 备注 |
---|---|---|
Wanwu | 无 | 抽出坦克,炮弹,地图块等共性的类 |
Mapcell | Wanwu | 地图块类 |
Gamemap | 无 | 地图类,包含地图块指针的二维矩阵 |
Tank | Wanwu | 坦克 |
PlayTank | Tank | 玩家坦克 |
BadTank | Tank | 敌人坦克类 |
Boom | Wanwu | 爆炸类 |
Bullet | Wanwu | 子弹类 |
Wanwu类,先完成我们的万物类
//file:wanhu.h
#ifndef WANWU_H
#define WANWU_H
#include<QPoint>
#include<QRect>
#include<QPainter>
enum Dir { UP, DOWN, LEFT, RIGHT };
class Wanwu
{
protected:
// 计算势力范围
virtual void CalculateSphere() = 0;
// 位置
QPoint m_pos;
// 势力范围
QRect m_rectSphere;
// 颜色
//QColor m_color;
// 方向
Dir m_dir;
// 存在状态
bool m_bDisappear;
// 单次前进步长
int m_step;
//生命值
float life;
//护甲
float hujia;
//魔抗
float mokang;
//物理攻击
float wuli;
//法术攻击
float fashu;
public:
Wanwu(){};
// 绘图
virtual void Display(QPainter &paint) = 0;
// 移动
virtual void Move() = 0;
// 判断是否消失
bool IsDisappear(){return m_bDisappear;}
//判断两物体是否碰撞
bool IsBoom(const Wanwu &wanwu)const;
//
void SetDisappear(bool tmp){m_bDisappear=tmp;}
//
QPoint getpos(){return m_pos;}
};
#endif // WANWU_H
//file:wanwu.c
#include "wanwu.h"
bool Wanwu::IsBoom(const Wanwu &wanwu)const{
bool isok=true;
if(wanwu.m_rectSphere.left()>m_rectSphere.right()
||wanwu.m_rectSphere.right()<m_rectSphere.left()||wanwu.m_rectSphere.top()>m_rectSphere.bottom()||wanwu.m_rectSphere.bottom()<m_rectSphere.top())
isok=false;
return isok;
}
//可能以后地图块也可以移动和攻击,就这样吧
前言和第一章完成基本的类,第二章程序可以跑动起来,我们将看到地图界面
本文素材地址链接: 密码: fhet,
自己动手先试试,后面某章中将提供整个项目源代码。
下一章C++(qt)游戏实战项目:坦克大战(一)将完成地图块的类
本文章为作者原创
转载请标明本文地址: