XNA C#可破坏地形

XNA C#可破坏地形,c#,xna,2d,textures,terrain,C#,Xna,2d,Textures,Terrain,我目前正在做一个游戏,玩家可以破坏地形。不幸的是,在对我的地形纹理使用SetData方法后,我遇到了此异常: 当资源在上处于活动设置状态时,您不能对其调用SetData 图形设备。在调用SetData之前,将其从设备中取消设置 现在,在有人说还有其他关于这个问题的话题之前,我已经看了所有这些。他们都说确保不要在Draw()中调用该方法,但无论如何,我只在Update()中使用它。以下是我目前用来破坏地形的代码: public class Terrain { private Texture

我目前正在做一个游戏,玩家可以破坏地形。不幸的是,在对我的地形纹理使用
SetData
方法后,我遇到了此异常:

当资源在上处于活动设置状态时,您不能对其调用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);
    }
}
公共级地形
{
私有纹理2D图像;
公共矩形边界{get;protected set;}
公共地形(ContentManager内容)
{
图像=内容负载(“地形”);
边界=新矩形(0,400,Image.Width,Image.Height);
}
公共作废抽签(SpriteBatch SpriteBatch)
{
绘制(图像、边界、颜色、白色);
}
公共无效更新()
{
if(Globals.newState.LeftButton==ButtonState.Pressed)
{
点鼠标位置=新点(Globals.newState.X,Globals.newState.Y);
if(Bounds.Contains(mousePosition))
{
颜色[]图像数据=新颜色[Image.Width*Image.Height];
Image.GetData(imageData);
对于(int i=0;i
}

每当鼠标单击地形时,我都希望将图像中20像素半径内的所有像素更改为透明。所有
GetPositionOfTextureData()
所做的就是返回一个
Vector2
,其中包含纹理数据中像素的位置


非常感谢您的帮助。

您必须通过拨打以下电话来解除纹理与图形设备的绑定:

  graphicsDevice.Textures[0] = null;

在试图通过SetData写入之前。

没有帮助吗?您似乎也没有使用spriteBatch.begin();和spriteBatch.end()。这也可能是个问题。没关系,非常感谢!我一直认为纹理是静态的。