0

完了したにもかかわらず、学校でまだ取り組んでいるプロジェクトのために、しばらくの間何かをコーディングしようとしていました。

衝突した敵に弾丸を発射する手榴弾を作りたいのですが、atmで助けが必要なのは、一度に8つの弾丸をさまざまな方向に発射することです.

これが私の先生がそれを行うために私にくれたコードです(私は彼に助けを求めました)

if (mouse.LeftButton == ButtonState.Pressed)
            {
                Texture2D pewTexture;
                pewTexture = game.Content.Load<Texture2D>("pew");
                game.firingSound.Play();
                //Tweak pews to shoot at mouse, rather than just going straight on the y axis.
                pew = new CPew(game, pewTexture);
                pew.velocity = new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation)) * 10f + spriteVelocity;
                pew.position = position + pew.velocity * 5;

                //easy cheesy way:
                //pew.position = position;
                //pew.position.X += 15f;
                //pew.position.Y -= 20f;





                //super awesome cool way for cool people and celebrities
                pew.position = position +
                    new Vector2(
                        texture.Width * .2f - pew.texture.Width * .2f,
                        -pew.texture.Height);

                game.pews.Add(pew);

                myFiringDelay = 10;


            }
            else
            {
                if (mouse.RightButton == ButtonState.Pressed)
                {
                    float pi2 = (float)Math.PI * 2.0f;
                    int numShots = 10;
                    float pi2overnum = pi2 / numShots;

                    for (int i = 0; i < numShots; i++)
                    {
                        Vector2 direction = PiToVec2(pi2overnum * i);

                        //particles[i].reset(position,direction, vector2.zero, 6);
                        game.pews[i].Reset(pew.position, direction, Vector2.Zero);

                    }

           Vector2 PiToVec2(float piT)
           {
              return new Vector2((float)Math.Sin(piT), (float)Math.Cos(piT));

           }

どうやらこれにより、マウスの右クリックであらゆる方向に撃たれるようになりますが、試してみるとゲームが真っ直ぐにクラッシュします次に、弾丸であるピュークラスがあり、同時にそれらの方向に撃たれたい

皆さんは、私が示したコードを参考にできないかもしれません。これを行う方法をしばらく探しましたが、何も見つからないようです

以前の例やソースコードは本当に役に立ちます。少なくともこれを別の方法で見ることができます。

クラッシュしたときに表示すると、インデックスが範囲外になるか負であることがわかります。多方向弾丸の基本コードを見せていただければ幸いです

4

1 に答える 1

0

問題は、game.pews コレクションをループしようとすると、コレクションの最初の 10 個のアイテムで Reset() を呼び出そうとしていることです。しかし、そこには10人の信者がいないようです。そのため、最後に到達して次のものにアクセスしようとすると、「インデックスが範囲外です」というエラーが発生します。

質問の手榴弾部分からの8発の弾丸については、このようなことをしたいと思います。

//Once a grenade has collided with an enemy 
float pi2 = (float)Math.PI * 2.0f;
int numShots = 8;
float pi2overnum = pi2 / numShots;

for (int i = 0; i < numShots; i++)
{
   Vector2 direction = PiToVec2(pi2overnum * i);

   pew = new CPew(game, pewTexture);

   pew.velocity = new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation)) * 10f + spriteVelocity;

   //Set the position based off of the grenades last position.
   //Set the direction.
   //Set any other attributes needed.

   game.pews.Add(pew);
}

これで、手榴弾が爆発した場所から異なる方向に移動する 8 つの弾丸ができました。それらを更新して描画するには、foreach ループを使用することをお勧めします。これにより、「インデックスが範囲外」エラーについて心配する必要がなくなります。

foreach CPew pew in game.pews
{
   pew.Update();
}
于 2012-12-02T04:24:36.823 に答える