0

スペースインベーダーのようなゲームを作り始めたところです。

私はプログラミングに関しては完全な初心者であり、ほとんど経験がありません (来週末に予定されているソフトウェア設計プロジェクトが必要なため、これを試みているだけです)。

とにかく、弾丸を発射する方法についてのチュートリアルに従っています。そして、それは機能していないようです。「弾丸」クラスの「速度」変数を除いて、このチュートリアルのほぼすべての側面をコピーしました(前後ではなく左右の動きのみを使用しているため、必要ないと思います)。

これが以下のコードです。前もって感謝します。:)


主要

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Software_Design_Major_Project
{

    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        Texture2D ship; // Declaring the sprite
        Vector2 shipposition = Vector2.Zero; 

        List<bullets> bullets = new List<bullets>();
        KeyboardState pastkey;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            graphics.PreferredBackBufferWidth = 600; 


        }



        protected override void Initialize()
        {

            base.Initialize();
        }


        protected override void LoadContent()
        {

            spriteBatch = new SpriteBatch(GraphicsDevice);

            ship = Content.Load<Texture2D>("ship"); // Loads the ship into the memory.
            shipposition = new Vector2((graphics.GraphicsDevice.Viewport.Width / 2) -
            (ship.Width / 2), 420);


        }


        protected override void UnloadContent()
        {

        }


        protected override void Update(GameTime gameTime)
        {

            if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Left) && shipposition.X
            >= 0) 
            {
                shipposition.X -= 6;
            }
            if(Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Right) && shipposition.X <
            ((graphics.GraphicsDevice.Viewport.Width) - (ship.Width))) 
            {
                shipposition.X += 6;
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Space) && pastkey.IsKeyUp(Keys.Space)) 
            {
                shoot();                
            }
            pastkey = Keyboard.GetState();
            updatebullets();
            base.Update(gameTime);
        }

        public void updatebullets() 
        {
            foreach(bullets bullet in bullets)
            {

                if (Vector2.Distance(bullet.position, shipposition) < 0)
                    bullet.isvisible = false;
            }

            for (int i = 0; i < bullets.Count; i++) 
            {
                if (!bullets[i].isvisible)
                    bullets.RemoveAt(i);
                i--;
            }
        }

        public void shoot() 
        {
            bullets newbullet = new bullets(Content.Load<Texture2D>("bullet"));
            newbullet.position = shipposition;
            newbullet.isvisible = true;

            if (bullets.Count < 20)
                bullets.Add(newbullet);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); 
            spriteBatch.Draw(ship, shipposition, Color.White);
            spriteBatch.End();

            foreach (bullets bullet in bullets)
                bullet.Draw(spriteBatch);

            base.Draw(gameTime);
        }



    }
}

弾丸

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace Software_Design_Major_Project
{

          class bullets // A new class needs to be created to allow for bullets.
        {
            public Texture2D texture;

            public Vector2 position;
            public Vector2 origin;

            public bool isvisible;

            public bullets(Texture2D newtexture) 
            {
                texture = newtexture;
                isvisible = false;
            }

            public void Draw(SpriteBatch spritebatch) 
            {
                spritebatch.Draw(texture, position, null, Color.White, 0f, origin, 1f, 
                SpriteEffects.None, 0);
            }
    }
}

PS長文すみません。

4

3 に答える 3

1

弾丸の位置を変更するコードは見当たりません。速度変数が必要になり、各フレームの速度に基づいて位置を更新します。

そして、 a = Math.Atan(Y,X) から角度を取得できます

速度は必要ないと思ったので、おそらく位置を計算する部分を削除したようです。追加して機能するかどうかを確認してから、不要な部分を削除することをお勧めします。

于 2012-07-18T14:27:22.770 に答える
1

誰もこれを早く発見しなかったことに驚いた. 箇条書きが描画される前に SpriteBatch を終了しています。SpriteBatch.Draw の呼び出しは、Begin メソッドと End メソッドの間で発生する必要があります。これは、描画をできるだけ高速にするために舞台裏で行われるすべての作業のためです。次のように、spriteBatch.End() をさらに下に移動するだけです。

protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
        spriteBatch.Draw(ship, shipposition, Color.White);

        foreach (bullets bullet in bullets)
            bullet.Draw(spriteBatch);

        spriteBatch.End(); //Move to here instead

        base.Draw(gameTime);
    }

雑学: 基本的に舞台裏で行われているのは、スプライト バッチが実際に begin で記述された設定を使用してテクスチャをバッチ処理し (はい、これらは変更可能です)、end が呼び出されると、どのビットが画面の外にあるかを判断することです。それらを描画しないように注意し、指示された場合はテクスチャを深度ソートし、バック バッファーに描画する前に他のあらゆる種類の最適化を行い、最後にすべての描画が終了すると、バック バッファーが画面に表示され、古いものは取得され、次の描画呼び出しに再利用されます。大変な作業のように聞こえますが、最新のコンピューターの動作方法では、最適化によって大きな改善が生じる傾向があります。

于 2013-06-14T05:47:46.177 に答える
0

ここでこのサンプルを確認できます。私はずっと前にこのようなものをコーディングしました.XNAのv2.0では、今は思い出すことができません.

http://gozoomin.com/media/p/69699.aspx

そこのロジックは非常に単純です:)

「クラシック」の作成を開始することは、常に良い開始方法です。

編集 - ここでも入手できます : http://www.sendspace.com/file/r4s4um . PS - コードを超えてコピーしないでください。サンプルの周りの基本を学ぶようにしてください。

于 2012-07-18T14:32:50.337 に答える