From 9d853dd4f3bda4a44d74beaaddc5878126212a09 Mon Sep 17 00:00:00 2001 From: Kilokem Date: Mon, 17 Mar 2025 11:30:18 +0100 Subject: [PATCH] ArcherTower and Arrows --- Assets/Bullets/arrow.png | Bin 0 -> 970 bytes Assets/Bullets/arrow.png.import | 34 +++++++++++++ Game/Bullets/arrow.tscn | 19 +++++++ Game/Bullets/bullet.gd | 35 +++++++++++++ Game/Bullets/bullet.gd.uid | 1 + Game/Maps/map_1.gd | 4 +- Game/Mobs/cobold.tscn | 1 + Game/Mobs/enemy.gd | 7 +++ Game/Mobs/forkman.tscn | 1 + Game/Mobs/ork.tscn | 1 + Game/Towers/archer_tower.tscn | 85 ++++++++++++++++++++++++++++++++ Game/Towers/towers.gd | 55 +++++++++++++++++++++ Game/Towers/towers.gd.uid | 1 + Game/sidepanel.gd | 11 +++++ 14 files changed, 253 insertions(+), 2 deletions(-) create mode 100644 Assets/Bullets/arrow.png create mode 100644 Assets/Bullets/arrow.png.import create mode 100644 Game/Bullets/arrow.tscn create mode 100644 Game/Bullets/bullet.gd create mode 100644 Game/Bullets/bullet.gd.uid create mode 100644 Game/Towers/archer_tower.tscn create mode 100644 Game/Towers/towers.gd create mode 100644 Game/Towers/towers.gd.uid diff --git a/Assets/Bullets/arrow.png b/Assets/Bullets/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..3172280361da7359579be2ed1838753c6489da79 GIT binary patch literal 970 zcmaJ=&2G~`5He!paYV9@lmbg7t z+;|2apyI*}aX_eNUIB?`pp_6;7^g|#Kv>z{ozeGwGqW>((`-ClT6nM^Nz#(DLtC(4 zhxhia;`?p*ybarZVRuEF_r=IdnY0z~9z#y#4OokL!STy4Y#m5A>~uxf-8Fq4$zFkx z^C$tfB&~1ciRT|MfqHBZ#uonm=^Udlu<%~RRo$e9C8v)*Ug4S~r z1R^Fplt+hgX66zZ&b+zLixh&ZtDRZ?BIiE2D$s3Mn3zDfwvb(ySIbe%j#no2Z9 zg-0)uRkNa-+8UZH4AIh{Z?XE9mm4U zOL4Y5RiG^M(=ZVsk5QrM_4tvnFl2gFLX^y8<7{$GaA8XBB?^(%qNFL%b^i~Iq8U09 zE%qnhe+p-v@$a27!>3%3{0a+%KBQhu9gWU#I~zcHELR2)mAIUHl^h$mva9oVzHQV zgBjOQ=W>fth!TiQSsK1#K|SRW8kcN_^K+qd^(Ne4ZZ1`OE?0qMl%lbJHG1lT=_!u0 zu?1r`_$-ELPhqUjo_(ysFR|F%?bw$;FFw4m7w@e6f_3@13;r9T)o6nyZLYlg0rowI oZgujnz5RZ#cUr4sa<{yBdQG}{Avx!7r87WCj@_W|xA$NF1`}Z{PXGV_ literal 0 HcmV?d00001 diff --git a/Assets/Bullets/arrow.png.import b/Assets/Bullets/arrow.png.import new file mode 100644 index 0000000..ce7f06a --- /dev/null +++ b/Assets/Bullets/arrow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqdblby54pv2s" +path="res://.godot/imported/arrow.png-356b4401c295e7e562eff933a2cd1c46.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Bullets/arrow.png" +dest_files=["res://.godot/imported/arrow.png-356b4401c295e7e562eff933a2cd1c46.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/Game/Bullets/arrow.tscn b/Game/Bullets/arrow.tscn new file mode 100644 index 0000000..7879f43 --- /dev/null +++ b/Game/Bullets/arrow.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=4 format=3 uid="uid://bjihbmnkq0n3b"] + +[ext_resource type="Texture2D" uid="uid://bqdblby54pv2s" path="res://Assets/Bullets/arrow.png" id="1_v0wue"] +[ext_resource type="Script" uid="uid://dqvdgdobuo2rf" path="res://Game/Bullets/bullet.gd" id="1_wft0c"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_wft0c"] +size = Vector2(3, 16) + +[node name="Arrow" type="Node2D"] +script = ExtResource("1_wft0c") + +[node name="CharacterBody2D" type="CharacterBody2D" parent="."] +collision_mask = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D"] +shape = SubResource("RectangleShape2D_wft0c") + +[node name="Sprite2D" type="Sprite2D" parent="CharacterBody2D"] +texture = ExtResource("1_v0wue") diff --git a/Game/Bullets/bullet.gd b/Game/Bullets/bullet.gd new file mode 100644 index 0000000..daccc9b --- /dev/null +++ b/Game/Bullets/bullet.gd @@ -0,0 +1,35 @@ +extends Node2D + +var target +var speed +var hitpoint + +func set_targe(_target : Node2D) -> void: + target = _target + +func set_speed(_speed: int) -> void: + speed = _speed + +func set_hitpoint(_hitpoint: int) -> void: + hitpoint = _hitpoint + +func _process(delta: float) -> void: + if target and speed > 0: + # Get the direction vector from the bullet to the target + var direction = (target.get_parent().get_parent().get_position() - position).normalized() + + # Rotate the bullet to face the target + rotation = direction.angle() + deg_to_rad(90) + + # Move the bullet towards the target + position += direction * speed * delta + + if position.distance_to(target.get_parent().get_parent().position) <= 5: + target_reached() + else: + queue_free() + + +func target_reached() -> void: + target.get_parent().enemy_hurt(hitpoint) + queue_free() diff --git a/Game/Bullets/bullet.gd.uid b/Game/Bullets/bullet.gd.uid new file mode 100644 index 0000000..fa59910 --- /dev/null +++ b/Game/Bullets/bullet.gd.uid @@ -0,0 +1 @@ +uid://dqvdgdobuo2rf diff --git a/Game/Maps/map_1.gd b/Game/Maps/map_1.gd index 75a12a3..02617c0 100644 --- a/Game/Maps/map_1.gd +++ b/Game/Maps/map_1.gd @@ -8,7 +8,7 @@ const COBOLD = preload("res://Game/Mobs/cobold.tscn") const enemies = [FORKMAN, COBOLD, ORK] -var lives = 2 +var lives = 20 func _ready() -> void: get_node("SidePanel").Update_Lives(lives) @@ -27,7 +27,7 @@ func spawnMonster(): func decrease_life(damage) -> void: lives -= damage get_node("SidePanel").Update_Lives(lives) - if lives == 0: + if lives <= 0: game_over() func game_over()-> void: diff --git a/Game/Mobs/cobold.tscn b/Game/Mobs/cobold.tscn index c7373d4..5c2ae93 100644 --- a/Game/Mobs/cobold.tscn +++ b/Game/Mobs/cobold.tscn @@ -195,6 +195,7 @@ corner_radius_bottom_left = 20 script = ExtResource("1_ssdee") [node name="CharacterBody2D" type="CharacterBody2D" parent="."] +collision_layer = 3 [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="CharacterBody2D"] position = Vector2(10, 0) diff --git a/Game/Mobs/enemy.gd b/Game/Mobs/enemy.gd index 2aa78f9..0bf11d6 100644 --- a/Game/Mobs/enemy.gd +++ b/Game/Mobs/enemy.gd @@ -49,16 +49,19 @@ func move_character(delta: float) -> void: func set_character_data(): match self.name: "Forkman": + self.name = "Forkman-" + str(randi()) speed = 120 health = 100 shield = 100 damage = 2 "Ork": + self.name = "Ork-" + str(randi()) speed = 80 health = 150 shield = 100 damage = 5 "Cobold": + self.name = "Cobold-" + str(randi()) speed = 200 health = 50 shield = 0 @@ -132,3 +135,7 @@ func Collision_Handler(body: Node2D): enemy_hurt(100) body.get_parent().Explode_Mine() + +func get_progress(): + return get_parent().get_progress() + diff --git a/Game/Mobs/forkman.tscn b/Game/Mobs/forkman.tscn index 05cdbbc..9c92342 100644 --- a/Game/Mobs/forkman.tscn +++ b/Game/Mobs/forkman.tscn @@ -196,6 +196,7 @@ corner_radius_bottom_left = 20 script = ExtResource("1_pq2md") [node name="CharacterBody2D" type="CharacterBody2D" parent="."] +collision_layer = 3 [node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D"] scale = Vector2(0.5, 0.5) diff --git a/Game/Mobs/ork.tscn b/Game/Mobs/ork.tscn index dcba724..b874e5a 100644 --- a/Game/Mobs/ork.tscn +++ b/Game/Mobs/ork.tscn @@ -195,6 +195,7 @@ corner_radius_bottom_left = 20 script = ExtResource("1_1ecd4") [node name="CharacterBody2D" type="CharacterBody2D" parent="."] +collision_layer = 3 [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="CharacterBody2D"] position = Vector2(10, 0) diff --git a/Game/Towers/archer_tower.tscn b/Game/Towers/archer_tower.tscn new file mode 100644 index 0000000..6269fce --- /dev/null +++ b/Game/Towers/archer_tower.tscn @@ -0,0 +1,85 @@ +[gd_scene load_steps=12 format=3 uid="uid://brugqnquwjrkt"] + +[ext_resource type="Texture2D" uid="uid://fxf6wd4317fb" path="res://Assets/Towers/4.png" id="1_1544k"] +[ext_resource type="Script" uid="uid://dil41a1ymo0ua" path="res://Game/Towers/towers.gd" id="1_ssiuv"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_ssiuv"] +atlas = ExtResource("1_1544k") +region = Rect2(0, 0, 70, 130) + +[sub_resource type="AtlasTexture" id="AtlasTexture_be2t6"] +atlas = ExtResource("1_1544k") +region = Rect2(70, 0, 70, 130) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ambw7"] +atlas = ExtResource("1_1544k") +region = Rect2(140, 0, 70, 130) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mkf4u"] +atlas = ExtResource("1_1544k") +region = Rect2(210, 0, 70, 130) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wwkyq"] +atlas = ExtResource("1_1544k") +region = Rect2(280, 0, 70, 130) + +[sub_resource type="AtlasTexture" id="AtlasTexture_e1la6"] +atlas = ExtResource("1_1544k") +region = Rect2(350, 0, 70, 130) + +[sub_resource type="SpriteFrames" id="SpriteFrames_xrf6u"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_ssiuv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_be2t6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ambw7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mkf4u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wwkyq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_e1la6") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_ssiuv"] +radius = 29.0 +height = 88.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_be2t6"] +radius = 238.134 + +[node name="ArcherTower" type="Node2D"] +script = ExtResource("1_ssiuv") + +[node name="CharacterBody2D" type="CharacterBody2D" parent="."] + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="CharacterBody2D"] +sprite_frames = SubResource("SpriteFrames_xrf6u") +autoplay = "default" +frame_progress = 0.157334 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D"] +position = Vector2(0, 17) +shape = SubResource("CapsuleShape2D_ssiuv") + +[node name="Area2D" type="Area2D" parent="CharacterBody2D"] +position = Vector2(2, 20) +collision_mask = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D/Area2D"] +shape = SubResource("CircleShape2D_be2t6") + +[node name="Timer" type="Timer" parent="."] +autostart = true diff --git a/Game/Towers/towers.gd b/Game/Towers/towers.gd new file mode 100644 index 0000000..638ada6 --- /dev/null +++ b/Game/Towers/towers.gd @@ -0,0 +1,55 @@ +extends Node2D + +var shootingTime = 0 + +var follower = false +var target = null + +const ARROW = preload("res://Game/Bullets/arrow.tscn") + + +func _ready() -> void: + follower = true + get_node("CharacterBody2D/Area2D").connect("body_entered", Callable(self, "choose_target")) + get_node("Timer").timeout.connect(shoot) + set_process_input(true) + set_properties() + +func _process(delta: float) -> void: + if follower: + position = get_viewport().get_mouse_position() + if not target: + if get_node("CharacterBody2D/Area2D").get_overlapping_bodies(): + choose_target(null) + +func set_properties() -> void: + if self.name.contains("ArcherTower"): + get_node("Timer").wait_time = 0.8 + + +func get_if_moving_state(): + return follower + +func _input(event): + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + if abs(position) <= get_viewport().get_mouse_position(): + follower = false + +func choose_target(body : Node2D) -> void: + var surroinding_enemies = get_node("CharacterBody2D/Area2D").get_overlapping_bodies() + target = surroinding_enemies[0] + for i in surroinding_enemies: + if i.get_parent().get_progress() > target.get_parent().get_progress(): + target = i + pass + +func shoot() -> void: + if target != null: + if self.name.contains("ArcherTower"): + var arrow = ARROW.instantiate() + arrow.position = self.position + arrow.set_speed(250) + arrow.set_targe(target) + arrow.set_hitpoint(50) + get_parent().add_child(arrow) + pass diff --git a/Game/Towers/towers.gd.uid b/Game/Towers/towers.gd.uid new file mode 100644 index 0000000..8205a95 --- /dev/null +++ b/Game/Towers/towers.gd.uid @@ -0,0 +1 @@ +uid://dil41a1ymo0ua diff --git a/Game/sidepanel.gd b/Game/sidepanel.gd index a208411..2aace15 100644 --- a/Game/sidepanel.gd +++ b/Game/sidepanel.gd @@ -8,9 +8,14 @@ const STICK_TRAP = preload("res://Game/Traps/stick_trap.tscn") @onready var minespawner: Button = $HBoxContainer4/HBoxContainer4/Button3 const MINE = preload("res://Game/Traps/mine.tscn") + +@onready var archertowerspawn: Button = $HBoxContainer4/HBoxContainer2/Button2 +const ARCHER_TOWER = preload("res://Game/Towers/archer_tower.tscn") + func _ready() -> void: stickspawner.connect("button_up", Spawn_Stick) minespawner.connect("button_up", Spawn_Mine) + archertowerspawn.connect("button_down", Spawn_Archer) func Update_Lives(lives) -> void: livelabel.text = "Lives: " + str(lives) @@ -24,3 +29,9 @@ func Spawn_Mine() -> void: var mine = MINE.instantiate() mine.name = "Mine-" + str(randi()) get_parent().add_child(mine) + +func Spawn_Archer() -> void: + var tower = ARCHER_TOWER.instantiate() + tower.name = "ArcherTower-" + str(randi()) + get_parent().add_child(tower) + pass