1

現在、戦車から発射物を発射しています。現時点では問題なく動作しますが、発射物がターゲットに命中したり、画面から消えたりすると、発射物を「再利用」することができません。これは私が現在使用しているコードです。

//Laser Shape
sf::Texture LaserTexture;
LaserTexture.loadFromFile("images/laser.png");
std::vector<sf::Sprite>Laser(1000, sf::Sprite(LaserTexture));

これは、キーボードが押されたときの if ステートメントです。

if (Event.key.code == sf::Keyboard::Space)
                    {
                        if (laserCount==1000)
                        {
                            laserCount=0;
                        }
                        /*if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
                        {

                        }*/
                        laserSpeed=4;
                        laserCount++;
                        laser.play();
                        std::cout << "laser count = " << laserCount << std::endl;
                    }

そして、実際にミサイルを発射するための私の時計カウンター:

static float laserTimer =0.0;
                laserTimer+=Clock.getElapsedTime().asSeconds();
                if (laserTimer<Ldelay)
                {
                    laserTimer = 3;
                }
                else {
                    laserTimer = 0;
                }

                for (int i = 0; i < laserCount; i++)
                {
                    Laser[i].move(0, -laserSpeed);

                }

これは非常に悪い方法であり、最適化も不十分です。私はこれを知っています。当初、私はベクトルに 50 個の発射体のみを配置しようとしましたが、それらが画面の上部に到達するか、ターゲットに命中すると、タンクに戻ります。これはまったく機能しませんでした...タンクに相対的に設定しても、画面の横に表示されて発砲し続けるだけでした。

for (int i=0; i<laserCount; i++)
    {
    if (Laser[i].getPosition().y==0)
       {
        Laser[i].setPosition(xTank, yTank);
        laserSpeed=0;
       }
}

これにより、レーザーが画面の端に配置されます (タンクが画面の中央にあったとしても)。実際の位置 (300,200) で試してみましたが、同じ問題が発生し、画面上の他のすべてのスプライトがフリーズしてしまいました。

率直に言って、スプライトが必要ないのに、不必要な量のスプライトを持ちたくないだけです!

4

1 に答える 1