From 435a143e59db31ad4a35dcfd5df16a6f18b5bd08 Mon Sep 17 00:00:00 2001 From: AhmedBelman Date: Mon, 7 Apr 2025 21:00:28 -0400 Subject: [PATCH] Week 1: static/rigid/charcter bodies, timer, game controller --- .editorconfig | 4 ++ .gitattributes | 2 + .gitignore | 3 ++ gamecontroller.gd | 35 ++++++++++++++++ gamecontroller.gd.uid | 1 + icon.svg | 1 + icon.svg.import | 37 ++++++++++++++++ project.godot | 22 ++++++++++ scenes/game.tscn | 95 ++++++++++++++++++++++++++++++++++++++++++ scenes/trigger.tscn | 17 ++++++++ scripts/player.gd | 30 +++++++++++++ scripts/player.gd.uid | 1 + scripts/trigger.gd | 19 +++++++++ scripts/trigger.gd.uid | 1 + 14 files changed, 268 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 gamecontroller.gd create mode 100644 gamecontroller.gd.uid create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 project.godot create mode 100644 scenes/game.tscn create mode 100644 scenes/trigger.tscn create mode 100644 scripts/player.gd create mode 100644 scripts/player.gd.uid create mode 100644 scripts/trigger.gd create mode 100644 scripts/trigger.gd.uid diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/gamecontroller.gd b/gamecontroller.gd new file mode 100644 index 0000000..5f7a999 --- /dev/null +++ b/gamecontroller.gd @@ -0,0 +1,35 @@ +class_name GameController extends Node2D + +var totalCrates = 3 +var timeLimit = 10 +var timer = Timer.new() + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + add_child(timer) + timer.wait_time = 1 + timer.one_shot = false + timer.connect("timeout", secondCounter) + timer.start() + +func secondCounter(): + print("tick "+str(timeLimit)) + timeLimit -= 1 + if timeLimit <= 0: + print("YOU LOSE...") + get_tree().reload_current_scene() + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass + + +func _on_trigger_trigger_fired(effect: Variant, body: Variant) -> void: + print("GameController know about trigger " + effect) + if effect == "destroy": + totalCrates -= 1 + print("Crates remaining: " + str(totalCrates)) + body.queue_free() + if totalCrates == 0: + print("YOU WIN!") + get_tree().reload_current_scene() diff --git a/gamecontroller.gd.uid b/gamecontroller.gd.uid new file mode 100644 index 0000000..7d45009 --- /dev/null +++ b/gamecontroller.gd.uid @@ -0,0 +1 @@ +uid://dtod1rsvbxyti diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..9d8b7fa --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..cb1f516 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6fbahxk4v2f5" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..212ecfe --- /dev/null +++ b/project.godot @@ -0,0 +1,22 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="AprilGodotProject" +run/main_scene="res://scenes/game.tscn" +config/features=PackedStringArray("4.4", "Forward Plus") +config/icon="res://icon.svg" + +[file_customization] + +folder_colors={ +"res://scripts/": "red" +} diff --git a/scenes/game.tscn b/scenes/game.tscn new file mode 100644 index 0000000..96f4f92 --- /dev/null +++ b/scenes/game.tscn @@ -0,0 +1,95 @@ +[gd_scene load_steps=8 format=3 uid="uid://bvs868ncmeoj5"] + +[ext_resource type="Script" uid="uid://dtod1rsvbxyti" path="res://gamecontroller.gd" id="1_lnu2h"] +[ext_resource type="Script" uid="uid://c3vqmu6nc4gb0" path="res://scripts/player.gd" id="1_uwrxv"] +[ext_resource type="PackedScene" uid="uid://dgbqoys4mm8j" path="res://scenes/trigger.tscn" id="3_lnu2h"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_8cj0n"] +radius = 21.2132 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_8cj0n"] +size = Vector2(160, 48) + +[sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_uwrxv"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_uwrxv"] +size = Vector2(144, 44) + +[node name="Game" type="Node2D"] +script = ExtResource("1_lnu2h") + +[node name="CharacterBody2D" type="CharacterBody2D" parent="."] +position = Vector2(489, 45) +script = ExtResource("1_uwrxv") +metadata/_edit_group_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D"] +shape = SubResource("CircleShape2D_8cj0n") +debug_color = Color(0.332985, 0.606108, 0.412422, 0.42) + +[node name="Level" type="Node2D" parent="."] + +[node name="Plat 0" type="StaticBody2D" parent="Level"] +position = Vector2(510, 276) +metadata/_edit_group_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Level/Plat 0"] +shape = SubResource("RectangleShape2D_8cj0n") + +[node name="Plat 1" type="StaticBody2D" parent="Level"] +position = Vector2(715, 276) +metadata/_edit_group_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Level/Plat 1"] +shape = SubResource("RectangleShape2D_8cj0n") + +[node name="Floor" type="StaticBody2D" parent="Level"] +position = Vector2(564, 515) +metadata/_edit_group_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Level/Floor"] +shape = SubResource("WorldBoundaryShape2D_uwrxv") + +[node name="Crates" type="Node2D" parent="."] + +[node name="Crate 0" type="RigidBody2D" parent="Crates"] +position = Vector2(580, 158) +rotation = 1.08962 +metadata/_edit_group_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Crates/Crate 0"] +shape = SubResource("RectangleShape2D_uwrxv") +debug_color = Color(0.82094, 0.38733, 0.296015, 0.42) + +[node name="Crate 1" type="RigidBody2D" parent="Crates"] +position = Vector2(758, 131) +rotation = 2.21149 +metadata/_edit_group_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Crates/Crate 1"] +shape = SubResource("RectangleShape2D_uwrxv") +debug_color = Color(0.82094, 0.38733, 0.296015, 0.42) + +[node name="Crate 2" type="RigidBody2D" parent="Crates"] +position = Vector2(390, 129) +rotation = 2.24474 +metadata/_edit_group_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Crates/Crate 2"] +shape = SubResource("RectangleShape2D_uwrxv") +debug_color = Color(0.82094, 0.38733, 0.296015, 0.42) + +[node name="Trigger" parent="." instance=ExtResource("3_lnu2h")] +position = Vector2(254, 406) + +[node name="Trigger2" parent="." instance=ExtResource("3_lnu2h")] +position = Vector2(860, 415) +effect = "destroy" + +[node name="Trigger3" parent="." instance=ExtResource("3_lnu2h")] +position = Vector2(582, 414) +effect = "elaborate" + +[connection signal="triggerFired" from="Trigger" to="." method="_on_trigger_trigger_fired"] +[connection signal="triggerFired" from="Trigger2" to="." method="_on_trigger_trigger_fired"] +[connection signal="triggerFired" from="Trigger3" to="." method="_on_trigger_trigger_fired"] diff --git a/scenes/trigger.tscn b/scenes/trigger.tscn new file mode 100644 index 0000000..874d126 --- /dev/null +++ b/scenes/trigger.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=3 format=3 uid="uid://dgbqoys4mm8j"] + +[ext_resource type="Script" uid="uid://duv4xlinu0hlj" path="res://scripts/trigger.gd" id="1_du5ex"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_uwrxv"] +radius = 81.0987 + +[node name="Trigger" type="Area2D"] +script = ExtResource("1_du5ex") +effect = "teleport" +metadata/_edit_group_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_uwrxv") +debug_color = Color(0.743052, 0.352443, 0.77245, 0.42) + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/scripts/player.gd b/scripts/player.gd new file mode 100644 index 0000000..36d7f2c --- /dev/null +++ b/scripts/player.gd @@ -0,0 +1,30 @@ +extends CharacterBody2D + + +const SPEED = 300.0 +const JUMP_VELOCITY = -400.0 + +@export var pushpower = 80.0 + +func _physics_process(delta: float) -> void: + # Add the gravity. + if not is_on_floor(): + velocity += get_gravity() * delta + + # Handle jump. + if Input.is_action_just_pressed("ui_accept") and is_on_floor(): + velocity.y = JUMP_VELOCITY + + # Get the input direction and handle the movement/deceleration. + # As good practice, you should replace UI actions with custom gameplay actions. + var direction := Input.get_axis("ui_left", "ui_right") + if direction: + velocity.x = direction * SPEED + else: + velocity.x = move_toward(velocity.x, 0, SPEED) + + move_and_slide() + for i in get_slide_collision_count(): + var c = get_slide_collision(i) + if c.get_collider() is RigidBody2D: + c.get_collider().apply_central_impulse(-c.get_normal() * pushpower) diff --git a/scripts/player.gd.uid b/scripts/player.gd.uid new file mode 100644 index 0000000..890cbba --- /dev/null +++ b/scripts/player.gd.uid @@ -0,0 +1 @@ +uid://c3vqmu6nc4gb0 diff --git a/scripts/trigger.gd b/scripts/trigger.gd new file mode 100644 index 0000000..036e383 --- /dev/null +++ b/scripts/trigger.gd @@ -0,0 +1,19 @@ +extends Area2D + +@export var effect = "destroy" + +signal triggerFired(effect, body) + +# 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: + pass + + +func _on_body_entered(body: Node2D) -> void: + print("trigger fired "+effect) + triggerFired.emit(effect, body) diff --git a/scripts/trigger.gd.uid b/scripts/trigger.gd.uid new file mode 100644 index 0000000..787a0b7 --- /dev/null +++ b/scripts/trigger.gd.uid @@ -0,0 +1 @@ +uid://duv4xlinu0hlj