Я работаю над 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, к которому принадлежит элемент?
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
.
Других решений пока нет …