From acf1ed54239de348d15e338d9417b01a8d2cecac Mon Sep 17 00:00:00 2001 From: Antti Hakkarainen Date: Tue, 7 Feb 2023 19:21:51 +0200 Subject: [PATCH] camera zoom in/out & camera panning --- art/placeholder/indoors.png | Bin 0 -> 8422 bytes art/placeholder/indoors.png.import | 34 ++ art/placeholder/outdoors.png | Bin 0 -> 22593 bytes art/placeholder/outdoors.png.import | 34 ++ art/placeholder/vehicles.png | Bin 0 -> 11643 bytes art/placeholder/vehicles.png.import | 34 ++ project.godot | 38 ++ scenes/Building.tscn | 6 +- scenes/Camera_zoom_2d.tscn | 6 + scenes/Main.tscn | 529 ++++++++++++++++++++++++++-- scripts/CameraZoom2D.gd | 40 +++ scripts/Control.gd | 13 +- scripts/Globals.gd | 10 + scripts/Main.gd | 6 +- scripts/Snippets.gd | 8 + scripts/View.gd | 34 -- scripts/World.gd | 62 ++++ 17 files changed, 774 insertions(+), 80 deletions(-) create mode 100644 art/placeholder/indoors.png create mode 100644 art/placeholder/indoors.png.import create mode 100644 art/placeholder/outdoors.png create mode 100644 art/placeholder/outdoors.png.import create mode 100644 art/placeholder/vehicles.png create mode 100644 art/placeholder/vehicles.png.import create mode 100644 scenes/Camera_zoom_2d.tscn create mode 100644 scripts/CameraZoom2D.gd create mode 100644 scripts/Snippets.gd delete mode 100644 scripts/View.gd create mode 100644 scripts/World.gd diff --git a/art/placeholder/indoors.png b/art/placeholder/indoors.png new file mode 100644 index 0000000000000000000000000000000000000000..4e415a0305ecd39837563c029996dcf015e832b1 GIT binary patch literal 8422 zcmaKS2UJsSv+fQpNRc4DgQ)bbG-*MQCcTOZND&pJcQ6S}LQ%RPEfft+X;P&3js&Gk zl@^+`&>?W*_n-g#_pZCnT`OztWbZwh_nnz%=9$?$(m+pxnu3)A003$&O*JC`01>`| z0CF*l$}?HQRSEbqgt+U-o=?STf* zty*kWp!KaOBmP#KG^}*Q``Vq~q+SYjw7}4%QO)|T@DNvx5ln&?{>AA<8hUQX67KHB zpZE2GN($HnUx_+y4^JMac7oG?0)3V#cgYo0Hn;;wqHb#A>zb7h&t!C)gB#hle*S#( zU936zDlue?H5!}WnFdy`9=Go~%qoh*Q&lvhKJRL=Uf|MPfc1%J@xH%`zX$XS8YjqB zDN|JK`G;mN9t|Jh3s3R+L^Z1}02Fe{O{@YTyGMrLrg}pKK$)pnfDmzJNr2?3xIIAL zX43;e!dgd8P^u8)^wuB6b?MpEU&s)jLi*4NedxCJ&(>t7b6g;HS#S9tr&(6jw||^Y z4@r~Q$gOh3y2N<#_Vr15jdL*&?lE-ey{8WVKGK8TgIy;8q8^^nIio!Is}H^_E9_uf zo6atzLupBc@WX{SMmj936T}!t=eVAVc69>}teA6c4^|euGn1XvS)!<@Ig%}@$7e58 zmhi&zoHIz}%RMH^(QyS!1;k42_xI^yo8Nhb#G=;@qE}0lg%^&xQ>%T#zic|4kRDsY zK!D9bLu`4#Y&U@D%)|*he4f@9ef1m%9CPvX{kNRdOWhNe%`>MoE0Ox$t}8%+;D+Dv zhUiuXxWVto!SVPW<<70HHfz~il~+ObuIw{1S!)ORpQsIAWKG4SbG^0^Qii!7E)~b_ zxON_K^kep|==(k|yLbfovx+N`sX(Y0Y5aT|UeeE=`&8Ae^rQTKSaqe;_wFvgKoETJ zAYo)W=%*amDh|Yr)cW}`RSQaR&#kACDk}c6EeXC^9GBU9X^oCo6kTC~R63jiZ5~Q+ zP93U%1$7JipF|>L*U3Y9{_*NPASAUTf&7L&x#czgE<>%o-`M?Ey-KQ_!HF?0e?3bX zq#7qXhmm^qha$bzrYr_py2PFNk6Mdc+@bpOw7=;BQZq(1la?)PGgZl?W$m%SVxs6XIKe8B< z7XX0uG7oi$t|i9&B>DqZ8JRx960Vce`~lm@R-wW#NCnrHOfDrX>OeGz!X zix>6A`_>&oy_$UV#N6asel&kQ?tZ@DtZ?@t_$F9oKthv}5Z$&31z!P18XI<-$a_Io zRnmyy3V+XD>mvw-Y9-p6!H1NaRZ`~ppt-( ze=K&+Iomph12>vka*?(D1r*6dM&t1as-WM0@_^BIu=p1E6G;>Z(s5(?;GC=W^LEYl zm3g>`MM*c7^kaAw$VO;AWWEw{Bc{Q{LU2MI>(qZDsA=jHR-L8X z;|vn(FG)eqbLCwvP~wq^u|-C^xAkq@AG27Sja4zl*QFS3l%V2GuB!Yh@B=C+422q- zDG0{Su7k~J7u3V(u$L?ZOug)NGNd+E$eaT`!j$TqMCaXO5n;$D(V^m|vW>NNiu!1) zO!VX)FnOx(-}YE?^1W(gb9@MQ7MGcojBTKkx3Q6FdeOR1YvLQ~oKx%du89-q9)NIb zL>g}!>c~LmU>~G6E*b<6jfWbg#B!LlN&Y7&|Np6mU`q1P96WGCQ-?7#Dn>1{8RabK zY4My|E%`z9Cj+8^Csa2)ai5l@`aeF!ZGgOJKjACpl+WK z4QrU_KH&wM;gY}`HiTl}A(@hI|NHN8U&IBv91(o}$sluJv*0oW?9>VcI&@#tf~FK23{I_I8E$7ZA^0 zcf>pN1kNe}QwFX-?3fc_>l^_=|QZbo0t-hUh- z&aikyoVqSSDK>~dAZMJdv)b_GF2UvlHWeeFAIXS=^Qt1XrCJF3p2Yvyw3@laWG=

?ouQGf{Ob-1LBsw`s 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 literal 0 HcmV?d00001 diff --git a/art/placeholder/indoors.png.import b/art/placeholder/indoors.png.import new file mode 100644 index 0000000..5228af6 --- /dev/null +++ b/art/placeholder/indoors.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1nssojjcesom" +path="res://.godot/imported/indoors.png-0385194c4b5190bd9e7e9194dfc3e4e8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/placeholder/indoors.png" +dest_files=["res://.godot/imported/indoors.png-0385194c4b5190bd9e7e9194dfc3e4e8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/art/placeholder/outdoors.png b/art/placeholder/outdoors.png new file mode 100644 index 0000000000000000000000000000000000000000..11cfc2e606b73f2ea9e18848677df6213cd98062 GIT binary patch literal 22593 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

LxMxtXN?q&cl19I3=A9L*Hje}?;-%H zdkND`qvibw0qN$t@xv2Aj&G#lDivi2J4>oz#_7%$|Lv|q6SioJ(BJnpA;DkoL`FOl z!2^lH@)lgd{_2@+K7IdE*$TKbu;4*`wqL&THl6ZJI^sQl|c!uLl6 zw0shb6O}9djhZVdWpWZ~<$<6$cjXq}a)Dwa$9~Y~Bh?h8t>JRvE-{z#fXHtA`0DQ@ z6@6=JXA_(9VwS!A^t;Q4OO)@%7*cHkZf-L__m;0~;iKKUgu4_Y&+B2ewK%0DOo)bb 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 literal 0 HcmV?d00001 diff --git a/art/placeholder/outdoors.png.import b/art/placeholder/outdoors.png.import new file mode 100644 index 0000000..80a16d7 --- /dev/null +++ b/art/placeholder/outdoors.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dakvtfpnjuwwl" +path="res://.godot/imported/outdoors.png-7d3b490bfc156077300af39882442502.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/placeholder/outdoors.png" +dest_files=["res://.godot/imported/outdoors.png-7d3b490bfc156077300af39882442502.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/art/placeholder/vehicles.png b/art/placeholder/vehicles.png new file mode 100644 index 0000000000000000000000000000000000000000..fd50183872e646e681a77cf51e98720722666a0d GIT binary patch literal 11643 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 G9PmG1%xU5P literal 0 HcmV?d00001 diff --git a/art/placeholder/vehicles.png.import b/art/placeholder/vehicles.png.import new file mode 100644 index 0000000..d187497 --- /dev/null +++ b/art/placeholder/vehicles.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bg55nglnk8uci" +path="res://.godot/imported/vehicles.png-502f12d58ac50ed88adfdecffc422010.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/placeholder/vehicles.png" +dest_files=["res://.godot/imported/vehicles.png-502f12d58ac50ed88adfdecffc422010.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/project.godot b/project.godot index 8d533e7..0ae5a04 100644 --- a/project.godot +++ b/project.godot @@ -18,3 +18,41 @@ config/icon="res://icon.svg" [autoload] Globals="*res://scripts/Globals.gd" + +[display] + +window/size/viewport_width=1920 +window/size/viewport_height=1080 +window/size/resizable=false + +[input] + +place_building={ +"deadzone": 0.5, +"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":1,"pressed":false,"double_click":false,"script":null) +] +} +cancel={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +camera_zoom_in={ +"deadzone": 0.5, +"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,"pressed":false,"double_click":false,"script":null) +] +} +camera_zoom_out={ +"deadzone": 0.5, +"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,"pressed":false,"double_click":false,"script":null) +] +} +camera_move={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"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":0,"echo":false,"script":null) +] +} + +[rendering] + +environment/defaults/default_clear_color=Color(0.658824, 0.329412, 0, 1) diff --git a/scenes/Building.tscn b/scenes/Building.tscn index 50162ac..7fece19 100644 --- a/scenes/Building.tscn +++ b/scenes/Building.tscn @@ -3,8 +3,6 @@ [ext_resource type="Script" path="res://scenes/Building.gd" id="1_uqlnt"] [ext_resource type="Texture2D" uid="uid://dabmo11wkiwm3" path="res://art/buildings/building_grid.png" id="1_yd1tr"] -[node name="Building" type="Node2D"] -script = ExtResource("1_uqlnt") - -[node name="Sprite2D" type="Sprite2D" parent="."] +[node name="Building" type="Sprite2D"] texture = ExtResource("1_yd1tr") +script = ExtResource("1_uqlnt") diff --git a/scenes/Camera_zoom_2d.tscn b/scenes/Camera_zoom_2d.tscn new file mode 100644 index 0000000..9f4f998 --- /dev/null +++ b/scenes/Camera_zoom_2d.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://2we3txfr812u"] + +[ext_resource type="Script" path="res://scripts/CameraZoom2D.gd" id="1_ttsl2"] + +[node name="CameraZoom2D" type="Camera2D"] +script = ExtResource("1_ttsl2") diff --git a/scenes/Main.tscn b/scenes/Main.tscn index e2ad638..4fba92c 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -1,70 +1,541 @@ -[gd_scene load_steps=4 format=3 uid="uid://ciperl36hv26g"] +[gd_scene load_steps=8 format=3 uid="uid://ciperl36hv26g"] [ext_resource type="Script" path="res://scripts/Main.gd" id="1_ysxum"] -[ext_resource type="Script" path="res://scripts/View.gd" id="2_rg0qh"] [ext_resource type="Script" path="res://scripts/Control.gd" id="3_1t1c8"] +[ext_resource type="Script" path="res://scripts/World.gd" id="3_6q5ju"] +[ext_resource type="Texture2D" uid="uid://dakvtfpnjuwwl" path="res://art/placeholder/outdoors.png" id="3_yddbk"] +[ext_resource type="PackedScene" uid="uid://2we3txfr812u" path="res://scenes/Camera_zoom_2d.tscn" id="4_rx82t"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_s55i2"] +texture = ExtResource("3_yddbk") +0:0/0 = 0 +1:0/0 = 0 +2:0/0 = 0 +3:0/0 = 0 +8:0/0 = 0 +9:0/0 = 0 +10:0/0 = 0 +14:0/0 = 0 +15:0/0 = 0 +16:0/0 = 0 +17:0/0 = 0 +20:0/0 = 0 +21:0/0 = 0 +22:0/0 = 0 +23:0/0 = 0 +24:0/0 = 0 +25:0/0 = 0 +26:0/0 = 0 +27:0/0 = 0 +0:1/0 = 0 +1:1/0 = 0 +2:1/0 = 0 +3:1/0 = 0 +8:1/0 = 0 +9:1/0 = 0 +10:1/0 = 0 +14:1/0 = 0 +15:1/0 = 0 +16:1/0 = 0 +17:1/0 = 0 +21:1/0 = 0 +23:1/0 = 0 +25:1/0 = 0 +27:1/0 = 0 +28:1/0 = 0 +0:2/0 = 0 +1:2/0 = 0 +2:2/0 = 0 +3:2/0 = 0 +8:2/0 = 0 +9:2/0 = 0 +10:2/0 = 0 +11:2/0 = 0 +12:2/0 = 0 +13:2/0 = 0 +18:2/0 = 0 +19:2/0 = 0 +21:2/0 = 0 +22:2/0 = 0 +23:2/0 = 0 +24:2/0 = 0 +25:2/0 = 0 +27:2/0 = 0 +28:2/0 = 0 +0:3/0 = 0 +1:3/0 = 0 +2:3/0 = 0 +3:3/0 = 0 +8:3/0 = 0 +9:3/0 = 0 +10:3/0 = 0 +11:3/0 = 0 +12:3/0 = 0 +13:3/0 = 0 +18:3/0 = 0 +19:3/0 = 0 +21:3/0 = 0 +23:3/0 = 0 +25:3/0 = 0 +0:4/0 = 0 +1:4/0 = 0 +2:4/0 = 0 +3:4/0 = 0 +8:4/0 = 0 +9:4/0 = 0 +10:4/0 = 0 +11:4/0 = 0 +12:4/0 = 0 +13:4/0 = 0 +18:4/0 = 0 +19:4/0 = 0 +20:4/0 = 0 +21:4/0 = 0 +22:4/0 = 0 +23:4/0 = 0 +24:4/0 = 0 +25:4/0 = 0 +26:4/0 = 0 +27:4/0 = 0 +28:4/0 = 0 +0:5/0 = 0 +1:5/0 = 0 +2:5/0 = 0 +3:5/0 = 0 +8:5/0 = 0 +9:5/0 = 0 +10:5/0 = 0 +11:5/0 = 0 +12:5/0 = 0 +13:5/0 = 0 +18:5/0 = 0 +19:5/0 = 0 +20:5/0 = 0 +21:5/0 = 0 +22:5/0 = 0 +23:5/0 = 0 +24:5/0 = 0 +25:5/0 = 0 +26:5/0 = 0 +27:5/0 = 0 +28:5/0 = 0 +0:6/0 = 0 +1:6/0 = 0 +2:6/0 = 0 +3:6/0 = 0 +8:6/0 = 0 +9:6/0 = 0 +10:6/0 = 0 +11:6/0 = 0 +14:6/0 = 0 +15:6/0 = 0 +16:6/0 = 0 +17:6/0 = 0 +20:6/0 = 0 +21:6/0 = 0 +22:6/0 = 0 +23:6/0 = 0 +24:6/0 = 0 +25:6/0 = 0 +27:6/0 = 0 +28:6/0 = 0 +0:7/0 = 0 +1:7/0 = 0 +2:7/0 = 0 +3:7/0 = 0 +8:7/0 = 0 +9:7/0 = 0 +10:7/0 = 0 +11:7/0 = 0 +14:7/0 = 0 +15:7/0 = 0 +16:7/0 = 0 +17:7/0 = 0 +20:7/0 = 0 +21:7/0 = 0 +24:7/0 = 0 +25:7/0 = 0 +26:7/0 = 0 +27:7/0 = 0 +0:8/0 = 0 +1:8/0 = 0 +2:8/0 = 0 +3:8/0 = 0 +8:8/0 = 0 +9:8/0 = 0 +10:8/0 = 0 +11:8/0 = 0 +12:8/0 = 0 +13:8/0 = 0 +14:8/0 = 0 +15:8/0 = 0 +16:8/0 = 0 +17:8/0 = 0 +18:8/0 = 0 +19:8/0 = 0 +20:8/0 = 0 +21:8/0 = 0 +22:8/0 = 0 +23:8/0 = 0 +24:8/0 = 0 +25:8/0 = 0 +26:8/0 = 0 +27:8/0 = 0 +0:9/0 = 0 +1:9/0 = 0 +2:9/0 = 0 +3:9/0 = 0 +8:9/0 = 0 +9:9/0 = 0 +10:9/0 = 0 +11:9/0 = 0 +12:9/0 = 0 +13:9/0 = 0 +14:9/0 = 0 +15:9/0 = 0 +16:9/0 = 0 +17:9/0 = 0 +18:9/0 = 0 +19:9/0 = 0 +22:9/0 = 0 +23:9/0 = 0 +26:9/0 = 0 +27:9/0 = 0 +0:10/0 = 0 +1:10/0 = 0 +2:10/0 = 0 +3:10/0 = 0 +8:10/0 = 0 +9:10/0 = 0 +10:10/0 = 0 +12:10/0 = 0 +13:10/0 = 0 +14:10/0 = 0 +15:10/0 = 0 +16:10/0 = 0 +17:10/0 = 0 +18:10/0 = 0 +19:10/0 = 0 +22:10/0 = 0 +23:10/0 = 0 +26:10/0 = 0 +27:10/0 = 0 +0:11/0 = 0 +8:11/0 = 0 +9:11/0 = 0 +10:11/0 = 0 +12:11/0 = 0 +13:11/0 = 0 +14:11/0 = 0 +15:11/0 = 0 +16:11/0 = 0 +17:11/0 = 0 +18:11/0 = 0 +19:11/0 = 0 +20:11/0 = 0 +21:11/0 = 0 +22:11/0 = 0 +23:11/0 = 0 +24:11/0 = 0 +25:11/0 = 0 +26:11/0 = 0 +0:12/0 = 0 +8:12/0 = 0 +9:12/0 = 0 +10:12/0 = 0 +11:12/0 = 0 +12:12/0 = 0 +13:12/0 = 0 +14:12/0 = 0 +15:12/0 = 0 +16:12/0 = 0 +17:12/0 = 0 +18:12/0 = 0 +19:12/0 = 0 +21:12/0 = 0 +22:12/0 = 0 +24:12/0 = 0 +25:12/0 = 0 +26:12/0 = 0 +0:13/0 = 0 +8:13/0 = 0 +9:13/0 = 0 +10:13/0 = 0 +11:13/0 = 0 +12:13/0 = 0 +13:13/0 = 0 +14:13/0 = 0 +15:13/0 = 0 +16:13/0 = 0 +17:13/0 = 0 +18:13/0 = 0 +19:13/0 = 0 +21:13/0 = 0 +22:13/0 = 0 +24:13/0 = 0 +25:13/0 = 0 +26:13/0 = 0 +0:14/0 = 0 +8:14/0 = 0 +9:14/0 = 0 +10:14/0 = 0 +11:14/0 = 0 +12:14/0 = 0 +13:14/0 = 0 +14:14/0 = 0 +15:14/0 = 0 +16:14/0 = 0 +17:14/0 = 0 +18:14/0 = 0 +19:14/0 = 0 +24:14/0 = 0 +10:15/0 = 0 +11:15/0 = 0 +12:15/0 = 0 +13:15/0 = 0 +14:15/0 = 0 +15:15/0 = 0 +16:15/0 = 0 +17:15/0 = 0 +18:15/0 = 0 +19:15/0 = 0 +21:15/0 = 0 +22:15/0 = 0 +23:15/0 = 0 +24:15/0 = 0 +25:15/0 = 0 +26:15/0 = 0 +27:15/0 = 0 +28:15/0 = 0 +21:16/0 = 0 +22:16/0 = 0 +23:16/0 = 0 +24:16/0 = 0 +25:16/0 = 0 +26:16/0 = 0 +27:16/0 = 0 +28:16/0 = 0 +21:17/0 = 0 +22:17/0 = 0 +23:17/0 = 0 +24:17/0 = 0 +25:17/0 = 0 +26:17/0 = 0 +27:17/0 = 0 +28:17/0 = 0 +8:18/0 = 0 +9:18/0 = 0 +10:18/0 = 0 +11:18/0 = 0 +21:18/0 = 0 +22:18/0 = 0 +23:18/0 = 0 +24:18/0 = 0 +25:18/0 = 0 +26:18/0 = 0 +27:18/0 = 0 +28:18/0 = 0 +8:19/0 = 0 +11:19/0 = 0 +21:19/0 = 0 +22:19/0 = 0 +23:19/0 = 0 +24:19/0 = 0 +25:19/0 = 0 +26:19/0 = 0 +27:19/0 = 0 +28:19/0 = 0 +8:20/0 = 0 +9:20/0 = 0 +10:20/0 = 0 +11:20/0 = 0 +21:20/0 = 0 +22:20/0 = 0 +23:20/0 = 0 +24:20/0 = 0 +25:20/0 = 0 +26:20/0 = 0 +27:20/0 = 0 +28:20/0 = 0 +9:21/0 = 0 +10:21/0 = 0 +11:21/0 = 0 +21:21/0 = 0 +22:21/0 = 0 +23:21/0 = 0 +24:21/0 = 0 +25:21/0 = 0 +26:21/0 = 0 +27:21/0 = 0 +28:21/0 = 0 +9:22/0 = 0 +10:22/0 = 0 +21:22/0 = 0 +22:22/0 = 0 +23:22/0 = 0 +24:22/0 = 0 +25:22/0 = 0 +26:22/0 = 0 +27:22/0 = 0 +28:22/0 = 0 +21:23/0 = 0 +22:23/0 = 0 +23:23/0 = 0 +24:23/0 = 0 +21:24/0 = 0 +22:24/0 = 0 +23:24/0 = 0 +24:24/0 = 0 +7:0/size_in_atlas = Vector2i(1, 3) +7:0/0 = 0 +7:3/0 = 0 +4:3/size_in_atlas = Vector2i(3, 1) +4:3/0 = 0 +4:0/size_in_atlas = Vector2i(3, 3) +4:0/0 = 0 +13:18/size_in_atlas = Vector2i(2, 5) +13:18/0 = 0 +12:20/size_in_atlas = Vector2i(1, 3) +12:20/0 = 0 +15:20/size_in_atlas = Vector2i(1, 3) +15:20/0 = 0 +4:24/size_in_atlas = Vector2i(3, 3) +4:24/0 = 0 +4:27/size_in_atlas = Vector2i(3, 1) +4:27/0 = 0 +7:27/0 = 0 +7:24/size_in_atlas = Vector2i(1, 3) +7:24/0 = 0 +4:20/size_in_atlas = Vector2i(3, 3) +4:20/0 = 0 +4:23/size_in_atlas = Vector2i(3, 1) +4:23/0 = 0 +7:23/0 = 0 +7:20/size_in_atlas = Vector2i(1, 3) +7:20/0 = 0 +4:16/size_in_atlas = Vector2i(3, 3) +4:16/0 = 0 +4:19/size_in_atlas = Vector2i(3, 1) +4:19/0 = 0 +7:19/0 = 0 +7:16/size_in_atlas = Vector2i(1, 3) +7:16/0 = 0 +7:15/0 = 0 +4:15/size_in_atlas = Vector2i(3, 1) +4:15/0 = 0 +4:12/size_in_atlas = Vector2i(3, 3) +4:12/0 = 0 +7:12/size_in_atlas = Vector2i(1, 3) +7:12/0 = 0 +4:4/size_in_atlas = Vector2i(3, 3) +4:4/0 = 0 +7:4/size_in_atlas = Vector2i(1, 3) +7:4/0 = 0 +7:7/0 = 0 +4:7/size_in_atlas = Vector2i(3, 1) +4:7/0 = 0 +4:8/size_in_atlas = Vector2i(3, 3) +4:8/0 = 0 +7:8/size_in_atlas = Vector2i(1, 3) +7:8/0 = 0 +7:11/0 = 0 +4:11/size_in_atlas = Vector2i(3, 1) +4:11/0 = 0 +8:15/size_in_atlas = Vector2i(2, 3) +8:15/0 = 0 +10:16/size_in_atlas = Vector2i(3, 2) +10:16/0 = 0 +13:16/size_in_atlas = Vector2i(3, 2) +13:16/0 = 0 +16:16/size_in_atlas = Vector2i(2, 2) +16:16/0 = 0 +14:2/size_in_atlas = Vector2i(4, 4) +14:2/0 = 0 + +[sub_resource type="TileSet" id="TileSet_t3bbo"] +sources/1 = SubResource("TileSetAtlasSource_s55i2") [node name="Main" type="Node"] script = ExtResource("1_ysxum") -[node name="View" type="Node2D" parent="."] -script = ExtResource("2_rg0qh") +[node name="World" type="TileMap" parent="."] +tile_set = SubResource("TileSet_t3bbo") +format = 2 +layer_0/name = "Buildings" +script = ExtResource("3_6q5ju") -[node name="Control" type="Control" parent="."] +[node name="CameraZoom2D" parent="World" instance=ExtResource("4_rx82t")] +position = Vector2(960, 536) +limit_left = -40000 +limit_top = -40000 +limit_right = 40000 +limit_bottom = 40000 +editor_draw_limits = true + +[node name="UILayer" type="CanvasLayer" parent="."] + +[node name="Control" type="Control" parent="UILayer"] layout_mode = 3 -anchor_right = 0.193 -anchor_bottom = 0.299 -offset_left = 265.0 -offset_top = 243.0 -offset_right = 82.664 -offset_bottom = 89.248 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +grow_horizontal = 2 script = ExtResource("3_1t1c8") +metadata/_edit_use_anchors_ = true -[node name="ConstructionPanel" type="Panel" parent="Control"] +[node name="ConstructionPanel" type="Panel" parent="UILayer/Control"] +custom_minimum_size = Vector2(500, 100) layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 +offset_left = -248.0 +offset_right = 252.0 +offset_bottom = 120.0 -[node name="button_residental" type="Button" parent="Control/ConstructionPanel"] +[node name="button_residental" type="Button" parent="UILayer/Control/ConstructionPanel"] layout_mode = 0 offset_right = 8.0 offset_bottom = 8.0 -[node name="button_commercial" type="Button" parent="Control/ConstructionPanel"] +[node name="button_commercial" type="Button" parent="UILayer/Control/ConstructionPanel"] layout_mode = 0 offset_right = 8.0 offset_bottom = 8.0 -[node name="button_industrial" type="Button" parent="Control/ConstructionPanel"] +[node name="button_industrial" type="Button" parent="UILayer/Control/ConstructionPanel"] layout_mode = 0 offset_right = 8.0 offset_bottom = 8.0 -[node name="button_roads" type="Button" parent="Control/ConstructionPanel"] +[node name="button_roads" type="Button" parent="UILayer/Control/ConstructionPanel"] layout_mode = 0 offset_right = 8.0 offset_bottom = 8.0 -[node name="button_demolish" type="Button" parent="Control/ConstructionPanel"] +[node name="button_demolish" type="Button" parent="UILayer/Control/ConstructionPanel"] layout_mode = 0 offset_right = 8.0 offset_bottom = 8.0 -[node name="button_services" type="Button" parent="Control/ConstructionPanel"] +[node name="button_services" type="Button" parent="UILayer/Control/ConstructionPanel"] layout_mode = 0 offset_right = 8.0 offset_bottom = 8.0 -[node name="button_social" type="Button" parent="Control/ConstructionPanel"] +[node name="button_social" type="Button" parent="UILayer/Control/ConstructionPanel"] layout_mode = 0 offset_right = 8.0 offset_bottom = 8.0 -[connection signal="button_pressed" from="Control" to="View" method="_on_control_button_pressed"] -[connection signal="pressed" from="Control/ConstructionPanel/button_residental" to="Control" method="_on_button_residental_pressed"] -[connection signal="pressed" from="Control/ConstructionPanel/button_commercial" to="Control" method="_on_button_commercial_pressed"] -[connection signal="pressed" from="Control/ConstructionPanel/button_industrial" to="Control" method="_on_button_industrial_pressed"] -[connection signal="pressed" from="Control/ConstructionPanel/button_roads" to="Control" method="_on_button_roads_pressed"] -[connection signal="pressed" from="Control/ConstructionPanel/button_demolish" to="Control" method="_on_button_demolish_pressed"] -[connection signal="pressed" from="Control/ConstructionPanel/button_services" to="Control" method="_on_button_services_pressed"] -[connection signal="pressed" from="Control/ConstructionPanel/button_social" to="Control" method="_on_button_social_pressed"] +[node name="DebugInfo" type="Label" parent="UILayer/Control"] +offset_left = 568.0 +offset_top = 24.0 +offset_right = 928.0 +offset_bottom = 280.0 + +[connection signal="button_pressed" from="UILayer/Control" to="World" method="_on_control_button_pressed"] +[connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_residental" to="UILayer/Control" method="_on_button_residental_pressed"] +[connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_commercial" to="UILayer/Control" method="_on_button_commercial_pressed"] +[connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_industrial" to="UILayer/Control" method="_on_button_industrial_pressed"] +[connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_roads" to="UILayer/Control" method="_on_button_roads_pressed"] +[connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_demolish" to="UILayer/Control" method="_on_button_demolish_pressed"] +[connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_services" to="UILayer/Control" method="_on_button_services_pressed"] +[connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_social" to="UILayer/Control" method="_on_button_social_pressed"] diff --git a/scripts/CameraZoom2D.gd b/scripts/CameraZoom2D.gd new file mode 100644 index 0000000..b04f130 --- /dev/null +++ b/scripts/CameraZoom2D.gd @@ -0,0 +1,40 @@ +# Class handles the camera zoom and movement in the game +class_name CameraZoom2D +extends Camera2D + +var _zoom_level : float = 1.0 : set = _set_zoom_level +var is_dragging_camera = false +var tween + +func _set_zoom_level(value: float) -> void: + _zoom_level = clamp(value, Globals.CAMERA_MIN_ZOOM_LEVEL, Globals.CAMERA_MAX_ZOOM_LEVEL) + + #interpolate frames between zoom levels to make zooming look smoother + tween = get_tree().create_tween() + tween.tween_property( + self, + "zoom", + Vector2(_zoom_level, _zoom_level), + Globals.CAMERA_ZOOM_DURATION + ) + +func _unhandled_input(event): + # camera zooming + if event.is_action_pressed("camera_zoom_in"): + _set_zoom_level(_zoom_level - Globals.CAMERA_ZOOM_FACTOR) + elif event.is_action_pressed("camera_zoom_out"): + _set_zoom_level(_zoom_level + Globals.CAMERA_ZOOM_DURATION) + + # camera dragging + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT: + if !is_dragging_camera and event.pressed: + is_dragging_camera = true + if is_dragging_camera and !event.pressed: + is_dragging_camera = false + + if event is InputEventMouseMotion and is_dragging_camera: + if self.position != event.position: + tween = get_tree().create_tween() + tween.tween_property(self, "property", Vector2(self.position, event.position), Globals.CAMERA_ZOOM_DURATION) + else: + self.position = event.position * Globals.CAMERA_DRAG_MULTI diff --git a/scripts/Control.gd b/scripts/Control.gd index 7d78732..0a6a9e5 100644 --- a/scripts/Control.gd +++ b/scripts/Control.gd @@ -3,8 +3,7 @@ extends Control # var view = get_node("../View") signal button_pressed(button_name) - -var BUTTON_SIZE = Vector2i(50,50) +@onready var debug_info = get_node("DebugInfo") # name, position var buttons = { @@ -19,18 +18,12 @@ var buttons = { # Called when the node enters the scene tree for the first time. func _ready(): - adjust_construction_panel() - $ConstructionPanel.set_size(Vector2(500, 120)) create_buttons() # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): - pass + debug_info.set_text(str(get_viewport().get_mouse_position())) -func adjust_construction_panel(): - $ConstructionPanel.set_size(Vector2i(500, 120)) - $ConstructionPanel.set_position(Vector2i(0, -200)) - # defines construction toolbar buttons func create_buttons(): for button in buttons: @@ -40,7 +33,7 @@ func create_buttons(): if(!node_path): push_error("Error: Button '" + button + "' not found when trying to set it's properties in Control.gd!") - node_path.set_size(BUTTON_SIZE) + node_path.set_size(Globals.GUI_BUILD_BUTTON_SIZE) node_path.set_position(values[0]) node_path.set_anchor(SIDE_TOP, anchor_top) node_path.set_text(values[1]) diff --git a/scripts/Globals.gd b/scripts/Globals.gd index 9065ed8..878e59b 100644 --- a/scripts/Globals.gd +++ b/scripts/Globals.gd @@ -4,6 +4,10 @@ const SCENE_PATH:String = "res://scenes/" const ART_PATH:String = "res://art/" const SCRIPT_PATH:String = "res://scripts" +const GUI_BUILD_BUTTON_SIZE_X: int = 50 +const GUI_BUILD_BUTTON_SIZE_Y: int = 50 +const GUI_BUILD_BUTTON_SIZE: Vector2i = Vector2i(GUI_BUILD_BUTTON_SIZE_X,GUI_BUILD_BUTTON_SIZE_Y) + const DEFAULT_X_RES:int = 1920 const DEFAULT_Y_RES:int = 1080 @@ -15,3 +19,9 @@ const TYPE_SOCIAL = "social" const TYPE_POWERPLANT = "powerplant" const TYPE_ROADS = "roads" const TYPE_DEMOLISH = "demolish" + +const CAMERA_MIN_ZOOM_LEVEL: float = 0.5 +const CAMERA_MAX_ZOOM_LEVEL: float = 2.0 +const CAMERA_ZOOM_FACTOR: float = 0.1 +const CAMERA_ZOOM_DURATION: float = 0.1 +const CAMERA_DRAG_MULTI:float = 2.0 diff --git a/scripts/Main.gd b/scripts/Main.gd index 3fa9006..7e02cfe 100644 --- a/scripts/Main.gd +++ b/scripts/Main.gd @@ -1,6 +1,6 @@ -# - "Cube Clicker 2000" where you click a spot and a cube appears there. -# - Then add different shapes or colors of cubes. -# - Then clamp their positions to be on a grid. +# OK - "Cube Clicker 2000" where you click a spot and a cube appears there. +# OK - Then add different shapes or colors of cubes. +# OK - Then clamp their positions to be on a grid. # - Then make it so that when you add yellow cubes, yellow desire meter goes down and green meter goes up. # - Then click a bunch of grey cubes in a row and have them automatically flatten out into flat grey cubes (roads). # - Then click and drag to draw the lines of grey cubes. diff --git a/scripts/Snippets.gd b/scripts/Snippets.gd new file mode 100644 index 0000000..94aaa8a --- /dev/null +++ b/scripts/Snippets.gd @@ -0,0 +1,8 @@ +extends Node + + +# Called when the node enters the scene tree for the first time. +func placeholder(): + # print all children of the node + for _i in self.get_children(): + print(_i diff --git a/scripts/View.gd b/scripts/View.gd deleted file mode 100644 index 00844a9..0000000 --- a/scripts/View.gd +++ /dev/null @@ -1,34 +0,0 @@ -extends Node2D - -var gui -var building - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(_delta): - pass - - -func _on_control_button_pressed(button_name): - # create new building, in Building node it is attached to mouse cursor - var scene = load(Globals.SCENE_PATH + "Building.tscn") - building = scene.instantiate() - add_child(building) - - #for _i in self.get_children(): - # print(_i) - - # stop processing the sprite (fix it in place). no idea if it is a good idea yet.. - - - # print(button_name + " button pressed in Control! :-0") - -func _input(event): - # places the building on cursor. a bad way! - if Input.is_anything_pressed() and building != null: - building.set_process(false) - building = null - # print(event.as_text()) diff --git a/scripts/World.gd b/scripts/World.gd new file mode 100644 index 0000000..db1fd1d --- /dev/null +++ b/scripts/World.gd @@ -0,0 +1,62 @@ +extends TileMap + +var building : bool = false +var building_type: String +var tilemap: Vector2i +#var scene + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta): + pass + + +func _on_control_button_pressed(type): + # create new building, in Building node it is attached to mouse cursor + #scene = load(Globals.SCENE_PATH + "Building.tscn") + #building = scene.instantiate() + #add_child(building) + self.building = true + self.building_type = type + + #print(button_name + " button pressed in Control! :-0") + pass + +func _input(event): + # place the building + if event.is_action_pressed("place_building") and building != false: + # stop processing the sprite (fix it in place). no idea if it is a good idea yet.. + #building.set_process(false) + building = false + place_building_to_map() + + # cancel placement + if event.is_action_pressed("cancel"): + if building != false: + pass + + +func place_building_to_map(): + + match building_type: + Globals.TYPE_RESIDENTIAL: + tilemap = Vector2i(4,4) + Globals.TYPE_COMMERCIAL: + tilemap = Vector2i(4,12) + Globals.TYPE_INDUSTRIAL: + tilemap = Vector2i(4,20) + Globals.TYPE_ROADS: + tilemap = Vector2i(14,2) + Globals.TYPE_DEMOLISH: + tilemap = Vector2i(4,4) + Globals.TYPE_SERVICES: + tilemap = Vector2i(4,8) + Globals.TYPE_SOCIAL: + tilemap = Vector2i(4,0) + _: #default + tilemap = Vector2i(16,16) + + set_cell(0, local_to_map(get_viewport().get_mouse_position()), 1, tilemap, 0)