0

Graphics View Framework を使用して、Qt で RPG ゲームに取り組んでいます。QGraphicsItem を継承するクラス「Player」を作成しました。今、私は「攻撃」アニメーションを作ろうとしているので、スペースキーを押すたびに、キャラクターの前にアニメーションが表示されます. 「advance()」関数を使用して、動くアニメーションを既に実装しています。

したがって、スペースを押すたびに、「is_attacking」変数が true になります。プログラムは 85 ミリ秒ごとに「is_attacking」が true かどうかをチェックし、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 に描画するにはどうすればよいですか?

4

1 に答える 1

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

于 2012-11-25T12:49:54.700 に答える