From 41fc5de4d35b1df2ad514f43fcc5f73e16d8f3af Mon Sep 17 00:00:00 2001 From: Dustin Date: Wed, 9 Apr 2025 20:48:30 -0700 Subject: [PATCH] Attempted Pew --- project.godot | 6 ++ src/PewMachine.gd | 64 +++++++++++++++++++ .../playerE/PlayerE-Movement_StateReceiver.gd | 6 ++ src/actors/players/playerE/PlayerE.tscn | 10 ++- src/classes/projectile.gd | 30 +++++++++ src/projectiles/MushroomPew.tscn | 16 +++++ src/templates/projectile_template.tscn | 10 +++ 7 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 src/PewMachine.gd create mode 100644 src/classes/projectile.gd create mode 100644 src/projectiles/MushroomPew.tscn create mode 100644 src/templates/projectile_template.tscn diff --git a/project.godot b/project.godot index 5ba9fda..61ef071 100644 --- a/project.godot +++ b/project.godot @@ -94,6 +94,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://lib/classes/movement_state_receiver.gd" }, { +"base": "Area2D", +"class": "Projectile", +"language": "GDScript", +"path": "res://src/classes/projectile.gd" +}, { "base": "Resource", "class": "SE_StateFrame", "language": "GDScript", @@ -152,6 +157,7 @@ _global_script_class_icons={ "Modifier_Receiver": "", "MovementComponent": "", "Movement_StateReceiver": "", +"Projectile": "", "SE_StateFrame": "", "State": "", "StateAnimatedActor": "", diff --git a/src/PewMachine.gd b/src/PewMachine.gd new file mode 100644 index 0000000..bbb6aa4 --- /dev/null +++ b/src/PewMachine.gd @@ -0,0 +1,64 @@ +extends Position2D +## Represents a weapon that spawns and shoots bullets. +## The Cooldown timer controls the cooldown duration between shots. + +export var scene_path :Resource +export var pew_cooldown_time :float = 1.0 + +const BULLET_VELOCITY = 350 +var projectile :Projectile #preload("res://src/Projectile.tscn") + +#onready var sound_shoot = $Shoot +onready var timer = Timer.new() +onready var offset_position = Vector2(transform.origin.x, transform.origin.y) + +## I don't know what type this would be +var loaded_scene + +func _ready(): + #projectile = load(scene_path.resource_path) + loaded_scene = load(scene_path.resource_path) + timer.autostart = false + timer.wait_time = pew_cooldown_time + timer.one_shot = true + timer.autostart = false + add_child(timer) + + +# This method is only called by Player.gd. +func shoot(direction = 1): + #self.set_position(Vector2(position.x * direction, position.y)) + #transform.x = transform.x * direction + #Transform2D.FLIP_Y + #transform.origin.x = transform.origin.x * direction +# if direction < 0: +# var t = Transform2D() +# # Translation +# t.origin = Vector2(position.x * -1, position.y) +# transform = t +# elif direction > 0: +# var t = Transform2D() +# # Translation +# t.origin = Vector2(position.x, position.y) +# transform = t + + print("Fire Debug: ", direction, " Gun position: ", position, transform.origin) +# position.x = position.x * direction #shifting position before fire was unreliable + if not timer.is_stopped(): + return false + var bullet = loaded_scene.instance() +# if (direction > 0): +# bullet.global_position = global_position +# else: +# bullet.global_position = global_position - Vector2(position.x * 2, 0) + if bullet is Projectile: + bullet.global_position = global_position + + #bullet.linear_velocity = Vector2(direction * BULLET_VELOCITY, 0) + + bullet.set_as_toplevel(true) + add_child(bullet) +# sound_shoot.play() + timer.start() + return true + diff --git a/src/actors/players/playerE/PlayerE-Movement_StateReceiver.gd b/src/actors/players/playerE/PlayerE-Movement_StateReceiver.gd index 142b611..899e644 100644 --- a/src/actors/players/playerE/PlayerE-Movement_StateReceiver.gd +++ b/src/actors/players/playerE/PlayerE-Movement_StateReceiver.gd @@ -4,6 +4,8 @@ var parent_request_state_change :FuncRef var player_number: int = 1 +onready var pew_machine = $"%PewMachine" + func _ready(): var state_ref :State var state_name :String @@ -163,6 +165,10 @@ func attack_secondary(): func _state_process_physics_attack_shoot(): + + if pew_machine.timer.time_left == 0: + pew_machine.shoot() + if current_state.animation_finished == true: request_state_change.call_func('idle') diff --git a/src/actors/players/playerE/PlayerE.tscn b/src/actors/players/playerE/PlayerE.tscn index d7521e0..1c9e90b 100644 --- a/src/actors/players/playerE/PlayerE.tscn +++ b/src/actors/players/playerE/PlayerE.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=34 format=2] +[gd_scene load_steps=36 format=2] [ext_resource path="res://lib/templates/Actor/ActorTemplate.tscn" type="PackedScene" id=1] [ext_resource path="res://assets/actors/players/playerE/PlayerE_SpriteFrames.tres" type="SpriteFrames" id=2] @@ -27,6 +27,8 @@ [ext_resource path="res://assets_tmp/SE/tap.wav" type="AudioStream" id=25] [ext_resource path="res://assets_tmp/SE/land.wav" type="AudioStream" id=26] [ext_resource path="res://src/actors/players/playerE/states/attack_punch.tres" type="Resource" id=27] +[ext_resource path="res://src/PewMachine.gd" type="Script" id=28] +[ext_resource path="res://src/projectiles/MushroomPew.tscn" type="PackedScene" id=29] [sub_resource type="Resource" id=3] resource_local_to_scene = true @@ -145,3 +147,9 @@ shape = SubResource( 2 ) [node name="Interactable_Receiver" type="Node" parent="." index="10"] script = ExtResource( 21 ) interactable_parent_callback = "touch_the_thing" + +[node name="PewMachine" type="Position2D" parent="." index="11"] +unique_name_in_owner = true +position = Vector2( 10, 1.36422e-12 ) +script = ExtResource( 28 ) +scene_path = ExtResource( 29 ) diff --git a/src/classes/projectile.gd b/src/classes/projectile.gd new file mode 100644 index 0000000..f26dba6 --- /dev/null +++ b/src/classes/projectile.gd @@ -0,0 +1,30 @@ +class_name Projectile +extends Area2D + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +var velocity_pps :float = 60 + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + rotate(delta * 10) + position += Vector2(velocity_pps * delta, velocity_pps * delta) + + +func _on_body_entered(body): + var colliding_node = body + if colliding_node.has_node("Projectile_Receiver"): + colliding_node.get_node("Projectile_Receiver").register_interactable(self) + + +func _on_area_entered(area): + pass # Replace with function body. diff --git a/src/projectiles/MushroomPew.tscn b/src/projectiles/MushroomPew.tscn new file mode 100644 index 0000000..341a271 --- /dev/null +++ b/src/projectiles/MushroomPew.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://src/templates/projectile_template.tscn" type="PackedScene" id=1] +[ext_resource path="res://assets/items/mushroom_icon.png" type="Texture" id=2] + +[sub_resource type="CapsuleShape2D" id=1] +radius = 6.0 +height = 2.0 + +[node name="MushroomPew" instance=ExtResource( 1 )] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." index="0"] +shape = SubResource( 1 ) + +[node name="Sprite" type="Sprite" parent="." index="1"] +texture = ExtResource( 2 ) diff --git a/src/templates/projectile_template.tscn b/src/templates/projectile_template.tscn new file mode 100644 index 0000000..b334157 --- /dev/null +++ b/src/templates/projectile_template.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://src/classes/projectile.gd" type="Script" id=1] + +[node name="Projectile_Template" type="Area2D"] +monitorable = false +script = ExtResource( 1 ) + +[connection signal="area_entered" from="." to="." method="_on_area_entered"] +[connection signal="body_entered" from="." to="." method="_on_body_entered"]