2

スーパー マリオ ブラザーズの最初のレベルのクローンを作成しようとしていますが、クラス同士が「会話」するのに問題があります。現在、2 つのコントローラー クラス (キーボード、ゲームパッド) と 2 つのアニメーション スプライト クラス (RunMarioSprite、DeadMarioSprite) があります。私がやりたいことは、ユーザーからのキーボード/ゲームパッド入力に基づいて、画面に表示されるこれら 2 つのスプライトを切り替えることです。キー F を押すと、マリオが正しく表示されます。キー D が押された場合、マリオは上下に移動する必要があります。

コントローラ クラスを使用して画面に描画しているアニメーション スプライト クラスを変更する適切な方法は何ですか?

キーボード クラス

public class KeyboardController : IController
{
    KeyboardState keyboard = Keyboard.GetState();
    private IAnimatedSprite marioSprite;
    Texture2D texture;

    public void Update()
    {
        if (keyboard.IsKeyDown(Keys.Q))
        {
            // QUIT GAME    
        }
        if (keyboard.IsKeyDown(Keys.F))
        {
            // MARIO RUN RIGHT             
        }
        if (keyboard.IsKeyDown(Keys.D))
        {
            // DEAD MARIO UP DOWN

        }
    }
}

アニメーション化されたスプライト クラスの例

public class RunMarioSprite : IAnimatedSprite
{
    public Texture2D Texture { get; set; }
    private int currentFrame = 0;
    private int totalFrames = 4;
    public int frameShift = 30;

    public RunMarioSprite(Texture2D texture)
    {
        currentFrame = 0;
        this.Texture = texture;
    }

    public void Update()
    {
        currentFrame++;
        if (currentFrame == totalFrames)
            currentFrame = 0;
    }

    public void Draw(SpriteBatch spriteBatch)
    {

        Rectangle sourceRectangle2 = new Rectangle((240 +(currentFrame*frameShift)), 0, 30, 30);
        Rectangle destinationRectangle2 = new Rectangle(100, 100, 30, 30);

        spriteBatch.Begin();
        spriteBatch.Draw(Texture, destinationRectangle2, sourceRectangle2, Color.White);
        spriteBatch.End();
    }
}


    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();


        // TODO: Add your update logic here
      foreach (IController Controller in ControllerList)
        {
           Controller.Update();
        }

        marioSprite.Update();
        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);

        // TODO: Add your drawing code here
        marioSprite.Draw(this.spriteBatch);

        base.Draw(gameTime);
    }

メイン (更新と描画)

    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();


        // TODO: Add your update logic here
      foreach (IController Controller in ControllerList)
        {
           Controller.Update();
        }

        marioSprite.Update();
        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);

        // TODO: Add your drawing code here
        marioSprite.Draw(this.spriteBatch);

        base.Draw(gameTime);
    }

質問の形式が悪い場合は申し訳ありません。助けてくれてありがとう!

4

2 に答える 2

0

別のクラスでのキーボード入力に基づいて、 Main.Draw() メソッドでどのスプライトを描画するかを知る方法を求めている場合は、次のようなことを試すことができます。

public class Main
{
    public static bool DrawAliveMario;
    RunMarioSprite runmariosprite;
    DeadMarioSprite deadmariosprite;

    protected override void Draw(GameTime gameTime)
    {
        //...

        // TODO: Add your drawing code here
        if (DrawAliveMario) runmariosprite.Draw(this.spriteBatch);
        else deadmariosprite.Draw(this.spriteBatch);

        base.Draw(gameTime);
    }

}

そして、コントローラークラスに次のものを含めることができます:

public class KeyboardController : IController
{
    KeyboardState keyboard = Keyboard.GetState();

    public void Update()
    {
        if (keyboard.IsKeyDown(Keys.Q))
        {
            // QUIT GAME    
        }
        if (keyboard.IsKeyDown(Keys.F))
        {
            Main.DrawAliveMario = true;           
        }
        if (keyboard.IsKeyDown(Keys.D))
        {
            Main.DrawAliveMario = false;

        }
    }
}

お役に立てれば。

于 2013-09-04T19:27:49.820 に答える
0

スプライト マネージャー クラスで処理する必要がありますKeyboardController。これは、画面上にあるレベル全体を描画する目的があります。おそらく、 は必要ありませんが、次KeyboardControllerのものだけが必要KeyboardStateです。

KeyboardController keyboardController = new KeyboardController();

public void Update()
{
   // you should implement a method like this
   KeyboardState keyboard = keyboardController.GetKeyboardState();

   if (keyboard.IsKeyDown(Keys.F))
   {
      //change marioSprite instance         
   }
   if (keyboard.IsKeyDown(Keys.D))
   {
      //change marioSprite instance
   }
 }
于 2013-09-04T15:41:16.200 に答える