diff --git a/project.godot b/project.godot index 4abf0b6..a0266a6 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,14 @@ run/main_scene="uid://diebydbkt7p12" config/features=PackedStringArray("4.6", "Forward Plus") config/icon="res://icon.svg" +[input] + +Shoot={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(355, 24),"global_position":Vector2(364, 72),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) +] +} + [physics] 3d/physics_engine="Jolt Physics" diff --git a/scenes/bullet.tscn b/scenes/bullet.tscn new file mode 100644 index 0000000..7fc6c47 --- /dev/null +++ b/scenes/bullet.tscn @@ -0,0 +1,13 @@ +[gd_scene format=3 uid="uid://cuj8pgtjqngp"] + +[ext_resource type="Script" uid="uid://bbm8hvs5bwx0f" path="res://scripts/bullet.gd" id="1_mkf8s"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_h1aey"] + +[node name="Bullet" type="Area2D" unique_id=722893754] +script = ExtResource("1_mkf8s") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1273835696] +scale = Vector2(0.47999987, 8.651428) +shape = SubResource("RectangleShape2D_h1aey") +debug_color = Color(1, 0, 0, 1) diff --git a/scenes/game.tscn b/scenes/game.tscn index afc188f..e605033 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -1,59 +1,64 @@ [gd_scene format=3 uid="uid://diebydbkt7p12"] [ext_resource type="Script" uid="uid://bg2xlgku08s3n" path="res://scripts/gameController.gd" id="1_lnu2h"] +[ext_resource type="Script" uid="uid://c3hbvk17cnfti" path="res://scripts/SceneManager.gd" id="2_iywne"] [ext_resource type="PackedScene" uid="uid://xvv1nyl3ny2g" path="res://scenes/crate.tscn" id="2_lnu2h"] -[ext_resource type="Script" uid="uid://ctm4xm3lnquco" path="res://scripts/player.gd" id="2_yqjtg"] +[ext_resource type="PackedScene" uid="uid://dyxqdgvctjshx" path="res://scenes/player.tscn" id="3_iywne"] [ext_resource type="PackedScene" uid="uid://c7i6hsic2uojx" path="res://scenes/trigger.tscn" id="4_lbhrr"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_8cj0n"] size = Vector2(74, 20) -[sub_resource type="CircleShape2D" id="CircleShape2D_uwrxv"] - [sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_lbhrr"] [node name="Game" type="Node2D" unique_id=239599901] script = ExtResource("1_lnu2h") -[node name="StaticBody2D" type="StaticBody2D" parent="." unique_id=2062716976] +[node name="SceneManager" type="Node2D" parent="." unique_id=1426606514] +unique_name_in_owner = true +script = ExtResource("2_iywne") + +[node name="Player" parent="." unique_id=401513938 instance=ExtResource("3_iywne")] +position = Vector2(536, 418) + +[node name="Triggers" type="Node2D" parent="." unique_id=1025206878] + +[node name="Destroy" parent="Triggers" unique_id=1908774248 instance=ExtResource("4_lbhrr")] +position = Vector2(692, 509) +effect = "destroy" + +[node name="Bounce" parent="Triggers" unique_id=1627494044 instance=ExtResource("4_lbhrr")] +position = Vector2(508, 507) +effect = "teleport" + +[node name="powerup" parent="Triggers" unique_id=1667683069 instance=ExtResource("4_lbhrr")] +position = Vector2(716, 391) +effect = "powerup" + +[node name="Crates" type="Node2D" parent="." unique_id=1303942974] + +[node name="Crate" parent="Crates" unique_id=1307809047 instance=ExtResource("2_lnu2h")] +position = Vector2(644, 404) + +[node name="Crate2" parent="Crates" unique_id=1988562966 instance=ExtResource("2_lnu2h")] +position = Vector2(609, 403) + +[node name="Crate3" parent="Crates" unique_id=1771442258 instance=ExtResource("2_lnu2h")] +position = Vector2(506, 353.99994) + +[node name="Level" type="Node2D" parent="." unique_id=219661874] + +[node name="Platform" type="StaticBody2D" parent="Level" unique_id=2062716976] position = Vector2(591, 442) scale = Vector2(2, 1) metadata/_edit_group_ = true -[node name="CollisionShape2D" type="CollisionShape2D" parent="StaticBody2D" unique_id=1655047088] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Level/Platform" unique_id=1655047088] shape = SubResource("RectangleShape2D_8cj0n") -[node name="Crate" parent="." unique_id=1307809047 instance=ExtResource("2_lnu2h")] -position = Vector2(644, 404) - -[node name="Crate2" parent="." unique_id=1988562966 instance=ExtResource("2_lnu2h")] -position = Vector2(609, 403) - -[node name="Player" type="CharacterBody2D" parent="." unique_id=1540403255] -position = Vector2(535, 417) -script = ExtResource("2_yqjtg") -metadata/_edit_group_ = true - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Player" unique_id=1365827185] -shape = SubResource("CircleShape2D_uwrxv") -debug_color = Color(0.28743955, 0.62438726, 0.25921708, 0.41960785) - -[node name="Trigger" parent="." unique_id=1908774248 instance=ExtResource("4_lbhrr")] -position = Vector2(692, 509) -effect = "destroy" - -[node name="Trigger2" parent="." unique_id=1627494044 instance=ExtResource("4_lbhrr")] -position = Vector2(508, 507) - -[node name="StaticBody2D2" type="StaticBody2D" parent="." unique_id=426786591] +[node name="Floor" type="StaticBody2D" parent="Level" unique_id=426786591] position = Vector2(601, 622) metadata/_edit_group_ = true -[node name="CollisionShape2D" type="CollisionShape2D" parent="StaticBody2D2" unique_id=895098891] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Level/Floor" unique_id=895098891] shape = SubResource("WorldBoundaryShape2D_lbhrr") - -[node name="Crate3" parent="." unique_id=1771442258 instance=ExtResource("2_lnu2h")] -position = Vector2(570, 397) - -[connection signal="AreaTrigger" from="Trigger" to="." method="_on_trigger"] -[connection signal="AreaTrigger" from="Trigger2" to="." method="_on_trigger"] diff --git a/scenes/player.tscn b/scenes/player.tscn new file mode 100644 index 0000000..de9fa15 --- /dev/null +++ b/scenes/player.tscn @@ -0,0 +1,19 @@ +[gd_scene format=3 uid="uid://dyxqdgvctjshx"] + +[ext_resource type="Script" uid="uid://ctm4xm3lnquco" path="res://scripts/player.gd" id="1_3vyb7"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_uwrxv"] + +[node name="Player" type="CharacterBody2D" unique_id=401513938] +script = ExtResource("1_3vyb7") +metadata/_edit_group_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=31138863] +shape = SubResource("CircleShape2D_uwrxv") +debug_color = Color(0.28743955, 0.62438726, 0.25921708, 0.41960785) + +[node name="Right Gun" type="Marker2D" parent="." unique_id=1203355308] +position = Vector2(15, -3) + +[node name="Left Gun" type="Marker2D" parent="." unique_id=1828444534] +position = Vector2(-15, -3) diff --git a/scripts/SceneManager.gd b/scripts/SceneManager.gd new file mode 100644 index 0000000..01d5ec4 --- /dev/null +++ b/scripts/SceneManager.gd @@ -0,0 +1,58 @@ +class_name SceneManager extends Node2D + +@onready var triggers: Node2D = $"../Triggers" +@onready var crates: Node2D = $"../Crates" +@onready var level: Node2D = $"../Level" +@onready var game: GameController = $".." + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + buildLevel() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass + +func buildLevel()->void: + print("building level") + updateCrates() + updateTriggers() + + #wire up signals from GameController + game.destroySignal.connect(destroy) + game.teleportSignal.connect(teleport) + game.levelChangeSignal.connect(loadLevel) + +func updateTriggers()->void: + if triggers: + for obj in triggers.get_children(): + if obj is trigger: + if not obj.AreaTrigger.is_connected(game._on_trigger): + obj.AreaTrigger.connect(game._on_trigger) +func updateCrates()->void: + #check that there is a crates node + if crates: + var totalCrates = 0 + for obj in crates.get_children(): + if obj is Crate: + if not obj.tree_exited.is_connected(updateCrates): + obj.tree_exited.connect(updateCrates) + totalCrates +=1 + game.crateUpdate(totalCrates) +func destroy(body)->void: + body.queue_free() + +func teleport(body)->void: + #if body is Crate: + var viewport_size = get_viewport().get_visible_rect().size + var random_x = randf_range(0, viewport_size.x) + var random_y = randf_range(0, viewport_size.y) + var newPosition = Vector2(506, 340) + body.teleport_to(newPosition) + +func loadLevel(level:String)->void: + get_tree().call_deferred("change_scene_to_file", level) + +func makeBullet(targetPosition, speed)->void: + print("make bullet") diff --git a/scripts/SceneManager.gd.uid b/scripts/SceneManager.gd.uid new file mode 100644 index 0000000..c679b71 --- /dev/null +++ b/scripts/SceneManager.gd.uid @@ -0,0 +1 @@ +uid://c3hbvk17cnfti diff --git a/scripts/bullet.gd b/scripts/bullet.gd new file mode 100644 index 0000000..5dde12a --- /dev/null +++ b/scripts/bullet.gd @@ -0,0 +1,11 @@ +class_name bullet extends Area2D + +var speed:float = 700; +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + position += transform.x * speed * delta diff --git a/scripts/bullet.gd.uid b/scripts/bullet.gd.uid new file mode 100644 index 0000000..54dbf08 --- /dev/null +++ b/scripts/bullet.gd.uid @@ -0,0 +1 @@ +uid://bbm8hvs5bwx0f diff --git a/scripts/crate.gd b/scripts/crate.gd index 7f42195..8539fb4 100644 --- a/scripts/crate.gd +++ b/scripts/crate.gd @@ -1 +1,13 @@ class_name Crate extends RigidBody2D + +var teleport_target: Vector2 = Vector2.ZERO +var should_teleport: bool = false + +func teleport_to(position:Vector2): + teleport_target = position + should_teleport = true; + +func _integrate_forces(state: PhysicsDirectBodyState2D) -> void: + if should_teleport: + state.transform = Transform2D.IDENTITY.translated(teleport_target) + should_teleport = false diff --git a/scripts/gameController.gd b/scripts/gameController.gd index f216179..2887957 100644 --- a/scripts/gameController.gd +++ b/scripts/gameController.gd @@ -1,18 +1,33 @@ -extends Node2D +class_name GameController extends Node2D -var crateTotal = 3 +var crateTotal = 0 +signal destroySignal(body) +signal teleportSignal(body) +signal levelChangeSignal(level) +var currentScene:String = "res://scenes/game.tscn" +var timer := Timer.new() +var timeAvailable := 10 # Called when the node enters the scene tree for the first time. func _ready() -> void: - pass # Replace with function body. - - + add_child(timer) + timer.wait_time = 1 + timer.one_shot = false + timer.connect("timeout", secondCounter) + timer.start() + +func secondCounter()->void: + timeAvailable -=1 + if timeAvailable <=0: + print("YOU LOST YOU ARE A LOSER YOU SUCK") + levelChangeSignal.emit(currentScene) + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass -func _on_trigger(body: Variant, effect) -> void: +func _on_trigger(body: Variant, effect, trigger) -> void: print("GC knows trigger...."+effect) if body is Crate: match effect: @@ -20,4 +35,16 @@ func _on_trigger(body: Variant, effect) -> void: crateTotal -=1 if crateTotal <=0: print("You WON!!!") - body.queue_free() + levelChangeSignal.emit(currentScene) + destroySignal.emit(body) + "teleport": + print("GC teleport") + teleportSignal.emit(body) + if body is Player: + match effect: + "powerup": + timeAvailable += 5 + destroySignal.emit(trigger) +func crateUpdate(cratesAmount)->void: + crateTotal = cratesAmount + print("GC updated crates: "+str(crateTotal)) diff --git a/scripts/player.gd b/scripts/player.gd index 489aaef..d328991 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -1,18 +1,30 @@ -extends CharacterBody2D +class_name Player extends CharacterBody2D +@onready var right_gun: Marker2D = $"Right Gun" +@onready var left_gun: Marker2D = $"Left Gun" -const SPEED = 300.0 -const JUMP_VELOCITY = -400.0 +const SPEED = 300 +const JUMP_VELOCITY = -1000.0 const BUMP_POWER = 50 - +enum FaceDirection{LEFT, RIGHT} +var facing:FaceDirection = FaceDirection.RIGHT func _physics_process(delta: float) -> void: # Add the gravity. if not is_on_floor(): velocity += get_gravity() * delta - + #Handle Shoot + if Input.is_action_just_pressed("Shoot"): + print("player wants to shoot") + match facing: + FaceDirection.RIGHT: + print("shoot to the right") + %SceneManager.makeBullet(right_gun.global_transform, 700) + FaceDirection.LEFT: + print("shoot to the left") + %SceneManager.makeBullet(left_gun.global_transform, -700) # Handle jump. - if Input.is_action_just_pressed("ui_accept") and is_on_floor(): + if Input.is_action_just_pressed("ui_accept") : velocity.y = JUMP_VELOCITY # Get the input direction and handle the movement/deceleration. @@ -20,6 +32,10 @@ func _physics_process(delta: float) -> void: var direction := Input.get_axis("ui_left", "ui_right") if direction: velocity.x = direction * SPEED + if direction >0: + facing=FaceDirection.RIGHT + if direction <0: + facing=FaceDirection.LEFT else: velocity.x = move_toward(velocity.x, 0, SPEED) diff --git a/scripts/trigger.gd b/scripts/trigger.gd index 44c1083..6eaf7c3 100644 --- a/scripts/trigger.gd +++ b/scripts/trigger.gd @@ -1,6 +1,6 @@ -extends Area2D +class_name trigger extends Area2D -signal AreaTrigger(body, effect) +signal AreaTrigger(body, effect, trigger) @export var effect="destroy" # Called when the node enters the scene tree for the first time. @@ -15,4 +15,4 @@ func _process(delta: float) -> void: func _on_body_entered(body: Node2D) -> void: print("Trigger activated") - AreaTrigger.emit(body, effect) + AreaTrigger.emit(body, effect, self)