2009-09-29 5 views
1

Учитывая прямоугольник назначения и значение смещения x/y, мне нужно, чтобы изображение было нарисовано в пределах этого прямоугольника назначения. Если смещение будет сдвигать изображение с края прямоугольника, то часть, которая «выталкивает», должна появиться на противоположной стороне прямоугольника назначения. Проще говоря, мне нужен прокручиваемый фон.Эффект «Обтекание» с помощью Direct3D.Texture

В GDI, я могу сделать это с «ImageAttributes» объект, который использует режим плитки обертку:

ImageAttributes attributes = new ImageAttributes(); 
attributes.SetWrapMode(System.Drawing.Drawing2D.WrapMode.Tile); 

Rectangle rectangle = new Rectangle(0, 0, (int)width, (int)height); 
g.DrawImage(bmp, rectangle, -x, -y, width, height, GraphicsUnit.Pixel, attributes); 

Теперь мне нужен способ, чтобы сделать это в DirectX. Предположим, что это метод я прямо сейчас:

public void RenderTexture(PrismDXObject obj, D3D.Texture texture, int xOffset, int yOffset) 
{ 
    if (obj != null && texture != null) 
    { 
     _renderSprite.Begin(D3D.SpriteFlags.AlphaBlend); 
     _renderSprite.Draw(texture, 
      new Rectangle(0, 0, (int)obj.Width, (int)obj.Height), 
      new Vector3(0.0f, 0.0f, 0.0f), 
      new Vector3((int)obj.Left, (int)obj.Top, 0.0f), 
      obj.RenderColor); 
      _renderSprite.End(); 
     } 
    } 
} 

... где «_renderSprite» является D3D.Sprite и PrismDXObject простой класс, который хранит х/у/ширина/высота/цвет. Как я могу обновить этот метод, чтобы xOffset и yOffset могли использоваться для обертывания текстуры? Помните, моя конечная цель - это прокручивающий фон, который петли, когда игрок идет вперед.

Кстати, этот метод RenderTexture() предназначен для «библиотечного метода», который может быть вызван из любой точки моей программы ... поэтому, если я делаю что-то действительно неэффективное или плохое, я бы приветствовал дружелюбное предупреждение! Моя главная проблема заключается в том, чтобы заставить обертывающий фон работать.

+0

Ну, я действительно думал, что это простая вещь; Прокрутка фонов - довольно простая (и универсальная) вещь в большинстве видеороликов с прокруткой. Нет ли «гладкого» способа сделать это? – 2009-10-13 22:04:28

ответ

0

Я не уверен, что механизм спрайта позволяет объяснить то, что я собираюсь объяснить, но, безусловно, 2 треугольника. Если это не работает со спрайтами, используйте треугольники напрямую:

То, что вы запрашиваете, напрямую поддерживается подсистемой текстурирования, называется текстурной упаковкой.

  • При указании координаты текстуры, что ваш четырехъядерных будет использовать, вместо того чтобы использовать 0,0-1,1 диапазон, вы можете использовать 0+xoffset/tex_x_size, 0+yoffset/tex_y_size, 1+xoffset/tex_x_size, 1+yoffset/tex_y_size для ваших текстурных координат.
  • Тогда остается только указать, что сэмплер текстур, который вы будете использовать для сопоставления фона, будет обертываться текстурой. Для этого вам необходимо установить D3DTADDRESS_WRAP состояния пробоотборника D3DSAMP_ADDRESSU и D3DSAMP_ADDRESSV. Обратите внимание, что это по умолчанию для состояния сэмплера.

все. Теперь, возвращаясь к D3D.Sprite, метод Draw использует прямоугольник, который указывает, какую часть текстуры использовать. вы попробовали рисунок xoffset, yoffset, xOffset+obj,Width, yoffset+obj.height? Это будет работать только в том случае, если подсистема спрайтов использует обертку сэмплером, и я не знаю, как спрайт реализован внутри.

+0

Мне нравится эта идея ... она еще не работала; Мне может потребоваться некоторое разъяснение: 1) Я сделал вызов _graphics.GetSamplerStageStateInt32() для D3D.SamplerStageStates.AddressU и D3D.SamplerStageStates.AddressV, и я вернул значение 1 для каждого из них. Означает ли это, что они уже установлены (по умолчанию)? 2) Если это так, мне интересно, нужно ли мне просто использовать 2 треугольника для рендеринга фона вместо моего «универсального» спрайта, который отображает все остальное. Если это так, мне нужно сделать небольшое исследование о том, как использовать треугольники, поскольку я использовал только спрайты! Спасибо за ваш ответ! – 2009-10-29 11:39:53

+0

1) yep, 1 действительно Wrap. См. Http://msdn.microsoft.com/en-us/library/ms858163.aspx 2) Я не знаю точно, как спрайт отображает текстуры. какой результат вы получили с помощью вышеуказанного метода? Понимание всего материала треугольника потребует некоторых инвестиций с вашей стороны, если вы никогда не смотрели на них. Удачи! – Bahbar

+0

Результат, который я получил с спрайтами, был любопытен ... изображение было забито ожидаемым количеством пикселей, но оно было обрезано вместо обернутого ... и еще более странным, прозрачные части текстуры были сделаны сплошным черным. Я рассмотрю использование треугольников, хотя я до сих пор неясно, в чем заключается цель треугольников и спрайтов (например, почему вы использовали бы один над другим). Спасибо за ваш вклад! – 2009-10-29 22:17:50

Смежные вопросы