Qt编写小游戏

使用Qtcreator编写代码实现做一个类似飞机躲避障碍物的小游戏,使用WASD键进行移动飞行,在允许范围内可以安全飞行,但当碰触到边缘时飞机坠毁,游戏重新开始.具体解释步骤以注释为主

具体代码如下:

dialog.h:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QMessageBox>
#include <QKeyEvent>
#include <QPainter>
#include <QPixmap>
#include <QDebug>
namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    int j;//保存窗口的宽度,全局变量
    int k;//保存窗口的高度,全局变量
private:
    Ui::Dialog *ui;

protected:
    void keyPressEvent(QKeyEvent * event);//键盘按钮触发的槽函数
    void paintEvent(QPaintEvent * event);//布置背景的槽函数
};

#endif // DIALOG_H

dialog.cpp:

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    resize(800,450);//调整窗口界面的大小
    j=this->width();//实时获取窗口界面宽度
    k=this->height();//实时获取窗口界面高度
    ui->fly_label->move(j/2,2*k/3);//移动飞机到窗口的特定坐标位置
    QPixmap pic(":/new/prefix1/normal.png");//飞机图标对象
    QSize picSize(ui->fly_label->width(),ui->fly_label->height());//规定飞机目标的大小
    pic = pic.scaled(picSize,Qt::KeepAspectRatioByExpanding);//飞机图标伸展模式
    ui->fly_label->setPixmap(pic);//设置设定好后的飞机图标
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::keyPressEvent(QKeyEvent *event)
{
    int code = event->key();//获取按键对象
    if(code == Qt::Key_A)
    {
        int x=ui->fly_label->x();//获取飞机此刻横坐标
        int y=ui->fly_label->y();//获取飞机此刻纵坐标
        //将图标替换为左移的图标
        QPixmap pic(":/new/prefix1/left.png");
        QSize picSize(ui->fly_label->width(),ui->fly_label->height());
        pic = pic.scaled(picSize,Qt::KeepAspectRatioByExpanding);
        ui->fly_label->setPixmap(pic);
        ui->fly_label->move(x-10,y);//在原先坐标上进行移动,左移10像素
    }else if(code == Qt::Key_D)
    {
        int x=ui->fly_label->x();
        int y=ui->fly_label->y();
        QPixmap pic(":/new/prefix1/right.png");
        QSize picSize(ui->fly_label->width(),ui->fly_label->height());
        pic = pic.scaled(picSize,Qt::KeepAspectRatioByExpanding);
        ui->fly_label->setPixmap(pic);
        ui->fly_label->move(x+10,y);
    }
    else if(code == Qt::Key_W)
    {
        int x=ui->fly_label->x();
        int y=ui->fly_label->y();
        QPixmap pic(":/new/prefix1/normal.png");
        QSize picSize(ui->fly_label->width(),ui->fly_label->height());
        pic = pic.scaled(picSize,Qt::KeepAspectRatioByExpanding);
        ui->fly_label->setPixmap(pic);
        ui->fly_label->move(x,y-10);
    }
    else if(code == Qt::Key_S)
    {
        int x=ui->fly_label->x();
        int y=ui->fly_label->y();
        QPixmap pic(":/new/prefix1/down.png");
        QSize picSize(ui->fly_label->width(),ui->fly_label->height());
        pic = pic.scaled(picSize,Qt::KeepAspectRatioByExpanding);
        ui->fly_label->setPixmap(pic);
        ui->fly_label->move(x,y+10);
    }
    //设定飞机坠毁条件,即飞机的参考点超出规定允许坐标范围
    if(ui->fly_label->x()<=0||ui->fly_label->y()<=0||ui->fly_label->x()>=this->width()-60||ui->fly_label->y()>=this->height()-60)
    {
        //弹窗界面
        QMessageBox::information(this,"对局结束","请重新开始游戏");
        //获取此刻窗口大小
        j=this->width();
        k=this->height();
        //重新将飞机恢复到起始图标
        QPixmap pic(":/new/prefix1/normal.png");
        ui->fly_label->setPixmap(pic);
        //游戏重新开始始终让飞机位于窗口的特定比例位置
        ui->fly_label->move(j/2,2*k/3);
    }
}
//设定窗口背景界面
void Dialog::paintEvent(QPaintEvent *event)
{
    QPainter painter(this); // 创建画家类对象
    QPixmap pic(":/new/prefix1/beijing(1).png");
    painter.drawPixmap(0,0,width(),height(),pic);
}

程序运行界面如下:

开局界面:

按下A键效果:

按下D键效果:

按下W效果:

按下S效果:

当飞机触碰到界面边缘:

将窗口拉伸后,重新开始游戏飞机还是会到设定比例位置:

  • 2
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值