From 0f3f6f0133e1357234d51a6aad7b4cfcf8f7e661 Mon Sep 17 00:00:00 2001 From: Felipe M Date: Tue, 18 May 2021 21:05:50 +0200 Subject: [PATCH] Missiles unlockable --- metroidvania/Scenes/Player/MissilesPowerup.gd | 5 +++++ .../Scenes/Player/MissilesPowerup.tscn | 18 ++++++++++++++++++ metroidvania/Scenes/Player/Player.gd | 7 ++++++- metroidvania/Scenes/Player/Player.tscn | 9 +++++++++ metroidvania/Scenes/Player/PlayerStats.gd | 6 ++++++ metroidvania/Scenes/Player/PowerUp.gd | 7 +++++++ metroidvania/Scenes/Player/PowerUp.tscn | 12 ++++++++++++ metroidvania/Scenes/UI/MissilesUI.gd | 4 ++++ metroidvania/Scenes/UI/MissilesUI.tscn | 1 + metroidvania/Scenes/UI/UI.tscn | 1 + metroidvania/Scenes/World/World.tscn | 6 +++++- metroidvania/project.godot | 9 ++++++++- 12 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 metroidvania/Scenes/Player/MissilesPowerup.gd create mode 100644 metroidvania/Scenes/Player/MissilesPowerup.tscn create mode 100644 metroidvania/Scenes/Player/PowerUp.gd create mode 100644 metroidvania/Scenes/Player/PowerUp.tscn diff --git a/metroidvania/Scenes/Player/MissilesPowerup.gd b/metroidvania/Scenes/Player/MissilesPowerup.gd new file mode 100644 index 0000000..fc1a483 --- /dev/null +++ b/metroidvania/Scenes/Player/MissilesPowerup.gd @@ -0,0 +1,5 @@ +extends Powerup + +func _pickup(): + PlayerStats.missiles_unlocked = true + queue_free() diff --git a/metroidvania/Scenes/Player/MissilesPowerup.tscn b/metroidvania/Scenes/Player/MissilesPowerup.tscn new file mode 100644 index 0000000..66a2414 --- /dev/null +++ b/metroidvania/Scenes/Player/MissilesPowerup.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://Scenes/Player/PowerUp.tscn" type="PackedScene" id=1] +[ext_resource path="res://Assets/Player/PlayerMissile.png" type="Texture" id=2] +[ext_resource path="res://Scenes/Player/MissilesPowerup.gd" type="Script" id=3] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 3, 7 ) + +[node name="MissilesPowerup" instance=ExtResource( 1 )] +script = ExtResource( 3 ) + +[node name="Sprite" parent="." index="0"] +rotation = -1.5708 +texture = ExtResource( 2 ) + +[node name="Collision" parent="." index="1"] +shape = SubResource( 1 ) diff --git a/metroidvania/Scenes/Player/Player.gd b/metroidvania/Scenes/Player/Player.gd index 27437a0..0b19c8f 100644 --- a/metroidvania/Scenes/Player/Player.gd +++ b/metroidvania/Scenes/Player/Player.gd @@ -39,6 +39,7 @@ onready var playerGun = $Sprite/PlayerGun onready var muzzle = $Sprite/PlayerGun/Sprite/Muzzle onready var fireBulletTimer = $FireBulletTimer onready var blinkAnimator = $BlinkAnimator +onready var powerupDetector = $PowerupDetector func set_invincible(value): @@ -82,7 +83,7 @@ func _physics_process(delta): if Input.is_action_pressed("fire") and fireBulletTimer.time_left == 0: fire_bullet() - if Input.is_action_pressed("fire_missile") and fireBulletTimer.time_left == 0 and PlayerStats.missiles > 0: + if Input.is_action_pressed("fire_missile") and fireBulletTimer.time_left == 0 and PlayerStats.missiles > 0 and PlayerStats.missiles_unlocked: fire_missile() func fire_bullet(): @@ -237,3 +238,7 @@ func _on_Hurtbox_hit(damage): func _on_died(): queue_free() + +func _on_PowerupDetector_area_entered(area): + if area is Powerup: + area._pickup() diff --git a/metroidvania/Scenes/Player/Player.tscn b/metroidvania/Scenes/Player/Player.tscn index cc3f573..0751419 100644 --- a/metroidvania/Scenes/Player/Player.tscn +++ b/metroidvania/Scenes/Player/Player.tscn @@ -174,6 +174,15 @@ shape = ExtResource( 6 ) [node name="InvincibleTimer" type="Timer" parent="."] +[node name="PowerupDetector" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 32 + +[node name="Collision" type="CollisionShape2D" parent="PowerupDetector"] +position = Vector2( 0, -7 ) +shape = ExtResource( 6 ) + [connection signal="hit" from="Hurtbox" to="." method="_on_Hurtbox_hit"] +[connection signal="area_entered" from="PowerupDetector" to="." method="_on_PowerupDetector_area_entered"] [editable path="Hurtbox"] diff --git a/metroidvania/Scenes/Player/PlayerStats.gd b/metroidvania/Scenes/Player/PlayerStats.gd index 8f2a324..47d9685 100644 --- a/metroidvania/Scenes/Player/PlayerStats.gd +++ b/metroidvania/Scenes/Player/PlayerStats.gd @@ -3,10 +3,12 @@ class_name PlayerStats var max_health = 4 var health = max_health setget set_health +var missiles_unlocked = false setget set_missiles_unlocked var max_missiles = 3 var missiles = max_missiles setget set_missiles signal player_health_changed(value) +signal player_missiles_unlocked(value) signal player_missiles_changed(value) signal player_died @@ -23,3 +25,7 @@ func set_health(value): func set_missiles(value): missiles = clamp(value, 0, max_missiles) emit_signal("player_missiles_changed", missiles) + +func set_missiles_unlocked(value): + missiles_unlocked = value + emit_signal("player_missiles_unlocked", value) diff --git a/metroidvania/Scenes/Player/PowerUp.gd b/metroidvania/Scenes/Player/PowerUp.gd new file mode 100644 index 0000000..0b320e3 --- /dev/null +++ b/metroidvania/Scenes/Player/PowerUp.gd @@ -0,0 +1,7 @@ +extends Area2D +class_name Powerup + +var PlayerStats = ResourceLoader.PlayerStats + +func _pickup(): + pass diff --git a/metroidvania/Scenes/Player/PowerUp.tscn b/metroidvania/Scenes/Player/PowerUp.tscn new file mode 100644 index 0000000..b4df4d8 --- /dev/null +++ b/metroidvania/Scenes/Player/PowerUp.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Scenes/Player/PowerUp.gd" type="Script" id=1] + +[node name="PowerUp" type="Area2D"] +collision_layer = 32 +collision_mask = 0 +script = ExtResource( 1 ) + +[node name="Sprite" type="Sprite" parent="."] + +[node name="Collision" type="CollisionShape2D" parent="."] diff --git a/metroidvania/Scenes/UI/MissilesUI.gd b/metroidvania/Scenes/UI/MissilesUI.gd index 6693cfc..7f556a8 100644 --- a/metroidvania/Scenes/UI/MissilesUI.gd +++ b/metroidvania/Scenes/UI/MissilesUI.gd @@ -6,6 +6,10 @@ onready var label = $Label func _ready(): PlayerStats.connect("player_missiles_changed", self, "_on_player_missiles_changed") + PlayerStats.connect("player_missiles_unlocked", self, "_on_player_missiles_unlocked") func _on_player_missiles_changed(value): label.text = str(value) + +func _on_player_missiles_unlocked(value): + visible = value diff --git a/metroidvania/Scenes/UI/MissilesUI.tscn b/metroidvania/Scenes/UI/MissilesUI.tscn index ec44f5b..9e72329 100644 --- a/metroidvania/Scenes/UI/MissilesUI.tscn +++ b/metroidvania/Scenes/UI/MissilesUI.tscn @@ -5,6 +5,7 @@ [ext_resource path="res://Scenes/UI/MissilesUI.gd" type="Script" id=3] [node name="MissilesUI" type="HBoxContainer"] +visible = false margin_right = 33.0 margin_bottom = 12.0 script = ExtResource( 3 ) diff --git a/metroidvania/Scenes/UI/UI.tscn b/metroidvania/Scenes/UI/UI.tscn index 8dc8897..a79627c 100644 --- a/metroidvania/Scenes/UI/UI.tscn +++ b/metroidvania/Scenes/UI/UI.tscn @@ -16,6 +16,7 @@ margin_bottom = 16.0 visible = false [node name="MissilesUI" parent="." instance=ExtResource( 3 )] +visible = false margin_left = 4.0 margin_top = 19.0 margin_right = 37.0 diff --git a/metroidvania/Scenes/World/World.tscn b/metroidvania/Scenes/World/World.tscn index 6862914..c3cd9bf 100644 --- a/metroidvania/Scenes/World/World.tscn +++ b/metroidvania/Scenes/World/World.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=12 format=2] +[gd_scene load_steps=13 format=2] [ext_resource path="res://Scenes/World/TileMap.tscn" type="PackedScene" id=1] [ext_resource path="res://Scenes/Player/Player.tscn" type="PackedScene" id=2] @@ -11,6 +11,7 @@ [ext_resource path="res://Scenes/Enemies/PlantEnemy.tscn" type="PackedScene" id=9] [ext_resource path="res://Scenes/Enemies/CrawlingEnemy.tscn" type="PackedScene" id=10] [ext_resource path="res://Scenes/Objects/Brick.tscn" type="PackedScene" id=11] +[ext_resource path="res://Scenes/Player/MissilesPowerup.tscn" type="PackedScene" id=12] [node name="World" type="Node"] script = ExtResource( 3 ) @@ -66,5 +67,8 @@ position = Vector2( 111, 64 ) [node name="Brick5" parent="." instance=ExtResource( 11 )] position = Vector2( 111, 48 ) +[node name="MissilesPowerup" parent="." instance=ExtResource( 12 )] +position = Vector2( 64, 42 ) + [editable path="Player"] [editable path="Player/Hurtbox"] diff --git a/metroidvania/project.godot b/metroidvania/project.godot index c23d7b3..c997746 100644 --- a/metroidvania/project.godot +++ b/metroidvania/project.godot @@ -18,10 +18,16 @@ _global_script_classes=[ { "class": "PlayerStats", "language": "GDScript", "path": "res://Scenes/Player/PlayerStats.gd" +}, { +"base": "Area2D", +"class": "Powerup", +"language": "GDScript", +"path": "res://Scenes/Player/PowerUp.gd" } ] _global_script_class_icons={ "MainInstances": "", -"PlayerStats": "" +"PlayerStats": "", +"Powerup": "" } [application] @@ -123,6 +129,7 @@ fire_missile={ 2d_physics/layer_3="PlayerHurtbox" 2d_physics/layer_4="EnemyHurtbox" 2d_physics/layer_5="Brick" +2d_physics/layer_6="PowerUp" [rendering]