Возникли проблемы с перемещением Snake в Qt - PullRequest
1 голос
/ 19 апреля 2019

Я делаю свою самую первую игру со змеями с создателем Qt, и я долго застрял в одной проблеме. Я использую QGraphicsPixmapItem в QGraphicsScene.

Голова змеи должна отличаться от других тел. Теперь мне нужно удалить все элементы со сцены, чтобы нарисовать новую позицию змеи, чтобы она заработала, но я думаю, что это неправильный способ кодирования.

Как, я полагаю, обновлять змею без необходимости все время удалять QGraphicsPixmapItems?

заголовок

struct Point{
    int x;
    int y;
};

std::vector<Point> snakecore_;

QGraphicsPixmapItem* head_ = nullptr;
QGraphicsPixmapItem* core_ = nullptr;

касты

delete head_

for(unsigned int i = 0; i < snakecore_.size(); ++i){
        if(i == 0){
            head_ = scene_.addPixmap(red_);
            head_->setPos(snakecore_[i].x, snakecore_[i].y);
        }
        //Add rest of the snake
}

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Переместить змею довольно просто: переместите голову в нужном направлении.Затем переместите каждую часть в положение предыдущей части.

Используйте QGraphicsGroupItem для создания вашей змеи, будет проще обрабатывать детали.

Например:

class Snake: public QGraphicsItemGroup
{
public:
    enum Direction
    {
        Left,
        Right
    };

    Snake(QGraphicsItem* parent=nullptr): QGraphicsItemGroup(parent), partCount(10)
    {
        int const partCount = 10;
        for( int i = 0; i != partCount; ++i)
        {
            QGraphicsRectItem* part = new QGraphicsRectItem(QRectF(0, 0, 10, 10), this);
            part->setPos((partCount - i) * 10, 0); // Create a snake from left to right
            parts << part;
        }
    }

    void move(Direction direction)
    {
        QPointF const offset = getOffset(direction);
        QPointF previousPartPosition = parts.first()->pos();
        parts.first()->setPos(parts.first()->pos() + offset);
        for( int i = 1; i != partCount; ++i)
        {
            QGraphicsRectItem* part = parts.at(i);
            QPointF const partPosition = part->pos();
            part->setPos(previousPartPosition);
            previousPartPosition = partPosition;
        }
    }

    QPointF getOffset(Direction direction)
    {
        switch (direction) {
        case Right:
            return QPointF(10, 0);
        case Left:
            return QPointF(-10, 0);
        }
    }
private:
    QList<QGraphicsRectItem*> parts;
    int partCount;
};
0 голосов
/ 19 апреля 2019

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

Сначала создайте элементы головы и тела (что вы уже должны были сделать), а затем вам не нужны ни «удалить голову», ниaddPixmap.Просто установите позиции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...