Определить видимую область TileMapLayer в GodotC#

Место общения программистов C#
Ответить
Anonymous
 Определить видимую область TileMapLayer в Godot

Сообщение Anonymous »

Я экспериментирую с процедурно генерируемым ландшафтом и новым TileMapLayer в Godot 4. Очень удобно и легко создавать ландшафт.
Изображение

Я хотел бы создать ландшафт в видимой области Camera2D, независимо от текущего масштабирование.
Моя функция масштабирования в Camera2D:

Код: Выделить всё

public void ZoomCamera(double delta)
{
Vector2 zoom = Zoom;
if (Input.IsActionJustPressed("camera_zoom_in"))
{
zoom.X = Mathf.Clamp(zoom.X * 1.1f, MinZoom, MaxZoom);
zoom.Y = Mathf.Clamp(zoom.Y * 1.1f, MinZoom, MaxZoom);
}

if (Input.IsActionJustPressed("camera_zoom_out"))
{
zoom.X = Mathf.Clamp(zoom.X * 0.9f, MinZoom, MaxZoom);
zoom.Y = Mathf.Clamp(zoom.Y * 0.9f, MinZoom, MaxZoom);
}
Zoom = Zoom.Slerp(zoom, (float)(ZoomSpeed * delta));
}
Я могу перевести текущую позицию мыши и использовать ее для выбора любой плитки:

Код: Выделить всё

var clickedCell = LocalToMap(GetLocalMousePosition());
SetCell(clickedCell, 0, new Vector2I(6, 0), 0);
Теперь, когда я пытаюсь вычислить границы области просмотра и преобразовать их в локальные, это не те же координаты, что и позиция мыши.

Код: Выделить всё

public void ReCalculateViewPortBounds()
{
var viewport = GetViewport();
var camera = viewport.GetCamera2D();

var viewport_size = viewport.GetVisibleRect().Size; // {(1152, 648)}
var cameraPosition = camera.GlobalPosition; // {(0, 0)}

var x = viewport_size.X; // 1152
var y = viewport_size.Y; // 648
var zx = Zoom.X; // 0.4
var zy = Zoom.Y; // 0.4

var half_width = (viewport_size.X * Zoom.X) / 2f; //  230.400009
var half_height = (viewport_size.Y * Zoom.Y) / 2f; // 129.6

// mouse position from as close to top left corner as I could get
var mousePosition
= camera.GetGlobalMousePosition(); // { (2615.0005, -5132.5005)}

// Define corners
var top_left = cameraPosition
+ (new Vector2(-half_width, -half_height)); //{(-230.40001, -129.6)}

var top_right = cameraPosition
+ (new Vector2(half_width, -half_height)); // {(230.40001, -129.6)}

var bottom_left = cameraPosition
+ (new Vector2(-half_width, half_height)); //{(-230.40001, 129.6)}

var bottom_right = cameraPosition
+ (new Vector2(half_width, half_height)); //{(230.40001, 129.6)}

// Send event
EventBus.Instance.Bus.Publish(new CameraEvent
{
BottomLeft = ToLocal(bottom_left),
BottomRight = ToLocal(bottom_right),
TopLeft = ToLocal(top_left),
TopRight = ToLocal(top_right)
});
}
Что создает:
Изображение

По сути, я пытаюсь получить те же координаты, как если бы я щелкал мышью во всех четырех углах карты при любом заданном уровне масштабирования. camera.GetGlobalMousePosition() создает координаты, которые сильно отличаются от номеров области просмотра.

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

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

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

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

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

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