Итак, у меня есть этот класс Panel.Это немного похоже на окно, где вы можете изменять размеры, закрывать, добавлять кнопки, ползунки и т. Д. Очень похоже на экран состояния в Morrowind, если кто-нибудь из вас помнит.Мне нужно поведение, когда спрайт находится за пределами панели, он не рисуется, а если он находится частично снаружи, то рисуется только часть внутри.То, что он делает сейчас, это сначала получает прямоугольник, который представляет границы панели, и прямоугольник для спрайта, он находит прямоугольник пересечения между ними, а затем переводит это пересечение в локальные координаты прямоугольника спрайта и использует , что для исходного прямоугольника.Это работает, и, насколько я чувствую, код, я не могу избавиться от ощущения, что есть лучший способ сделать это.Кроме того, с этой настройкой я не могу использовать матрицу глобального преобразования для моей 2D-камеры, все в «мире» должно быть передано аргументом камеры для рисования.В любом случае, вот код, который у меня есть:
для пересечения:
public static Rectangle? Intersection(Rectangle rectangle1, Rectangle rectangle2)
{
if (rectangle1.Intersects(rectangle2))
{
if (rectangle1.Contains(rectangle2))
{
return rectangle2;
}
else if (rectangle2.Contains(rectangle1))
{
return rectangle1;
}
else
{
int x = Math.Max(rectangle1.Left, rectangle2.Left);
int y = Math.Max(rectangle1.Top, rectangle2.Top);
int height = Math.Min(rectangle1.Bottom, rectangle2.Bottom) - Math.Max(rectangle1.Top, rectangle2.Top);
int width = Math.Min(rectangle1.Right, rectangle2.Right) - Math.Max(rectangle1.Left, rectangle2.Left);
return new Rectangle(x, y, width, height);
}
}
else
{
return null;
}
}
и для фактического рисования на панели:
public void DrawOnPanel(IDraw sprite, SpriteBatch spriteBatch)
{
Rectangle panelRectangle = new Rectangle(
(int)_position.X,
(int)_position.Y,
_width,
_height);
Rectangle drawRectangle = new Rectangle();
drawRectangle.X = (int)sprite.Position.X;
drawRectangle.Y = (int)sprite.Position.Y;
drawRectangle.Width = sprite.Width;
drawRectangle.Height = sprite.Height;
if (panelRectangle.Contains(drawRectangle))
{
sprite.Draw(
spriteBatch,
drawRectangle,
null);
}
else if (Intersection(panelRectangle, drawRectangle) == null)
{
return;
}
else if (Intersection(panelRectangle, drawRectangle).HasValue)
{
Rectangle intersection = Intersection(panelRectangle, drawRectangle).Value;
if (Intersection(panelRectangle, drawRectangle) == drawRectangle)
{
sprite.Draw(spriteBatch, intersection, intersection);
}
else
{
sprite.Draw(
spriteBatch,
intersection,
new Rectangle(
intersection.X - drawRectangle.X,
intersection.Y - drawRectangle.Y,
intersection.Width,
intersection.Height));
}
}
}
Так что я думаю, мой вопрос, есть лилучший способ сделать это?
Обновление: только что узнал о свойстве ScissorRectangle.Это похоже на достойный способ сделать это;он требует создания объекта RasterizerState и его передачи в перегрузку spritebatch.Begin, которая его принимает.Похоже, что это может быть лучшим выбором, хотя.Есть также видовой экран, который я могу изменить.Мысли?:)