0

私はコーディングにまったく慣れておらず、数週間しか練習しておらず、単純なことがつまずきになっているように見えるタスクが割り当てられています。

画面に4つのスプライトが描画されていますが、ゲームを開始するたびに、2つのスプライトから1つのスプライトからランダムに選択する必要があり、画面には各スプライトが少なくとも1つ存在する必要があります。

私の家庭教師は、配列を使用してテクスチャを保存し、それをコーディングして、毎回描画するものをランダムに選択することを提案しました

namespace GamesProgrammingAssement1
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        KeyboardState keys;
        KeyboardState oldKeys;
        GamePadState Pad1;
        GamePadState oldPad1;
        Texture2D gnome;
        Texture2D troll;
        Rectangle sprRect1;
        Rectangle sprRect2;
        Rectangle sprRect3;
        Rectangle sprRect4;
        SpriteFont Run;
        SpriteFont Score;
        int scoreNum = 0;
        int runNum = 0;
        Vector2 scorePos;
        Vector2 runPos;
        Texture2D[] sprite = new Texture2D[2];

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

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            sprRect1 = new Rectangle(375, 100, 64, 64);
            sprRect2 = new Rectangle(375, 300, 64, 64);
            sprRect3 = new Rectangle(225, 200, 64, 64);
            sprRect4 = new Rectangle(525, 200, 64, 64);

            scorePos = new Vector2(5, 400);
            runPos = new Vector2(5, 425);

            sprite[0] = gnome;
            sprite[1] = troll;

            base.Initialize();
        }
        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            gnome = Content.Load<Texture2D>("Gnome");
            troll = Content.Load<Texture2D>("Troll");
            Score = Content.Load<SpriteFont>("Score");
            Run = Content.Load<SpriteFont>("Run");
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {

            KeyboardState keys = Keyboard.GetState();
            KeyboardState oldkeys = keys;
            if (keys.IsKeyDown(Keys.Escape)) this.Exit();

            // TODO: Add your update logic here

            base.Update(gameTime);
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();

            spriteBatch.Draw(gnome,sprRect1,Color.White);
            spriteBatch.Draw(troll, sprRect2,Color.White);
            spriteBatch.Draw(troll, sprRect3, Color.White);
            spriteBatch.Draw(troll, sprRect4, Color.White);

            spriteBatch.DrawString(Score, "SCORE : "+ scoreNum, scorePos, Color.Black);
            spriteBatch.DrawString(Run, "RUN OF TROLL : " + runNum, runPos, Color.Black);

            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}

配列を適切に格納しているかどうか、またはランダムに正しく実行しているかどうかがわからないため、ヘルプは素晴らしいでしょう

4

2 に答える 2

0

4 つのスプライトを選択する必要があるため、4 つの要素を含むことができる配列 (または同様の構造) を使用する必要があります。

Texture2D[] sprites = new Texture2D[4];

Array を初期化するとき、各スプライトがいくつ存在するかに関して、3 つの状況が考えられます。

  • 1-3 (トロル 1 体、ノーム 3 体)
  • 2-2 (各 2 個)
  • 3-1 (トロール3体、ノーム1体)

したがって、まず、次のいずれかのディストリビューションを選択する必要があります。

var rnd = new Random();
var trolls = rnd.Next(1, 3);
var gnomes = 4 - trolls;

次に、配列を埋めることができます:

for(int i = 0; i < 4; ++i)
{
    if(gnomes == 0)
    {
        //choose the troll
        sprites[i] = troll; 
        --trolls;
    }
    else if(trolls == 0)
    {
        //choose the gnome
        sprites[i] = gnome;
        --gnomes;
    }
    else
    {
        //choose randomly
        if(rnd.Next(2) < 1)
        {
            sprites[i] = troll; 
            --trolls;
        }
        else
        {
            sprites[i] = gnome;
            --gnomes;
        }
    }
}

あなたはそれらを次のように描きます

spriteBatch.Draw(sprites[0], sprRect1,Color.White);
spriteBatch.Draw(sprites[1], , sprRect2,Color.White);
spriteBatch.Draw(sprites[2], , sprRect3, Color.White);
spriteBatch.Draw(sprites[3], , sprRect4, Color.White);
于 2012-11-19T16:40:32.430 に答える
0

テクスチャを配列に保存しているようです。あなたのサンプルには Random のコードがありません。

そうは言っても、次の関数を検討してください。

Random rand = new Random();
private Texture2D GetRandomTexture()
{
    return sprite[rand.Next(0, 2)];
}

この関数を呼び出すと、「スプライト」配列に含まれるランダム テクスチャが返されます。この関数呼び出しを描画にプラグインすると、次のようになります。

spriteBatch.Draw(GetRandomTexture(), sprRect1, Color.White);

初心者ということで、あまり詳しくは言わないようにしています。ただし、各スプライトの Texture2D、Position、Rectangle 値を含む新しいクラス「Sprite」の作成を検討する必要があります。次に、テクスチャの配列を格納する代わりに、Sprite オブジェクトの配列 (またはリスト) を格納できます。

于 2012-11-19T16:30:04.530 に答える