繁体   English   中英

从QGraphicsItem派生类使用QGraphicsScene

[英]Drawing on QGraphicsScene from a QGraphicsItem derived class

我正在使用Graphics View Framework在Qt中开发RPG游戏。 我创建了一个类“ Player”,该类继承了QGraphicsItem。 现在,我试图制作一个“攻击”动画,所以每次我按空格键时,角色前面都会有一个动画。 我已经使用“ advance()”函数实现了移动动画。

因此,每次我按空格键时,“ is_attacking”变量都会变为true。 每隔85毫秒,程序将检查“ is_attacking”是否为true,如果是,则动画将前进(绘制下一帧)并进行更新。 使用完所有帧后,“ is_attacking”将变为false。

问题是我不能使用“ 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

     }


   } 

}

我如何使用QGraphicsItem中的“ paint()”来绘制该项目所属的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM