godot-shooter / commit
Merge branch 'weapons' into 'main'
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]