fuzzyworld

godot-shooter / commit

Merge branch 'weapons' into 'main'

41dde458925f08780a8155bf6e760c07617f73e6 · Pavel Safronov · 2023-11-08 23:25:54 +0000 · parents f6120dbab939 d5877b100e8b

Merge branch 'weapons' into 'main'

Added weapons support

See merge request PavelSafronov/godot-shooter!2
 Player.gd     | 23 ++++++++++++-----------
 Player.tscn   |  4 +---
 Weapon.gd     |  8 ++++++++
 Weapons.gd    |  7 +++++++
 World.gd      | 16 ++++++++++++----
 World.tscn    |  2 +-
 project.godot |  8 +++++++-
 7 files changed, 48 insertions(+), 20 deletions(-)

diff --git a/Player.gd b/Player.gd
index 44db529..7f7308c 100644
--- a/Player.gd
+++ b/Player.gd
@@ -1,11 +1,11 @@
 extends KinematicBody2D
 class_name Player
 
+const Weapons = preload("res://Weapons.gd")
+
 export var move_speed = 100
 export var health = 10
 export var max_health = 10
-export var shot_period_seconds = .5
-export var bullet: PackedScene
 export var is_invincible = false
 export var turn_rate = 0.03
 export var shooting_range = 500
@@ -19,6 +19,7 @@ onready var radar_container = $Graphics/Alive/StaticControls/Radar
 const Utils = preload("res://Utils.gd")
 const PopupControl = preload("res://Popup.tscn")
 
+var weapon: Weapon = Weapons.create_basic_gun(1)
 var dead = false
 var velocity = Vector2.UP * move_speed
 var can_fire = true
@@ -126,22 +127,22 @@ func shoot():
 	if !can_fire:
 		return
 	can_fire = false
-	$ShotTimer.wait_time = shot_period_seconds
+	$ShotTimer.wait_time = weapon.shot_period_seconds
 	$ShotTimer.start()
-	var b = bullet.instance()
-	owner.add_child(b)
-	b.transform = $Barrel.global_transform
+	var particle = weapon.particle.instance()
+	owner.add_child(particle)
+	particle.transform = $Barrel.global_transform
 	
 func shoot_at(pos: Vector2):
 	if !can_fire:
 		return
 	can_fire = false
-	$ShotTimer.wait_time = shot_period_seconds
+	$ShotTimer.wait_time = weapon.shot_period_seconds
 	$ShotTimer.start()
-	var b = bullet.instance() as Bullet
-	owner.add_child(b)
-	b.global_position = global_position
-	b.global_rotation = global_position.angle_to_point(pos) + PI / 2.0
+	var particle = weapon.particle.instance()
+	owner.add_child(particle)
+	particle.global_position = global_position
+	particle.global_rotation = global_position.angle_to_point(pos) + PI / 2.0
 	
 func allow_fire():
 	can_fire = true
diff --git a/Player.tscn b/Player.tscn
index 61077c7..7ca3658 100644
--- a/Player.tscn
+++ b/Player.tscn
@@ -1,9 +1,8 @@
-[gd_scene load_steps=17 format=2]
+[gd_scene load_steps=15 format=2]
 
 [ext_resource path="res://assets/kenney_simple-space/PNG/Default/ship_sidesA.png" type="Texture" id=1]
 [ext_resource path="res://Explosion.tscn" type="PackedScene" id=2]
 [ext_resource path="res://Player.gd" type="Script" id=3]
-[ext_resource path="res://Bullet.tscn" type="PackedScene" id=4]
 [ext_resource path="res://CharacterTheme.tres" type="Theme" id=5]
 [ext_resource path="res://Trails.tscn" type="PackedScene" id=6]
 [ext_resource path="res://assets/kenney_crosshair-pack/PNG/White Retina/crosshair120.png" type="Texture" id=7]
@@ -160,7 +159,6 @@ tracks/0/keys = {
 [node name="Player" type="KinematicBody2D" groups=["player"]]
 rotation = -0.000165944
 script = ExtResource( 3 )
-bullet = ExtResource( 4 )
 shield_active = false
 
 [node name="ShipCollisionShape" type="CollisionPolygon2D" parent="."]
diff --git a/Weapon.gd b/Weapon.gd
new file mode 100644
index 0000000..ffe8fdd
--- /dev/null
+++ b/Weapon.gd
@@ -0,0 +1,8 @@
+class_name Weapon
+
+var shot_period_seconds = .5
+var particle: PackedScene
+
+func _init(period_seconds, scene) -> void:
+	shot_period_seconds = period_seconds
+	particle = scene
diff --git a/Weapons.gd b/Weapons.gd
new file mode 100644
index 0000000..8e6a977
--- /dev/null
+++ b/Weapons.gd
@@ -0,0 +1,7 @@
+# Note: `tool` is optional but without it there are no error reporting in the editor
+tool
+
+static func create_basic_gun(period_secs: float = 0.5) -> Weapon:
+	var bullet = preload("res://Bullet.tscn")
+	var weapon = Weapon.new(period_secs, bullet)
+	return weapon
diff --git a/World.gd b/World.gd
index a6707ae..f953c79 100644
--- a/World.gd
+++ b/World.gd
@@ -13,6 +13,7 @@ var generators = [
 	LevelItemGenerator.new(10, "create_health", self, "health", 10),
 	LevelItemGenerator.new(3, "create_shield", self, "shields", 3),
 	LevelItemGenerator.new(5, "create_gold", self, "gold", 5),
+	LevelItemGenerator.new(5, "create_weapon", self, "weapon", 5),
 ]
 var completed_objectives = 0
 var max_objectives = 5
@@ -23,14 +24,13 @@ func enemy_killed(_position: Vector2):
 	completed_objectives += 1
 func health_consumed():
 	$Player.heal()
-#	$UI/HUD.show_message("+1 health", 1)
 func shield_consumed():
 	Utils.log("consuming a shield and sending a message")
 	$Player.enable_shield()
-#	$UI/HUD.show_message("+1 shield", 1)
 func gold_consumed():
 	$UI/HUD.score += 5
-#	$UI/HUD.show_message("+5 points", 1)
+func weapon_consumed():
+	$Player.weapon.shot_period_seconds *= 0.8
 	
 func create_enemy() -> Enemy:
 	var enemy = Enemy.instance()
@@ -40,7 +40,7 @@ func create_enemy() -> Enemy:
 
 func create_health() -> PowerUp:
 	var health = PowerUp.instance()
-	health.position = get_new_item_pos(randf() + .25)
+	health.position = get_new_item_pos(randf() + .5)
 	health.connect("consumed", self, "health_consumed")
 	health.label = "+HP"
 	health.color = Color.green
@@ -62,6 +62,14 @@ func create_gold(pos: Vector2 = get_new_item_pos(1 + randf())) -> PowerUp:
 	gold.color = Color.gold
 	return gold
 
+func create_weapon() -> PowerUp:
+	var weapon = PowerUp.instance()
+	weapon.position = get_new_item_pos(randf() + .5)
+	weapon.connect("consumed", self, "weapon_consumed")
+	weapon.label = "WPN"
+	weapon.color = Color.red
+	return weapon
+
 func _ready() -> void:
 	$UI/HUD.show_message("Tap/drag to move")
 
diff --git a/World.tscn b/World.tscn
index 3aea5cf..f897875 100644
--- a/World.tscn
+++ b/World.tscn
@@ -131,7 +131,7 @@ text = "Restart"
 
 [node name="ShootTimer" type="Timer" parent="."]
 process_mode = 0
-wait_time = 0.1
+wait_time = 0.01
 autostart = true
 
 [node name="PlayerToTarget" type="Line2D" parent="."]
diff --git a/project.godot b/project.godot
index 1dfe127..ef0e9dd 100644
--- a/project.godot
+++ b/project.godot
@@ -43,6 +43,11 @@ _global_script_classes=[ {
 "class": "Trails",
 "language": "GDScript",
 "path": "res://Trails.gd"
+}, {
+"base": "Reference",
+"class": "Weapon",
+"language": "GDScript",
+"path": "res://Weapon.gd"
 } ]
 _global_script_class_icons={
 "Bullet": "",
@@ -51,7 +56,8 @@ _global_script_class_icons={
 "LevelItemGenerator": "",
 "Player": "",
 "PowerUp": "",
-"Trails": ""
+"Trails": "",
+"Weapon": ""
 }
 
 [application]