gpt4 book ai didi

c++ - 使用 Qt 在 C++ 中球从墙上反弹

转载 作者:行者123 更新时间:2023-11-30 03:41:50 24 4
gpt4 key购买 nike

我正在尝试创建一个简单的球动画,该球在屏幕上徘徊并在墙上反弹。由于我是 C++ 的新手,因此我在执行此任务时遇到了一些问题。我也在使用 Qt 库。球只是停留在同一个位置并来回移动一点,这很奇怪,因为我创建了一个与我的 graphicsView 大小相同的 SceneRect。

主窗口.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsScene>
#include <QtWidgets>


float movement_x = 2.5;
float movement_y = 2.0;

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

void MainWindow::showEvent(QShowEvent *event){


scene = new QGraphicsScene(this);

scene -> setSceneRect(ui->graphicsView->geometry().x(), ui->graphicsView->geometry().y(),
ui->graphicsView->geometry().width(), ui->graphicsView->geometry().height());
ui->graphicsView->setScene(scene);
QPen redpen(Qt::red);


QBrush brush(Qt::green);
//QBrush brush2(Qt::black);
QPen mypen(Qt::blue);
mypen.setWidth(7);


ellipse = scene->addEllipse(100.0,100.0,20.0,20.0,mypen,brush);
timer1 = startTimer(50);
timer2 = startTimer(600);

}

void MainWindow::timerEvent(QTimerEvent *event){
// check for radius
if(ellipse->pos().x() >= scene->sceneRect().right() || ellipse->pos().x() <= scene->sceneRect().left()){
movement_x = -movement_x;
}
if(ellipse->pos().y() >= scene->sceneRect().bottom() || ellipse->pos().y() <= scene->sceneRect().top()){
movement_y = -movement_y;
}
ellipse->moveBy(movement_x, movement_y);

}

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

主窗口.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QGraphicsScene>

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();


protected:
void showEvent(QShowEvent* event);
void timerEvent(QTimerEvent* event);
private:
Ui::MainWindow *ui;
QGraphicsScene *scene;
QGraphicsEllipseItem *ellipse;
};

#endif // MAINWINDOW_H

主要.cpp:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.resize(800,600);
w.show();

return a.exec();
}

最佳答案

pos 的初始值为(0,0)。因此,您的更新在两个值之间振荡。在 addEllipse 之后,您必须在场景矩形内设置一个初始位置。例如

ellipse->setPos(100,100);

关于c++ - 使用 Qt 在 C++ 中球从墙上反弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37119005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com