Как правильно использовать метод SetData XNA - PullRequest
2 голосов
/ 24 декабря 2011

Я пытаюсь использовать метод SetData как часть пиксельного механизма обнаружения столкновений, который я использую в своей игре. В общем, я хочу установить прозрачные перекрывающиеся пиксели текстуры.

При попытке использовать SetData я получаю следующее исключение: «Вы не можете вызывать SetData для ресурса, когда он активно установлен на GraphicsDevice. Удалите его из устройства перед вызовом SetData.»

Мне удалось найти некоторые почти похожие вопросы, касающиеся этого исключения, в StockOverFlow, но я все еще не уверен, как справиться с этим исключением:

  1. Я пытался вызвать SetData из метода Draw, но исключение продолжает появляться.
  2. Я пытался понять, должен ли я каким-то образом удалить текстуру из GraphicsDevice, но единственный способ сделать это, по-видимому, - использовать индекс текстуры в GraphicsDevice.Textures [idx] и установить его в null. Что если я не держу этот индекс в своем классе?

Моя игра, естественно, содержит в себе несколько текстур (некоторые из них добавлены и в Game.Components). Возможно, это может быть причиной проблемы?

Я прилагаю очень небольшую часть своего кода ... Я не вижу реальной причины размещать больше, чем это.

private void collisionDetected()
{...
        for (int col = collisionLeftCordinate; col < collisionRightCordinate; col++)
        {
            for (int row = collisionTopCordinate; row < collisionBottomCordinate - 1; row++)
            {
                if (m_BarrierPixels[col + row * (int)this.Texture.Width] != Color.Transparent)
                {
                    m_BarrierPixels[col + row * (int)this.Texture.Width] = Color.Transparent;
                    m_TransparentPixelsCounter++;
                }
            }
        }

        this.Texture.SetData(m_BarrierPixels);
...}

1 Ответ

0 голосов
/ 24 декабря 2011
  1. обнаружение столкновений по пикселям неэффективно, вам нужно использовать холодные цветные массивы, где вам нужно заботиться о масштабах и коэффициентах поворота.

  2. если вы работаете с renderTarget, вам следует установить для renderTarget значение null, чтобы вы могли изменить пиксель; если вы не используете renderTarget, вам следует изменить пиксель в Update (лучше) если вы хотите сделать это в методе Draw, вам следует вызвать его до spriteBatch.Begin.

...