要求:按空格键,玩家发射子弹,子弹(长条形)从玩家(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";
}
}
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved