Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从QGraphicsItem派生类在QGraphicscene上绘图_C++_Qt_Qgraphicsview_Qgraphicsscene - Fatal编程技术网

C++ 从QGraphicsItem派生类在QGraphicscene上绘图

C++ 从QGraphicsItem派生类在QGraphicscene上绘图,c++,qt,qgraphicsview,qgraphicsscene,C++,Qt,Qgraphicsview,Qgraphicsscene,我正在用Qt开发一个RPG游戏,使用图形视图框架。我创建了一个类“Player”,它继承了QGraphicsItem。现在,我正在尝试制作一个“攻击”动画,所以每次我按下空格键时,角色前面都会有一个动画。我已经使用“advance()”函数实现了移动动画 所以,每次我按下空格键,“is_attacking”变量都变为真。每85毫秒,程序检查“is_attacking”是否为真,如果为真,动画将前进(绘制下一帧)并更新。当所有帧都被使用时,“正在攻击”变为假 问题是我不能使用“Player”类来绘

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

所以,每次我按下空格键,“is_attacking”变量都变为真。每85毫秒,程序检查“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

     }


   } 

}
如何使用QGraphicsSitem中的“paint()”绘制到项目所属的QGraphicscene上?

用于在局部坐标中绘制项目。更改项目位置所需的功能是设置项目在父坐标中的位置

动画不应在
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;
     }
   }
}

请注意,为了启用信号/插槽,您应该从中继承,而不是。

谢谢您的帮助,但是如何从插槽中绘制动画帧?您将使用paint()来绘制动画,并从插槽中更改项目的位置,但动画只是一个精灵表,一个QPixmap。我怎样才能移动pixmap?pixmap是表,所以我只画了一部分。玩家是否在移动?不,我的意思是玩家有一个移动的动画,但它不会干扰攻击动画。