PirateTreasureHunt/scenes/World.gd

103 lines
3.7 KiB
GDScript
Raw Normal View History

extends Node2D
2021-06-17 23:07:57 +02:00
onready var HexGridDrawer = get_node("HexGridDrawer")
onready var WorldCamera = get_node("Camera")
onready var OffsetValueLabel = get_node("UI/TopContainer/OffsetValue")
onready var ZoomValueLabel = get_node("UI/TopContainer/ZoomValue")
onready var HexCoordValueLabel = get_node("UI/TopContainer/HexCoordValue")
2021-06-17 23:03:45 +02:00
onready var PlayerChar = get_node("PlayerChar")
2021-06-17 23:07:57 +02:00
onready var FPSValueLabel = get_node("UI/TopContainer/FPSValue")
var HexGrid = preload("../thirdparty/gdhexgrid/HexGrid.gd").new()
var hex_size = 128
2021-06-17 23:03:45 +02:00
var hex_grid_bbox = [[0,0], [10,10]]
var hex_hover = Vector2.ZERO
var is_dragging = false
var drag_start = null
2021-06-17 23:03:45 +02:00
var target = Vector2()
# Called when the node enters the scene tree for the first time.
func _ready():
HexGrid.hex_scale = Vector2(hex_size, hex_size)
2021-06-17 23:03:45 +02:00
# Set player starting position
PlayerChar.position = HexGrid.get_hex_center(Vector2(0,0))
2021-06-17 23:07:57 +02:00
HexGridDrawer.hex_scale = Vector2(hex_size, hex_size)
func _draw():
2021-06-17 23:07:57 +02:00
var view_grid_corners = calc_grid_view_rect()
var tl_tile_coords = HexGrid.get_hex_center(view_grid_corners[0])
var tr_tile_coords = HexGrid.get_hex_center(view_grid_corners[1])
var bl_tile_coords = HexGrid.get_hex_center(view_grid_corners[2])
var br_tile_coords = HexGrid.get_hex_center(view_grid_corners[3])
print (tl_tile_coords, bl_tile_coords)
var nc = ceil ((tr_tile_coords[0] - tl_tile_coords[0]) * 1.5 / hex_size)
var nr = ceil ((bl_tile_coords[1] - tr_tile_coords[1]) / hex_size) + 2
for c in range (nc):
var dx = 0.75 * hex_size * c
var dy = (c % 2) * sqrt(3) * 0.25 * hex_size #(c % 2) * sqrt(3) * hex_size * 0.75
for r in range (nr):
draw_set_transform(tl_tile_coords + Vector2(dx, r * hex_size * sqrt(3) * 0.5 + dy), 0, Vector2.ONE)
draw_polygon (HexGridDrawer.HexPoints, HexGridDrawer.HexColors[HexGridDrawer.TileType.None])
draw_polyline(HexGridDrawer.HexPoints, "#888", 1 * WorldCamera.zoom.x)
var coords = HexGrid.get_hex_center (hex_hover)
draw_set_transform(coords, 0, Vector2.ONE)
2021-06-17 23:07:57 +02:00
draw_polyline(HexGridDrawer.HexPoints, "#f00", 2 * WorldCamera.zoom.x)
func screen_to_world(pos: Vector2):
pos = pos - OS.get_window_safe_area().size * 0.5
return WorldCamera.offset + pos * WorldCamera.zoom
func screen_to_hex(pos: Vector2):
return HexGrid.get_hex_at(screen_to_world(pos)).axial_coords
func world_to_screen(pos: Vector2):
return pos * WorldCamera.zoom + WorldCamera.offset
2021-06-17 23:07:57 +02:00
func calc_grid_view_rect():
var view_tl = Vector2(-hex_size,-hex_size)
var view_br = OS.get_window_safe_area().size - view_tl
var top_left = screen_to_hex (view_tl)
var top_right = screen_to_hex (Vector2(view_br.x, view_tl.y))
var bottom_left = screen_to_hex (Vector2(view_tl.x, view_br.y))
var bottom_right = screen_to_hex (view_br)
return [top_left, top_right, bottom_left, bottom_right]
func _unhandled_input(event):
if event is InputEventMouseButton:
2021-06-17 23:03:45 +02:00
# Move main character
if event.pressed and event.button_index == BUTTON_LEFT:
PlayerChar.target = HexGrid.get_hex_center(screen_to_hex(event.position))
# Move camera
2021-06-17 23:07:57 +02:00
if event.pressed and event.button_index == 2:
is_dragging = true
drag_start = (WorldCamera.offset / WorldCamera.zoom.x + event.position)
else:
is_dragging = false
2021-06-17 23:03:45 +02:00
# Zoom Camera
if event.pressed and event.button_index == BUTTON_WHEEL_DOWN and event.pressed:
WorldCamera.zoom = WorldCamera.zoom * 1.0 / 0.8
elif event.button_index == BUTTON_WHEEL_UP and event.pressed:
WorldCamera.zoom = WorldCamera.zoom * 0.8
if 'position' in event:
if is_dragging:
WorldCamera.offset = (drag_start - event.position) * WorldCamera.zoom.x
else:
hex_hover = screen_to_hex(event.position)
HexCoordValueLabel.text = str(hex_hover)
update()
OffsetValueLabel.text = str(WorldCamera.offset)
ZoomValueLabel.text = str(WorldCamera.zoom)