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 000000000..044cfd9e2 Binary files /dev/null and b/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_base.png differ 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 000000000..c741ea1e9 Binary files /dev/null and b/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_explode.png differ diff --git a/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_explode.png.import b/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_explode.png.import new file mode 100644 index 000000000..fb0d2294e --- /dev/null +++ b/apps/gamejam/brackeys/13/assets/frostwindz/asteroid_explode.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bf5iwehj5at6t" +path="res://.godot/imported/asteroid_explode.png-3be1e81ddede01303c41100b4d04a0ee.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/frostwindz/asteroid_explode.png" +dest_files=["res://.godot/imported/asteroid_explode.png-3be1e81ddede01303c41100b4d04a0ee.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/project.godot b/apps/gamejam/brackeys/13/project.godot index 31bf58283..f52732c3e 100644 --- a/apps/gamejam/brackeys/13/project.godot +++ b/apps/gamejam/brackeys/13/project.godot @@ -82,3 +82,4 @@ shoot={ renderer/rendering_method="gl_compatibility" renderer/rendering_method.mobile="gl_compatibility" +environment/defaults/default_clear_color=Color(0, 0, 0, 1) diff --git a/apps/gamejam/brackeys/13/scenes/asteroid.tscn b/apps/gamejam/brackeys/13/scenes/asteroid.tscn index b8f4c1213..102e6c76c 100644 --- a/apps/gamejam/brackeys/13/scenes/asteroid.tscn +++ b/apps/gamejam/brackeys/13/scenes/asteroid.tscn @@ -1,10 +1,75 @@ -[gd_scene load_steps=4 format=3 uid="uid://c4tfp7xjvfd2t"] +[gd_scene load_steps=14 format=3 uid="uid://c4tfp7xjvfd2t"] -[ext_resource type="Texture2D" uid="uid://ct1megp1rctxi" path="res://assets/kenny/space-shooter-redux/png/meteorGrey_big3.png" id="1_bra2q"] [ext_resource type="Script" path="res://scripts/asteroid.gd" id="1_luuic"] +[ext_resource type="Texture2D" uid="uid://dbx7yu6wgjtfs" path="res://assets/frostwindz/asteroid_base.png" id="2_dvxfl"] +[ext_resource type="Texture2D" uid="uid://bf5iwehj5at6t" path="res://assets/frostwindz/asteroid_explode.png" id="3_t8m0d"] [sub_resource type="CircleShape2D" id="CircleShape2D_qw1xp"] -radius = 44.6542 +radius = 18.2483 + +[sub_resource type="AtlasTexture" id="AtlasTexture_faa0d"] +atlas = ExtResource("3_t8m0d") +region = Rect2(0, 0, 96, 96) + +[sub_resource type="AtlasTexture" id="AtlasTexture_54mr3"] +atlas = ExtResource("3_t8m0d") +region = Rect2(96, 0, 96, 96) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4ntrw"] +atlas = ExtResource("3_t8m0d") +region = Rect2(192, 0, 96, 96) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lsyjt"] +atlas = ExtResource("3_t8m0d") +region = Rect2(288, 0, 96, 96) + +[sub_resource type="AtlasTexture" id="AtlasTexture_p1u3t"] +atlas = ExtResource("3_t8m0d") +region = Rect2(384, 0, 96, 96) + +[sub_resource type="AtlasTexture" id="AtlasTexture_oxqmb"] +atlas = ExtResource("3_t8m0d") +region = Rect2(480, 0, 96, 96) + +[sub_resource type="AtlasTexture" id="AtlasTexture_o4oup"] +atlas = ExtResource("3_t8m0d") +region = Rect2(576, 0, 96, 96) + +[sub_resource type="AtlasTexture" id="AtlasTexture_c77nx"] +atlas = ExtResource("3_t8m0d") +region = Rect2(672, 0, 96, 96) + +[sub_resource type="SpriteFrames" id="SpriteFrames_30yq2"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_faa0d") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_54mr3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4ntrw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lsyjt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p1u3t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_oxqmb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_o4oup") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_c77nx") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] [node name="Asteroid" type="Area2D"] collision_layer = 128 @@ -12,9 +77,15 @@ collision_mask = 288 script = ExtResource("1_luuic") [node name="Sprite2D" type="Sprite2D" parent="."] -texture = ExtResource("1_bra2q") +texture = ExtResource("2_dvxfl") [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_qw1xp") +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] +visible = false +sprite_frames = SubResource("SpriteFrames_30yq2") +frame = 6 +frame_progress = 0.643016 + [connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/apps/gamejam/brackeys/13/scenes/game.tscn b/apps/gamejam/brackeys/13/scenes/game.tscn index 096df737e..5fc593c62 100644 --- a/apps/gamejam/brackeys/13/scenes/game.tscn +++ b/apps/gamejam/brackeys/13/scenes/game.tscn @@ -159,7 +159,8 @@ script = ExtResource("3_hgajf") [node name="Background" type="Node2D" parent="."] script = ExtResource("4_8k503") -[node name="TimespaceLayer" type="Node2D" parent="Background"] +[node name="TimespaceLayer" type="CanvasLayer" parent="Background"] +layer = -2 script = ExtResource("5_jsdqu") [node name="ColorRect" type="ColorRect" parent="Background/TimespaceLayer"] diff --git a/apps/gamejam/brackeys/13/scenes/spaceship.tscn b/apps/gamejam/brackeys/13/scenes/spaceship.tscn index 6ca26baa9..c6f10aff5 100644 --- a/apps/gamejam/brackeys/13/scenes/spaceship.tscn +++ b/apps/gamejam/brackeys/13/scenes/spaceship.tscn @@ -248,3 +248,8 @@ position = Vector2(-8.34465e-07, 1.75) scale = Vector2(0.84375, 0.832031) sprite_frames = SubResource("SpriteFrames_wdipm") animation = &"shield" + +[node name="Camera2D" type="Camera2D" parent="."] +position_smoothing_enabled = true +drag_horizontal_enabled = true +drag_vertical_enabled = true diff --git a/apps/gamejam/brackeys/13/scripts/global.gd b/apps/gamejam/brackeys/13/scripts/global.gd index 4efc2411b..16b5ed5b9 100644 --- a/apps/gamejam/brackeys/13/scripts/global.gd +++ b/apps/gamejam/brackeys/13/scripts/global.gd @@ -46,7 +46,8 @@ var starship_bonuses := { var starship_data := { "name": "Explorer-X", "emergency_rockets_used": false, - "shield_active": false + "shield_active": false, + "coordinates": Vector2.ZERO } func earn_random_resource(resource_name: String, min_value: int = 3, max_value: int = 15): @@ -120,3 +121,10 @@ func get_environment_data(data_name: String): func set_environment_data(data_name: String, new_value): environment_data[data_name] = new_value emit_signal("environment_data_changed", data_name, new_value) + +func get_starship_coordinates() -> 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()