godot-shooter / commit
Adding rockets and:
Enemy.gd | 4 +- Player.gd | 11 +++--- Rocket.gd | 33 +++++++++++++++++ Rocket.tscn | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Weapons.gd | 5 +++ World.gd | 3 +- project.godot | 6 +++ 7 files changed, 169 insertions(+), 8 deletions(-) diff --git a/Enemy.gd b/Enemy.gd index 84b1d9c..a55f423 100644 --- a/Enemy.gd +++ b/Enemy.gd @@ -61,10 +61,10 @@ func turn_towards(pos: Vector2): var change = dir_diff * turn_rate * move_speed velocity = (velocity + change).normalized() * move_speed -func hurt(): +func hurt(damage: int = 1): if dead || is_invincible: return - health -= 1 + health -= damage var smoke = Smoke.instance() var smoke_pos = get_damage_point_on_body() smoke.position = smoke_pos diff --git a/Player.gd b/Player.gd index 7f7308c..cec9de3 100644 --- a/Player.gd +++ b/Player.gd @@ -8,25 +8,26 @@ export var health = 10 export var max_health = 10 export var is_invincible = false export var turn_rate = 0.03 -export var shooting_range = 500 +export var shooting_range = 350 export var shield_active = true -export var radar_min_radius = 300 +export var radar_min_radius = 350 export var radar_max_radius = 2000 -#export var shield_restart_period_seconds = 5 onready var radar_sprite = $Graphics/Alive/StaticControls/RadarSprite 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 weapon: Weapon var dead = false -var velocity = Vector2.UP * move_speed +var velocity: Vector2 var can_fire = true var destination: Vector2 var is_destination_set = false func _ready() -> void: + velocity= Vector2.UP * move_speed + weapon = Weapons.create_basic_gun() if shield_active: enable_shield() else: diff --git a/Rocket.gd b/Rocket.gd new file mode 100644 index 0000000..9e4bfd0 --- /dev/null +++ b/Rocket.gd @@ -0,0 +1,33 @@ +extends Area2D +class_name Rocket + +const Utils = preload("res://Utils.gd") +const SmallExplosion = preload("res://SmallExplosion.tscn") +export var lifetime_seconds = 5 +export var speed = 100 +export var arm_secs = 1 + +func _ready() -> void: +# $AnimationPlayer.play("arming") + pass + +func _physics_process(delta: float) -> void: + position += transform.y * speed * delta + +func on_bullet_body_entered(body): + var tree = get_tree() + var players = tree.get_nodes_in_group("player") + var player = players[0] + if body != player && body.has_method("hurt"): + body.hurt(3) + var se = SmallExplosion.instance() + get_parent().add_child(se) + se.transform = transform + queue_free() + + +func _on_LifeTimer_timeout() -> void: + var se = SmallExplosion.instance() + get_parent().add_child(se) + se.transform = transform + queue_free() diff --git a/Rocket.tscn b/Rocket.tscn new file mode 100644 index 0000000..afb3089 --- /dev/null +++ b/Rocket.tscn @@ -0,0 +1,115 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://Rocket.gd" type="Script" id=1] +[ext_resource path="res://assets/kenney_simple-space/PNG/Default/meteor_squareSmall.png" type="Texture" id=2] +[ext_resource path="res://assets/kenney_simple-space/PNG/Retina/ship_B.png" type="Texture" id=3] + +[sub_resource type="Animation" id=1] +length = 0.001 +tracks/0/type = "value" +tracks/0/path = NodePath("CollisionPolygon2D:disabled") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ true ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Color( 0, 1, 0.0627451, 1 ) ] +} + +[sub_resource type="Animation" id=2] +resource_name = "arming" +tracks/0/type = "value" +tracks/0/path = NodePath("CollisionPolygon2D:disabled") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 1, +"values": [ true, false ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 0, 1, 0.0627451, 1 ), Color( 1, 1, 1, 1 ) ] +} + +[sub_resource type="Curve" id=3] +_data = [ Vector2( 0, 0.0945946 ), 0.0, 0.0, 0, 0, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ] + +[sub_resource type="Gradient" id=4] +interpolation_mode = 2 +offsets = PoolRealArray( 0, 0.995842, 1 ) +colors = PoolColorArray( 0.775391, 0.775391, 0.775391, 1, 0.364706, 0.364706, 0.364706, 0, 1, 1, 1, 0 ) + +[node name="Rocket" type="Area2D"] +position = Vector2( 0, -1 ) +script = ExtResource( 1 ) +speed = 200 + +[node name="Sprite" type="Sprite" parent="."] +modulate = Color( 0, 1, 0.0627451, 1 ) +rotation = 3.14159 +scale = Vector2( 0.2, 0.2 ) +texture = ExtResource( 3 ) + +[node name="LifeTimer" type="Timer" parent="."] +wait_time = 5.0 +one_shot = true +autostart = true + +[node name="ArmedTimer" type="Timer" parent="."] + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] +rotation = 3.14159 +scale = Vector2( 0.2, 0.2 ) +polygon = PoolVector2Array( 0, -30, -16, 16, 0, 32, 16, 16 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/RESET = SubResource( 1 ) +anims/arming = SubResource( 2 ) + +[node name="Particles2D" type="CPUParticles2D" parent="."] +position = Vector2( 0, -6 ) +amount = 50 +lifetime_randomness = 0.5 +local_coords = false +texture = ExtResource( 2 ) +emission_shape = 1 +emission_sphere_radius = 0.01 +direction = Vector2( 0, 0 ) +spread = 0.0 +gravity = Vector2( 0, 0 ) +angular_velocity = 212.08 +damping = 5.91 +damping_random = 0.25 +scale_amount = 0.5 +scale_amount_curve = SubResource( 3 ) +color_ramp = SubResource( 4 ) + +[connection signal="body_entered" from="." to="." method="on_bullet_body_entered"] +[connection signal="timeout" from="LifeTimer" to="." method="_on_LifeTimer_timeout"] diff --git a/Weapons.gd b/Weapons.gd index 8e6a977..a22ea22 100644 --- a/Weapons.gd +++ b/Weapons.gd @@ -5,3 +5,8 @@ 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 + +static func create_rocket_gun(period_secs: float = 1) -> Weapon: + var rocket = preload("res://Rocket.tscn") + var weapon = Weapon.new(period_secs, rocket) + return weapon diff --git a/World.gd b/World.gd index f953c79..ca0bb31 100644 --- a/World.gd +++ b/World.gd @@ -1,6 +1,7 @@ extends Node2D const Utils = preload("res://Utils.gd") +const Weapons = preload("res://Weapons.gd") const Enemy = preload("res://Enemy.tscn") const PowerUp = preload("res://PowerUp.tscn") var width = ProjectSettings.get("display/window/size/width") @@ -30,7 +31,7 @@ func shield_consumed(): func gold_consumed(): $UI/HUD.score += 5 func weapon_consumed(): - $Player.weapon.shot_period_seconds *= 0.8 + $Player.weapon = Weapons.create_rocket_gun() func create_enemy() -> Enemy: var enemy = Enemy.instance() diff --git a/project.godot b/project.godot index ef0e9dd..a402a8e 100644 --- a/project.godot +++ b/project.godot @@ -39,6 +39,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://PowerUp.gd" }, { +"base": "Area2D", +"class": "Rocket", +"language": "GDScript", +"path": "res://Rocket.gd" +}, { "base": "Node2D", "class": "Trails", "language": "GDScript", @@ -56,6 +61,7 @@ _global_script_class_icons={ "LevelItemGenerator": "", "Player": "", "PowerUp": "", +"Rocket": "", "Trails": "", "Weapon": "" }