From fa6e5d9582101b7da6f6a0af5c0b87e5ba73b41f Mon Sep 17 00:00:00 2001 From: djairoh Date: Wed, 12 Nov 2025 15:39:40 +0100 Subject: [PATCH] feat: reorganized logic + camera --- langtons-ant/TODO | 5 +++ langtons-ant/ant.gd | 42 ++++++++++--------- langtons-ant/assets/ant.png | Bin 4826 -> 4013 bytes langtons-ant/assets/tile0.png | Bin 305 -> 0 bytes langtons-ant/assets/tile1.png | Bin 305 -> 0 bytes langtons-ant/assets/tiles.png | Bin 869 -> 1404 bytes langtons-ant/camera.gd | 41 ++++++++++++++++++ langtons-ant/camera.gd.uid | 1 + langtons-ant/grid.gd | 15 ++++--- langtons-ant/grid.tscn | 24 ++++++----- langtons-ant/project.godot | 23 +++++++++++ langtons-ant/tile_map_layer.gd | 73 ++++----------------------------- 12 files changed, 124 insertions(+), 100 deletions(-) create mode 100644 langtons-ant/TODO delete mode 100644 langtons-ant/assets/tile0.png delete mode 100644 langtons-ant/assets/tile1.png create mode 100644 langtons-ant/camera.gd create mode 100644 langtons-ant/camera.gd.uid diff --git a/langtons-ant/TODO b/langtons-ant/TODO new file mode 100644 index 0000000..3133743 --- /dev/null +++ b/langtons-ant/TODO @@ -0,0 +1,5 @@ +UI -> toggleButton so camera follows ant + -> reset camera button + -> pause button +customizable tile->dir->color logic (im thinking we do a dict: {tileState, (newDir, newTileCol)}) +dynamically generate tile colours (using a big palette for indexing maybe?) this probably needs to be a shader. diff --git a/langtons-ant/ant.gd b/langtons-ant/ant.gd index 0a42e4c..d4fcb0c 100644 --- a/langtons-ant/ant.gd +++ b/langtons-ant/ant.gd @@ -17,31 +17,35 @@ var cur_int: Dictionary = { TileSet.CELL_NEIGHBOR_RIGHT_SIDE: 0, TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE: 1, TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_SIDE: 2, - TileSet.CELL_NEIGHBOR_TOP_LEFT_SIDE: 3, - TileSet.CELL_NEIGHBOR_LEFT_SIDE: 4, + TileSet.CELL_NEIGHBOR_LEFT_SIDE: 3, + TileSet.CELL_NEIGHBOR_TOP_LEFT_SIDE: 4, TileSet.CELL_NEIGHBOR_TOP_RIGHT_SIDE: 5, } func _ready() -> void: - set_frame(1) - set_z_index(1) - tiles.set_tile(pos, (tiles.get_tile_colour(pos) + 1) % 2) # TODO: should probably use another dictionary + self.set_z_index(1) + self.set_frame(cur_int[dir]) + tiles.set_tile(pos, (tiles.get_tile_colour(pos))) # TODO: should probably use another dictionary move() func update() -> void: var tile: int = tiles.get_tile_colour(pos) - print("tile %s" % tile) var newFrame: int = cur_int[dir] + # TODO: turn into dict{tileCol, (nextDir, paintCol)} customizable match tile: 0: - newFrame = (newFrame + 1) % 6 + newFrame = (newFrame + 5) % tiles.numTiles 1: - newFrame = (newFrame + 1) % 6 + newFrame = (newFrame + 4) % tiles.numTiles 2: - newFrame = (newFrame + 1) % 6 + newFrame = (newFrame + 0) % tiles.numTiles 3: - newFrame = (newFrame + 5) % 6 + newFrame = (newFrame + 0) % tiles.numTiles + 4: + newFrame = (newFrame + 5) % tiles.numTiles + 5: + newFrame = (newFrame + 4) % tiles.numTiles _: pass dir = next_dir[newFrame] @@ -49,24 +53,24 @@ func update() -> void: move() pos = tiles.get_neighbor_cell(pos, dir) tile = tiles.get_tile_colour(pos) - tiles.set_tile(pos, (tile + 1) % 4) # TODO: should probably use another dictionary - set_frame(newFrame) + tiles.set_tile(pos, (tile + 1) % tiles.numTiles) # TODO: should probably use another dictionary + self.set_frame(newFrame) func move() -> void: var delta: Vector2 match dir: TileSet.CELL_NEIGHBOR_RIGHT_SIDE: - delta = Vector2(32, 0) + delta = Vector2(tiles.texSize.x, 0) TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE: - delta = Vector2(16, 24) + delta = Vector2(tiles.texSize.x/2, tiles.texSize.y/4*3) TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_SIDE: - delta = Vector2(-16, 24) + delta = Vector2(-tiles.texSize.x/2, tiles.texSize.y/4*3) TileSet.CELL_NEIGHBOR_LEFT_SIDE: - delta = Vector2(-32, 0) + delta = Vector2(-tiles.texSize.x, 0) TileSet.CELL_NEIGHBOR_TOP_LEFT_SIDE: - delta = Vector2(-16, -24) + delta = Vector2(-tiles.texSize.x/2, -tiles.texSize.y/4*3) TileSet.CELL_NEIGHBOR_TOP_RIGHT_SIDE: - delta = Vector2(16, -24) + delta = Vector2(tiles.texSize.x/2, -tiles.texSize.y/4*3) _: delta = Vector2(0,0) - translate(delta) + self.translate(delta) diff --git a/langtons-ant/assets/ant.png b/langtons-ant/assets/ant.png index e4d3132f93f525a6bdbba9f472099b05f0d88d0d..748baf030d45f08a2e8ff22b3a80941a49b7d2b5 100644 GIT binary patch delta 3915 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 Z{{WLKTZtkjkzW7+002ovPDHLkV1m*GUSI$K delta 4732 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 diff --git a/langtons-ant/assets/tile0.png b/langtons-ant/assets/tile0.png deleted file mode 100644 index 27959affe8745567272527e5ac8cbd472e167b8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%C&rs6b?Si}mUKs7M+SzC z{oH>NSwSk3J%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f-TA0 z-GyNa!y$&ykoR{%N;wNWB8wRq^pruEv0|xx8BmbD#M9T6{UtZIs0nv=w5%LZsMOQN zF(l&f+vytx4=C_3uk|_Z!ZWdRlWa(djQED$SdXRL|EEvtP+IDx9Xjh7yWhdhzrVlx z-^?1J%;f!{lf&kKwbBQc|AGg3KX|d2A2b$pIp{9O$;YbUz{nNQz$DV4ucE0HIV)(^ ovT4gD)iRgOd~OkXG-+P>s}7_4Pfzc;0CWI@r>mdKI;Vst0EanUzW@LL diff --git a/langtons-ant/assets/tile1.png b/langtons-ant/assets/tile1.png deleted file mode 100644 index a17a638c9e8b089b33bd3930c46c0729b7d1d313..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%C&rs6b?Si}mUKs7M+SzC z{oH>NSwSk3J%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f-TA0 z-GyNa!y$&ykoR{%N;wNWB8wRq^pruEv0|xx8BmbD#M9T6{UtZIsENQsyDOi7LZzNA zjv*0;-%j5sctC-Nd2P?(lAcK~H}Qp($cS&~jrCZ{{eSwT4yCOgt6gV3WA{6_`SE?*}gy^Ml5ME(hJ^IQdvL92mI*8kj^n^i?#qB4-87 nS~hLDq*~^(na?dkk0#A4SGZ=R{X4S=cW` diff --git a/langtons-ant/assets/tiles.png b/langtons-ant/assets/tiles.png index 2d398f14521cf7bc2c206b43f24f13bd5dbcb579..fa0a47edb088a1a9f7fc996bddfa2ddb3379bb18 100644 GIT binary patch delta 1298 zcma)+jaO0!7>9wYaz%)nX$F~IT3^-_zp}EFD-mTQR47-O1!iVO<}p*$ynuq@jy9Wh zq@~V2t=5uG%af-R5-K;fKsm;dk*-F1rbya{P0dF819tike$V?n=e4=b5UP9#TF?!H z!5oMd=ANQ)PD%VEq@@8Vm^wPlHCQ;PA`Cgz>*JrsPIvlmf zJ_Sw&ow;&?p-DtrhFoaAPdW_gA)(>B@6J%Pq><=PW4)3jkf4nYbj3yMd_g(LhoR64 z8B(Dp;X-tgplPbigC-xg{;_cN>`O}?O%6p(%sZ@k#v&?-oxS|o;`pj;Gx(YmqF9B! zS#>>_iYNrSRK#0OO#^JbUfY_J`>GLn=#KB#(s%^ww0av1``Jw$s@1;`*F!G&2G0x9P<$G~Yj@v`ye*(ZRP*>@Ru@f|-vJ zt^Ef8O3gr?1OJyz{+698x$oXsGhmqnyg=86(u8N(L>IuIh%G56r2yvk8%7S^hz%At z{<&Ro6|>dc*|K+iB4;eJHj|N+Ex34BtftSRgT@c;cK$x`_{vdK>y;~$J`Kj>XzgC0 zoVXu`z7mxnUFtcwuy+Mc0hXy3WBBIBC$hC%mVhDt=rb@uM%}1|BvBwM!)sd7BLW6 zJSJno@xaGOFeX_Qt}??B(!eficMh}&GcT9Q-Jv8j$XjdA7PP8vlGb;7MFna8`EW`S zHKIxHe&{^w{er}4)3k%({y!d&HxpBmOmp+`Z%iMCE;n8Nh#cIZmv*T084$>u^Q{BF zA%-KIL8b232)&cQ7H2~PQ_uZd7zXYg|MbRwa>1{BJHG$gd*Fzt=_T6GJvBGqOwO4| zJ&mPQVKb$`nte+wWZ%}_(dVCs+AGaM#V<8Hf*cpGyLxz?TQPRH{n7)y+byg}*q45# wWEi7T_hwyZZpSPgwROc+`W(#+uTA?-qMse{7Ox7t?)-h2*iBs4O{SpuU+8)~_5c6? delta 757 zcmeyv^^|RbI9CG)8v_GFR$8{yL`5Hdwj^(N7luX#MTVuXzD2&Bn59_HrLQ_gjD0@? z1Jg=R7srr_TW@de_nsXna_r-CkIg$vRt7t7Yw~6a;@sl2U}?#j3k!en?+|k`N-GE{ zc^{*}x3ENvMUj`qTQQO=&oTDQqessQtX1??w(FaJpZEK*Y|%TlMfcAuJekwnaQyW* zsa3bLHRj)Uyko!+6C2CKP*yI@P~ULaf4Ye1g7&Y+8v{Bv@V7X%SqgLsmNf>P*}&Tp z)Z#1f>YJ2Ss0F{1ymf%ahuj4Z)EO8#92l4c4jglB{MenNpn2AQ(tTAP<^z`nGcr}W zc_VqG+b><1uxG>7hmw(RNa8U*x_ss=+&Dv|^kMHGwk@&YzK}6{d^TG*{a^Q!Gw8yN^{ZG6O88H0$v-&Q3lC#+1V+&18RP=L9 zr~P*FNnC#Ph-i{<+S;_$3VMm_pVo)87aVeoE0$gr`6R?Pm;cHZTaW+$nIpekFW_LP zh+fak5GS+0vs(Vb;a`s(G+b`5J1HKP;W)~%+d(7k2Ah-SAvF%)+ssq7=CCi6uU0RT z7ieH$0Xk@nWy0rg`!@V|_V#a%g5~-W5eA!mcf7>d8u%wKe)`)X=S0#Ciz#hwPg?8O z9xICP(0sFH#tx^PLu;<)h#paWvvtlZ0Y8fq*6T|`+BBbBjj9dJ{(AX7`=%Eef2zNg zel=xCDA^?b-EKkq|KE1ZPKt-@1h^!hIcT`uV0AJ)Y$o6(Xy&-$+N;$e4{bOe{#|*8 z9poZloMrQA*vE*A>D$MgXPfltTq9G%?B~AgC$%y@cy|6eimPxt>WuvLbB(7A?tJH$ Y2w(mts^3lvn7kQ0UHx3vIVCg!0M*<}@&Et; diff --git a/langtons-ant/camera.gd b/langtons-ant/camera.gd new file mode 100644 index 0000000..34495a5 --- /dev/null +++ b/langtons-ant/camera.gd @@ -0,0 +1,41 @@ +extends Camera2D + +@export var minZoom := 0.1 +@export var maxZoom := 2.0 +@export var zoomFactor := 0.1 +@export var zoomDuration := 0.2 +var zoomLevel: float = 1 +var dragging: bool = false + +func _ready(): + pass + +func _input(event): + if event.is_action_pressed("zoomIn"): + setZoomLevel(zoomLevel + zoomFactor) + elif event.is_action_pressed("zoomOut"): + setZoomLevel(zoomLevel - zoomFactor) + elif event.is_action_pressed("resetCamera"): + reset() + +func _unhandled_input(event): + if event is InputEventMouseButton: + if event.get_button_index() == 1: + dragging = event.is_pressed() + elif event is InputEventMouseMotion: + if dragging: + self.global_position -= event.get_relative() * 1/zoomLevel + + +func setZoomLevel(level: float, mouse_world_position = self.get_global_mouse_position()): + var old_zoomLevel = zoomLevel + zoomLevel = clampf(level, minZoom, maxZoom) + + var direction = (mouse_world_position - global_position) + var new_position = self.global_position + direction - ((direction) / (zoomLevel/old_zoomLevel)) + + zoom = Vector2(zoomLevel, zoomLevel) + self.global_position = new_position + +func reset(): + self.global_position = Vector2(0, 0) diff --git a/langtons-ant/camera.gd.uid b/langtons-ant/camera.gd.uid new file mode 100644 index 0000000..eccb470 --- /dev/null +++ b/langtons-ant/camera.gd.uid @@ -0,0 +1 @@ +uid://bqjbnbfd7jlob diff --git a/langtons-ant/grid.gd b/langtons-ant/grid.gd index f154bbd..9d445ae 100644 --- a/langtons-ant/grid.gd +++ b/langtons-ant/grid.gd @@ -1,19 +1,24 @@ extends Node2D -var t: float = 0 -@export var speed: float = 58 +@export var stepSize: float = 2 @export var ant: Sprite2D @export var tiles: TileMapLayer +var t: float = -1 +var paused: bool = false # Called when the node enters the scene tree for the first time. func _ready() -> void: pass - +func _input(event): + if event.is_action_pressed("togglePause"): + paused = !paused + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: + if paused: return + t += delta - if (t > 60-speed): + if (t > stepSize/100): t = 0 ant.update() - #tiles.render_next() diff --git a/langtons-ant/grid.tscn b/langtons-ant/grid.tscn index 9a4d25b..a6ebae1 100644 --- a/langtons-ant/grid.tscn +++ b/langtons-ant/grid.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=8 format=3 uid="uid://b6xi32r3co6md"] +[gd_scene load_steps=9 format=3 uid="uid://b6xi32r3co6md"] [ext_resource type="Script" uid="uid://by3d3t5ymxl3m" path="res://grid.gd" id="1_bghhw"] [ext_resource type="Script" uid="uid://b6ll30b7xtwal" path="res://ant.gd" id="1_ebq2e"] -[ext_resource type="Texture2D" uid="uid://bnfy5vx72ux33" path="res://assets/ant.png" id="3_sle3t"] -[ext_resource type="Texture2D" uid="uid://d0v1qlkltasln" path="res://assets/tiles.png" id="4_fqc2p"] +[ext_resource type="Texture2D" uid="uid://ykvioy4g357o" path="res://assets/ant.png" id="3_sle3t"] +[ext_resource type="Texture2D" uid="uid://b8dilj6w2vq2l" path="res://assets/tiles.png" id="4_fqc2p"] [ext_resource type="Script" uid="uid://cqxfmo3hixad1" path="res://tile_map_layer.gd" id="5_fqc2p"] +[ext_resource type="Script" uid="uid://bqjbnbfd7jlob" path="res://camera.gd" id="6_g2qvd"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_g2qvd"] texture = ExtResource("4_fqc2p") @@ -17,6 +18,8 @@ texture_region_size = Vector2i(32, 32) 1:2/0 = 0 0:3/0 = 0 1:3/0 = 0 +0:4/0 = 0 +0:5/0 = 0 [sub_resource type="TileSet" id="TileSet_05i0m"] tile_shape = 3 @@ -25,8 +28,8 @@ sources/0 = SubResource("TileSetAtlasSource_g2qvd") [node name="Grid" type="Node2D" node_paths=PackedStringArray("ant", "tiles")] script = ExtResource("1_bghhw") -speed = 60.0 -ant = NodePath("ant") +stepSize = 1.0 +ant = NodePath("Ant") tiles = NodePath("TileMapLayer") [node name="TileMapLayer" type="TileMapLayer" parent="."] @@ -34,13 +37,14 @@ tile_set = SubResource("TileSet_05i0m") collision_enabled = false script = ExtResource("5_fqc2p") -[node name="Camera2D" type="Camera2D" parent="TileMapLayer"] -position = Vector2(0, -8) -scale = Vector2(0.8, 0.8) - -[node name="ant" type="Sprite2D" parent="."] +[node name="Ant" type="Sprite2D" parent="."] position = Vector2(-15.999998, 14.999998) scale = Vector2(0.8, 0.8) texture = ExtResource("3_sle3t") vframes = 6 script = ExtResource("1_ebq2e") + +[node name="Camera" type="Camera2D" parent="."] +position = Vector2(-3.8146973e-06, -8) +scale = Vector2(0.79999983, 0.79999983) +script = ExtResource("6_g2qvd") diff --git a/langtons-ant/project.godot b/langtons-ant/project.godot index 4261f85..354c558 100644 --- a/langtons-ant/project.godot +++ b/langtons-ant/project.godot @@ -18,3 +18,26 @@ config/icon="res://icon.svg" [editor_plugins] enabled=PackedStringArray("res://addons/godot-vim/plugin.cfg") + +[input] + +zoomIn={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +zoomOut={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +togglePause={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +] +} +resetCamera={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":114,"location":0,"echo":false,"script":null) +] +} diff --git a/langtons-ant/tile_map_layer.gd b/langtons-ant/tile_map_layer.gd index 72a6313..17393d4 100644 --- a/langtons-ant/tile_map_layer.gd +++ b/langtons-ant/tile_map_layer.gd @@ -1,75 +1,16 @@ extends TileMapLayer var tiles: Dictionary = {} -var idx: int = 0 -var dirs: Array[int] = [ - TileSet.CELL_NEIGHBOR_TOP_RIGHT_SIDE, - TileSet.CELL_NEIGHBOR_RIGHT_SIDE, - TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE, - TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_SIDE, - TileSet.CELL_NEIGHBOR_LEFT_SIDE, - TileSet.CELL_NEIGHBOR_TOP_LEFT_SIDE, -] +@onready var numTiles: int = get_tile_set().get_source(0).get_tiles_count() +#@onready var texSize: Vector2 = get_tile_set().get_tile_texture(get_tile_set().get_tile_id(0)) +@onready var texSize: Vector2 = Vector2(32, 32) # TODO: get from tileSet -func render_next() -> void: - print("rendering {i}") - set_cell(get_neighbor_cell(Vector2i(0, 0), dirs[idx]), 0, Vector2i(0, 1)) - idx = (idx + 1) % 6 func get_tile_colour(pos: Vector2i) -> int: - return tiles.get_or_add(pos, 0) + return self.tiles.get_or_add(pos, 0) -# TODO: state sh1ould be an enum probably +# TODO: state should be an enum probably func set_tile(pos: Vector2i, state: int) -> void: - print("setting cell (%s) at %d %d\n" % [state, pos.x, pos.y]) set_cell(pos, 0, Vector2i(0, state)) - tiles.erase(pos) - tiles.get_or_add(pos, state) - -#var direction = 0 -#var antPos = Vector2i(0,0) -#var grid = {} -#var tileSize = 16 -# -## Called when the node enters the scene tree for the first time. -#func _ready() -> void: - #set_process(true) - #grid[antPos] = 0 - #updateTile(antPos, 0) -# -#func updateTile(pos: Vector2i, col: int): - #var tileCol = Color.WHITE if col == 0 else Color.BLACK - #var tileRect = ColorRect.new() - #tileRect.color = tileCol - #tileRect.size = Vector2(tileSize, tileSize) - #tileRect.position = Vector2(pos.x * tileSize, pos.y * tileSize) - #add_child(tileRect) - # -# -## Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(delta: float) -> void: - #moveAnt() -# -#func moveAnt(): - #var curCol = grid.get(antPos, 0) - # - #if curCol == 0: - #direction = (direction + 1) % 4 - #else: - #direction = (direction + 3) % 4 - # - #grid[antPos] = 1 - curCol - #updateTile(antPos, grid[antPos]) - # - #match direction: - #0: - #antPos.y -= 1 - #1: - #antPos.x += 1 - #2: - #antPos.y += 1 - #3: - #antPos.x -= 1 - # - #if not grid.has(antPos): - #grid[antPos] = 0 + self.tiles.erase(pos) + self.tiles.get_or_add(pos, state % self.numTiles)