У меня проблемы с получением правильного положения мыши на элементе управления при перемещении камеры.Контроллер имеет ширину 800 пикселей и высоту 600 пикселей.
Давайте рассмотрим только метод рисования. Здесь я пытаюсь только нарисовать линию от центра экрана до положения мыши.Проблема в том, что когда камера перемещается, результат не совпадает с тем, когда камера находится в положении x: 0, y: 0.
protected override void Draw()
{
GraphicsDevice.Clear(new Color(50, 50, 50));
SpriteBatch.Begin(SpriteSortMode.Deferred,BlendState.AlphaBlend, null, null, null, null,
Camera.GetTransformationMatrix());
Map.Draw(SpriteBatch);
//SelectionTool.Draw(SpriteBatch);
if (isPanning)
{
var point = PointToClient(MousePosition);
Vector2 mousePosition = new Vector2(point.X, point.Y);
Console.WriteLine(mousePosition);
DrawLine(SpriteBatch, Camera.CenterScreen, mousePosition, Color.White);
}
SpriteBatch.End();
}
Итак, я рисую элемент управления, используя Camera.GetTransformationMatrix()
:
public Matrix GetTransformationMatrix()
{
return Matrix.CreateScale(new Vector3(1, 1, 0)) *
Matrix.CreateTranslation(new Vector3(-View.X, -View.Y, 0));
}
Для перемещения камеры я применяю:
public void Move(Vector2 distance)
{
View.X += (int)(distance.X * panSpeed);
View.Y += (int)(distance.Y * panSpeed);
}
Метод рисования линии:
public void DrawLine(SpriteBatch spriteBatch, Vector2 from, Vector2 to, Color color, int width = 1)
{
Rectangle rect = new Rectangle((int)from.X, (int)from.Y, (int)(to - from).Length() + width, width);
Vector2 vector = Vector2.Normalize(from - to);
float angle = (float)Math.Acos(Vector2.Dot(vector, -Vector2.UnitX));
Vector2 origin = Vector2.Zero;
if (from.Y > to.Y)
angle = MathHelper.TwoPi - angle;
SpriteBatch.Draw(lineTexture, rect, null, color, angle, origin, SpriteEffects.None, 0);
}
Результат:
Камера не сместилась
Камера сместилась вправо
Я пытался инвертировать матрицу, а также с помощью PointToClient
или PointToScreen
, но сбезуспешно.