超抽象飞机大战——天翌版,Qt,Cpp实现

超抽象飞机大战——天翌版

一,场景设置

A. 在main函数中创建场景

//创建场景
    QGraphicsScene * scene =new QGraphicsScene;

创建一个QGraphicsScene类的对象

B.场景滚动效果的实现

// 创建两个背景图片
    QPixmap originalPixmap(":/images/rubbish/stone.png");
    QPixmap scaledPixmap = originalPixmap.scaled(GameSetting::SceneWidth, GameSetting::SceneHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
    QGraphicsPixmapItem *background1 = scene->addPixmap(scaledPixmap);
    QGraphicsPixmapItem *background2 = scene->addPixmap(scaledPixmap);
    background2->setY(-background2->pixmap().height());
  1. 创建两个背景图片,并将它们添加到场景中。
  2. 再将originalPixmap缩放到GameSetting::SceneWidthGameSetting::SceneHeight的大小。Qt::IgnoreAspectRatio参数表示在缩放时忽略原始图片的宽高比,Qt::SmoothTransformation参数表示使用平滑的缩放算法。
  3. background2->setY(-background2->pixmap().height());:将background2的y坐标设置为-background2->pixmap().height()。这意味着background2的顶部会被放置在场景的顶部之上,这样在开始时background2就不会被看到。这通常用于创建滚动背景的效果,当background1滚动到场景的底部时,background2就会滚动到场景的顶部,从而创建出无限滚动的背景的效果。
 // 创建定时器,每隔一段时间就移动背景图片
    QTimer *timer = new QTimer;
    QObject::connect(timer, &QTimer::timeout, [=]() {
   
   
        background1->setY(background1->y() + 1);
        background2->setY(background2->y() + 1);
        if (background1->y() >= 0) {
   
   
            background2->setY(background1->y() - background2->pixmap().height());
        }
        if (background2->y() >= 0) {
   
   
            background1->setY(background2->y() - background1->pixmap().height());
        }
    });
    timer->start(1000 / 60);  // 60 帧每秒
  1. 创建一个QTimer的对象
  2. 连接timer的timeout信号到一个匿名函数。这个匿名函数会在每次timer的timeout信号被触发时执行。
  3. 将background1和background2的y坐标向下移动1个单位。这会使得背景图片向下滚动。
  4. 检查background1和background2的y坐标是否已经到达或超过0。如果是,那么就将另一个背景图片的y坐标设置为当前背景图片的y坐标减去另一个背景图片的高度。这会使得另一个背景图片被放置在当前背景图片的上方,从而在当前背景图片滚动到底部时,另一个背景图片就会滚动到顶部,创建出无限滚动的背景的效果。
  5. 启动timer,并设置其超时时间为1000 / 60毫秒,也就是大约16.67毫秒。这意味着timer的timeout信号会每秒触发大约60次,也就是每秒更新60帧,从而创建出流畅的滚动效果。

C场景的大小设置

 scene->setSceneRect(0,0,GameSetting::SceneWidth,GameSetting::SceneHeight);//设置场景高度和宽度
 scene->setBackgroundBrush(QImage(":/images/rubbish/stone.png"));//背景源

定义场景的宽度和高度,这个游戏只有x轴和y轴,所以前两个参数就设置成0了

二,Player类的思路与实现

A.类的创建与继承

class Player :public QObject, public QGraphicsPixmapItem
{
   
   
    Q_OBJECT
public:
    Player(QGraphicsItem *parent = nullptr);

    // QGraphicsItem interface
protected:
    virtual void keyPressEvent(QKeyEvent *event) override;//press
    void keyReleaseEvent(QKeyEvent *event) override;//release

这里的Player之间继承QObject和QGraphicsPixmapItem。

B.按键的基本设置和按键连贯性的实现

如果只是单纯写按键后面加个功能的话,这样在游戏按键的时候就会有移动的适合卡帧,或者移动时按发子弹键会卡住的情况,为了解决这个问题,翌就使用了Qt的事件循环和信号槽机制。
在这里插入图片描述

1.按键连贯实现

创建QTimer对象
连接信号槽

keyRespondTimer = new QTimer(this);	//构造函数中创建定时器对象,并连接信号槽
    connect(keyRespondTimer, &QTimer::timeout, this, &Player::slotTimeOut);

设置按下按键的函数

void Player::keyPressEvent(QKeyEvent *event)
{
   
   
    if(!event->isAutoRepeat())  //判断如果不是长按时自动触发的按下,就将key值加入容器
        keys.append(event->key());
    if(!keyRespondTimer->isActive()) //如果定时器不在运行,就启动一下
        keyRespondTimer->start(4);
}

设置释放按键的函数

void Player::keyReleaseEvent(QKeyEvent *event){
   
   
    if(!event->isAutoRepeat())  //判断如果不是长按时自动触发的释放,就将key值从容器中删除
        keys.removeAll(event->key());
    if(keys.isEmpty()) //容器空了,关闭定时器
        keyRespondTimer
内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ricky_Theseus

感谢大家,祝您生活愉快

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值