0.4.0: map (N) that fills in as you explore and a compass (closes #1); Old Tam's seam and Cove tips (voiced); the journey and sea fish in the guide; trailer with the tunnel and the Cove; protocol 16
This commit is contained in:
53
scripts/ui/compass.gd
Normal file
53
scripts/ui/compass.gd
Normal file
@@ -0,0 +1,53 @@
|
||||
extends Control
|
||||
## The compass (Gitea issue #1): a strip across the top of the screen that
|
||||
## shows which way you're facing, N/E/S/W and the points between, with a tick
|
||||
## at the centre. North is the map's top (-Z).
|
||||
|
||||
const UITheme = preload("res://scripts/ui/theme.gd")
|
||||
const WIDTH := 420.0
|
||||
const SPAN := 180.0 ## degrees shown across the strip
|
||||
const POINTS := [[0, "N"], [45, "NE"], [90, "E"], [135, "SE"], [180, "S"], [225, "SW"], [270, "W"], [315, "NW"]]
|
||||
|
||||
var player: Node3D
|
||||
|
||||
func setup(p: Node3D) -> void:
|
||||
player = p
|
||||
mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
set_anchors_preset(Control.PRESET_CENTER_TOP)
|
||||
offset_left = -WIDTH * 0.5
|
||||
offset_right = WIDTH * 0.5
|
||||
offset_top = 44.0
|
||||
offset_bottom = 74.0
|
||||
|
||||
## Which way `p` faces, in degrees clockwise from north (0 = N, 90 = E).
|
||||
static func heading(p: Node3D) -> float:
|
||||
var f: Vector3 = -p.global_basis.z
|
||||
return fposmod(rad_to_deg(atan2(f.x, -f.z)), 360.0)
|
||||
|
||||
func _process(_d: float) -> void:
|
||||
visible = player != null and is_instance_valid(player) and not bool(player.get("ui_open"))
|
||||
queue_redraw()
|
||||
|
||||
func _draw() -> void:
|
||||
if player == null or not is_instance_valid(player):
|
||||
return
|
||||
var h := heading(player)
|
||||
var font := get_theme_default_font()
|
||||
draw_rect(Rect2(Vector2.ZERO, size), Color(0, 0, 0, 0.35))
|
||||
for deg in range(0, 360, 15):
|
||||
var off := wrapf(deg - h, -180.0, 180.0)
|
||||
if absf(off) > SPAN * 0.5:
|
||||
continue
|
||||
var x := WIDTH * 0.5 + off / SPAN * WIDTH
|
||||
var big := deg % 45 == 0
|
||||
draw_line(Vector2(x, 0), Vector2(x, 6 if not big else 9), Color(1, 1, 1, 0.5 if not big else 0.8), 1.0)
|
||||
for pt in POINTS:
|
||||
var off := wrapf(float(pt[0]) - h, -180.0, 180.0)
|
||||
if absf(off) > SPAN * 0.5 - 6.0:
|
||||
continue
|
||||
var x := WIDTH * 0.5 + off / SPAN * WIDTH
|
||||
var s := 17 if String(pt[1]).length() == 1 else 13
|
||||
var col := Color(1.0, 0.55, 0.35) if pt[1] == "N" else Color(1, 1, 1, 0.9)
|
||||
var w := font.get_string_size(pt[1], HORIZONTAL_ALIGNMENT_CENTER, -1, s).x
|
||||
draw_string(font, Vector2(x - w * 0.5, 25), pt[1], HORIZONTAL_ALIGNMENT_LEFT, -1, s, col)
|
||||
draw_line(Vector2(WIDTH * 0.5, 0), Vector2(WIDTH * 0.5, 30), Color(1.0, 0.85, 0.4, 0.9), 2.0)
|
||||
Reference in New Issue
Block a user