2

私は現在、プレイヤーが地形を破壊できるゲームに取り組んでいます。残念ながら、SetData地形テクスチャでこのメソッドを使用した後、この例外が発生します。

GraphicsDeviceでアクティブに設定されている間は、リソースでSetDataを呼び出すことはできません。SetDataを呼び出す前に、デバイスから設定を解除してください。

さて、この問題について他のトピックがあると誰かが言う前に、私はそれらすべてを見てきました。彼らは皆、内のメソッドを呼び出さないようにするように言っていますが、私はとにかくDraw()それを使用するだけです。Update()地形を破壊するために現在使用しているコードは次のとおりです。

public class Terrain
{
    private Texture2D Image;


    public Rectangle Bounds { get; protected set; }

    public Terrain(ContentManager Content)
    {
        Image = Content.Load<Texture2D>("Terrain");
        Bounds = new Rectangle(0, 400, Image.Width, Image.Height);
    }

    public void Draw(SpriteBatch spriteBatch)
    {

        spriteBatch.Draw(Image, Bounds, Color.White);


    }

    public void Update()
    {
        if (Globals.newState.LeftButton == ButtonState.Pressed)
        {
            Point mousePosition = new Point(Globals.newState.X, Globals.newState.Y);


            if(Bounds.Contains(mousePosition))
            {
                Color[] imageData = new Color[Image.Width * Image.Height];
                Image.GetData(imageData);

                for (int i = 0; i < imageData.Length; i++)
                {
                    if (Vector2.Distance(new Vector2(mousePosition.X, mousePosition.Y), GetPositionOfTextureData(i, imageData)) < 20)
                    {
                        imageData[i] = Color.Transparent;

                    }
                } 
            Image.SetData(imageData);   
            }
        }
    }

    private Vector2 GetPositionOfTextureData(int index, Color[] colorData)
    {
        float x = 0;
        float y = 0;



        x = index % 800;
        y = (index - x) / 800;

        return new Vector2(x + Bounds.X, y + Bounds.Y);
    }
}

}

マウスが地形をクリックするたびに、半径20ピクセル以内の画像のすべてのピクセルを変更して透明にします。テクスチャデータ内のピクセルの位置を含むをGetPositionOfTextureData()返すだけです。Vector2

すべての助けをいただければ幸いです。

4

1 に答える 1

1

次を呼び出して、GraphicsDeviceからテクスチャのバインドを解除する必要があります。

  graphicsDevice.Textures[0] = null;

SetDataで書き込もうとする前に。

于 2013-01-21T20:13:43.287 に答える