У меня есть 2 спрайта, которые при объединении составляют правильное изображение на экране. Рисовать их одновременно нельзя.
Представьте себе этот класс:
class MyImage
{
Vector2 drawOffset; // this gets added before the image is drawn
Vector2 sourceRect; // this is where it is on the source texturepage
void Draw(Vector2 position)
{
position = position + drawOffset;
spriteBatch.Draw(sourceTexture, position, sourceRect, Color.White);
}
}
И этот код зовет в него:
MyImage a = new MyImage(); // assume they get initialised correctly
MyImage b = new MyImage(); // with different drawOffsets and sourceRects
a.Draw(position); // this composes the final
b.Draw(position); // screen image from the 2 source images
Теперь я хотел бы добавить масштаб и вращение к функции Draw (), но у меня возникли реальные проблемы с получением параметров для функции SpriteBatch.Draw. Это будет версия, которая принимает масштаб, поворот и происхождение. Мне нужно, чтобы окончательно составленное изображение корректно масштабировалось и вращалось (вокруг некоторого произвольного центра), но я не могу понять, как манипулировать параметрами масштабирования, поворота и исходного положения, чтобы 2 изображения отображались в масштабе и вращались согласованно , Кто-нибудь делал что-то подобное раньше? С удовольствием отредактирую вопрос, основываясь на отзывах, если что-то неясно. Если изображения помогут, я могу выложить их куда-нибудь ...
Я смотрел на вращение вокруг точки xna 2D , но все еще в тупике.
Ура,
Чарли.
Большое спасибо за ответ ниже - с его помощью мне удалось правильно отобразить изображения. Остается еще одна проблема, которая заключается в том, что мне нужно использовать много пар spritebatch.Begin / End (по одной на рендеринг изображения). У меня пока нет способа измерить производительность на этом устройстве, и частота кадров не увеличивается, так что, думаю, это не проблема.
Вот мой код:
// gr is the graphic object:
// gr.position is the location of the image in the atlas
// gr.DrawOffset is the draw offset so the image is placed correctly in it's virtual box
// gr.pageIndex is the index into the texture/atlas array
// hw,hh are half the width/height of the image (it always rotates around it's centre in fact)
Matrix m = Matrix.CreateTranslation(-hw, -hh, 0) *
Matrix.CreateRotationZ(rotation) * // rotation : parameter
Matrix.CreateScale(scale) * // scale : parameter
Matrix.CreateTranslation(pos.X + hw, pos.Y + hh, 0); // pos : parameter!
spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, m);
spriteBatch.Draw(page[gr.pageIndex].texture, gr.DrawOffset, gr.position, color);
spriteBatch.End();