0

私は長い間頭を悩ませてきました。

Game1 というメインのGameクラスと、 myShowUpという DrawableGameComponent を継承した ShowUpクラスがあります

通常の方法は、コンポーネントmyShowUpGame1オブジェクトに追加して、次のように ( Game1の Initialize メソッドで直接) ゲームの一部にすることです。

class Game1 : Microsoft.Xna.Framework.Game
{
    ShowUp myShowUp;

    ...

    protected override Initialize ()
    {
        this.myShowUp = new ShowUp(this);
        this.Components.Add(this.myShowUp);
    }
    ...
}

このメソッドは機能し、myShowUpが表示され、ゲーム内の独立したオブジェクトになります。

私が望むのは、後でオブジェクトをインスタンス化してゲームオブジェクトリストに追加することです(たとえば、ウィンドウをクリックした後)

これは私の試みです:

class Game1 : Microsoft.Xna.Framework.Game
{
    MouseState myMouseState;

    ...

    ...

    protected override void Update(GameTime gameTime)
    {
        myMouseState = Mouse.GetState();

        if (myMouseState.LeftButton == ButtonState.Pressed)
        {
            this.myShowUp = new ShowUp(this);   // Nothing
            this.Components.Add(this.myShowUp); // Happens..
        }

        base.Update(gameTime);
    }

    ...
}

これまでにメソッドを見つけました。最初の構文を保持し (つまり、インスタンス化を Initialize メソッドに保持します)、アクティブ化されたという名前のShowUpクラスにブール値を定義します。activateが true の場合は、指示を実行して表示するか、何も表示しません。また、Gameオブジェクトの Update メソッドで、左ボタンを押してアクティブ変数を trueに変更すると、 myShowUpのactivate()を呼び出します。

この方法は機能しますが、私は満足していません。コード内の任意の場所でゲームオブジェクト内のオブジェクトをインスタンス化して、それらをその一部にするのと同じくらい簡単だったらよかったのにと思います。そのようにする方法はありますか?

何かのようなもの :

class Game1 : Microsoft.Xna.Framework.Game
{
    ShowUp myShowUp;
    MouseState myMouseState;

    ...

    ...

    protected override Initialize ()
    {
        this.Components.Add(this.myShowUp);
    }

    ...

    protected override void Update(GameTime gameTime)
    {
        myMouseState = Mouse.GetState();

        if (myMouseState.LeftButton == ButtonState.Pressed)
        {
            this.myShowUp = new ShowUp(this);
        }

        base.Update(gameTime);
    }

    ...
}

これはいいでしょう。

4

1 に答える 1

1

コードに小さなバグが 1 つあります。コンポーネントの複数のインスタンス (更新ごとに 1 つ) を作成します。これは、コンポーネントを作成する前に、以前のマウスの状態が null でReleasedあるかどうかを確認していないためです。myShowUpテスト済みの動作コードを次に示します (両方の条件をチェックします)。

MouseState lastMouseState;

protected override void Update(GameTime gameTime)
{
    MouseState mouseState = Mouse.GetState();

    if(mouseState.LeftButton == ButtonState.Pressed
            && lastMouseState.LeftButton == ButtonState.Released
            && myShowUp == null)
    {
        Components.Add(myShowUp = new ShowUp(this));
    }

    lastMouseState = mouseState;

    base.Update(gameTime);
}

もちろん、このバグがShowUpまったく表示されない理由はわかりません。複数のインスタンスを作成しているため、表示できると予想されます。コンポーネントにバグがある可能性がありますShowUp

価値があるのは、私がテストしたコードです:

class ShowUp : DrawableGameComponent
{
    public ShowUp(Game game) : base(game) { }

    Texture2D texture;
    SpriteBatch sb;

    protected override void LoadContent()
    {
        sb = new SpriteBatch(GraphicsDevice);
        texture = this.Game.Content.Load<Texture2D>("test");
        base.LoadContent();
    }

    public override void Draw(GameTime gameTime)
    {
        sb.Begin();
        sb.Draw(texture, new Vector2(100), Color.White);
        sb.End();
        base.Draw(gameTime);
    }
}

実行後に コンポーネントを追加すると、コレクションに追加されるとすぐにGame.InitializeそのコンポーネントInitializeとメソッドが実行されることに注意してください。LoadContentComponents

今後の参考のために、 にはとプロパティDrawableGameComponentが既に付属していることに注意してください。EnabledVisibleUpdateDraw

于 2013-02-08T10:20:03.957 に答える