如何绘制自定义形状的元素?
How to draw a custom shaped element?
我目前正在开发一个本质上是乒乓球游戏的应用程序。该游戏具有两个目前为矩形格式的球拍,以简化对球的碰撞检测(目前为正方形(。
我使用"QRect"元素作为桨,因为它提供了".intersect"方法,可以轻松检查冲突。 我对矩形桨的实现如下:
Paddle::Paddle(int initial_x, int initial_y) {
QImage image.load(":images/paddle.png");
QRect rect = image.rect();
resetState(initial_x, initial_y);
}
我正在尝试绘制一个像桨和命中框这样的拱门,类似于下面的代码提供的内容:
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;
QPainter painter(this);
painter.drawChord(rectangle, startAngle, spanAngle);
上面代码的唯一问题是它只能在paintEvent函数中工作,这对我不起作用。
桨.h
#ifndef PADDLE_H
#pragma once
#include <QImage>
#include <QRect>
class Paddle {
public:
Paddle(int, int);
~Paddle();
public:
void resetState(int, int);
void move();
void setDx(int);
void setDy(int);
QRect getRect();
QImage & getImage();
private:
QImage image;
QRect rect;
int dx;
int dy;
static const int INITIAL_X1 = 70;
static const int INITIAL_Y1 = 350;
};
#define PADDLE_H
#endif // PADDLE_H
划桨.cpp
#include <iostream>
#include "paddle.h"
Paddle::Paddle(int initial_x, int initial_y) {
dy = 0;
image.load(":images/paddle.png");
rect = image.rect();
resetState(initial_x, initial_y);
}
Paddle::~Paddle() {
std::cout << ("Paddle deleted") << std::endl;
}
void Paddle::setDy(int y) {
dy = y;
}
void Paddle::move() {
int x = rect.x();
int y = rect.top() + dy;
rect.moveTo(x, y);
}
void Paddle::resetState(int initial_x, int initial_y) {
rect.moveTo(initial_x, initial_y);
}
QRect Paddle::getRect() {
return rect;
}
QImage & Paddle::getImage() {
return image;
}
主游戏.h
#ifndef BREAKOUT_H
#pragma once
#include <QWidget>
#include <QKeyEvent>
#include <QFrame>
#include "ball.h"
#include "brick.h"
#include "paddle.h"
class Breakout : public QFrame {
Q_OBJECT
public:
Breakout(QWidget *parent = 0);
~Breakout();
signals:
void leftScoreChanged(int leftScore);
void rightScoreChanged(int rightScore);
void ballLost(int ballsLeft);
protected:
void paintEvent(QPaintEvent *);
void timerEvent(QTimerEvent *);
void keyPressEvent(QKeyEvent *);
void keyReleaseEvent(QKeyEvent *);
void drawObjects(QPainter *);
void finishGame(QPainter *, QString);
void moveObjects();
void startGame();
void pauseGame();
void stopGame();
void victory();
void validateScoreChange(int);
void checkCollision();
private:
int x;
int timerId;
int ballsLeft;
int leftScore;
int rightScore;
static const int N_OF_BRICKS = 30;
static const int DELAY = 5;
static const int TOP_EDGE = 0;
static const int LEFT_EDGE = 0;
static const int BOTTOM_EDGE = 700;
static const int RIGHT_EDGE = 1200;
Ball *ball;
Paddle *leftPaddle;
Paddle *rightPaddle;
Brick *bricks[N_OF_BRICKS];
bool gameOver;
bool gameWon;
bool gameStarted;
bool paused;
};
#define BREAKOUT_H
#endif // BREAKOUT_H
突破::p aintEvent((
void Breakout::paintEvent(QPaintEvent *e) {
Q_UNUSED(e);
QPainter painter(this);
if (gameOver) {
finishGame(&painter, "Game lost");
} else if(gameWon) {
finishGame(&painter, "Victory");
}
else {
drawObjects(&painter);
}
QWidget::paintEvent(e);
}
据我了解,您不想从.png文件中加载QImage
,而是想绘制它,如果是这样,您可以使用QPainter
来创建图像,如下所示:
Paddle::Paddle(int initial_x, int initial_y) {
// draw image
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;
image = QImage(QSize(100, 100), QImage::Format_ARGB32);
image.fill(Qt::transparent);
QPainter painter(&image);
painter.drawChord(rectangle, startAngle, spanAngle);
painter.end();
dy = 0;
rect = image.rect();
resetState(initial_x, initial_y);
}
相关文章:
- 如何绘制自定义形状的元素?
- 从自定义类获取对象向量中的 max 元素
- gtest 期望无序元素与自定义比较器/匹配器一起使用
- 从自定义数据类型向量中删除重复元素
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- C++ - 按自定义数据类型向量的值删除元素
- 对自定义元素向量进行排序时出现意外(至少对我来说)行为
- 使用自定义比较器C++映射,不插入所有元素
- 通过Overloading Operator []访问自定义数组包装器中的元素
- 尝试自定义一个函数来对不同种类元素的向量进行排序
- 使用 C++ 中的自定义元素进行 Const 结构初始化
- 定义将函数调用到传递的元素的自定义迭代器
- 如何使用完全自定义的GUI元素来自定义操作系统设计
- 通过与不同类型的值进行自定义比较来查找 std::set 的元素
- 设置要与无序集合一起使用的自定义类 - 在集合中找不到元素
- 自定义容器在保留空间时不必要地创建新元素实例
- 如何在 c++ 中从文件创建自定义 QML 元素
- 如何比较/排序包含自定义 typedef 的列表容器的元素
- 具有元素自定义构造函数的对象数组/向量
- 当矢量至少有1个元素时,自定义对象的std::find_if返回错误的迭代器