Как нарисовать элемент нестандартной формы?

В настоящее время я работаю в приложении, которое по сути является игрой в понг. В игре есть два весла в настоящее время в прямоугольном формате, чтобы облегчить обнаружение столкновения с мячом (в настоящее время квадрат).

Я использую элемент «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);
}

Я пытаюсь нарисовать арку, такую ​​как paddle и hitbox, аналогично тому, что представлен в приведенном ниже коде:

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, и это не сработает для меня.

paddle.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

paddle.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;
}

mainGame.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

Возвратный :: paintEvent ()

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);
}

2

Решение

Из того, что я понимаю, вы не хотите загружать QImage из файла .png, но вы хотите нарисовать его, если вы можете использовать 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);
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]