0

大学の課題でスペース インベーダー ゲームを作成しています。私は紙の上でパーツを分解しています。開始するのに適した場所は、スプライトを画面上で移動させることだと思いました。私が現時点で抱えている問題はこれです.スプライトが画面の右側にあるとき、それはただ動き続けるので、私はこのコードを追加しました:

    if (invadersSprite.getPosition().x > 650)           
    {
        std::cout << "WIDTH_END" << std::endl;
    }

私は基本的にこれを将来の参考のためにデバッグに使用しました。出力がコンソールにポップアップ表示されたので、何かに取り組んでいることがわかりました。そこで、出力から実際にスプライトを画面の左側に戻す作業に移りました。私は今、予想以上の問題を抱えています。

コードを読みやすくするために、上、左、右、下の int をいくつか宣言しました。

int spriteWalkSpeed = 50;
int up=-spriteWalkSpeed, down=spriteWalkSpeed, left=-spriteWalkSpeed, right=spriteWalkSpeed;

SFML の移動コマンドと setPosition を使用してみましたが、思ったほど機能しませんでした。

動く:

私がこれで抱えていた問題は、基本的に画面の真ん中で止まることです。脚の動きなどはアニメートされますが、左右には動きません。

    if (invadersSprite.getPosition().x > 650)           
    {
        invadersSprite.move(left, 00);
    }

セット位置:

これは私が求めているものに少し近いですが、まだ葉巻はありません. 動きは約 1 秒間停止し、画面の左側にポップアップ表示されます。必要なのは、画面を下に移動することです。

    if (invadersSprite.getPosition().x > 650)           
    {
        invadersSprite.setPosition(left, 00);
    }

私はSFMLを長い間使用していないので、これには少し困惑しています。

編集

現在、スプライトは必要に応じて画面の右側に移動しています。

if(spriteTimer>delay)
            {
                invadersSprite.setTextureRect(area);
                ++count;
                invadersSprite.move(right,0);
                if(count==SPRITECOLS) //WE HAVE MOVED OFF THE RIGHT OF THE IMAGE
                {
                    area.left=0;            //reset texture rect at left

                    count=0;                //reset count
                }
                else
                {
                    area.left+=spaceWidth; //move texture rect right

                }


                spriteTimer=0; //we have made one move in the sprite tile - start timing for the next move
            }
4

1 に答える 1

0

x座標が650より大きい場合、現在のロジックはスプライトを1回だけ左に移動しますが、それはまさにあなたが望むものではありません. あなたが望むのは、スプライトが端に到達した後、左に移動し続けることです。

これを行うには、スプライトの現在の速度を追跡する必要があります。たとえば、スプライトが開始すると、右に移動します。

xVelocity = right;

次に、方向を切り替える2つの条件を設定できます(画面の端にぶつかったとき):

if (invaderSprite.getPosition().x >= screenWidth) {
    // hit the right side of screen
    xVelocity = left;
} else if (invaderSprite.getPosition().x <= 0) {
    // hit the left side of screen
    xVelocity = right;
}

これで、ゲーム ティックごとに、現在の速度に従ってスプライトを移動するだけです。

invaderSprite.move(xVelocity, yVelocity);

スプライトの幅を考慮したり、y 速度を変更したりするなど、他にも修正が必要なことがいくつかありますが、これが主なアイデアです。

于 2013-03-05T15:21:19.703 に答える