現在、戦車から発射物を発射しています。現時点では問題なく動作しますが、発射物がターゲットに命中したり、画面から消えたりすると、発射物を「再利用」することができません。これは私が現在使用しているコードです。
//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) で試してみましたが、同じ問題が発生し、画面上の他のすべてのスプライトがフリーズしてしまいました。
率直に言って、スプライトが必要ないのに、不必要な量のスプライトを持ちたくないだけです!