Пытаясь создать 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
Почему моя программа перемещается вверх при масштабировании? ⇐ C#
Место общения программистов C#
-
Anonymous
1737727895
Anonymous
Пытаясь создать 2D -координатную сетку с панорамированием и масштабированием, я следил за этим учебником [youtube]zq8qtyizis4[/youtube], и я использую 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);
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79384583/why-is-my-program-moving-upleft-when-zooming[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия