2

私はプログラミングの世界の初心者で、現在 C# で XNA プログラミングを試しています。現在、プレーヤーが飛行機または宇宙船であり、流星を撃墜する必要がある基本的なゲームに取り組んでいます。

現時点では、ボックスの衝突検出を試していますが、よくわかりません。リスト内のすべてのアイテムの位置を取得する方法がわかりません。助けが必要です!

つまり、基本的に船のテクスチャと流星のテクスチャがあります。モデル テクスチャは 10 回描画され、ランダムな位置になります。各流星の周りに長方形を作りたいのですが、方法がわかりません。以下に示す foreach ループを試してみましたが、衝突したときに機能する流星は 1 つだけです。私の英語がうまくできなくてすみません。みんなの助けに感謝します!

List<Vector2> meteor_pos = new List<Vector2>();

              //loadcontent
            for (int i = 0; i < 10; i++)
            {
                meteor_pos.Add(new Vector2(myRnd.Next(800), myRnd.Next(600)));
                double tmp_angle = (myRnd.Next(1000) * Math.PI * 2) / 1000.0;
                double tmp_speed = 0.5 + 3.0 * (myRnd.Next(1000) / 1000.0);
                meteor_speed.Add(new Vector2((float)(tmp_speed * Math.Cos(tmp_angle)),
                (float)(tmp_speed * Math.Sin(tmp_angle))));
            }

              //protected override void Update(GameTime gameTime)
              for (int i = 0; i < meteor_pos.Count; i++)
                {
                    meteor_pos[i] += meteor_speed[i];
                    Vector2 v = meteor_pos[i];
                    //Outside the screen?
                    if (v.X < -80)
                        v.X = graphics.GraphicsDevice.Viewport.Width + 80;
                    if (v.X > graphics.GraphicsDevice.Viewport.Width + 80)
                        v.X = -80;
                    if (v.Y < -60)
                        v.Y = graphics.GraphicsDevice.Viewport.Height + 60;
                    if (v.Y > graphics.GraphicsDevice.Viewport.Height + 60)
                        v.Y = -60;
                    //Uppdate the list
                    meteor_pos[i] = v;

               }
                foreach (var item in meteor_pos)      
                 {
                     meteor_rect = new Rectangle((int)item.X, (int)item.Y, gfx_meteor.Width, gfx_meteor.Height);
                 }

                gfx_rect = new Rectangle((int)position.X, (int)position.Y, gfx.Width, gfx.Height);

                if (gfx_rect.Intersects(meteor_rect))
                {
                    position.X = 0;
                    position.Y = 0;
                }

    //protected override void Draw(GameTime gameTime)

                for (int i = 0; i < meteor_pos.Count; i++)
            {
                spriteBatch.Draw(gfx_meteor, meteor_pos[i], null, Color.White, 0,
                new Vector2(gfx_meteor.Width / 2, gfx_meteor.Height / 2), 1.0f, SpriteEffects.None, 0);
            }}
4

1 に答える 1

1

あなたのアプローチはかなり混乱しており、クラスを作成したいと思うでしょう。少なくとも、位置とその他の基本的な情報を処理するスプライト クラスです。

ただし、現在の問題を解決するには、値を foreach ループで meteor_rect に上書きし、最後に一度だけ衝突をチェックしています。

コードを次のように切り替えます。

gfx_rect = new Rectangle((int)position.X, (int)position.Y, gfx.Width, gfx.Height);

foreach (var item in meteor_pos)      
    {
        meteor_rect = new Rectangle((int)item.X, (int)item.Y, gfx_meteor.Width, gfx_meteor.Height);

        if (gfx_rect.Intersects(meteor_rect))
            {
                position.X = 0;
                position.Y = 0;
            }
    }

しかし、私が言ったように、あなたを助けるために基本的なチュートリアルを調べてください:)

于 2012-10-26T15:40:00.527 に答える