From 7c7e607a6e6932a8e35b0abe4a5ce4798669fc2c Mon Sep 17 00:00:00 2001 From: doctorbatmanwho-creator Date: Sun, 7 Jun 2026 21:17:10 -0400 Subject: [PATCH] Level loading and camera bounds system - Added MainGame scene - Converted player into reusable scene - Added CameraBounds support - Added Demon Woods level - Fixed SceneManager references --- .../Demon Woods/parallax-demon-woods-bg.png | Bin 0 -> 947 bytes .../parallax-demon-woods-bg.png.import | 40 ++++++ .../parallax-demon-woods-close-trees.png | Bin 0 -> 6171 bytes ...arallax-demon-woods-close-trees.png.import | 40 ++++++ .../parallax-demon-woods-far-trees.png | Bin 0 -> 3986 bytes .../parallax-demon-woods-far-trees.png.import | 40 ++++++ .../parallax-demon-woods-mid-trees.png | Bin 0 -> 10984 bytes .../parallax-demon-woods-mid-trees.png.import | 40 ++++++ .../Level_1_library.tscn} | 88 ++++-------- .../Level_2_demons.tscn} | 126 ++++++++++-------- Scenes/Levels/MainGame.tscn | 16 +++ Scenes/Player.tscn | 26 ++-- Scripts/gamecontroller.gd | 3 +- Scripts/player.gd | 43 +++--- Scripts/scene_manager.gd | 43 +++++- 15 files changed, 350 insertions(+), 155 deletions(-) create mode 100644 Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-bg.png create mode 100644 Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-bg.png.import create mode 100644 Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-close-trees.png create mode 100644 Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-close-trees.png.import create mode 100644 Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-far-trees.png create mode 100644 Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-far-trees.png.import create mode 100644 Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-mid-trees.png create mode 100644 Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-mid-trees.png.import rename Scenes/{game.tscn => Levels/Level_1_library.tscn} (86%) rename Scenes/{level2.tscn => Levels/Level_2_demons.tscn} (77%) create mode 100644 Scenes/Levels/MainGame.tscn diff --git a/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-bg.png b/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7141812a7dba5f4f97a041334e793797e023cc GIT binary patch literal 947 zcmeAS@N?(olHy`uVBq!ia0y~yV0-|?0vv2Wkqo!xJq!%YRh}-6Ar-gYUNz)pP~c%W zxXalgT_Dc*Z5NZ!BVqq{y0HFg7j6lS|%mzX{5+DST82)mCxIGUE z73={+P_EJY{ZeKL1BQeHAk@If3`7iUJYb~5!T^-PCCP+a5~2&c#$hD4fdgBxK|BZv hPxK%iG;;OQ7nYg-IxMoV4VW1jJYD@<);T3K0RWI@tJ?qo literal 0 HcmV?d00001 diff --git a/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-bg.png.import b/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-bg.png.import new file mode 100644 index 0000000..9b0d25c --- /dev/null +++ b/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-bg.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://deprjxf7mfx2j" +path="res://.godot/imported/parallax-demon-woods-bg.png-8143f03ad87cce020cc71f004cf237ea.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-bg.png" +dest_files=["res://.godot/imported/parallax-demon-woods-bg.png-8143f03ad87cce020cc71f004cf237ea.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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 diff --git a/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-close-trees.png b/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-close-trees.png new file mode 100644 index 0000000000000000000000000000000000000000..d84c3cf27c892c91d923e2799dd7989e720a3fc8 GIT binary patch literal 6171 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 literal 0 HcmV?d00001 diff --git a/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-far-trees.png.import b/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-far-trees.png.import new file mode 100644 index 0000000..5f81f3b --- /dev/null +++ b/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-far-trees.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rqo2a3nuk173" +path="res://.godot/imported/parallax-demon-woods-far-trees.png-8c3360716e2ee4416f77bf696e9b01b6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-far-trees.png" +dest_files=["res://.godot/imported/parallax-demon-woods-far-trees.png-8c3360716e2ee4416f77bf696e9b01b6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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 diff --git a/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-mid-trees.png b/Assets/Graphics/Terrains/Background/Demon Woods/parallax-demon-woods-mid-trees.png new file mode 100644 index 0000000000000000000000000000000000000000..49c1bf811430bdea64fbe024d1bd3c96f88d3b2f GIT binary patch literal 10984 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 void: enemy = load("res://Scripts/rscs/slimeStats.tres") playerHealth = player.starting_health + timeAvailable = timers[currentLevel] add_child(timer) timer.wait_time = 1 diff --git a/Scripts/player.gd b/Scripts/player.gd index 587d69d..ebe9fc2 100644 --- a/Scripts/player.gd +++ b/Scripts/player.gd @@ -9,6 +9,7 @@ const JUMP_VELOCITY = -400.0 @onready var right_spawn: Node2D = $RightSpawn @onready var left_spawn: Node2D = $LeftSpawn @onready var player_graphic: AnimatedSprite2D = $PlayerGraphic +@onready var camera: Camera2D = $Camera2D enum FaceDirection{LEFT, RIGHT} @@ -37,18 +38,18 @@ func _physics_process(delta: float) -> void: handle_input() #calculate the movement - # --- STAIRS OPT-IN LOGIC --- + # --- STAIRS OPT-IN LOGIC --- if can_mount_stairs and not is_on_stairs: - print("Player: inside stairs trigger, waiting for up/down") - - if Input.is_action_just_pressed("ui_up"): - print("Player: ui_up pressed") - if Input.is_action_just_pressed("ui_down"): - print("Player: ui_down pressed") - - if Input.is_action_just_pressed("ui_up") or Input.is_action_just_pressed("ui_down"): - print("Player: START stairs mode requested") - _start_stairs_mode() + + if Input.is_action_just_pressed("ui_up"): + print("Player: ui_up pressed") + + if Input.is_action_just_pressed("ui_down"): + print("Player: ui_down pressed") + + if Input.is_action_just_pressed("ui_up") or Input.is_action_just_pressed("ui_down"): + print("Player: START stairs mode requested") + _start_stairs_mode() # --------------------------- handle_movement(delta) @@ -97,11 +98,7 @@ func update_animation(): player_graphic.play("hurt") State.DEATH: player_graphic.play("death") -func handle_movement(delta): - # Add the gravity. - if not is_on_floor(): - velocity += get_gravity() * delta - +func handle_movement(_delta): if direction: velocity.x = direction * SPEED if direction <0: @@ -135,8 +132,8 @@ func handle_input(): %SceneManager.makeBullet(left_spawn.global_transform, -700) # Get the input direction and handle the movement/deceleration. - # As good practice, you should replace UI actions with custom gameplay actions. direction = Input.get_axis("ui_left", "ui_right") + func handle_collisions(): for i in get_slide_collision_count(): var c = get_slide_collision(i) @@ -169,6 +166,18 @@ func _ready() -> void: # Allow climbing up steeper slopes (default is ~45°) floor_max_angle = deg_to_rad(60) # you can increase or decrease as needed +func set_camera_limits(left: int, top: int, right: int, bottom: int) -> void: + camera.limit_left = left + camera.limit_top = top + camera.limit_right = right + camera.limit_bottom = bottom + + print("Camera limits set:") + print("Left: ", left) + print("Top: ", top) + print("Right: ", right) + print("Bottom: ", bottom) + func _set_stair_collision(enabled: bool) -> void: print("[Player] set stair collision to:", enabled) set_collision_mask_value(STAIRS_LAYER, enabled) diff --git a/Scripts/scene_manager.gd b/Scripts/scene_manager.gd index 289bfae..7b3885c 100644 --- a/Scripts/scene_manager.gd +++ b/Scripts/scene_manager.gd @@ -1,16 +1,30 @@ extends Node2D var bullet = preload("res://Scenes/bullet.tscn") -var bulletArray =[] +var bulletArray = [] var totalAllowedBullets = 7 -@onready var triggers: Node2D = $"../Triggers" -@onready var coins: Node2D = $"../Coins" -@onready var enemies: Node2D = $"../Enemies" -@onready var player: Player = $"../Player" -@onready var ui: Control = $"../CanvasLayer/UI" +var current_level_container: Node2D +var current_level: Node2D +var triggers: Node2D +var coins: Node2D +var enemies: Node2D +var player: Player +var ui: Control func _ready() -> void: + current_level_container = $"../CurrentLevel" + current_level = current_level_container.get_child(0) + + triggers = current_level.get_node("Triggers") + coins = current_level.get_node("Coins") + enemies = current_level.get_node_or_null("Enemies") + + player = get_parent().get_node("Player") + ui = current_level.get_node_or_null("CanvasLayer/UI") + + apply_camera_limits() + Gamecontroller.reset() for obj in triggers.get_children(): @@ -35,6 +49,23 @@ func _ready() -> void: Gamecontroller.playerDiesSignal.connect(player.playerDies) player.deathAnimationCompleteSignal.connect(Gamecontroller.playerDead) +func apply_camera_limits() -> void: + var bounds = current_level.get_node_or_null("CameraBounds") + + if bounds == null: + print("No CameraBounds found in level") + return + + var top_left = bounds.get_node("TopLeft") + var bottom_right = bounds.get_node("BottomRight") + + player.set_camera_limits( + int(top_left.global_position.x), + int(top_left.global_position.y), + int(bottom_right.global_position.x), + int(bottom_right.global_position.y) + ) + #call this any time the coins change func updateCoins() -> void: var coinCount = 0