使用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效果:
当飞机触碰到界面边缘:文章来源:https://www.toymoban.com/news/detail-505513.html
将窗口拉伸后,重新开始游戏飞机还是会到设定比例位置:文章来源地址https://www.toymoban.com/news/detail-505513.html
到了这里,关于Qt编写小游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!