From 12e1b4eb7e3b606139e6e05d5d5646727ed29361 Mon Sep 17 00:00:00 2001 From: h0lybyte <5599058+h0lybyte@users.noreply.github.com> Date: Fri, 21 Feb 2025 07:33:26 -0500 Subject: [PATCH] feat(brackeys13): unlocked map. --- .../13/assets/frostwindz/asteroid_base.png | Bin 0 -> 1095 bytes .../frostwindz/asteroid_base.png.import | 34 ++++++++ .../13/assets/frostwindz/asteroid_explode.png | Bin 0 -> 6009 bytes .../frostwindz/asteroid_explode.png.import | 34 ++++++++ apps/gamejam/brackeys/13/project.godot | 1 + apps/gamejam/brackeys/13/scenes/asteroid.tscn | 79 +++++++++++++++++- apps/gamejam/brackeys/13/scenes/game.tscn | 3 +- .../gamejam/brackeys/13/scenes/spaceship.tscn | 5 ++ apps/gamejam/brackeys/13/scripts/global.gd | 10 ++- apps/gamejam/brackeys/13/scripts/hud.gd | 17 ++-- apps/gamejam/brackeys/13/scripts/spaceship.gd | 22 +++-- .../brackeys/13/scripts/timespace_layer.gd | 10 +-- .../brackeys/13/scripts/universe_layer.gd | 58 ++++++------- 13 files changed, 216 insertions(+), 57 deletions(-) create mode 100644 apps/gamejam/brackeys/13/assets/frostwindz/asteroid_base.png create mode 100644 apps/gamejam/brackeys/13/assets/frostwindz/asteroid_base.png.import create mode 100644 apps/gamejam/brackeys/13/assets/frostwindz/asteroid_explode.png create mode 100644 apps/gamejam/brackeys/13/assets/frostwindz/asteroid_explode.png.import diff --git a/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_base.png b/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_base.png new file mode 100644 index 0000000000000000000000000000000000000000..044cfd9e275657fcd309e3777e22f778cf73440e GIT binary patch literal 1095 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-HD>U}5xhaSW-L z^LCc4w|1aF+x-~5C89w&GZhlObA`5f&#YHiB9?PxzHpv$1p6QMX=MjZqS_QZXF6^0 z-Man887phc*}eDrZ$9|lupr(3&fM>3j?di8px7ed#DRheV)(od9LIU zdSjL7IynX7pC4Z;+FIKl_te%pQ-E%>CVM;ED{7v*)e{+7PpON9eR;Dzbduck zmde;9H{Tw0iNUn`P3Vw!nX;ALBpouQ7qdU(!WagGw&#&jv^+oETFc^j6l z;SH4AQRQ%xXPb6Hw#8dkt1BIjYmZM+yq*$uRjI@Ai_SIEIt~4ZlD-wMmQ_8DV|_X4wJFMmCHpNqirtrBZ6-bxmC~ZG(+sprh^FqMf zlT23IUI&D1{c!0z)5Ehef6HS(HD_B#ZBuNm73~yr5ZdvrW&IQW2fw!|HLPV|_|~b+!m8<;~Zp-i3vm-0Vwcuc`s?7_2=}pSt{%t#VJT+foOA)W+)izOvgJrIU zEpPAL=Dw~1QlP*7JcE(`g?R#8;$pc+Ho0ggomj5jbmrgw?`H9bOZ_7*%wHNJDD>pQ zO`Un)KK+U@__v+MQHs;OIc$gP+V4H~**T|AzcvP@Tj%Fu{&!ez)c*8gQTW_v#N2j) ziSyI;ef<*uyZit6uV`gwQ1VEV5p=5GAZk=J)x+uu!-}~d8>MO_7wn(3?V)Q6LswEr z;iaxG>KcxR*{?C_?cn~vX?J_Q{jzdpeA)3|%YA_~KdIQm?)!ix1B0ilpUXO@geCx7 CHsb;S literal 0 HcmV?d00001 diff --git a/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_base.png.import b/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_base.png.import new file mode 100644 index 000000000..8a6b3481f --- /dev/null +++ b/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_base.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbx7yu6wgjtfs" +path="res://.godot/imported/asteroid_base.png-a79e53537b060ae8f2520d13eccbd8d0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/frostwindz/asteroid_base.png" +dest_files=["res://.godot/imported/asteroid_base.png-a79e53537b060ae8f2520d13eccbd8d0.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 diff --git a/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_explode.png b/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_explode.png new file mode 100644 index 0000000000000000000000000000000000000000..c741ea1e98c6e2d14921a4f474d3cc4f2569584c GIT binary patch literal 6009 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 Vector2: + return starship_data.get("coordinates", Vector2.ZERO) + +func set_starship_coordinates(new_position: Vector2): + starship_data["coordinates"] = new_position + call_deferred("emit_signal", "starship_data_changed", "coordinates", new_position) diff --git a/apps/gamejam/brackeys/13/scripts/hud.gd b/apps/gamejam/brackeys/13/scripts/hud.gd index 96306d760..e749cc63b 100644 --- a/apps/gamejam/brackeys/13/scripts/hud.gd +++ b/apps/gamejam/brackeys/13/scripts/hud.gd @@ -1,6 +1,6 @@ extends Control -@onready var score_label = $Panel/Menu/Nav/Label +@onready var coordinates_label = $Panel/Menu/Nav/Label @onready var name_label = $Panel/Menu/Nav/StarshipName # Resources @@ -38,13 +38,18 @@ func _ready(): call_deferred("_update_starship_name") call_deferred("_update_starship_resources") Global.connect("resource_changed", Callable(self, "_on_resource_changed")) - update_score(0) + Global.connect("starship_data_changed", Callable(self, "_update_starship_data")) + update_coordinates(Global.get_starship_coordinates()) -func update_score(new_score): - if score_label: - score_label.text = "Score: %d" % new_score +func update_coordinates(coords: Vector2): + if coordinates_label: + coordinates_label.text = "Coords X: %d, Y: %d" % [coords.x, coords.y] else: - push_warning("Score label not found!") + push_warning("Coordinates label not found!") + +func _update_starship_data(data_name: String, value): + if data_name == "coordinates": + update_coordinates(value) func _update_starship_resources(): for resource in Global.resources_list: diff --git a/apps/gamejam/brackeys/13/scripts/spaceship.gd b/apps/gamejam/brackeys/13/scripts/spaceship.gd index 47ec41ec1..acf8f8b8e 100644 --- a/apps/gamejam/brackeys/13/scripts/spaceship.gd +++ b/apps/gamejam/brackeys/13/scripts/spaceship.gd @@ -14,6 +14,7 @@ func _ready(): position = get_viewport_rect().size / 2 func _process(delta): + call_deferred("defer_set_starship_coordinates") if Input.is_action_pressed("shoot"): shield.visible = false shoot_laser() @@ -54,15 +55,15 @@ func _physics_process(delta): move_and_slide() - var screen_size = get_viewport_rect().size - if global_position.y < 0: - global_position.y = screen_size.y - elif global_position.y > screen_size.y: - global_position.y = 0 - if global_position.x < 0: - global_position.x = screen_size.x - elif global_position.x > screen_size.x: - global_position.x = 0 + #var screen_size = get_viewport_rect().size + #if global_position.y < 0: + #global_position.y = screen_size.y + #elif global_position.y > screen_size.y: + #global_position.y = 0 + #if global_position.x < 0: + #global_position.x = screen_size.x + #elif global_position.x > screen_size.x: + #global_position.x = 0 func shoot_laser(): emit_signal("laser_shot", scope.global_position, rotation) @@ -72,3 +73,6 @@ func activate_shield(): Global.emit_signal("notification_received", "shield_active", "Shield was deployed", "warning") shield.visible = true shield.play("shield") + +func defer_set_starship_coordinates(): + Global.set_starship_coordinates(global_position) diff --git a/apps/gamejam/brackeys/13/scripts/timespace_layer.gd b/apps/gamejam/brackeys/13/scripts/timespace_layer.gd index b059197fa..e8be56ff0 100644 --- a/apps/gamejam/brackeys/13/scripts/timespace_layer.gd +++ b/apps/gamejam/brackeys/13/scripts/timespace_layer.gd @@ -1,11 +1,11 @@ -extends Node2D +extends CanvasLayer @onready var color_rect := $ColorRect @onready var background_sprite := $BackgroundSprite func _ready() -> void: - color_rect.color = Color(0,0,0) - background_sprite.centered = false + color_rect.color = Color.BLACK + background_sprite.centered = true update_background_size() get_viewport().connect("size_changed", Callable(self, "_on_viewport_resized")) @@ -17,9 +17,9 @@ func update_background_size(): var scale_x: float = viewport_size.x / texture_size.x var scale_y: float = viewport_size.y / texture_size.y background_sprite.scale = Vector2(scale_x, scale_y) - background_sprite.position = Vector2.ZERO + background_sprite.position = viewport_size / 2 # Keep centered - color_rect.size = viewport_size + color_rect.size = viewport_size # Make sure the color rect covers the screen func _on_viewport_resized(): update_background_size() diff --git a/apps/gamejam/brackeys/13/scripts/universe_layer.gd b/apps/gamejam/brackeys/13/scripts/universe_layer.gd index 728d7fb67..b2eb77812 100644 --- a/apps/gamejam/brackeys/13/scripts/universe_layer.gd +++ b/apps/gamejam/brackeys/13/scripts/universe_layer.gd @@ -1,26 +1,17 @@ extends Parallax2D - @export var pool_size: int = 2 -@export var scroll_speed: float = 10.0 - -# Screen bounds -var screen_width: float -var screen_height: float +@export var despawn_distance: float = 2000 -# Sprite pools var active_sprites: Array[Sprite2D] = [] var inactive_sprites: Array[Sprite2D] = [] const BASE_PATH: String = "res://assets/kbve/png/universe/object" +var spaceship: Node2D + func _ready(): - var viewport = get_viewport() - screen_width = viewport.get_visible_rect().size.x - screen_height = viewport.get_visible_rect().size.y - ignore_camera_scroll = true - repeat_size = Vector2(screen_width * 2, screen_height * 2) - scroll_scale = Vector2(1.0, 1.0) + spaceship = get_tree().get_root().find_child("Spaceship", true, false) _initialize_pool() _spawn_initial_sprites() @@ -36,36 +27,41 @@ func _initialize_pool(): var scale = randf_range(0.5, 1.5) sprite.scale = Vector2(scale, scale) - var notifier = VisibleOnScreenNotifier2D.new() - notifier.rect = Rect2(-sprite.get_rect().size * scale / 2, sprite.get_rect().size * scale) - sprite.add_child(notifier) - notifier.connect("screen_exited", Callable(self, "_return_to_pool").bind(sprite)) inactive_sprites.append(sprite) add_child(sprite) sprite.hide() func _spawn_initial_sprites(): - var spawn_area_width = screen_width * 2 for i in range(pool_size): - _spawn_sprite(Vector2(randf_range(0, spawn_area_width), randf_range(0, screen_height))) + _spawn_sprite_near_ship() -func _spawn_sprite(position: Vector2): - if inactive_sprites.size() == 0: +func _spawn_sprite_near_ship(): + if inactive_sprites.is_empty() or spaceship == null: return var sprite = inactive_sprites.pop_back() - sprite.position = position + + var offset_distance = randf_range(500, 1500) + var angle = randf_range(0, TAU) + var spawn_position = spaceship.global_position + Vector2(offset_distance, 0).rotated(angle) + + sprite.position = spawn_position sprite.scale = Vector2(randf_range(0.5, 1.5), randf_range(0.5, 1.5)) sprite.show() active_sprites.append(sprite) -func _return_to_pool(sprite: Sprite2D): - if sprite in active_sprites: - active_sprites.erase(sprite) - inactive_sprites.append(sprite) - sprite.hide() - var spawn_x = screen_width + scroll_offset.x + randf_range(0, screen_width) - _spawn_sprite(Vector2(spawn_x, randf_range(0, screen_height))) - func _process(delta: float): - scroll_offset.x -= scroll_speed * delta + if spaceship == null: + return + + for sprite in active_sprites.duplicate(): + if spaceship.global_position.distance_to(sprite.global_position) > despawn_distance: + _return_to_pool(sprite) + + while active_sprites.size() < pool_size: + _spawn_sprite_near_ship() + +func _return_to_pool(sprite: Sprite2D): + active_sprites.erase(sprite) + inactive_sprites.append(sprite) + sprite.hide()