龙空技术网

Qt的图形视图框架编一个简单的射击游戏

荆楚奇侠 272

前言:

目前兄弟们对“qt游戏开发”都比较着重,朋友们都需要分析一些“qt游戏开发”的相关文章。那么小编在网上网罗了一些对于“qt游戏开发””的相关内容,希望看官们能喜欢,兄弟们一起来学习一下吧!

要求:按空格键,玩家发射子弹,子弹(长条形)从玩家(player,底边上的大正方形)所在位置自行向上运动。而敌人(小正方形)在视图窗体顶部的随机位置出现,并且自动向下运动。如果子弹和敌人两个对象发生碰撞那么,子弹和敌人一块报销(delete);如果没遇到敌人,子弹离开视图窗体边界时被delete以节省内存。

用图形视图矿建编写的简单射击游戏

编程要点:

1. 一个类要用到connect函数,那么这个类就需要做到三点:

(1)类的头文件需要#include <QObject>

(2)除了继承QGraphicsRectItem类,还必须继承QObject类

(3)类的定义中,必须用到Q_OBJECT宏

2. 子弹图项自动运动,通过定时器QTimer,connect槽函数move()实现。敌人图项也是如此。

3. 设置图项(玩家)的焦点特性,然后才可以接受键盘事件、鼠标事件。按空格键发射子弹,创建子弹图项后,用scene()方法返回场景的指针,从而将子弹添加到场景中去, scene( )->addItem(item).

4. 键盘事件程序的重写,用光标键控制玩家的左右移动,用空格键发射子弹。

5. 为防止因为子弹和敌人运动导致场景不断扩大,进而导致视图窗体的滚动条不断滚动,采取的办法是设置视图窗体为固定大小。

6. 子弹和敌人如果发生碰撞,场景首先remove它们,然后再delete它们。

7. 图项(子弹、敌人)离开视图窗体后,delete这些对象,以节省内存空间。

这里给出子弹类的代码:

-----------------bullet.h------------------

#ifndef BULLET_H

#define BULLET_H

#include <QGraphicsRectItem>

#include <QObject>

class Bullet: public QObject,public QGraphicsRectItem

{

Q_OBJECT //因为bullet要用到connect()函数,要使用这个宏,同时类要继承QObject类

public:

Bullet();

public slots:

void move(); //槽函数

};

#endif // BULLET_H

-----------------bullet.cpp------------------

#include "bullet.h"

#include "Enemy.h"

#include <QGraphicsRectItem>

#include <QTimer>

#include <QGraphicsItem>

#include <QObject>

#include <QGraphicsScene>

#include <QDebug>

#include <QList>

Bullet::Bullet()

{

setRect(0,0,10,50); //设置子弹的大小

QTimer *timer = new QTimer();

connect(timer,SIGNAL(timeout()),this,SLOT(move()));

timer->start(20); //每隔20ms, 定时器就会触发,发出信号,调用子弹运动的槽函数。

}

void Bullet::move() {

//获取所有与子弹碰撞的对象的指针,并存储在一个QList对象中

QList <QGraphicsItem*> colliding_items = collidingItems();

for(int i=0,n=colliding_items.size();i<n;i++)

{

/*if bullet collides with enemy,destroy them both

判断这个对象的类型,是否Enemy */

if(typeid(*(colliding_items[i]))==typeid(Enemy))

{

//remove them both

scene()->removeItem(colliding_items[i]);

scene()->removeItem(this);

//delete them all

delete colliding_items[i]; //delete Enemy

delete this; //delete bullet

return;

}

}

//如果没有发生碰撞,y坐标减少10,即子弹向上运动10个像素距离

setPos(x(),y()-10);

/*如果子弹没发生碰撞,且离开视图窗体范围,场景就删除子弹图项,并delete子弹对象。

因为这里场景、视图的左上角都设为(0,0),视图的顶端即子弹运动的边界,其y坐标为0,

小于0说明子弹已经出界了。

*/

if(this->pos().y()+this->rect().height()<0)

{

scene()->removeItem(this); //场景删除子弹对象

delete this; //销毁对象,释放对象所占用的内存空间。

qDebug()<<"bullet deleted";

}

}

标签: #qt游戏开发