Как нарисовать элемент нестандартной формы? - PullRequest
0 голосов
/ 19 октября 2018

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

Я использую элемент «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, и это не сработает для меня.

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

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

1 Ответ

0 голосов
/ 19 октября 2018

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