Qt 游戏开发(06) - 为游戏增加健康值和得分

本文是Qt游戏教程系列的第六篇,主要介绍如何为游戏添加健康值和得分系统。首先新建Qt widget工程,删除默认代码,保留核心部分。接着,通过继承QGraphicsRectItem创建玩家角色,并利用setPos设定其位置。子弹的移动通过QTimer和slot机制实现,而敌人的生成则是随机的,并与玩家碰撞检测。当敌人到达底部,玩家健康值减少。最后,文章探讨了如何实现健康值和得分的增加,但未涉及游戏结束和升级功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  之前写的文章中,大多数属于贴代码的类型,经过一段时间后,自己对于代码的理解并没什么什么裨益,反而让自己觉得写代码就是贴代码,丧失很多兴趣,水平也得不到提高。在看过那么多大牛写的文章之后,也决心结合自己的长处开始写些比较好的文章。

  闲话少说,此文章是之前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中的方法,表示玩家在窗口中的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值