1

私はSFMLにかなり慣れていないので、スペースバーを押すたびに弾丸を発射するスクロール飛行機ゲームを作ろうとしています. すべての動きが機能するようになりましたが、弾丸を別のクラスファイルに配置して、後でそれらのセット全体を保持できるようにする方法を見つけようとしています (IE create.bullet(), create.missle ()など)。ここに私が今持っているコードがあります。

void create::bullet(int xPos, int yPos)
{
sf::Texture bulletTexture;
if(!bulletTexture.loadFromFile("bullet.png"))
    cout << "There was an error loading the bullet texture file." << endl;
sf::Sprite bulletSprite;
bulletSprite.setTexture(bulletTexture);
bulletSprite.setPosition(xPos, yPos);

window.draw(bulletSprite);

}

メインクラスに window という sf::RenderWindow インスタンスがあるのですが、別のクラスから直接参照できないようです。ベロシティもまだ実装できていませんが、実装できるはずです。しかし、私が助けを必要としているもう1つのことは、発射できる弾丸の数に制限がないようにすることです. スペースバーが押されるたびにこの関数を実行すると、スプライトが新しい位置にリセットされ、古い位置が削除されるようです。助けてくれてありがとう!

4

1 に答える 1

1

まず第一に、ファイルからテクスチャをロードするのが遅いです。プログラムまたはレベルの開始時に一度実行し、テクスチャをどこかに保存する必要があります。

Create クラスの代わりに、Bullet クラスを作成します。次に、箇条書きのベクトル (またはそれらへのポインター/スマートポインター) を取得できます。新しい弾丸が必要になるたびに、それをベクターに push_back() するだけです。弾丸を破壊する必要がある場合は、ererase() します。次に、ゲーム自体のために、すべての弾丸に対して Move() を呼び出し、次にベクター内のすべての弾丸に対して Draw() を呼び出す必要があります。それが完了したら、衝突検出などを追加できます。

選択肢もあります - 各弾丸に独自の sf::sprite を設定して変更するか、ゲーム スプライトごとに 1 つの sf::sprite を設定して弾丸ごとに再配置するかを選択できます。個人的には、2 番目の方法を使用しています。私の Bullet クラスは次のようになります。

Bullet::Bullet(std::string ntype, double nx, double ny, double nvx, double nvy):
    type(ntype), x(nx), y(ny), vx(nvx), vy(nvy)
{
    angle=atan2(vy, vx)*(180/M_PI);
}
void Bullet::Move()
{
    x+=vx;
    y+=vy;
};
void Bullet::Draw()
{
    DrawSprite(type, x, y, angle+90);
};

別の .cpp ファイルには、sf::sprite の文字列順序付きマップがあります。私の描画関数は次のようになります。

void DrawSprite(std::string type, float x, float y, float angle)
{
    sf::Sprite temp=sprites[type];
    temp.setRotation(angle);
    temp.setPosition(x, y);
    window.draw(temp);
}
于 2013-08-17T08:40:15.130 に答える