之前写的文章中,大多数属于贴代码的类型,经过一段时间后,自己对于代码的理解并没什么什么裨益,反而让自己觉得写代码就是贴代码,丧失很多兴趣,水平也得不到提高。在看过那么多大牛写的文章之后,也决心结合自己的长处开始写些比较好的文章。
闲话少说,此文章是之前C++ Qt Game Tutorial的续集,只是把标题换成更中文一些。
1. 新建一个widget工程,工程名字为tutorial6,删除生成的代码,只剩下tutorial6.pro 和 main.cpp
#-------------------------------------------------
#
# Project created by QtCreator 2017-01-23T11:32:10
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = tutorial6
TEMPLATE = app
SOURCES += main.cpp
HEADERS +=
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
return a.exec();
}
tutorial6.pro是工程文件,相当于makefile, QT += core gui 添加相关的模块,比如需要opengl编程可以 QT += opengl,一般常见的类都会在core gui widgets上。
TARGET TEMPLATE 在建立工程时已经自动生成,SOURCES HEADERS在增加源文件或者头文件时会自动生成相应的文件。
main.cpp是程序执行的入口,每个程序都会有,函数中第一句话,建立一个QApplication a的对象,使用argc, argv初始化。这个对象主要用于管理GUI程序的控制流和主要的设置。它包含一个事件住循环,来自系统的事件(比如鼠标点击,敲键盘)都会通过这个QApplication对象分发出去;它还包括程序的初始化,程序的清除回收,以及程序的管理,主要是处理系统或者程序级别的设置。这个类暂时不需要研究太深,a.exec(),使程序进入循环,防止退出。
2. 给游戏添加玩家
在前面的篇章中,玩家是继承QGraphicsRectItem类,用一个正方形实现。关于C++的多继承,理解起来有点费劲,Qt中的将父类的对象的指针传递给子类,是为了更好地管理子类的资源,子类销毁之后,父类自动回收资源。
#ifndef PLAYER_H
#define PLAYER_H
#include <QGraphicsRectItem>
#include <QObject>
#include <QGraphicsItem>
class Player : public QObject, public QGraphicsRectItem {
Q_OBJECT
public:
Player(QGraphicsItem *parent = 0);
void keyPressEvent(QKeyEvent *event);
public slots:
void spawn();
};
#endif // PLAYER_H
Player对象定义了一个公共方法keyPressEvent,这个方法的作用是可以通过键盘的←→键控制玩家的左右移动,通过空格键发射子弹。
void Player::keyPressEvent(QKeyEvent *event)
{
// move the player left and right
if (event->key() == Qt::Key_Left) {
if (pos().x() > 0)
setPos(x() - 10, y());
} else if (event->key() == Qt::Key_Right) {
if (pos().x() + 100 < 800)
setPos(x() + 10, y());
} else if (event->key() == Qt::Key_Space) {
// shoot with the spacebar
// create a bullet
Bullet *bullet = new Bullet();
bullet->setPos(x(), y());
scene()->addItem(bullet);
}
}
setPos是父类QGraphicsItem中的方法,表示玩家在窗口中的