Определить видимую область 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 viewportSize = viewport.GetVisibleRect().Size;
var cameraPosition = camera.GlobalPosition;

var half_width = (viewportSize.X * Zoom.X) / 2f;
var half_height = (viewportSize.Y * Zoom.Y) / 2f;

// Define corners
var top_left = cameraPosition + (new Vector2(-half_width, -half_height));
var top_right = cameraPosition + (new Vector2(half_width, -half_height));
var bottom_left = cameraPosition + (new Vector2(-half_width, half_height));
var bottom_right = cameraPosition + (new Vector2(half_width, half_height));

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

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

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

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

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

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

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

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