Почему моя программа перемещается вверх при масштабировании?C#

Место общения программистов C#
Ответить
Anonymous
 Почему моя программа перемещается вверх при масштабировании?

Сообщение Anonymous »

Пытаясь создать 2D -координатную сетку с панорамированием и масштабированием, я следил за этим учебником , и я использую C# и Monogame в VS 2022.
Когда я пытаюсь увеличить экран, непрерывно перемещается влево, а не увеличивается в мой курсор. Я запрограммировал его, чтобы добавить изменение в позиции курсора из -за увеличения масштабирования в смещение, чтобы, по -видимому, произошло масштабирование, но этого не произошло. Я думаю, что это проблема с моими вычислениями от пространства мирового пространства для экрана, так как логика зум (в подпрограмме обновления) логически верна. < /P>
Это MRE моей программы только включает функцию Zoom. Пожалуйста, помогите мне! < /P>
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace MinimalReproducibleExample
{
public class Game1 : Game
{
private GraphicsDeviceManager _graphics;
private SpriteBatch _spriteBatch;
private Texture2D pixel; // Pixel stretched to make a line

public Vector2 Offset = new Vector2(-100, -100);
public float Zoom = 1;
public int oldScrollWheelValue = 0;

public Vector2 WorldmousePositionBef; // World position before zoom
public Vector2 WorldmousePositionAft; // World position after zoom

public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
}

protected override void Initialize()
{
_graphics.IsFullScreen = false;
_graphics.PreferredBackBufferWidth = 1920;
_graphics.PreferredBackBufferHeight = 1080;
_graphics.ApplyChanges();
base.Initialize();
}

protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);

// Create a 1x1 white pixel texture
pixel = new Texture2D(GraphicsDevice, 1, 1);
pixel.SetData(new[] { Color.White });
}

protected override void Update(GameTime gameTime)
{
var mouseState = Mouse.GetState();
Vector2 newMousePosition = mouseState.Position.ToVector2();

// Calculate world position before zoom
WorldmousePositionBef = ScreenToWorld(newMousePosition);

// Handle zoom logic
if (mouseState.ScrollWheelValue > oldScrollWheelValue)
{
Zoom *= 1.05f; // Zoom in
}
else if (mouseState.ScrollWheelValue < oldScrollWheelValue)
{
Zoom *= 0.95f; // Zoom out
}
oldScrollWheelValue = mouseState.ScrollWheelValue;

// Calculate world position after zoom
WorldmousePositionAft = ScreenToWorld(newMousePosition);

// Adjust offset to keep zoom centered around cursor
Offset += (WorldmousePositionBef - WorldmousePositionAft);

base.Update(gameTime);
}

protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Red);

_spriteBatch.Begin();

// Draw grid lines
DrawLines(true, 11, 10, Color.White); // Horizontal lines
DrawLines(false, 11, 10, Color.White); // Vertical lines

_spriteBatch.End();

base.Draw(gameTime);
}

protected override void UnloadContent()
{
pixel.Dispose();
base.UnloadContent();
}

private Vector2 WorldToScreen(Vector2 world)
{
return (world - Offset) * Zoom; // Transform world to screen coordinates
}

private Vector2 ScreenToWorld(Vector2 screen)
{
return (screen / Zoom) + Offset; // Transform screen to world coordinates
}

private void DrawLines(bool isHorizontal, int n, int lineWidth, Color color)
{
for (int i = 0; i < n; i++)
{
Vector2 startPosition = isHorizontal
? new Vector2(0, i * lineWidth) // Horizontal start
: new Vector2(i * lineWidth, 0); // Vertical start

Vector2 endPosition = isHorizontal
? new Vector2(n * lineWidth, i * lineWidth) // Horizontal end
: new Vector2(i * lineWidth, n * lineWidth); // Vertical end

// Convert world to screen positions
Vector2 screenStart = WorldToScreen(startPosition);
Vector2 screenEnd = WorldToScreen(endPosition);

// Calculate rectangle size
Point size = isHorizontal
? new Point((int)(screenEnd.X - screenStart.X), (int)(lineWidth * Zoom))
: new Point((int)(lineWidth * Zoom), (int)(screenEnd.Y - screenStart.Y));

// Draw the line as a rectangle
_spriteBatch.Draw(pixel, new Rectangle(screenStart.ToPoint(), size), color);
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... en-zooming
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»