C++ 如何绘制自定义形状的元素?
我目前在一个应用程序中工作,它本质上是一个乒乓球游戏。游戏的特点是两个目前呈矩形的桨,以便于对球(目前为方形)进行碰撞检测 我使用了一个“QRect”元素作为拨片,因为它提供了“.intersect”方法,使得检查碰撞更加容易。 我对矩形挡板的实现如下所示:C++ 如何绘制自定义形状的元素?,c++,qt,qt5,qrect,C++,Qt,Qt5,Qrect,我目前在一个应用程序中工作,它本质上是一个乒乓球游戏。游戏的特点是两个目前呈矩形的桨,以便于对球(目前为方形)进行碰撞检测 我使用了一个“QRect”元素作为拨片,因为它提供了“.intersect”方法,使得检查碰撞更加容易。 我对矩形挡板的实现如下所示: Paddle::Paddle(int initial_x, int initial_y) { QImage image.load(":images/paddle.png"); QRect rect = image.rect();
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函数中工作,这对我来说不起作用
划桨
#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
据我所知,您不想从.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);
}
你能解释一下为什么你说:这对我不起作用吗?我对类桨的实现只是初始化了要在扩展QFrame的主游戏类中绘制的元素。我想不出通过paintEvent函数将其引入主游戏的方法。您可以展示pailer的实现,以便更好地理解您,并提供可能的解决方案。只需编辑添加整个代码的帖子。谢谢你谈论QFrame,QFrame在哪里?你想让一个法师用画笔画桨吗?就是这样!非常感谢@大多数情况下,您必须在paile.cpp中包含QPainter:
#包含
…:-)我的错!哈哈哈!谢谢
#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
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);
}
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);
}