Рисование на QGraphicsScene из производного класса QGraphicsItem

Я работаю над RPG-игрой в Qt, используя Framework View Framework. Я создал класс «Player», который наследует QGraphicsItem. Теперь я пытаюсь создать анимацию «атаки», поэтому каждый раз, когда я нажимаю клавишу пробела, перед персонажем будет анимация. Я уже реализовал движущуюся анимацию, используя функцию «advance ()».

Таким образом, каждый раз, когда я нажимаю пробел, переменная is_attacking становится истинной. Каждые 85 миллисекунд программа проверяет, является ли «is_attacking» истиной, и если это так, анимация будет продвигаться (рисовать следующий кадр) и обновляться. Когда все кадры были использованы, is_attacking становится ложным.

Проблема в том, что я не могу использовать класс Player для рисования анимации. QGraphicsItem является независимым и имеет свою собственную систему координат. Я уже закончил систему атаки, но не могу нарисовать анимацию на сцене.

void Player::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){

painter->drawPixmap(QRect(0, 0, 32, 32), *pixmap, QRect(position.x(), position.y(), 32, 32));

if(its_attacking()){
switch(pos){
case NORTH: // draw animation frame to x, y - 32
break;
case SOUTH: // draw animation frame to x, y + 32
break;
case WEST: // draw animation frame to x - 32, y
break;
case EAST: // draw animation frame to x + 32, y

}}

}

Как я могу использовать «paint ()» из QGraphicsItem для рисования на QGraphicsScene, к которому принадлежит элемент?

0

Решение

paint() используется для того, чтобы раскрасить предмет в местные координаты. Для того, чтобы изменить позицию предмета, вам нужно setPos() функция, которая устанавливает позицию элемента в родительских координатах.

Анимация не должна обрабатываться в paint() функция (кроме случаев, когда вы хотите изменить позицию элемента), но в слоте, который вызывается при тайм-ауте:

// Slot called at 85 ms timer's timeout
void Player::timerTimeoutSlot()
{
if(its_attacking()){
switch(pos){
case NORTH: // draw animation frame to x, y - 32
setPos(QPointF(pos().x(), pos().y()-32);
break;
case SOUTH: // draw animation frame to x, y + 32
setPos(QPointF(pos().x(), pos().y()+32);
break;
case WEST: // draw animation frame to x - 32, y
setPos(QPointF(pos().x()-32, pos().y());
break;
case EAST: // draw animation frame to x + 32, y
setPos(QPointF(pos().x()+32, pos().y());
break;
}
}
}

Обратите внимание, что для включения сигналов / слотов вы должны наследовать от QGraphicsObject вместо QGraphicsItem.

0

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

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

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