diff --git a/2d/platformer/README.md b/2d/platformer/README.md index 7d8db3c4..67f6a198 100644 --- a/2d/platformer/README.md +++ b/2d/platformer/README.md @@ -1,46 +1,41 @@ # 2D Platformer -This demo is a pixel art 2D platformer with graphics and sound. +This demo is a pixel art 2D platformer with single-player +and two player splitscreen multiplayer. -It shows you how to code characters and physics-based objects +It demonstrates how to code characters and physics-based objects in a real game context. This is a relatively complete demo where the player can jump, walk on slopes, fire bullets, -interact with enemies, and more. It contains one closed -level, and the player is invincible, unlike the enemies. - -You will find most of the demo’s content in the `Level.tscn` scene. -You can open it from the default `Game.tscn` scene, or double -click on `Level.tscn` in the `src/Level/` directory. - -We invite you to open the demo's GDScript files in the editor as -they contain a lot of comments that explain how each class works. +interact with enemies, and collect items. It contains one +level. The player is invincible, unlike the enemies. Language: GDScript -Renderer: GLES 2 +Renderer: Forward Plus Check out this demo on the asset library: https://godotengine.org/asset-library/asset/120 ## Features -- Side-scrolling player controller using [`KinematicBody2D`](https://docs.godotengine.org/en/latest/classes/class_kinematicbody2d.html). - - Can walk on and snap to slopes. - - Can shoot, including while jumping. +- Side-scrolling player controller using [`CharacterBody2D`](https://docs.godotengine.org/en/latest/classes/class_characterbody2d.html). + - Can walk smoothly up and down slopes. + - Can shoot, including while jumping. + - Has a double jump that provides a horizontal momentum boost. - Enemies that crawl on the floor and change direction when they encounter an obstacle. - Camera that stays within the level’s bounds. -- Supports keyboard and gamepad controls. +- Keyboard and gamepad control support. - Platforms that can move in any direction. - Gun that shoots bullets with rigid body (natural) physics. - Collectible coins. -- Pause and pause menu. +- Pausing and a pause menu. - Pixel art visuals. - Sound effects and music. ## Screenshots -![Player shooting in the direction of an enemy](screenshots/shoot.png) +![Player shooting in the direction of an enemy](screenshots/shoot.webp) -![The entire level layout viewed in the editor](screenshots/layout.png) +![The entire level layout viewed in the editor](screenshots/layout.webp) ## Music diff --git a/2d/platformer/assets/art/background/cloud_1.png b/2d/platformer/assets/art/background/cloud_1.png deleted file mode 100644 index 5f01d1b8..00000000 Binary files a/2d/platformer/assets/art/background/cloud_1.png and /dev/null differ diff --git a/2d/platformer/assets/art/background/cloud_2.png b/2d/platformer/assets/art/background/cloud_2.png deleted file mode 100644 index 68c985f2..00000000 Binary files a/2d/platformer/assets/art/background/cloud_2.png and /dev/null differ diff --git a/2d/platformer/assets/art/background/cloud_3.png b/2d/platformer/assets/art/background/cloud_3.png deleted file mode 100644 index 998d6ff0..00000000 Binary files a/2d/platformer/assets/art/background/cloud_3.png and /dev/null differ diff --git a/2d/platformer/assets/art/background/distant_platforms_1.png b/2d/platformer/assets/art/background/distant_platforms_1.png deleted file mode 100644 index a513c820..00000000 Binary files a/2d/platformer/assets/art/background/distant_platforms_1.png and /dev/null differ diff --git a/2d/platformer/assets/art/background/distant_platforms_2.png b/2d/platformer/assets/art/background/distant_platforms_2.png deleted file mode 100644 index da67ebe7..00000000 Binary files a/2d/platformer/assets/art/background/distant_platforms_2.png and /dev/null differ diff --git a/2d/platformer/assets/art/background/sky.png b/2d/platformer/assets/art/background/sky.png deleted file mode 100644 index 13ba7b6c..00000000 Binary files a/2d/platformer/assets/art/background/sky.png and /dev/null differ diff --git a/2d/platformer/assets/art/coin/coin.png b/2d/platformer/assets/art/coin/coin.png deleted file mode 100644 index 2c966e57..00000000 Binary files a/2d/platformer/assets/art/coin/coin.png and /dev/null differ diff --git a/2d/platformer/assets/art/enemy/enemy.png b/2d/platformer/assets/art/enemy/enemy.png deleted file mode 100644 index 5fcf9503..00000000 Binary files a/2d/platformer/assets/art/enemy/enemy.png and /dev/null differ diff --git a/2d/platformer/assets/art/platforms/moving_platform.png b/2d/platformer/assets/art/platforms/moving_platform.png deleted file mode 100644 index 42554b78..00000000 Binary files a/2d/platformer/assets/art/platforms/moving_platform.png and /dev/null differ diff --git a/2d/platformer/assets/art/platforms/one_way_platform.png b/2d/platformer/assets/art/platforms/one_way_platform.png deleted file mode 100644 index 6e0b1518..00000000 Binary files a/2d/platformer/assets/art/platforms/one_way_platform.png and /dev/null differ diff --git a/2d/platformer/assets/art/player/bullet/bullet.png b/2d/platformer/assets/art/player/bullet/bullet.png deleted file mode 100644 index f8e0168c..00000000 Binary files a/2d/platformer/assets/art/player/bullet/bullet.png and /dev/null differ diff --git a/2d/platformer/assets/art/player/robot_demo.png b/2d/platformer/assets/art/player/robot_demo.png deleted file mode 100644 index 914a5efb..00000000 Binary files a/2d/platformer/assets/art/player/robot_demo.png and /dev/null differ diff --git a/2d/platformer/assets/art/tileset/tiles_demo.png b/2d/platformer/assets/art/tileset/tiles_demo.png deleted file mode 100644 index bbb7d44a..00000000 Binary files a/2d/platformer/assets/art/tileset/tiles_demo.png and /dev/null differ diff --git a/2d/platformer/assets/art/tileset/tileset.tres b/2d/platformer/assets/art/tileset/tileset.tres deleted file mode 100644 index 917e2afa..00000000 --- a/2d/platformer/assets/art/tileset/tileset.tres +++ /dev/null @@ -1,335 +0,0 @@ -[gd_resource type="TileSet" load_steps=14 format=2] - -[ext_resource path="res://assets/art/tileset/tiles_demo.png" type="Texture2D" id=1] - -[sub_resource type="ConvexPolygonShape2D" id=1] -points = PackedVector2Array( 0, 6, 32, 6, 32, 32, 0, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=2] -points = PackedVector2Array( 0, 6, 28, 6, 28, 32, 0, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=3] -points = PackedVector2Array( 0, 0, 32, 0, 32, 32, 0, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=4] -points = PackedVector2Array( 0, 6, 32, 6, 32, 32, 0, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=5] -points = PackedVector2Array( 32, 38, 32, 64, 0, 64, 0, 6 ) - -[sub_resource type="ConvexPolygonShape2D" id=6] -points = PackedVector2Array( 0, 0, 28, 0, 28, 32, 0, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=7] -points = PackedVector2Array( 28, 6, 32, 6, 32, 32, 0, 32, 0, 0, 28, 0 ) - -[sub_resource type="ConvexPolygonShape2D" id=8] -points = PackedVector2Array( 0, 6, 32, 6, 32, 32, 0, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=9] -points = PackedVector2Array( 0, 6, 28, 6, 28, 32, 0, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=10] -points = PackedVector2Array( 0, 0, 32, 0, 32, 32, 0, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=11] -points = PackedVector2Array( 0, 0, 32, 0, 32, 24, 0, 24 ) - -[sub_resource type="ConvexPolygonShape2D" id=12] -points = PackedVector2Array( 0, 0, 28, 0, 28, 24, 0, 24 ) - -[resource] -0/name = "ground" -0/texture = ExtResource( 1 ) -0/tex_offset = Vector2( 0, 0 ) -0/modulate = Color( 1, 1, 1, 1 ) -0/region = Rect2( 0, 0, 32, 32 ) -0/tile_mode = 0 -0/occluder_offset = Vector2( 0, 0 ) -0/navigation_offset = Vector2( 0, 0 ) -0/shape_offset = Vector2( 0, 0 ) -0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -0/shape = SubResource( 1 ) -0/shape_one_way = false -0/shape_one_way_margin = 1.0 -0/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": false, -"one_way_margin": 1.0, -"shape": SubResource( 1 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -0/z_index = 0 -1/name = "ground_end" -1/texture = ExtResource( 1 ) -1/tex_offset = Vector2( 0, 0 ) -1/modulate = Color( 1, 1, 1, 1 ) -1/region = Rect2( 32, 0, 32, 32 ) -1/tile_mode = 0 -1/occluder_offset = Vector2( 0, 0 ) -1/navigation_offset = Vector2( 0, 0 ) -1/shape_offset = Vector2( 0, 0 ) -1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -1/shape = SubResource( 2 ) -1/shape_one_way = false -1/shape_one_way_margin = 1.0 -1/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": false, -"one_way_margin": 1.0, -"shape": SubResource( 2 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -1/z_index = 0 -2/name = "slope" -2/texture = ExtResource( 1 ) -2/tex_offset = Vector2( 0, 0 ) -2/modulate = Color( 1, 1, 1, 1 ) -2/region = Rect2( 64, 64, 32, 64 ) -2/tile_mode = 0 -2/occluder_offset = Vector2( 0, 0 ) -2/navigation_offset = Vector2( 0, 0 ) -2/shape_offset = Vector2( 0, 0 ) -2/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -2/shape = SubResource( 5 ) -2/shape_one_way = false -2/shape_one_way_margin = 1.0 -2/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": false, -"one_way_margin": 1.0, -"shape": SubResource( 5 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -2/z_index = 0 -3/name = "wall" -3/texture = ExtResource( 1 ) -3/tex_offset = Vector2( 0, 0 ) -3/modulate = Color( 1, 1, 1, 1 ) -3/region = Rect2( 32, 32, 32, 32 ) -3/tile_mode = 0 -3/occluder_offset = Vector2( 0, 0 ) -3/navigation_offset = Vector2( 0, 0 ) -3/shape_offset = Vector2( 0, 0 ) -3/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -3/shape = SubResource( 6 ) -3/shape_one_way = false -3/shape_one_way_margin = 1.0 -3/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": false, -"one_way_margin": 1.0, -"shape": SubResource( 6 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -3/z_index = 0 -4/name = "slope_top" -4/texture = ExtResource( 1 ) -4/tex_offset = Vector2( 0, 0 ) -4/modulate = Color( 1, 1, 1, 1 ) -4/region = Rect2( 32, 64, 32, 32 ) -4/tile_mode = 0 -4/occluder_offset = Vector2( 0, 0 ) -4/navigation_offset = Vector2( 0, 0 ) -4/shape_offset = Vector2( 0, 0 ) -4/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -4/shape = SubResource( 7 ) -4/shape_one_way = false -4/shape_one_way_margin = 1.0 -4/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": false, -"one_way_margin": 1.0, -"shape": SubResource( 7 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -4/z_index = 0 -5/name = "one_way" -5/texture = ExtResource( 1 ) -5/tex_offset = Vector2( 0, 0 ) -5/modulate = Color( 1, 1, 1, 1 ) -5/region = Rect2( 64, 0, 32, 32 ) -5/tile_mode = 0 -5/occluder_offset = Vector2( 0, 0 ) -5/navigation_offset = Vector2( 0, 0 ) -5/shape_offset = Vector2( 0, 0 ) -5/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -5/shape = SubResource( 8 ) -5/shape_one_way = true -5/shape_one_way_margin = 1.0 -5/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": true, -"one_way_margin": 1.0, -"shape": SubResource( 8 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -5/z_index = 0 -6/name = "one_way_end" -6/texture = ExtResource( 1 ) -6/tex_offset = Vector2( 0, 0 ) -6/modulate = Color( 1, 1, 1, 1 ) -6/region = Rect2( 96, 0, 32, 32 ) -6/tile_mode = 0 -6/occluder_offset = Vector2( 0, 0 ) -6/navigation_offset = Vector2( 0, 0 ) -6/shape_offset = Vector2( 0, 0 ) -6/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -6/shape = SubResource( 9 ) -6/shape_one_way = true -6/shape_one_way_margin = 1.0 -6/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": true, -"one_way_margin": 1.0, -"shape": SubResource( 9 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -6/z_index = 0 -7/name = "rock" -7/texture = ExtResource( 1 ) -7/tex_offset = Vector2( 0, 0 ) -7/modulate = Color( 1, 1, 1, 1 ) -7/region = Rect2( 0, 32, 32, 32 ) -7/tile_mode = 0 -7/occluder_offset = Vector2( 0, 0 ) -7/navigation_offset = Vector2( 0, 0 ) -7/shape_offset = Vector2( 0, 0 ) -7/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -7/shape = SubResource( 10 ) -7/shape_one_way = false -7/shape_one_way_margin = 1.0 -7/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": false, -"one_way_margin": 1.0, -"shape": SubResource( 10 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -7/z_index = 0 -8/name = "bottom" -8/texture = ExtResource( 1 ) -8/tex_offset = Vector2( 0, 0 ) -8/modulate = Color( 1, 1, 1, 1 ) -8/region = Rect2( 192, 32, 32, 32 ) -8/tile_mode = 0 -8/occluder_offset = Vector2( 0, 0 ) -8/navigation_offset = Vector2( 0, 0 ) -8/shape_offset = Vector2( 0, 0 ) -8/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -8/shape = SubResource( 11 ) -8/shape_one_way = false -8/shape_one_way_margin = 1.0 -8/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": false, -"one_way_margin": 1.0, -"shape": SubResource( 11 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -8/z_index = 0 -9/name = "bottom_end" -9/texture = ExtResource( 1 ) -9/tex_offset = Vector2( 0, 0 ) -9/modulate = Color( 1, 1, 1, 1 ) -9/region = Rect2( 224, 32, 32, 32 ) -9/tile_mode = 0 -9/occluder_offset = Vector2( 0, 0 ) -9/navigation_offset = Vector2( 0, 0 ) -9/shape_offset = Vector2( 0, 0 ) -9/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -9/shape = SubResource( 12 ) -9/shape_one_way = false -9/shape_one_way_margin = 1.0 -9/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": false, -"one_way_margin": 1.0, -"shape": SubResource( 12 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -9/z_index = 0 -10/name = "bottom_corner" -10/texture = ExtResource( 1 ) -10/tex_offset = Vector2( 0, 0 ) -10/modulate = Color( 1, 1, 1, 1 ) -10/region = Rect2( 160, 32, 32, 32 ) -10/tile_mode = 0 -10/occluder_offset = Vector2( 0, 0 ) -10/navigation_offset = Vector2( 0, 0 ) -10/shape_offset = Vector2( 0, 0 ) -10/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -10/shape = SubResource( 3 ) -10/shape_one_way = false -10/shape_one_way_margin = 1.0 -10/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": false, -"one_way_margin": 1.0, -"shape": SubResource( 3 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -10/z_index = 0 -11/name = "tree_trunk_0" -11/texture = ExtResource( 1 ) -11/tex_offset = Vector2( 0, 0 ) -11/modulate = Color( 1, 1, 1, 1 ) -11/region = Rect2( 128, 64, 32, 32 ) -11/tile_mode = 0 -11/occluder_offset = Vector2( 0, 0 ) -11/navigation_offset = Vector2( 0, 0 ) -11/shape_offset = Vector2( 0, 0 ) -11/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -11/shape_one_way = false -11/shape_one_way_margin = 0.0 -11/shapes = [ ] -11/z_index = 0 -12/name = "tree_trunk_1" -12/texture = ExtResource( 1 ) -12/tex_offset = Vector2( 0, 0 ) -12/modulate = Color( 1, 1, 1, 1 ) -12/region = Rect2( 128, 32, 32, 32 ) -12/tile_mode = 0 -12/occluder_offset = Vector2( 0, 0 ) -12/navigation_offset = Vector2( 0, 0 ) -12/shape_offset = Vector2( 0, 0 ) -12/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -12/shape_one_way = false -12/shape_one_way_margin = 0.0 -12/shapes = [ ] -12/z_index = 0 -13/name = "tree_base" -13/texture = ExtResource( 1 ) -13/tex_offset = Vector2( 0, 0 ) -13/modulate = Color( 1, 1, 1, 1 ) -13/region = Rect2( 128, 96, 32, 32 ) -13/tile_mode = 0 -13/occluder_offset = Vector2( 0, 0 ) -13/navigation_offset = Vector2( 0, 0 ) -13/shape_offset = Vector2( 0, 0 ) -13/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -13/shape = SubResource( 4 ) -13/shape_one_way = false -13/shape_one_way_margin = 1.0 -13/shapes = [ { -"autotile_coord": Vector2( 0, 0 ), -"one_way": false, -"one_way_margin": 1.0, -"shape": SubResource( 4 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) -} ] -13/z_index = 0 -14/name = "tree_top" -14/texture = ExtResource( 1 ) -14/tex_offset = Vector2( 0, 0 ) -14/modulate = Color( 1, 1, 1, 1 ) -14/region = Rect2( 128, 0, 32, 32 ) -14/tile_mode = 0 -14/occluder_offset = Vector2( 0, 0 ) -14/navigation_offset = Vector2( 0, 0 ) -14/shape_offset = Vector2( 0, 0 ) -14/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) -14/shape_one_way = false -14/shape_one_way_margin = 0.0 -14/shapes = [ ] -14/z_index = 0 diff --git a/2d/platformer/assets/art/ui/touch_button_fire.png b/2d/platformer/assets/art/ui/touch_button_fire.png deleted file mode 100644 index 1d7ed2d5..00000000 Binary files a/2d/platformer/assets/art/ui/touch_button_fire.png and /dev/null differ diff --git a/2d/platformer/assets/art/ui/touch_button_jump.png b/2d/platformer/assets/art/ui/touch_button_jump.png deleted file mode 100644 index 819ba611..00000000 Binary files a/2d/platformer/assets/art/ui/touch_button_jump.png and /dev/null differ diff --git a/2d/platformer/assets/art/ui/touch_button_left.png b/2d/platformer/assets/art/ui/touch_button_left.png deleted file mode 100644 index 60e48d69..00000000 Binary files a/2d/platformer/assets/art/ui/touch_button_left.png and /dev/null differ diff --git a/2d/platformer/assets/art/ui/touch_button_right.png b/2d/platformer/assets/art/ui/touch_button_right.png deleted file mode 100644 index 8f0c57c4..00000000 Binary files a/2d/platformer/assets/art/ui/touch_button_right.png and /dev/null differ diff --git a/2d/platformer/assets/audio/music/music.ogg.import b/2d/platformer/assets/audio/music/music.ogg.import deleted file mode 100644 index 88faf849..00000000 --- a/2d/platformer/assets/audio/music/music.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://cx6hrmvjvhkt5" -path="res://.godot/imported/music.ogg-e27216112531ea490cdad574860a53a5.oggvorbisstr" - -[deps] - -source_file="res://assets/audio/music/music.ogg" -dest_files=["res://.godot/imported/music.ogg-e27216112531ea490cdad574860a53a5.oggvorbisstr"] - -[params] - -loop=true -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/2d/platformer/assets/theme/fonts/kenney_mini_square.tres b/2d/platformer/assets/theme/fonts/kenney_mini_square.tres deleted file mode 100644 index 1cb0ffcb..00000000 --- a/2d/platformer/assets/theme/fonts/kenney_mini_square.tres +++ /dev/null @@ -1,5 +0,0 @@ -[gd_resource type="FontData" format=2] - -[resource] -antialiased = false -font_path = "res://assets/theme/fonts/kenney_mini_square.ttf" diff --git a/2d/platformer/enemy/enemy.gd b/2d/platformer/enemy/enemy.gd new file mode 100644 index 00000000..c0d97945 --- /dev/null +++ b/2d/platformer/enemy/enemy.gd @@ -0,0 +1,59 @@ +class_name Enemy extends CharacterBody2D + + +enum State { + WALKING, + DEAD, +} + +const WALK_SPEED = 100.0 + +var _state := State.WALKING + +@onready var gravity: int = ProjectSettings.get("physics/2d/default_gravity") +@onready var platform_detector := $PlatformDetector as RayCast2D +@onready var floor_detector_left := $FloorDetectorLeft as RayCast2D +@onready var floor_detector_right := $FloorDetectorRight as RayCast2D +@onready var sprite := $Sprite2D as Sprite2D +@onready var animation_player := $AnimationPlayer as AnimationPlayer + + +func _physics_process(delta: float) -> void: + if _state == State.WALKING and velocity.is_zero_approx(): + velocity.x = WALK_SPEED + velocity.y += gravity * delta + if not floor_detector_left.is_colliding(): + velocity.x = WALK_SPEED + elif not floor_detector_right.is_colliding(): + velocity.x = -WALK_SPEED + + if is_on_wall(): + velocity.x = -velocity.x + + move_and_slide() + + if velocity.x > 0.0: + sprite.scale.x = 1.0 + elif velocity.x < 0.0: + sprite.scale.x = -1.0 + + var animation := get_new_animation() + if animation != animation_player.current_animation: + animation_player.play(animation) + + +func destroy() -> void: + _state = State.DEAD + velocity = Vector2.ZERO + + +func get_new_animation() -> StringName: + var animation_new: StringName + if _state == State.WALKING: + if velocity.x == 0: + animation_new = &"idle" + else: + animation_new = &"walk" + else: + animation_new = &"destroy" + return animation_new diff --git a/2d/platformer/src/Actors/Enemy.tscn b/2d/platformer/enemy/enemy.tscn similarity index 57% rename from 2d/platformer/src/Actors/Enemy.tscn rename to 2d/platformer/enemy/enemy.tscn index accdf2ea..d49c950a 100644 --- a/2d/platformer/src/Actors/Enemy.tscn +++ b/2d/platformer/enemy/enemy.tscn @@ -1,22 +1,85 @@ -[gd_scene load_steps=13 format=2] +[gd_scene load_steps=15 format=3 uid="uid://bd478yrtijbfn"] -[ext_resource path="res://assets/art/player/bullet/bullet.png" type="Texture2D" id=1] -[ext_resource path="res://assets/audio/sfx/explode.wav" type="AudioStream" id=2] -[ext_resource path="res://assets/audio/sfx/hit.wav" type="AudioStream" id=3] -[ext_resource path="res://assets/art/enemy/enemy.png" type="Texture2D" id=4] -[ext_resource path="res://src/Actors/Enemy.gd" type="Script" id=5] +[ext_resource type="Texture2D" uid="uid://c2aisfmq85suf" path="res://player/bullet.webp" id="1"] +[ext_resource type="AudioStream" uid="uid://bbxjxs8sms61b" path="res://enemy/explode.wav" id="2"] +[ext_resource type="AudioStream" uid="uid://brtn51vs7jaet" path="res://enemy/hit.wav" id="3"] +[ext_resource type="Texture2D" uid="uid://cdy6gikv8wka7" path="res://enemy/enemy.webp" id="4"] +[ext_resource type="Script" path="res://enemy/enemy.gd" id="5"] -[sub_resource type="CanvasItemMaterial" id=1] +[sub_resource type="CanvasItemMaterial" id="1"] -[sub_resource type="Animation" id=2] +[sub_resource type="Animation" id="Animation_67t2c"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:collision_layer") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [2] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:frame") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Sprite2D:self_modulate") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} + +[sub_resource type="Animation" id="2"] resource_name = "destroy" length = 1.5 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), @@ -24,11 +87,11 @@ tracks/0/keys = { "values": [7] } tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true tracks/1/path = NodePath("Sprite2D:rotation_degrees") tracks/1/interp = 1 tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true tracks/1/keys = { "times": PackedFloat32Array(0, 0.8), "transitions": PackedFloat32Array(0.0796601, 1), @@ -36,23 +99,23 @@ tracks/1/keys = { "values": [0.0, 180.0] } tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true tracks/2/path = NodePath("Sprite2D:self_modulate") tracks/2/interp = 1 tracks/2/loop_wrap = true -tracks/2/imported = false -tracks/2/enabled = true tracks/2/keys = { -"times": PackedFloat32Array(0, 0.5, 1.1), +"times": PackedFloat32Array(0, 0.9, 1.3), "transitions": PackedFloat32Array(1, 1, 1), "update": 0, "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] } tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true tracks/3/path = NodePath("Explosion:emitting") tracks/3/interp = 1 tracks/3/loop_wrap = true -tracks/3/imported = false -tracks/3/enabled = true tracks/3/keys = { "times": PackedFloat32Array(0, 1), "transitions": PackedFloat32Array(1, 1), @@ -60,90 +123,77 @@ tracks/3/keys = { "values": [false, true] } tracks/4/type = "value" -tracks/4/path = NodePath("Explosion:process_material:scale") -tracks/4/interp = 1 -tracks/4/loop_wrap = true tracks/4/imported = false tracks/4/enabled = true +tracks/4/path = NodePath("Hit:playing") +tracks/4/interp = 1 +tracks/4/loop_wrap = true tracks/4/keys = { -"times": PackedFloat32Array(0.6, 1), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [1.0, 4.0] -} -tracks/5/type = "value" -tracks/5/path = NodePath("Hit:playing") -tracks/5/interp = 1 -tracks/5/loop_wrap = true -tracks/5/imported = false -tracks/5/enabled = true -tracks/5/keys = { "times": PackedFloat32Array(0.00999999), "transitions": PackedFloat32Array(1), "update": 1, "values": [true] } -tracks/6/type = "value" -tracks/6/path = NodePath("Explode:playing") -tracks/6/interp = 1 -tracks/6/loop_wrap = true -tracks/6/imported = false -tracks/6/enabled = true -tracks/6/keys = { +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Explode:playing") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { "times": PackedFloat32Array(0.8), "transitions": PackedFloat32Array(1), "update": 1, "values": [true] } -tracks/7/type = "method" -tracks/7/path = NodePath(".") -tracks/7/interp = 1 -tracks/7/loop_wrap = true -tracks/7/imported = false -tracks/7/enabled = true -tracks/7/keys = { +tracks/6/type = "method" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath(".") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { "times": PackedFloat32Array(1.5), "transitions": PackedFloat32Array(1), "values": [{ "args": [], -"method": "queue_free" +"method": &"queue_free" }] } -tracks/8/type = "value" -tracks/8/path = NodePath(".:collision_layer") -tracks/8/interp = 1 -tracks/8/loop_wrap = true -tracks/8/imported = false -tracks/8/enabled = true -tracks/8/keys = { +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath(".:collision_layer") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 1, "values": [0] } -tracks/9/type = "value" -tracks/9/path = NodePath("Sprite2D:position") -tracks/9/interp = 1 -tracks/9/loop_wrap = true -tracks/9/imported = false -tracks/9/enabled = true -tracks/9/keys = { +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Sprite2D:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { "times": PackedFloat32Array(0, 0.2, 0.4), "transitions": PackedFloat32Array(2.2974, 0.183011, 1), "update": 0, "values": [Vector2(0, 0), Vector2(0, -32), Vector2(0, 0)] } -[sub_resource type="Animation" id=3] +[sub_resource type="Animation" id="3"] length = 6.75 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0, 0.75, 1.5, 2.25, 3, 3.75, 4.5, 5.25, 6, 6.75), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), @@ -151,16 +201,15 @@ tracks/0/keys = { "values": [5, 6, 5, 6, 5, 6, 7, 6, 7, 5] } -[sub_resource type="Animation" id=4] +[sub_resource type="Animation" id="4"] length = 1.25 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0, 0.25, 0.5, 0.75, 1, 1.25), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), @@ -168,60 +217,61 @@ tracks/0/keys = { "values": [0, 1, 2, 3, 4, 0] } -[sub_resource type="CapsuleShape2D" id=5] -radius = 11.0 -height = 7.0 +[sub_resource type="AnimationLibrary" id="AnimationLibrary_nnb1f"] +_data = { +"RESET": SubResource("Animation_67t2c"), +"destroy": SubResource("2"), +"idle": SubResource("3"), +"walk": SubResource("4") +} -[sub_resource type="CanvasItemMaterial" id=6] +[sub_resource type="CapsuleShape2D" id="5"] +radius = 8.0 +height = 22.0 + +[sub_resource type="CanvasItemMaterial" id="6"] blend_mode = 1 -[sub_resource type="Gradient" id=7] +[sub_resource type="Gradient" id="7"] offsets = PackedFloat32Array(0.5, 1) colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 1) [node name="Enemy" type="CharacterBody2D"] collision_layer = 2 -collision_mask = 24 -script = ExtResource( 5 ) -speed = Vector2(75, 250) +collision_mask = 26 +collision_priority = 2.0 +script = ExtResource("5") [node name="PlatformDetector" type="RayCast2D" parent="."] position = Vector2(0, 6) -enabled = true -cast_to = Vector2(0, 8) collision_mask = 8 [node name="FloorDetectorLeft" type="RayCast2D" parent="."] position = Vector2(-15, -4) -enabled = true -cast_to = Vector2(0, 35) collision_mask = 24 [node name="FloorDetectorRight" type="RayCast2D" parent="."] position = Vector2(15.5, -3) -enabled = true -cast_to = Vector2(0, 35) collision_mask = 24 [node name="Sprite2D" type="Sprite2D" parent="."] -material = SubResource( 1 ) -texture = ExtResource( 4 ) +material = SubResource("1") +texture = ExtResource("4") flip_h = true hframes = 8 -frame = 7 [node name="AnimationPlayer" type="AnimationPlayer" parent="."] -anims/destroy = SubResource( 2 ) -anims/idle = SubResource( 3 ) -anims/walk = SubResource( 4 ) +libraries = { +"": SubResource("AnimationLibrary_nnb1f") +} [node name="CollisionShape2D" type="CollisionShape2D" parent="."] rotation = -1.5708 -shape = SubResource( 5 ) +shape = SubResource("5") [node name="Explosion" type="CPUParticles2D" parent="."] self_modulate = Color(1, 1, 1, 0.12) -material = SubResource( 6 ) +material = SubResource("6") emitting = false amount = 32 lifetime = 0.5 @@ -229,21 +279,19 @@ one_shot = true speed_scale = 1.2 explosiveness = 0.76 draw_order = 215832976 -texture = ExtResource( 1 ) +texture = ExtResource("1") emission_shape = 1 emission_sphere_radius = 8.0 spread = 180.0 gravity = Vector2(0, 250) -initial_velocity = 120.0 -initial_velocity_random = 0.5 -angle_random = 1.0 -scale_amount_random = 1.0 -color_ramp = SubResource( 7 ) -hue_variation = 0.05 -hue_variation_random = 0.46 +initial_velocity_min = 25.0 +initial_velocity_max = 80.0 +angular_velocity_max = 45.0 +scale_amount_max = 1.2 +color_ramp = SubResource("7") [node name="Hit" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource( 3 ) +stream = ExtResource("3") [node name="Explode" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource( 2 ) +stream = ExtResource("2") diff --git a/2d/platformer/enemy/enemy.webp b/2d/platformer/enemy/enemy.webp new file mode 100644 index 00000000..8d90bdb5 Binary files /dev/null and b/2d/platformer/enemy/enemy.webp differ diff --git a/2d/platformer/assets/art/enemy/enemy.png.import b/2d/platformer/enemy/enemy.webp.import similarity index 66% rename from 2d/platformer/assets/art/enemy/enemy.png.import rename to 2d/platformer/enemy/enemy.webp.import index 94f8895c..4401c116 100644 --- a/2d/platformer/assets/art/enemy/enemy.png.import +++ b/2d/platformer/enemy/enemy.webp.import @@ -2,23 +2,23 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dq7svs8qmf7h6" -path="res://.godot/imported/enemy.png-c2f48b2558d3b68a547452306041a310.ctex" +uid="uid://cdy6gikv8wka7" +path="res://.godot/imported/enemy.webp-c5e00d5c5f64233c41f70dc392999636.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/enemy/enemy.png" -dest_files=["res://.godot/imported/enemy.png-c2f48b2558d3b68a547452306041a310.ctex"] +source_file="res://enemy/enemy.webp" +dest_files=["res://.godot/imported/enemy.webp-c5e00d5c5f64233c41f70dc392999636.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/assets/audio/sfx/explode.wav b/2d/platformer/enemy/explode.wav similarity index 100% rename from 2d/platformer/assets/audio/sfx/explode.wav rename to 2d/platformer/enemy/explode.wav diff --git a/2d/platformer/assets/audio/sfx/explode.wav.import b/2d/platformer/enemy/explode.wav.import similarity index 55% rename from 2d/platformer/assets/audio/sfx/explode.wav.import rename to 2d/platformer/enemy/explode.wav.import index 885dbf47..c7ac2881 100644 --- a/2d/platformer/assets/audio/sfx/explode.wav.import +++ b/2d/platformer/enemy/explode.wav.import @@ -3,12 +3,12 @@ importer="wav" type="AudioStreamWAV" uid="uid://bbxjxs8sms61b" -path="res://.godot/imported/explode.wav-302a3de6d016432bf47477d337a4d553.sample" +path="res://.godot/imported/explode.wav-2389d0cf62710ef336bf397194eae82e.sample" [deps] -source_file="res://assets/audio/sfx/explode.wav" -dest_files=["res://.godot/imported/explode.wav-302a3de6d016432bf47477d337a4d553.sample"] +source_file="res://enemy/explode.wav" +dest_files=["res://.godot/imported/explode.wav-2389d0cf62710ef336bf397194eae82e.sample"] [params] diff --git a/2d/platformer/assets/audio/sfx/hit.wav b/2d/platformer/enemy/hit.wav similarity index 100% rename from 2d/platformer/assets/audio/sfx/hit.wav rename to 2d/platformer/enemy/hit.wav diff --git a/2d/platformer/assets/audio/sfx/hit.wav.import b/2d/platformer/enemy/hit.wav.import similarity index 57% rename from 2d/platformer/assets/audio/sfx/hit.wav.import rename to 2d/platformer/enemy/hit.wav.import index 8f81b3b7..29f3e849 100644 --- a/2d/platformer/assets/audio/sfx/hit.wav.import +++ b/2d/platformer/enemy/hit.wav.import @@ -3,12 +3,12 @@ importer="wav" type="AudioStreamWAV" uid="uid://brtn51vs7jaet" -path="res://.godot/imported/hit.wav-27e178036f6cee6545e9f025a3865a36.sample" +path="res://.godot/imported/hit.wav-02ea2b331eef4f150ed1e5cb9477122b.sample" [deps] -source_file="res://assets/audio/sfx/hit.wav" -dest_files=["res://.godot/imported/hit.wav-27e178036f6cee6545e9f025a3865a36.sample"] +source_file="res://enemy/hit.wav" +dest_files=["res://.godot/imported/hit.wav-02ea2b331eef4f150ed1e5cb9477122b.sample"] [params] diff --git a/2d/platformer/game.gd b/2d/platformer/game.gd new file mode 100644 index 00000000..0ec75a89 --- /dev/null +++ b/2d/platformer/game.gd @@ -0,0 +1,24 @@ +class_name Game extends Node + + +@onready var _pause_menu := $InterfaceLayer/PauseMenu as PauseMenu + + +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_pressed(&"toggle_fullscreen"): + var mode := DisplayServer.window_get_mode() + if mode == DisplayServer.WINDOW_MODE_FULLSCREEN or \ + mode == DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + else: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) + get_tree().root.set_input_as_handled() + + elif event.is_action_pressed(&"toggle_pause"): + var tree := get_tree() + tree.paused = not tree.paused + if tree.paused: + _pause_menu.open() + else: + _pause_menu.close() + get_tree().root.set_input_as_handled() diff --git a/2d/platformer/game_singleplayer.tscn b/2d/platformer/game_singleplayer.tscn new file mode 100644 index 00000000..a1688eee --- /dev/null +++ b/2d/platformer/game_singleplayer.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=6 format=3 uid="uid://bf3wnwihk7ymg"] + +[ext_resource type="Script" path="res://game.gd" id="2"] +[ext_resource type="PackedScene" uid="uid://dr2p70jo7e4kn" path="res://level/level.tscn" id="3"] +[ext_resource type="PackedScene" uid="uid://d0ni64ucb3ym2" path="res://player/player.tscn" id="4"] +[ext_resource type="PackedScene" uid="uid://c7ai4bigaryci" path="res://gui/pause_menu_singleplayer.tscn" id="4_x6l06"] +[ext_resource type="PackedScene" uid="uid://do7htx4sqmcnh" path="res://music.tscn" id="5_rkna2"] + +[node name="Game" type="Node"] +process_mode = 3 +script = ExtResource("2") + +[node name="Level" parent="." instance=ExtResource("3")] + +[node name="Player" parent="Level" instance=ExtResource("4")] +position = Vector2(90, 546) + +[node name="InterfaceLayer" type="CanvasLayer" parent="."] +layer = 100 + +[node name="PauseMenu" parent="InterfaceLayer" instance=ExtResource("4_x6l06")] + +[node name="Music" parent="." instance=ExtResource("5_rkna2")] + +[connection signal="coin_collected" from="Level/Player" to="InterfaceLayer/PauseMenu" method="_on_coin_collected"] diff --git a/2d/platformer/game_splitscreen.gd b/2d/platformer/game_splitscreen.gd new file mode 100644 index 00000000..c082666f --- /dev/null +++ b/2d/platformer/game_splitscreen.gd @@ -0,0 +1,10 @@ +extends Game + + +func _ready() -> void: + var player_2 := %Player2 as Player + var viewport_1 := %Viewport1 as SubViewport + var viewport_2 := %Viewport2 as SubViewport + viewport_2.world_2d = viewport_1.world_2d + player_2.camera.custom_viewport = viewport_2 + player_2.camera.make_current() diff --git a/2d/platformer/game_splitscreen.tscn b/2d/platformer/game_splitscreen.tscn new file mode 100644 index 00000000..22424c61 --- /dev/null +++ b/2d/platformer/game_splitscreen.tscn @@ -0,0 +1,82 @@ +[gd_scene load_steps=7 format=3 uid="uid://2elur2m0il32"] + +[ext_resource type="Script" path="res://game_splitscreen.gd" id="1_60qgt"] +[ext_resource type="PackedScene" uid="uid://dggactv0aho4p" path="res://gui/pause_menu_splitscreen.tscn" id="2_xkexm"] +[ext_resource type="PackedScene" uid="uid://dr2p70jo7e4kn" path="res://level/level.tscn" id="3_e0nyr"] +[ext_resource type="PackedScene" uid="uid://d0ni64ucb3ym2" path="res://player/player.tscn" id="4_8j0va"] +[ext_resource type="PackedScene" uid="uid://bkyw3e13rupar" path="res://level/parallax_background.tscn" id="5_47vt4"] +[ext_resource type="PackedScene" uid="uid://do7htx4sqmcnh" path="res://music.tscn" id="6_q2yet"] + +[node name="GameSplitscreen" type="Node"] +process_mode = 3 +script = ExtResource("1_60qgt") + +[node name="Black" type="ColorRect" parent="."] +process_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = 6.10352e-05 +offset_bottom = 3.05176e-05 +color = Color(0, 0, 0, 1) + +[node name="SplitContainer" type="HSplitContainer" parent="Black"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +dragger_visibility = 1 + +[node name="ViewportContainer1" type="SubViewportContainer" parent="Black/SplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +stretch = true + +[node name="Viewport1" type="SubViewport" parent="Black/SplitContainer/ViewportContainer1"] +unique_name_in_owner = true +handle_input_locally = false +canvas_item_default_texture_filter = 0 +audio_listener_enable_2d = true +size = Vector2i(394, 480) +render_target_update_mode = 4 + +[node name="Level" parent="Black/SplitContainer/ViewportContainer1/Viewport1" instance=ExtResource("3_e0nyr")] + +[node name="Player1" parent="Black/SplitContainer/ViewportContainer1/Viewport1" instance=ExtResource("4_8j0va")] +unique_name_in_owner = true +position = Vector2(90, 546) +action_suffix = "_p1" + +[node name="Player2" parent="Black/SplitContainer/ViewportContainer1/Viewport1" instance=ExtResource("4_8j0va")] +unique_name_in_owner = true +position = Vector2(120, 546) +action_suffix = "_p2" + +[node name="ViewportContainer2" type="SubViewportContainer" parent="Black/SplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +stretch = true + +[node name="Viewport2" type="SubViewport" parent="Black/SplitContainer/ViewportContainer2"] +unique_name_in_owner = true +handle_input_locally = false +canvas_item_default_texture_filter = 0 +audio_listener_enable_2d = true +size = Vector2i(394, 480) +render_target_update_mode = 4 + +[node name="ParallaxBackground" parent="Black/SplitContainer/ViewportContainer2/Viewport2" instance=ExtResource("5_47vt4")] + +[node name="InterfaceLayer" type="CanvasLayer" parent="."] +layer = 100 + +[node name="PauseMenu" parent="InterfaceLayer" instance=ExtResource("2_xkexm")] + +[node name="Music" parent="." instance=ExtResource("6_q2yet")] + +[connection signal="coin_collected" from="Black/SplitContainer/ViewportContainer1/Viewport1/Player1" to="InterfaceLayer/PauseMenu" method="_on_coin_collected"] +[connection signal="coin_collected" from="Black/SplitContainer/ViewportContainer1/Viewport1/Player2" to="InterfaceLayer/PauseMenu" method="_on_coin_collected"] diff --git a/2d/platformer/gui/coins_counter.gd b/2d/platformer/gui/coins_counter.gd new file mode 100644 index 00000000..a1ff99ab --- /dev/null +++ b/2d/platformer/gui/coins_counter.gd @@ -0,0 +1,16 @@ +class_name CoinsCounter extends Panel + + +var _coins_collected: int = 0 + +@onready var _coins_label := $Label as Label + + +func _ready() -> void: + _coins_label.set_text(str(_coins_collected)) + ($AnimatedSprite2D as AnimatedSprite2D).play() + + +func collect_coin() -> void: + _coins_collected += 1 + _coins_label.set_text(str(_coins_collected)) diff --git a/2d/platformer/gui/coins_counter.tscn b/2d/platformer/gui/coins_counter.tscn new file mode 100644 index 00000000..4a904a29 --- /dev/null +++ b/2d/platformer/gui/coins_counter.tscn @@ -0,0 +1,70 @@ +[gd_scene load_steps=9 format=3 uid="uid://bsyqg6eh3wl5i"] + +[ext_resource type="Theme" uid="uid://da4noqsij73it" path="res://gui/theme.tres" id="1"] +[ext_resource type="Texture2D" uid="uid://l42us5qso8v4" path="res://level/coin.webp" id="2"] +[ext_resource type="Script" path="res://gui/coins_counter.gd" id="3"] + +[sub_resource type="AtlasTexture" id="2"] +atlas = ExtResource("2") +region = Rect2(0, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="3"] +atlas = ExtResource("2") +region = Rect2(8, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="4"] +atlas = ExtResource("2") +region = Rect2(16, 0, 8, 8) + +[sub_resource type="AtlasTexture" id="5"] +atlas = ExtResource("2") +region = Rect2(24, 0, 8, 8) + +[sub_resource type="SpriteFrames" id="6"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("2") +}, { +"duration": 1.0, +"texture": SubResource("3") +}, { +"duration": 1.0, +"texture": SubResource("4") +}, { +"duration": 1.0, +"texture": SubResource("5") +}, { +"duration": 1.0, +"texture": SubResource("4") +}, { +"duration": 1.0, +"texture": SubResource("3") +}], +"loop": true, +"name": &"coin_spinning", +"speed": 6.5 +}] + +[node name="CoinsCounter" type="Panel"] +offset_left = 5.0 +offset_top = 5.0 +offset_right = 100.0 +offset_bottom = 45.0 +theme = ExtResource("1") +script = ExtResource("3") + +[node name="Label" type="Label" parent="."] +layout_mode = 0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -8.0 +text = "100" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] +position = Vector2(21.5, 22.5) +scale = Vector2(4.375, 4.375) +sprite_frames = SubResource("6") +animation = &"coin_spinning" diff --git a/2d/platformer/assets/theme/fonts/kenney_mini_square.ttf b/2d/platformer/gui/kenney_mini_square.ttf similarity index 100% rename from 2d/platformer/assets/theme/fonts/kenney_mini_square.ttf rename to 2d/platformer/gui/kenney_mini_square.ttf diff --git a/2d/platformer/assets/theme/fonts/kenney_mini_square.ttf.import b/2d/platformer/gui/kenney_mini_square.ttf.import similarity index 61% rename from 2d/platformer/assets/theme/fonts/kenney_mini_square.ttf.import rename to 2d/platformer/gui/kenney_mini_square.ttf.import index 32284136..c5ebd6c6 100644 --- a/2d/platformer/assets/theme/fonts/kenney_mini_square.ttf.import +++ b/2d/platformer/gui/kenney_mini_square.ttf.import @@ -3,12 +3,12 @@ importer="font_data_dynamic" type="FontFile" uid="uid://bk80b6owsrioj" -path="res://.godot/imported/kenney_mini_square.ttf-d79fb84878832e276f7b282a10aa19c8.fontdata" +path="res://.godot/imported/kenney_mini_square.ttf-14b0a28a89225c31efd7626f5228f467.fontdata" [deps] -source_file="res://assets/theme/fonts/kenney_mini_square.ttf" -dest_files=["res://.godot/imported/kenney_mini_square.ttf-d79fb84878832e276f7b282a10aa19c8.fontdata"] +source_file="res://gui/kenney_mini_square.ttf" +dest_files=["res://.godot/imported/kenney_mini_square.ttf-14b0a28a89225c31efd7626f5228f467.fontdata"] [params] @@ -18,6 +18,7 @@ generate_mipmaps=false multichannel_signed_distance_field=false msdf_pixel_range=8 msdf_size=48 +allow_system_fallback=true force_autohinter=false hinting=1 subpixel_positioning=1 diff --git a/2d/platformer/gui/pause_menu.gd b/2d/platformer/gui/pause_menu.gd new file mode 100644 index 00000000..0aecfbff --- /dev/null +++ b/2d/platformer/gui/pause_menu.gd @@ -0,0 +1,77 @@ +class_name PauseMenu extends Control + + +@export var fade_in_duration := 0.3 +@export var fade_out_duration := 0.2 + +@onready var center_cont := $ColorRect/CenterContainer as CenterContainer +@onready var resume_button := center_cont.get_node(^"VBoxContainer/ResumeButton") as Button +@onready var coins_counter := $ColorRect/CoinsCounter as CoinsCounter + + +func _ready(): + hide() + + +func close(): + var tween := create_tween() + get_tree().paused = false + tween.tween_property( + self, + ^"modulate:a", + 0.0, + fade_out_duration + ).set_trans(Tween.TRANS_LINEAR).set_ease(Tween.EASE_OUT) + tween.parallel().tween_property( + center_cont, + ^"anchor_bottom", + 0.5, + fade_out_duration + ).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) + tween.tween_callback(hide) + + +func open(): + show() + resume_button.grab_focus() + + modulate.a = 0.0 + center_cont.anchor_bottom = 0.5 + var tween := create_tween() + tween.tween_property( + self, + ^"modulate:a", + 1.0, + fade_in_duration + ).set_trans(Tween.TRANS_LINEAR).set_ease(Tween.EASE_IN) + tween.parallel().tween_property( + center_cont, + ^"anchor_bottom", + 1.0, + fade_out_duration + ).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) + + +func _on_coin_collected() -> void: + coins_counter.collect_coin() + + +func _on_resume_button_pressed(): + close() + + +func _on_singleplayer_button_pressed() -> void: + if visible: + get_tree().paused = false + get_tree().change_scene_to_file("res://game_singleplayer.tscn") + + +func _on_splitscreen_button_pressed() -> void: + if visible: + get_tree().paused = false + get_tree().change_scene_to_file("res://game_splitscreen.tscn") + + +func _on_quit_button_pressed(): + if visible: + get_tree().quit() diff --git a/2d/platformer/src/UserInterface/PauseMenu.tscn b/2d/platformer/gui/pause_menu.tscn similarity index 58% rename from 2d/platformer/src/UserInterface/PauseMenu.tscn rename to 2d/platformer/gui/pause_menu.tscn index 3b480f85..b77f1311 100644 --- a/2d/platformer/src/UserInterface/PauseMenu.tscn +++ b/2d/platformer/gui/pause_menu.tscn @@ -1,8 +1,8 @@ -[gd_scene load_steps=4 format=3 uid="uid://0oqbyhiw1abi"] +[gd_scene load_steps=4 format=3 uid="uid://dh71g61cm8k44"] -[ext_resource type="Theme" uid="uid://chubprkmexsng" path="res://assets/theme/user_interface.tres" id="1"] -[ext_resource type="Script" path="res://src/UserInterface/PauseMenu.gd" id="2"] -[ext_resource type="PackedScene" path="res://src/UserInterface/CoinsCounter.tscn" id="4"] +[ext_resource type="Theme" uid="uid://da4noqsij73it" path="res://gui/theme.tres" id="1"] +[ext_resource type="Script" path="res://gui/pause_menu.gd" id="2"] +[ext_resource type="PackedScene" uid="uid://bsyqg6eh3wl5i" path="res://gui/coins_counter.tscn" id="4"] [node name="PauseMenu" type="Control"] process_mode = 3 @@ -10,6 +10,8 @@ layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 theme = ExtResource("1") script = ExtResource("2") @@ -18,64 +20,46 @@ layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 color = Color(0, 0, 0, 0.294118) [node name="CenterContainer" type="CenterContainer" parent="ColorRect"] layout_mode = 1 -anchors_preset = 15 +anchors_preset = -1 anchor_right = 1.0 anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 [node name="VBoxContainer" type="VBoxContainer" parent="ColorRect/CenterContainer"] layout_mode = 2 -offset_left = 347.0 -offset_top = 194.0 -offset_right = 453.0 -offset_bottom = 285.0 alignment = 1 [node name="Label" type="Label" parent="ColorRect/CenterContainer/VBoxContainer"] layout_mode = 2 -offset_right = 106.0 -offset_bottom = 23.0 text = "Game Paused" +horizontal_alignment = 1 [node name="MarginContainer" type="MarginContainer" parent="ColorRect/CenterContainer/VBoxContainer"] layout_mode = 2 -offset_top = 27.0 -offset_right = 106.0 -offset_bottom = 27.0 [node name="ResumeButton" type="Button" parent="ColorRect/CenterContainer/VBoxContainer"] layout_mode = 2 -offset_left = 16.0 -offset_top = 31.0 -offset_right = 90.0 -offset_bottom = 59.0 size_flags_horizontal = 4 text = "Resume" [node name="QuitButton" type="Button" parent="ColorRect/CenterContainer/VBoxContainer"] layout_mode = 2 -offset_left = 31.0 -offset_top = 63.0 -offset_right = 75.0 -offset_bottom = 91.0 size_flags_horizontal = 4 text = "Quit" [node name="CoinsCounter" parent="ColorRect" instance=ExtResource("4")] layout_mode = 0 +offset_left = 0.0 +offset_top = 0.0 offset_right = 105.0 offset_bottom = 50.0 -[node name="Tween" type="Tween" parent="."] -_import_path = NodePath("") -unique_name_in_owner = false -process_mode = 0 -process_priority = 0 -editor_description = "" -script = null - -[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/ResumeButton" to="." method="_on_ResumeButton_pressed"] -[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"] +[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/ResumeButton" to="." method="_on_resume_button_pressed"] +[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/QuitButton" to="." method="_on_quit_button_pressed"] diff --git a/2d/platformer/gui/pause_menu_singleplayer.tscn b/2d/platformer/gui/pause_menu_singleplayer.tscn new file mode 100644 index 00000000..8eb0b73d --- /dev/null +++ b/2d/platformer/gui/pause_menu_singleplayer.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=3 uid="uid://c7ai4bigaryci"] + +[ext_resource type="PackedScene" uid="uid://dh71g61cm8k44" path="res://gui/pause_menu.tscn" id="1_pwe1t"] + +[node name="PauseMenu" instance=ExtResource("1_pwe1t")] + +[node name="SplitscreenButton" type="Button" parent="ColorRect/CenterContainer/VBoxContainer" index="3"] +layout_mode = 2 +text = "Change to 2-Player" + +[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/SplitscreenButton" to="." method="_on_splitscreen_button_pressed"] diff --git a/2d/platformer/gui/pause_menu_splitscreen.tscn b/2d/platformer/gui/pause_menu_splitscreen.tscn new file mode 100644 index 00000000..d027bdbb --- /dev/null +++ b/2d/platformer/gui/pause_menu_splitscreen.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=3 uid="uid://dggactv0aho4p"] + +[ext_resource type="PackedScene" uid="uid://dh71g61cm8k44" path="res://gui/pause_menu.tscn" id="1_x3hgi"] + +[node name="PauseMenu" instance=ExtResource("1_x3hgi")] + +[node name="SingleplayerButton" type="Button" parent="ColorRect/CenterContainer/VBoxContainer" index="3"] +layout_mode = 2 +text = "Change to 1-player" + +[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/SingleplayerButton" to="." method="_on_singleplayer_button_pressed"] diff --git a/2d/platformer/assets/theme/user_interface.tres b/2d/platformer/gui/theme.tres similarity index 94% rename from 2d/platformer/assets/theme/user_interface.tres rename to 2d/platformer/gui/theme.tres index 9218df04..d4626865 100644 --- a/2d/platformer/assets/theme/user_interface.tres +++ b/2d/platformer/gui/theme.tres @@ -1,6 +1,6 @@ -[gd_resource type="Theme" load_steps=7 format=3 uid="uid://chubprkmexsng"] +[gd_resource type="Theme" load_steps=7 format=3 uid="uid://da4noqsij73it"] -[ext_resource type="FontFile" uid="uid://bk80b6owsrioj" path="res://assets/theme/fonts/kenney_mini_square.ttf" id="1_f0sjs"] +[ext_resource type="FontFile" uid="uid://bk80b6owsrioj" path="res://gui/kenney_mini_square.ttf" id="1_f0sjs"] [sub_resource type="StyleBoxFlat" id="1"] content_margin_left = 6.0 diff --git a/2d/platformer/gui/touch_button_fire.webp b/2d/platformer/gui/touch_button_fire.webp new file mode 100644 index 00000000..563205d6 Binary files /dev/null and b/2d/platformer/gui/touch_button_fire.webp differ diff --git a/2d/platformer/assets/art/ui/touch_button_fire.png.import b/2d/platformer/gui/touch_button_fire.webp.import similarity index 66% rename from 2d/platformer/assets/art/ui/touch_button_fire.png.import rename to 2d/platformer/gui/touch_button_fire.webp.import index 486fca17..230902bd 100644 --- a/2d/platformer/assets/art/ui/touch_button_fire.png.import +++ b/2d/platformer/gui/touch_button_fire.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://dkvmtr3ieug3l" -path="res://.godot/imported/touch_button_fire.png-8b72c42a8cb252207ce8948d4b623690.ctex" +path="res://.godot/imported/touch_button_fire.webp-dccf84dcf0f617f42794a4bab6e5b347.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/ui/touch_button_fire.png" -dest_files=["res://.godot/imported/touch_button_fire.png-8b72c42a8cb252207ce8948d4b623690.ctex"] +source_file="res://gui/touch_button_fire.webp" +dest_files=["res://.godot/imported/touch_button_fire.webp-dccf84dcf0f617f42794a4bab6e5b347.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/gui/touch_button_jump.webp b/2d/platformer/gui/touch_button_jump.webp new file mode 100644 index 00000000..94c667ce Binary files /dev/null and b/2d/platformer/gui/touch_button_jump.webp differ diff --git a/2d/platformer/assets/art/ui/touch_button_jump.png.import b/2d/platformer/gui/touch_button_jump.webp.import similarity index 66% rename from 2d/platformer/assets/art/ui/touch_button_jump.png.import rename to 2d/platformer/gui/touch_button_jump.webp.import index 487c21fe..037d9eb5 100644 --- a/2d/platformer/assets/art/ui/touch_button_jump.png.import +++ b/2d/platformer/gui/touch_button_jump.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://xbywv0ti1u0h" -path="res://.godot/imported/touch_button_jump.png-f72afeb370538aa951853dbc52052250.ctex" +path="res://.godot/imported/touch_button_jump.webp-72d09f543801d684298fbadf893197c2.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/ui/touch_button_jump.png" -dest_files=["res://.godot/imported/touch_button_jump.png-f72afeb370538aa951853dbc52052250.ctex"] +source_file="res://gui/touch_button_jump.webp" +dest_files=["res://.godot/imported/touch_button_jump.webp-72d09f543801d684298fbadf893197c2.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/gui/touch_button_left.webp b/2d/platformer/gui/touch_button_left.webp new file mode 100644 index 00000000..cfc15d8e Binary files /dev/null and b/2d/platformer/gui/touch_button_left.webp differ diff --git a/2d/platformer/assets/art/ui/touch_button_left.png.import b/2d/platformer/gui/touch_button_left.webp.import similarity index 66% rename from 2d/platformer/assets/art/ui/touch_button_left.png.import rename to 2d/platformer/gui/touch_button_left.webp.import index 421ef162..b0441f10 100644 --- a/2d/platformer/assets/art/ui/touch_button_left.png.import +++ b/2d/platformer/gui/touch_button_left.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://byv1xhmnegdap" -path="res://.godot/imported/touch_button_left.png-e48f16cfdaae98fdc92a21f20c157c53.ctex" +path="res://.godot/imported/touch_button_left.webp-f44154539d59fd4f5b3597e8703bbc6a.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/ui/touch_button_left.png" -dest_files=["res://.godot/imported/touch_button_left.png-e48f16cfdaae98fdc92a21f20c157c53.ctex"] +source_file="res://gui/touch_button_left.webp" +dest_files=["res://.godot/imported/touch_button_left.webp-f44154539d59fd4f5b3597e8703bbc6a.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/gui/touch_button_right.webp b/2d/platformer/gui/touch_button_right.webp new file mode 100644 index 00000000..a60b669f Binary files /dev/null and b/2d/platformer/gui/touch_button_right.webp differ diff --git a/2d/platformer/assets/art/ui/touch_button_right.png.import b/2d/platformer/gui/touch_button_right.webp.import similarity index 66% rename from 2d/platformer/assets/art/ui/touch_button_right.png.import rename to 2d/platformer/gui/touch_button_right.webp.import index bf278221..7beca8a6 100644 --- a/2d/platformer/assets/art/ui/touch_button_right.png.import +++ b/2d/platformer/gui/touch_button_right.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://byg0psif5h7ak" -path="res://.godot/imported/touch_button_right.png-74bf87a3a0fa663fbb3574844de31372.ctex" +path="res://.godot/imported/touch_button_right.webp-ec9f97ce35fcf0bf570ff19f4fcaecc8.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/ui/touch_button_right.png" -dest_files=["res://.godot/imported/touch_button_right.png-74bf87a3a0fa663fbb3574844de31372.ctex"] +source_file="res://gui/touch_button_right.webp" +dest_files=["res://.godot/imported/touch_button_right.webp-ec9f97ce35fcf0bf570ff19f4fcaecc8.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/icon.png b/2d/platformer/icon.png deleted file mode 100644 index 8f118484..00000000 Binary files a/2d/platformer/icon.png and /dev/null differ diff --git a/2d/platformer/icon.webp b/2d/platformer/icon.webp new file mode 100644 index 00000000..14a20244 Binary files /dev/null and b/2d/platformer/icon.webp differ diff --git a/2d/platformer/icon.png.import b/2d/platformer/icon.webp.import similarity index 70% rename from 2d/platformer/icon.png.import rename to 2d/platformer/icon.webp.import index 6fc13e7e..d4ea02ae 100644 --- a/2d/platformer/icon.png.import +++ b/2d/platformer/icon.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://dpxlcfssx0etu" -path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex" +path="res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://icon.png" -dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"] +source_file="res://icon.webp" +dest_files=["res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/level/cloud_1.webp b/2d/platformer/level/cloud_1.webp new file mode 100644 index 00000000..fa38f593 Binary files /dev/null and b/2d/platformer/level/cloud_1.webp differ diff --git a/2d/platformer/assets/art/background/cloud_1.png.import b/2d/platformer/level/cloud_1.webp.import similarity index 68% rename from 2d/platformer/assets/art/background/cloud_1.png.import rename to 2d/platformer/level/cloud_1.webp.import index 5893ddf8..784068ec 100644 --- a/2d/platformer/assets/art/background/cloud_1.png.import +++ b/2d/platformer/level/cloud_1.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://b4n7s65t0qoep" -path="res://.godot/imported/cloud_1.png-03c0ad8be397b731df0dd38fa3c87727.ctex" +path="res://.godot/imported/cloud_1.webp-d4440f8a56714fd63d83c7074d20ace3.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/background/cloud_1.png" -dest_files=["res://.godot/imported/cloud_1.png-03c0ad8be397b731df0dd38fa3c87727.ctex"] +source_file="res://level/cloud_1.webp" +dest_files=["res://.godot/imported/cloud_1.webp-d4440f8a56714fd63d83c7074d20ace3.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/level/cloud_2.webp b/2d/platformer/level/cloud_2.webp new file mode 100644 index 00000000..4714555e Binary files /dev/null and b/2d/platformer/level/cloud_2.webp differ diff --git a/2d/platformer/assets/art/background/cloud_2.png.import b/2d/platformer/level/cloud_2.webp.import similarity index 68% rename from 2d/platformer/assets/art/background/cloud_2.png.import rename to 2d/platformer/level/cloud_2.webp.import index 421d8c1e..7d460a3e 100644 --- a/2d/platformer/assets/art/background/cloud_2.png.import +++ b/2d/platformer/level/cloud_2.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://cubkvnu4fdwki" -path="res://.godot/imported/cloud_2.png-4ddf8c5bceca4aa07a8bc86d7d788e02.ctex" +path="res://.godot/imported/cloud_2.webp-6870de4e2ed6536e37af4c22aa731ad1.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/background/cloud_2.png" -dest_files=["res://.godot/imported/cloud_2.png-4ddf8c5bceca4aa07a8bc86d7d788e02.ctex"] +source_file="res://level/cloud_2.webp" +dest_files=["res://.godot/imported/cloud_2.webp-6870de4e2ed6536e37af4c22aa731ad1.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/level/cloud_3.webp b/2d/platformer/level/cloud_3.webp new file mode 100644 index 00000000..a04dc443 Binary files /dev/null and b/2d/platformer/level/cloud_3.webp differ diff --git a/2d/platformer/assets/art/background/cloud_3.png.import b/2d/platformer/level/cloud_3.webp.import similarity index 68% rename from 2d/platformer/assets/art/background/cloud_3.png.import rename to 2d/platformer/level/cloud_3.webp.import index b5af3c62..36e00ff6 100644 --- a/2d/platformer/assets/art/background/cloud_3.png.import +++ b/2d/platformer/level/cloud_3.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://5tho6j8r4eam" -path="res://.godot/imported/cloud_3.png-a1b7dc71aa84bea9cb4f78f585dcc65d.ctex" +path="res://.godot/imported/cloud_3.webp-a303ee6af47d3df137be263a98a9fa7d.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/background/cloud_3.png" -dest_files=["res://.godot/imported/cloud_3.png-a1b7dc71aa84bea9cb4f78f585dcc65d.ctex"] +source_file="res://level/cloud_3.webp" +dest_files=["res://.godot/imported/cloud_3.webp-a303ee6af47d3df137be263a98a9fa7d.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/level/coin.gd b/2d/platformer/level/coin.gd new file mode 100644 index 00000000..152cfb1e --- /dev/null +++ b/2d/platformer/level/coin.gd @@ -0,0 +1,10 @@ +class_name Coin extends Area2D +## Collectible that disappears when the player touches it. + + +@onready var animation_player := $AnimationPlayer as AnimationPlayer + + +func _on_body_entered(body: Node2D) -> void: + animation_player.play(&"picked") + (body as Player).coin_collected.emit() diff --git a/2d/platformer/src/Objects/Coin.tscn b/2d/platformer/level/coin.tscn similarity index 59% rename from 2d/platformer/src/Objects/Coin.tscn rename to 2d/platformer/level/coin.tscn index e4ec37b1..62df1f9a 100644 --- a/2d/platformer/src/Objects/Coin.tscn +++ b/2d/platformer/level/coin.tscn @@ -1,19 +1,71 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=9 format=3 uid="uid://b2xsfn7h7komw"] -[ext_resource path="res://assets/art/coin/coin.png" type="Texture2D" id=2] -[ext_resource path="res://assets/audio/sfx/coin_pickup.wav" type="AudioStream" id=3] -[ext_resource path="res://src/Objects/Coin.gd" type="Script" id=4] +[ext_resource type="Texture2D" uid="uid://l42us5qso8v4" path="res://level/coin.webp" id="2"] +[ext_resource type="AudioStream" uid="uid://bw67pgdlhpqd0" path="res://player/coin_pickup.wav" id="3"] +[ext_resource type="Script" path="res://level/coin.gd" id="4"] -[sub_resource type="Animation" id=1] +[sub_resource type="Animation" id="Animation_mfug7"] +resource_name = "RESET" +length = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:monitoring") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:frame") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Sprite2D:self_modulate") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} + +[sub_resource type="Animation" id="1"] resource_name = "picked" length = 1.5 step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), @@ -21,25 +73,25 @@ tracks/0/keys = { "values": [0] } tracks/1/type = "method" +tracks/1/imported = false +tracks/1/enabled = true tracks/1/path = NodePath(".") tracks/1/interp = 1 tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true tracks/1/keys = { -"times": PackedFloat32Array(1), +"times": PackedFloat32Array(1.5), "transitions": PackedFloat32Array(1), "values": [{ "args": [], -"method": "queue_free" +"method": &"queue_free" }] } tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true tracks/2/path = NodePath("Sprite2D:self_modulate") tracks/2/interp = 1 tracks/2/loop_wrap = true -tracks/2/imported = false -tracks/2/enabled = true tracks/2/keys = { "times": PackedFloat32Array(0.25, 1.25), "transitions": PackedFloat32Array(1, 1), @@ -47,52 +99,55 @@ tracks/2/keys = { "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] } tracks/3/type = "value" -tracks/3/path = NodePath("Pickup:playing") -tracks/3/interp = 1 -tracks/3/loop_wrap = true tracks/3/imported = false tracks/3/enabled = true +tracks/3/path = NodePath(".:monitoring") +tracks/3/interp = 1 +tracks/3/loop_wrap = true tracks/3/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 2, -"values": [true] -} -tracks/4/type = "value" -tracks/4/path = NodePath(".:monitoring") -tracks/4/interp = 1 -tracks/4/loop_wrap = true -tracks/4/imported = false -tracks/4/enabled = true -tracks/4/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), "update": 1, "values": [false] } -tracks/5/type = "value" -tracks/5/path = NodePath("Sprite2D:position") -tracks/5/interp = 1 -tracks/5/loop_wrap = true -tracks/5/imported = false -tracks/5/enabled = true -tracks/5/keys = { +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Sprite2D:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { "times": PackedFloat32Array(0, 1.5), "transitions": PackedFloat32Array(1, 1), "update": 0, "values": [Vector2(0, 0), Vector2(0, -42)] } +tracks/5/type = "audio" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Pickup") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"clips": [{ +"end_offset": 0.0, +"start_offset": 0.0, +"stream": ExtResource("3") +}], +"times": PackedFloat32Array(0) +} +tracks/5/use_blend = true -[sub_resource type="Animation" id=2] +[sub_resource type="Animation" id="2"] length = 1.5 -loop = true +loop_mode = 1 step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0, 0.25, 0.5, 0.75, 1, 1.25, 1.5), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), @@ -100,11 +155,11 @@ tracks/0/keys = { "values": [0, 1, 2, 3, 2, 1, 0] } tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true tracks/1/path = NodePath("Sprite2D:position") tracks/1/interp = 1 tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true tracks/1/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), @@ -112,11 +167,11 @@ tracks/1/keys = { "values": [Vector2(0, 0)] } tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true tracks/2/path = NodePath("Sprite2D:self_modulate") tracks/2/interp = 1 tracks/2/loop_wrap = true -tracks/2/imported = false -tracks/2/enabled = true tracks/2/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), @@ -124,11 +179,11 @@ tracks/2/keys = { "values": [Color(1, 1, 1, 1)] } tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true tracks/3/path = NodePath(".:monitoring") tracks/3/interp = 1 tracks/3/loop_wrap = true -tracks/3/imported = false -tracks/3/enabled = true tracks/3/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), @@ -136,29 +191,33 @@ tracks/3/keys = { "values": [true] } -[sub_resource type="CircleShape2D" id=3] +[sub_resource type="AnimationLibrary" id="AnimationLibrary_fwb0h"] +_data = { +"RESET": SubResource("Animation_mfug7"), +"picked": SubResource("1"), +"spinning": SubResource("2") +} + +[sub_resource type="CircleShape2D" id="3"] radius = 5.0 [node name="Coin" type="Area2D"] collision_layer = 0 -monitoring = false -monitorable = false -script = ExtResource( 4 ) +script = ExtResource("4") [node name="Sprite2D" type="Sprite2D" parent="."] -texture = ExtResource( 2 ) +texture = ExtResource("2") hframes = 4 [node name="AnimationPlayer" type="AnimationPlayer" parent="."] autoplay = "spinning" -playback_speed = 1.5 -anims/picked = SubResource( 1 ) -anims/spinning = SubResource( 2 ) +libraries = { +"": SubResource("AnimationLibrary_fwb0h") +} [node name="CollisionShape2D" type="CollisionShape2D" parent="."] -shape = SubResource( 3 ) +shape = SubResource("3") [node name="Pickup" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource( 3 ) [connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/2d/platformer/level/coin.webp b/2d/platformer/level/coin.webp new file mode 100644 index 00000000..e508c603 Binary files /dev/null and b/2d/platformer/level/coin.webp differ diff --git a/2d/platformer/assets/art/coin/coin.png.import b/2d/platformer/level/coin.webp.import similarity index 70% rename from 2d/platformer/assets/art/coin/coin.png.import rename to 2d/platformer/level/coin.webp.import index 2be6965e..f460a7eb 100644 --- a/2d/platformer/assets/art/coin/coin.png.import +++ b/2d/platformer/level/coin.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://l42us5qso8v4" -path="res://.godot/imported/coin.png-87689993f83db6056500d4fa153313d8.ctex" +path="res://.godot/imported/coin.webp-1d50c095672512acb2df6e9dbf7e85c6.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/coin/coin.png" -dest_files=["res://.godot/imported/coin.png-87689993f83db6056500d4fa153313d8.ctex"] +source_file="res://level/coin.webp" +dest_files=["res://.godot/imported/coin.webp-1d50c095672512acb2df6e9dbf7e85c6.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/level/distant_platforms_1.webp b/2d/platformer/level/distant_platforms_1.webp new file mode 100644 index 00000000..8f83fec3 Binary files /dev/null and b/2d/platformer/level/distant_platforms_1.webp differ diff --git a/2d/platformer/assets/art/background/distant_platforms_1.png.import b/2d/platformer/level/distant_platforms_1.webp.import similarity index 65% rename from 2d/platformer/assets/art/background/distant_platforms_1.png.import rename to 2d/platformer/level/distant_platforms_1.webp.import index d6c68a38..813d669e 100644 --- a/2d/platformer/assets/art/background/distant_platforms_1.png.import +++ b/2d/platformer/level/distant_platforms_1.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://smxp1wviat8" -path="res://.godot/imported/distant_platforms_1.png-7286fe6c8587b96abbbe0bc4a8cbc510.ctex" +path="res://.godot/imported/distant_platforms_1.webp-3e434db11cd91084f2225ce02ba95102.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/background/distant_platforms_1.png" -dest_files=["res://.godot/imported/distant_platforms_1.png-7286fe6c8587b96abbbe0bc4a8cbc510.ctex"] +source_file="res://level/distant_platforms_1.webp" +dest_files=["res://.godot/imported/distant_platforms_1.webp-3e434db11cd91084f2225ce02ba95102.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/level/distant_platforms_2.webp b/2d/platformer/level/distant_platforms_2.webp new file mode 100644 index 00000000..4e6e4de2 Binary files /dev/null and b/2d/platformer/level/distant_platforms_2.webp differ diff --git a/2d/platformer/assets/art/background/distant_platforms_2.png.import b/2d/platformer/level/distant_platforms_2.webp.import similarity index 65% rename from 2d/platformer/assets/art/background/distant_platforms_2.png.import rename to 2d/platformer/level/distant_platforms_2.webp.import index 5583686d..1593f330 100644 --- a/2d/platformer/assets/art/background/distant_platforms_2.png.import +++ b/2d/platformer/level/distant_platforms_2.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://d003shl6ntver" -path="res://.godot/imported/distant_platforms_2.png-ba010b30987da6d74062ce964ab450ef.ctex" +path="res://.godot/imported/distant_platforms_2.webp-cfb64fd24d51633ea9b69670abc2c765.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/background/distant_platforms_2.png" -dest_files=["res://.godot/imported/distant_platforms_2.png-ba010b30987da6d74062ce964ab450ef.ctex"] +source_file="res://level/distant_platforms_2.webp" +dest_files=["res://.godot/imported/distant_platforms_2.webp-cfb64fd24d51633ea9b69670abc2c765.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/level/level.tscn b/2d/platformer/level/level.tscn new file mode 100644 index 00000000..69365f63 --- /dev/null +++ b/2d/platformer/level/level.tscn @@ -0,0 +1,284 @@ +[gd_scene load_steps=12 format=3 uid="uid://dr2p70jo7e4kn"] + +[ext_resource type="TileSet" uid="uid://dmpguegs1kkkl" path="res://level/tileset.tres" id="1"] +[ext_resource type="PackedScene" uid="uid://bd478yrtijbfn" path="res://enemy/enemy.tscn" id="2"] +[ext_resource type="PackedScene" uid="uid://bfylfwu4pwywv" path="res://level/platform.tscn" id="3"] +[ext_resource type="PackedScene" uid="uid://b2xsfn7h7komw" path="res://level/coin.tscn" id="4"] +[ext_resource type="Texture2D" uid="uid://8p65ui1ydnff" path="res://level/moving_platform.webp" id="6"] +[ext_resource type="PackedScene" uid="uid://bkyw3e13rupar" path="res://level/parallax_background.tscn" id="7"] + +[sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_vsviu"] +normal = Vector2(1, 0) + +[sub_resource type="Animation" id="1"] +resource_name = "move" +length = 4.0 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(707, 400), Vector2(566, 303)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_twp1p"] +_data = { +"move": SubResource("1") +} + +[sub_resource type="Animation" id="2"] +length = 8.0 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 4), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(-47, 80), Vector2(-47, 407)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_61huy"] +_data = { +"move": SubResource("2") +} + +[node name="Level" type="Node2D"] +process_mode = 1 + +[node name="TileMap" type="TileMap" parent="."] +tile_set = ExtResource("1") +format = 2 +layer_0/tile_data = PackedInt32Array(-65546, 1, 65536, -65545, 1, 0, -131044, 1, 65536, -131043, 1, 0, -10, 3, 65536, -9, 3, 0, -65508, 3, 65536, -65507, 3, 0, 65526, 3, 65536, 65527, 3, 0, 28, 3, 65536, 29, 3, 0, 131062, 3, 65536, 131063, 3, 0, 131069, 6, 65536, 131070, 5, 0, 131071, 5, 0, 65536, 5, 0, 65537, 5, 0, 65538, 5, 0, 65539, 5, 0, 65540, 6, 0, 65564, 3, 65536, 65565, 3, 0, 196598, 3, 65536, 196599, 3, 0, 131080, 1, 65536, 131081, 0, 0, 131082, 0, 0, 131083, 0, 0, 131084, 0, 0, 131085, 1, 0, 131100, 3, 65536, 131101, 3, 0, 262134, 3, 65536, 262135, 3, 0, 196616, 9, 65536, 196617, 8, 0, 196618, 8, 0, 196619, 8, 0, 196620, 8, 0, 196621, 9, 0, 196626, 1, 65536, 196627, 0, 0, 196628, 0, 0, 196629, 0, 0, 196630, 0, 0, 196631, 0, 0, 196632, 0, 0, 196633, 0, 0, 196634, 0, 0, 196635, 0, 0, 196636, 4, 65536, 196637, 3, 0, 327670, 3, 65536, 327671, 3, 0, 262149, 6, 65536, 262150, 6, 0, 262162, 9, 65536, 262163, 8, 65536, 262164, 8, 65536, 262165, 8, 65536, 262166, 8, 65536, 262167, 10, 65536, 262168, 7, 0, 262169, 7, 0, 262170, 7, 0, 262171, 7, 0, 262172, 7, 0, 262173, 3, 0, 393206, 3, 65536, 393207, 3, 0, 327682, 6, 65536, 327683, 6, 0, 327703, 9, 65536, 327704, 8, 65536, 327705, 10, 65536, 327706, 7, 0, 327707, 7, 0, 327708, 7, 0, 327709, 3, 0, 458742, 3, 65536, 458743, 4, 0, 458744, 0, 0, 458745, 0, 0, 458746, 1, 0, 393241, 9, 65536, 393242, 8, 65536, 393243, 8, 65536, 393244, 10, 65536, 393245, 3, 0, 524278, 3, 65536, 524279, 7, 65536, 524280, 7, 65536, 524281, 7, 65536, 524282, 3, 0, 458754, 1, 65536, 458755, 0, 0, 458756, 0, 0, 458764, 1, 65536, 458765, 1, 0, 458780, 3, 65536, 458781, 3, 0, 589814, 3, 65536, 589815, 7, 65536, 589816, 7, 65536, 589817, 7, 65536, 589818, 3, 0, 524290, 3, 65536, 524291, 7, 0, 524292, 7, 0, 524294, 0, 65536, 524295, 0, 65536, 524296, 0, 65536, 524297, 0, 65536, 524298, 0, 65536, 524299, 0, 65536, 524300, 4, 65536, 524301, 3, 0, 524316, 3, 65536, 524317, 3, 0, 655350, 3, 65536, 655351, 7, 65536, 655352, 7, 65536, 655353, 7, 65536, 655354, 3, 0, 589826, 3, 65536, 589827, 7, 0, 589828, 7, 0, 589829, 7, 0, 589830, 7, 0, 589831, 7, 0, 589832, 7, 0, 589833, 7, 0, 589834, 7, 0, 589835, 7, 0, 589836, 7, 0, 589837, 4, 0, 589838, 0, 0, 589839, 1, 0, 589852, 3, 65536, 589853, 3, 0, 720886, 3, 65536, 720887, 7, 65536, 720888, 7, 65536, 720889, 7, 65536, 720890, 3, 0, 655362, 9, 65536, 655363, 8, 65536, 655364, 8, 65536, 655365, 8, 65536, 655366, 8, 65536, 655367, 8, 65536, 655368, 8, 65536, 655369, 8, 65536, 655370, 8, 65536, 655371, 8, 65536, 655372, 8, 65536, 655373, 8, 65536, 655374, 8, 65536, 655375, 9, 0, 655388, 3, 65536, 655389, 3, 0, 786422, 3, 65536, 786423, 7, 65536, 786424, 7, 65536, 786425, 7, 65536, 786426, 3, 0, 720924, 3, 65536, 720925, 3, 0, 851958, 3, 65536, 851959, 7, 65536, 851960, 7, 65536, 851961, 7, 65536, 851962, 3, 0, 786456, 6, 65536, 786457, 5, 65536, 786458, 6, 0, 786460, 3, 65536, 786461, 3, 0, 917494, 3, 65536, 917495, 7, 65536, 917496, 7, 65536, 917497, 7, 65536, 917498, 4, 0, 917499, 0, 0, 917500, 0, 0, 917501, 0, 0, 917502, 0, 0, 917503, 0, 0, 851968, 0, 0, 851969, 1, 0, 851996, 3, 65536, 851997, 3, 0, 983030, 3, 65536, 983031, 7, 65536, 983032, 7, 65536, 983033, 7, 65536, 983034, 7, 65536, 983035, 7, 65536, 983036, 7, 65536, 983037, 7, 65536, 983038, 7, 65536, 983039, 7, 65536, 917504, 7, 65536, 917505, 3, 0, 917526, 1, 65536, 917527, 0, 65536, 917528, 0, 65536, 917529, 0, 0, 917530, 0, 65536, 917531, 0, 65536, 917532, 4, 65536, 917533, 3, 0, 1048566, 3, 65536, 1048567, 7, 65536, 1048568, 7, 65536, 1048569, 7, 65536, 1048570, 7, 65536, 1048571, 7, 65536, 1048572, 7, 65536, 1048573, 7, 65536, 1048574, 7, 65536, 1048575, 7, 65536, 983040, 7, 65536, 983041, 3, 0, 983057, 6, 65536, 983058, 5, 0, 983059, 6, 0, 983062, 3, 65536, 983063, 7, 0, 983064, 7, 0, 983065, 7, 0, 983066, 7, 0, 983067, 7, 0, 983068, 7, 0, 983069, 3, 0, 1114102, 3, 65536, 1114103, 7, 65536, 1114104, 7, 65536, 1114105, 7, 65536, 1114106, 7, 65536, 1114107, 7, 65536, 1114108, 7, 65536, 1114109, 7, 65536, 1114110, 7, 65536, 1114111, 7, 65536, 1048576, 7, 65536, 1048577, 3, 0, 1048579, 14, 65536, 1048598, 3, 65536, 1048599, 7, 0, 1048600, 7, 0, 1048601, 7, 0, 1048602, 7, 0, 1048603, 7, 0, 1048604, 7, 0, 1048605, 3, 0, 1179638, 3, 65536, 1179639, 7, 65536, 1179640, 7, 65536, 1179641, 7, 65536, 1179642, 7, 65536, 1179643, 7, 65536, 1179644, 7, 65536, 1179645, 7, 65536, 1179646, 7, 65536, 1179647, 7, 65536, 1114112, 7, 65536, 1114113, 4, 0, 1114114, 0, 0, 1114115, 13, 65536, 1114116, 0, 0, 1114117, 2, 0, 1114123, 14, 65536, 1114126, 6, 65536, 1114127, 5, 0, 1114128, 6, 0, 1114133, 2, 65536, 1114134, 4, 65536, 1114135, 7, 0, 1114136, 7, 0, 1114137, 7, 0, 1114138, 7, 0, 1114139, 7, 0, 1114140, 7, 0, 1114141, 3, 0, 1245174, 3, 65536, 1245175, 7, 65536, 1245176, 7, 65536, 1245177, 7, 65536, 1245178, 7, 65536, 1245179, 7, 65536, 1245180, 7, 65536, 1245181, 7, 65536, 1245182, 7, 65536, 1245183, 7, 65536, 1179648, 7, 65536, 1179649, 7, 65536, 1179650, 7, 65536, 1179651, 7, 65536, 1179652, 7, 0, 1179654, 2, 0, 1179658, 1, 65536, 1179659, 13, 65536, 1179660, 1, 0, 1179668, 2, 65536, 1179670, 7, 0, 1179671, 7, 0, 1179672, 7, 0, 1179673, 7, 0, 1179674, 7, 0, 1179675, 7, 0, 1179676, 7, 0, 1179677, 3, 0, 1310710, 3, 65536, 1310711, 7, 65536, 1310712, 7, 65536, 1310713, 7, 65536, 1310714, 7, 65536, 1310715, 7, 65536, 1310716, 7, 65536, 1310717, 7, 65536, 1310718, 7, 65536, 1310719, 7, 65536, 1245184, 7, 65536, 1245185, 7, 65536, 1245186, 7, 65536, 1245187, 7, 65536, 1245188, 7, 65536, 1245189, 7, 0, 1245191, 2, 0, 1245194, 3, 65536, 1245195, 7, 0, 1245196, 3, 0, 1245205, 7, 0, 1245206, 7, 0, 1245207, 7, 0, 1245208, 7, 0, 1245209, 7, 0, 1245210, 7, 0, 1245211, 7, 0, 1245212, 7, 0, 1245213, 3, 0, 1376246, 3, 65536, 1376247, 7, 65536, 1376248, 7, 65536, 1376249, 7, 65536, 1376250, 7, 65536, 1376251, 7, 65536, 1376252, 7, 65536, 1376253, 7, 65536, 1376254, 7, 65536, 1376255, 7, 65536, 1310720, 7, 65536, 1310721, 7, 65536, 1310722, 7, 65536, 1310723, 7, 65536, 1310724, 7, 65536, 1310725, 7, 65536, 1310726, 7, 0, 1310728, 0, 65536, 1310729, 0, 65536, 1310730, 4, 65536, 1310731, 7, 0, 1310732, 4, 0, 1310733, 0, 0, 1310734, 0, 0, 1310735, 0, 0, 1310736, 0, 0, 1310737, 0, 0, 1310738, 0, 65536, 1310740, 7, 0, 1310741, 7, 0, 1310742, 7, 0, 1310743, 7, 0, 1310744, 7, 0, 1310745, 7, 0, 1310746, 7, 0, 1310747, 7, 0, 1310748, 7, 0, 1310749, 3, 0, 1441782, 9, 65536, 1441783, 8, 65536, 1441784, 8, 65536, 1441785, 8, 65536, 1441786, 8, 65536, 1441787, 8, 65536, 1441788, 8, 65536, 1441789, 8, 65536, 1441790, 8, 65536, 1441791, 8, 65536, 1376256, 8, 65536, 1376257, 8, 65536, 1376258, 8, 65536, 1376259, 8, 65536, 1376260, 8, 65536, 1376261, 8, 65536, 1376262, 8, 65536, 1376263, 8, 65536, 1376264, 8, 65536, 1376265, 8, 65536, 1376266, 8, 65536, 1376267, 8, 65536, 1376268, 8, 65536, 1376269, 8, 65536, 1376270, 8, 65536, 1376271, 8, 65536, 1376272, 8, 65536, 1376273, 8, 65536, 1376274, 8, 65536, 1376275, 8, 65536, 1376276, 8, 65536, 1376277, 8, 65536, 1376278, 8, 65536, 1376279, 8, 65536, 1376280, 8, 65536, 1376281, 8, 65536, 1376282, 8, 65536, 1376283, 8, 65536, 1376284, 8, 0, 1376285, 9, 0, 458757, 2, 0, 1245203, 2, 65536) + +[node name="WorldBoundaries" type="StaticBody2D" parent="."] +collision_layer = 16 + +[node name="Left" type="CollisionShape2D" parent="WorldBoundaries"] +position = Vector2(-318, 0) +shape = SubResource("WorldBoundaryShape2D_vsviu") + +[node name="Right" type="CollisionShape2D" parent="WorldBoundaries"] +position = Vector2(958, 0) +rotation = 3.14159 +shape = SubResource("WorldBoundaryShape2D_vsviu") + +[node name="Coins" type="Node" parent="."] + +[node name="CoinsArc" type="Node2D" parent="Coins"] +position = Vector2(269.878, 573.77) + +[node name="Coin" parent="Coins/CoinsArc" instance=ExtResource("4")] +position = Vector2(-14.7314, 29.9809) + +[node name="Coin2" parent="Coins/CoinsArc" instance=ExtResource("4")] +position = Vector2(0.0855715, 0.070923) + +[node name="Coin3" parent="Coins/CoinsArc" instance=ExtResource("4")] +position = Vector2(31.2736, -17.854) + +[node name="CoinsVertical" type="Node2D" parent="Coins"] +position = Vector2(366.022, 518.94) + +[node name="Coin" parent="Coins/CoinsVertical" instance=ExtResource("4")] +position = Vector2(-0.0551455, 15.9351) + +[node name="Coin2" parent="Coins/CoinsVertical" instance=ExtResource("4")] +position = Vector2(-0.0551455, -0.0649415) + +[node name="Coin3" parent="Coins/CoinsVertical" instance=ExtResource("4")] +position = Vector2(-0.0551455, -16.065) + +[node name="CoinsVertical2" type="Node2D" parent="Coins"] +position = Vector2(509.055, -8.98655) + +[node name="Coin" parent="Coins/CoinsVertical2" instance=ExtResource("4")] +position = Vector2(-0.0551455, 15.9351) + +[node name="Coin2" parent="Coins/CoinsVertical2" instance=ExtResource("4")] +position = Vector2(-0.0551455, -0.0649415) + +[node name="Coin3" parent="Coins/CoinsVertical2" instance=ExtResource("4")] +position = Vector2(-0.0551455, -16.065) + +[node name="CoinsSquare" type="Node2D" parent="Coins"] +position = Vector2(-214.835, 161.6) + +[node name="Coin" parent="Coins/CoinsSquare" instance=ExtResource("4")] +position = Vector2(-16, -16) + +[node name="Coin2" parent="Coins/CoinsSquare" instance=ExtResource("4")] +position = Vector2(16, -16) + +[node name="Coin3" parent="Coins/CoinsSquare" instance=ExtResource("4")] +position = Vector2(-16, 16) + +[node name="Coin4" parent="Coins/CoinsSquare" instance=ExtResource("4")] +position = Vector2(16, 16) + +[node name="CoinsSquare2" type="Node2D" parent="Coins"] +position = Vector2(347.552, 33.4742) + +[node name="Coin" parent="Coins/CoinsSquare2" instance=ExtResource("4")] +position = Vector2(-16, -16) + +[node name="Coin2" parent="Coins/CoinsSquare2" instance=ExtResource("4")] +position = Vector2(16, -16) + +[node name="Coin3" parent="Coins/CoinsSquare2" instance=ExtResource("4")] +position = Vector2(-16, 16) + +[node name="Coin4" parent="Coins/CoinsSquare2" instance=ExtResource("4")] +position = Vector2(16, 16) + +[node name="CoinsSquare3" type="Node2D" parent="Coins"] +position = Vector2(676.585, 58.6425) + +[node name="Coin" parent="Coins/CoinsSquare3" instance=ExtResource("4")] +position = Vector2(-16, -16) + +[node name="Coin2" parent="Coins/CoinsSquare3" instance=ExtResource("4")] +position = Vector2(16, -16) + +[node name="Coin3" parent="Coins/CoinsSquare3" instance=ExtResource("4")] +position = Vector2(-16, 16) + +[node name="Coin4" parent="Coins/CoinsSquare3" instance=ExtResource("4")] +position = Vector2(16, 16) + +[node name="CoinsSquare4" type="Node2D" parent="Coins"] +position = Vector2(796.29, 58.6425) + +[node name="Coin" parent="Coins/CoinsSquare4" instance=ExtResource("4")] +position = Vector2(-16, -16) + +[node name="Coin2" parent="Coins/CoinsSquare4" instance=ExtResource("4")] +position = Vector2(16, -16) + +[node name="Coin3" parent="Coins/CoinsSquare4" instance=ExtResource("4")] +position = Vector2(-16, 16) + +[node name="Coin4" parent="Coins/CoinsSquare4" instance=ExtResource("4")] +position = Vector2(16, 16) + +[node name="CoinsHorizontal" type="Node2D" parent="Coins"] +position = Vector2(36.6204, 402.991) + +[node name="Coin" parent="Coins/CoinsHorizontal" instance=ExtResource("4")] +position = Vector2(-16, 0) + +[node name="Coin2" parent="Coins/CoinsHorizontal" instance=ExtResource("4")] + +[node name="Coin3" parent="Coins/CoinsHorizontal" instance=ExtResource("4")] +position = Vector2(16, 0) + +[node name="CoinsHorizontal2" type="Node2D" parent="Coins"] +position = Vector2(668.605, 431.544) + +[node name="Coin" parent="Coins/CoinsHorizontal2" instance=ExtResource("4")] +position = Vector2(-16, 0) + +[node name="Coin2" parent="Coins/CoinsHorizontal2" instance=ExtResource("4")] + +[node name="Coin3" parent="Coins/CoinsHorizontal2" instance=ExtResource("4")] +position = Vector2(16, 0) + +[node name="CoinsHorizontal3" type="Node2D" parent="Coins"] +position = Vector2(335.585, 155.872) + +[node name="Coin" parent="Coins/CoinsHorizontal3" instance=ExtResource("4")] +position = Vector2(-16, 0) + +[node name="Coin2" parent="Coins/CoinsHorizontal3" instance=ExtResource("4")] + +[node name="Coin3" parent="Coins/CoinsHorizontal3" instance=ExtResource("4")] +position = Vector2(16, 0) + +[node name="CoinsHorizontal4" type="Node2D" parent="Coins"] +position = Vector2(-63.444, 20.5902) + +[node name="Coin" parent="Coins/CoinsHorizontal4" instance=ExtResource("4")] +position = Vector2(-16, 0) + +[node name="Coin2" parent="Coins/CoinsHorizontal4" instance=ExtResource("4")] + +[node name="Coin3" parent="Coins/CoinsHorizontal4" instance=ExtResource("4")] +position = Vector2(16, 0) + +[node name="CoinsHorizontal5" type="Node2D" parent="Coins"] +position = Vector2(127.607, 20.5902) + +[node name="Coin" parent="Coins/CoinsHorizontal5" instance=ExtResource("4")] +position = Vector2(-16, 0) + +[node name="Coin2" parent="Coins/CoinsHorizontal5" instance=ExtResource("4")] + +[node name="Coin3" parent="Coins/CoinsHorizontal5" instance=ExtResource("4")] +position = Vector2(16, 0) + +[node name="Platforms" type="Node" parent="."] + +[node name="Platform" parent="Platforms" instance=ExtResource("3")] +position = Vector2(707, 400) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Platforms/Platform"] +autoplay = "move" +playback_process_mode = 0 +libraries = { +"": SubResource("AnimationLibrary_twp1p") +} + +[node name="Platform2" parent="Platforms" instance=ExtResource("3")] +position = Vector2(-47, 80) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Platforms/Platform2"] +autoplay = "move" +playback_process_mode = 0 +libraries = { +"": SubResource("AnimationLibrary_61huy") +} + +[node name="PlatformStatic" type="StaticBody2D" parent="Platforms"] +z_index = -1 +position = Vector2(569.935, 105.877) +rotation = 0.355618 +collision_layer = 16 +collision_mask = 0 + +[node name="Sprite2" type="Sprite2D" parent="Platforms/PlatformStatic"] +position = Vector2(-88.692, 10.5003) +rotation = -0.246293 +texture = ExtResource("6") + +[node name="Sprite2D" type="Sprite2D" parent="Platforms/PlatformStatic"] +texture = ExtResource("6") + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Platforms/PlatformStatic"] +position = Vector2(-0.0684814, 0.0254364) +polygon = PackedVector2Array(-129.699, 9.94633, -47, -10.5, 8, -7, 10, -1.5, -46.75, -4, -130, 15) + +[node name="Enemies" type="Node" parent="."] + +[node name="Enemy" parent="Enemies" instance=ExtResource("2")] +position = Vector2(271.04, 245.639) + +[node name="Enemy2" parent="Enemies" instance=ExtResource("2")] +position = Vector2(346.109, 48.5631) + +[node name="Enemy3" parent="Enemies" instance=ExtResource("2")] +position = Vector2(632.725, 78.5545) + +[node name="Enemy4" parent="Enemies" instance=ExtResource("2")] +position = Vector2(23, 16) + +[node name="ParallaxBackground" parent="." instance=ExtResource("7")] diff --git a/2d/platformer/level/moving_platform.webp b/2d/platformer/level/moving_platform.webp new file mode 100644 index 00000000..22e74077 Binary files /dev/null and b/2d/platformer/level/moving_platform.webp differ diff --git a/2d/platformer/assets/art/platforms/moving_platform.png.import b/2d/platformer/level/moving_platform.webp.import similarity index 66% rename from 2d/platformer/assets/art/platforms/moving_platform.png.import rename to 2d/platformer/level/moving_platform.webp.import index 205452a1..bbe8195a 100644 --- a/2d/platformer/assets/art/platforms/moving_platform.png.import +++ b/2d/platformer/level/moving_platform.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://8p65ui1ydnff" -path="res://.godot/imported/moving_platform.png-479aa8f802d1a4964b138893ada8d372.ctex" +path="res://.godot/imported/moving_platform.webp-dd4a79a18c99da84f4c06de09878b0a4.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/platforms/moving_platform.png" -dest_files=["res://.godot/imported/moving_platform.png-479aa8f802d1a4964b138893ada8d372.ctex"] +source_file="res://level/moving_platform.webp" +dest_files=["res://.godot/imported/moving_platform.webp-dd4a79a18c99da84f4c06de09878b0a4.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/assets/art/platforms/one_way_platform.png.import b/2d/platformer/level/one_way_platform.import similarity index 66% rename from 2d/platformer/assets/art/platforms/one_way_platform.png.import rename to 2d/platformer/level/one_way_platform.import index fefc8591..6c47017e 100644 --- a/2d/platformer/assets/art/platforms/one_way_platform.png.import +++ b/2d/platformer/level/one_way_platform.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://dpdd5ioofxcur" -path="res://.godot/imported/one_way_platform.png-aaf0179c7171228f27cb489e99e339bd.ctex" +path="res://.godot/imported/one_way_platform.png-ff82db5f4cf9bbd816ae5115d1b41cf7.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/platforms/one_way_platform.png" -dest_files=["res://.godot/imported/one_way_platform.png-aaf0179c7171228f27cb489e99e339bd.ctex"] +source_file="res://level/one_way_platform.png" +dest_files=["res://.godot/imported/one_way_platform.png-ff82db5f4cf9bbd816ae5115d1b41cf7.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/level/one_way_platform.webp b/2d/platformer/level/one_way_platform.webp new file mode 100644 index 00000000..86f92543 Binary files /dev/null and b/2d/platformer/level/one_way_platform.webp differ diff --git a/2d/platformer/level/one_way_platform.webp.import b/2d/platformer/level/one_way_platform.webp.import new file mode 100644 index 00000000..0004a676 --- /dev/null +++ b/2d/platformer/level/one_way_platform.webp.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://db21c324q8p5n" +path="res://.godot/imported/one_way_platform.webp-184fac31b4e1b4bd4c4e6085ce99357a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://level/one_way_platform.webp" +dest_files=["res://.godot/imported/one_way_platform.webp-184fac31b4e1b4bd4c4e6085ce99357a.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/2d/platformer/src/Level/ParallaxBackground.tscn b/2d/platformer/level/parallax_background.tscn similarity index 72% rename from 2d/platformer/src/Level/ParallaxBackground.tscn rename to 2d/platformer/level/parallax_background.tscn index e4c39761..b5cae72a 100644 --- a/2d/platformer/src/Level/ParallaxBackground.tscn +++ b/2d/platformer/level/parallax_background.tscn @@ -1,11 +1,11 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=7 format=3 uid="uid://bkyw3e13rupar"] -[ext_resource path="res://assets/art/background/distant_platforms_2.png" type="Texture2D" id=1] -[ext_resource path="res://assets/art/background/sky.png" type="Texture2D" id=2] -[ext_resource path="res://assets/art/background/cloud_1.png" type="Texture2D" id=3] -[ext_resource path="res://assets/art/background/cloud_2.png" type="Texture2D" id=4] -[ext_resource path="res://assets/art/background/cloud_3.png" type="Texture2D" id=5] -[ext_resource path="res://assets/art/background/distant_platforms_1.png" type="Texture2D" id=6] +[ext_resource type="Texture2D" uid="uid://d003shl6ntver" path="res://level/distant_platforms_2.webp" id="1"] +[ext_resource type="Texture2D" uid="uid://cnxf4hsvrcgka" path="res://level/sky.webp" id="2"] +[ext_resource type="Texture2D" uid="uid://b4n7s65t0qoep" path="res://level/cloud_1.webp" id="3"] +[ext_resource type="Texture2D" uid="uid://cubkvnu4fdwki" path="res://level/cloud_2.webp" id="4"] +[ext_resource type="Texture2D" uid="uid://5tho6j8r4eam" path="res://level/cloud_3.webp" id="5"] +[ext_resource type="Texture2D" uid="uid://smxp1wviat8" path="res://level/distant_platforms_1.webp" id="6"] [node name="ParallaxBackground" type="ParallaxBackground"] scroll_base_scale = Vector2(0.4, 0) @@ -15,7 +15,7 @@ motion_mirroring = Vector2(400, 0) [node name="Sprite2D" type="Sprite2D" parent="Sky"] scale = Vector2(64, 0.94) -texture = ExtResource( 2 ) +texture = ExtResource("2") centered = false [node name="Clouds" type="ParallaxLayer" parent="."] @@ -27,64 +27,64 @@ position = Vector2(-780, 0) [node name="Sprite1" type="Sprite2D" parent="Clouds/CloudGroup1"] position = Vector2(-200, 120) -texture = ExtResource( 3 ) +texture = ExtResource("3") centered = false [node name="Sprite2" type="Sprite2D" parent="Clouds/CloudGroup1"] position = Vector2(100, 10) -texture = ExtResource( 3 ) +texture = ExtResource("3") centered = false [node name="Sprite3" type="Sprite2D" parent="Clouds/CloudGroup1"] position = Vector2(-60, 40) -texture = ExtResource( 4 ) +texture = ExtResource("4") centered = false [node name="Sprite4" type="Sprite2D" parent="Clouds/CloudGroup1"] position = Vector2(150, 65) -texture = ExtResource( 4 ) +texture = ExtResource("4") centered = false [node name="Sprite5" type="Sprite2D" parent="Clouds/CloudGroup1"] position = Vector2(15, 75) -texture = ExtResource( 5 ) +texture = ExtResource("5") centered = false [node name="Sprite6" type="Sprite2D" parent="Clouds/CloudGroup1"] position = Vector2(225, 35) -texture = ExtResource( 5 ) +texture = ExtResource("5") centered = false [node name="CloudGroup2" type="Node2D" parent="Clouds"] [node name="Sprite1" type="Sprite2D" parent="Clouds/CloudGroup2"] position = Vector2(-200, 120) -texture = ExtResource( 3 ) +texture = ExtResource("3") centered = false [node name="Sprite2" type="Sprite2D" parent="Clouds/CloudGroup2"] position = Vector2(100, 10) -texture = ExtResource( 3 ) +texture = ExtResource("3") centered = false [node name="Sprite3" type="Sprite2D" parent="Clouds/CloudGroup2"] position = Vector2(-60, 40) -texture = ExtResource( 4 ) +texture = ExtResource("4") centered = false [node name="Sprite4" type="Sprite2D" parent="Clouds/CloudGroup2"] position = Vector2(150, 65) -texture = ExtResource( 4 ) +texture = ExtResource("4") centered = false [node name="Sprite5" type="Sprite2D" parent="Clouds/CloudGroup2"] position = Vector2(15, 75) -texture = ExtResource( 5 ) +texture = ExtResource("5") centered = false [node name="Sprite6" type="Sprite2D" parent="Clouds/CloudGroup2"] position = Vector2(225, 35) -texture = ExtResource( 5 ) +texture = ExtResource("5") centered = false [node name="CloudGroup3" type="Node2D" parent="Clouds"] @@ -92,32 +92,32 @@ position = Vector2(390, 0) [node name="Sprite1" type="Sprite2D" parent="Clouds/CloudGroup3"] position = Vector2(-200, 120) -texture = ExtResource( 3 ) +texture = ExtResource("3") centered = false [node name="Sprite2" type="Sprite2D" parent="Clouds/CloudGroup3"] position = Vector2(100, 10) -texture = ExtResource( 3 ) +texture = ExtResource("3") centered = false [node name="Sprite3" type="Sprite2D" parent="Clouds/CloudGroup3"] position = Vector2(-60, 40) -texture = ExtResource( 4 ) +texture = ExtResource("4") centered = false [node name="Sprite4" type="Sprite2D" parent="Clouds/CloudGroup3"] position = Vector2(150, 65) -texture = ExtResource( 4 ) +texture = ExtResource("4") centered = false [node name="Sprite5" type="Sprite2D" parent="Clouds/CloudGroup3"] position = Vector2(15, 75) -texture = ExtResource( 5 ) +texture = ExtResource("5") centered = false [node name="Sprite6" type="Sprite2D" parent="Clouds/CloudGroup3"] position = Vector2(225, 35) -texture = ExtResource( 5 ) +texture = ExtResource("5") centered = false [node name="CloudGroup4" type="Node2D" parent="Clouds"] @@ -125,32 +125,32 @@ position = Vector2(780, 0) [node name="Sprite1" type="Sprite2D" parent="Clouds/CloudGroup4"] position = Vector2(-200, 120) -texture = ExtResource( 3 ) +texture = ExtResource("3") centered = false [node name="Sprite2" type="Sprite2D" parent="Clouds/CloudGroup4"] position = Vector2(100, 10) -texture = ExtResource( 3 ) +texture = ExtResource("3") centered = false [node name="Sprite3" type="Sprite2D" parent="Clouds/CloudGroup4"] position = Vector2(-60, 40) -texture = ExtResource( 4 ) +texture = ExtResource("4") centered = false [node name="Sprite4" type="Sprite2D" parent="Clouds/CloudGroup4"] position = Vector2(150, 65) -texture = ExtResource( 4 ) +texture = ExtResource("4") centered = false [node name="Sprite5" type="Sprite2D" parent="Clouds/CloudGroup4"] position = Vector2(15, 75) -texture = ExtResource( 5 ) +texture = ExtResource("5") centered = false [node name="Sprite6" type="Sprite2D" parent="Clouds/CloudGroup4"] position = Vector2(225, 35) -texture = ExtResource( 5 ) +texture = ExtResource("5") centered = false [node name="Mountains2" type="ParallaxLayer" parent="."] @@ -159,7 +159,9 @@ motion_scale = Vector2(0.2, 1) [node name="Sprite2D" type="Sprite2D" parent="Mountains2"] position = Vector2(0, -64) -texture = ExtResource( 1 ) +texture = ExtResource("1") +centered = false +offset = Vector2(0, -64) region_enabled = true region_rect = Rect2(0, 0, 2048, 128) @@ -169,6 +171,8 @@ motion_scale = Vector2(0.4, 1) [node name="Sprite2D" type="Sprite2D" parent="Mountains1"] position = Vector2(0, -64) -texture = ExtResource( 6 ) +texture = ExtResource("6") +centered = false +offset = Vector2(0, -64) region_enabled = true region_rect = Rect2(0, 0, 2048, 128) diff --git a/2d/platformer/level/platform.tscn b/2d/platformer/level/platform.tscn new file mode 100644 index 00000000..9b939cbd --- /dev/null +++ b/2d/platformer/level/platform.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 format=3 uid="uid://bfylfwu4pwywv"] + +[ext_resource type="Texture2D" uid="uid://8p65ui1ydnff" path="res://level/moving_platform.webp" id="2"] + +[sub_resource type="RectangleShape2D" id="1"] +size = Vector2(94, 12) + +[node name="Platform" type="CharacterBody2D"] +z_index = -1 +collision_layer = 8 +collision_mask = 0 + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(0, -4) +shape = SubResource("1") +one_way_collision = true diff --git a/2d/platformer/level/sky.webp b/2d/platformer/level/sky.webp new file mode 100644 index 00000000..f67bf61e Binary files /dev/null and b/2d/platformer/level/sky.webp differ diff --git a/2d/platformer/assets/art/background/sky.png.import b/2d/platformer/level/sky.webp.import similarity index 69% rename from 2d/platformer/assets/art/background/sky.png.import rename to 2d/platformer/level/sky.webp.import index 118364fe..b08f5368 100644 --- a/2d/platformer/assets/art/background/sky.png.import +++ b/2d/platformer/level/sky.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://cnxf4hsvrcgka" -path="res://.godot/imported/sky.png-c175b712c46edc17f2b5fc55b9de3c49.ctex" +path="res://.godot/imported/sky.webp-378e3d4469ee1943579600be36d5a9f5.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/background/sky.png" -dest_files=["res://.godot/imported/sky.png-c175b712c46edc17f2b5fc55b9de3c49.ctex"] +source_file="res://level/sky.webp" +dest_files=["res://.godot/imported/sky.webp-378e3d4469ee1943579600be36d5a9f5.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/level/tiles.webp b/2d/platformer/level/tiles.webp new file mode 100644 index 00000000..0cb4e888 Binary files /dev/null and b/2d/platformer/level/tiles.webp differ diff --git a/2d/platformer/assets/art/tileset/tiles_demo.png.import b/2d/platformer/level/tiles.webp.import similarity index 68% rename from 2d/platformer/assets/art/tileset/tiles_demo.png.import rename to 2d/platformer/level/tiles.webp.import index 1e664a5d..4c9cd232 100644 --- a/2d/platformer/assets/art/tileset/tiles_demo.png.import +++ b/2d/platformer/level/tiles.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://c1hixfwf86y2q" -path="res://.godot/imported/tiles_demo.png-f720a7de2b60b01f690cfa3cb881996b.ctex" +path="res://.godot/imported/tiles.webp-4f56cd8ea452f8ba920d65a0b9099010.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/tileset/tiles_demo.png" -dest_files=["res://.godot/imported/tiles_demo.png-f720a7de2b60b01f690cfa3cb881996b.ctex"] +source_file="res://level/tiles.webp" +dest_files=["res://.godot/imported/tiles.webp-4f56cd8ea452f8ba920d65a0b9099010.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/level/tileset.tres b/2d/platformer/level/tileset.tres new file mode 100644 index 00000000..f1429a94 --- /dev/null +++ b/2d/platformer/level/tileset.tres @@ -0,0 +1,729 @@ +[gd_resource type="TileSet" load_steps=17 format=3 uid="uid://dmpguegs1kkkl"] + +[ext_resource type="Texture2D" uid="uid://c1hixfwf86y2q" path="res://level/tiles.webp" id="1"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_24d4o"] +texture = ExtResource("1") +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 16, -10, 16, 16, -16, 16) +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -16, -10, -16, 16, 16, 16) +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 10, 16, 10, 16, -16, -16, -16) +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 10, -16, 10, -16, -16, 16, -16) +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 16, -10, 16, 16, -16, 16) +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -16, -10, -16, 16, 16, 16) +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 10, 16, 10, 16, -16, -16, -16) +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 10, -16, 10, -16, -16, 16, -16) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_opo1u"] +texture = ExtResource("1") +margins = Vector2i(32, 0) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 12, -10, 12, 16, -16, 16) +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -12, -10, -12, 16, 16, 16) +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 10, 12, 10, 12, -16, -16, -16) +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 10, -12, 10, -12, -16, 16, -16) +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 12, -10, 12, 16, -16, 16) +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -12, -10, -12, 16, 16, 16) +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 10, 12, 10, 12, -16, -16, -16) +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 10, -12, 10, -12, -16, 16, -16) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_val0e"] +texture = ExtResource("1") +margins = Vector2i(160, 32) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16) +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -16, -16, -16, 16, 16, 16) +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16) +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -16, 16, -16, -16, 16, -16) +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16) +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -16, -16, -16, 16, 16, 16) +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16) +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -16, 16, -16, -16, 16, -16) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_vw3dp"] +texture = ExtResource("1") +margins = Vector2i(128, 64) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_ofvgn"] +texture = ExtResource("1") +margins = Vector2i(128, 32) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_suguu"] +texture = ExtResource("1") +margins = Vector2i(128, 96) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 16, -10, 16, 16, -16, 16) +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -16, -10, -16, 16, 16, 16) +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 10, 16, 10, 16, -16, -16, -16) +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 10, -16, 10, -16, -16, 16, -16) +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 16, -10, 16, 16, -16, 16) +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -16, -10, -16, 16, 16, 16) +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 10, 16, 10, 16, -16, -16, -16) +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 10, -16, 10, -16, -16, 16, -16) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_erd6k"] +texture = ExtResource("1") +margins = Vector2i(128, 0) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_l8f8l"] +texture = ExtResource("1") +margins = Vector2i(64, 32) +texture_region_size = Vector2i(32, 96) +0:0/next_alternative_id = 2 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 16, 22.5, 16, 48, -16, 48) +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -16, 22, -16, 48, 16, 48) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_5pwh6"] +texture = ExtResource("1") +margins = Vector2i(32, 32) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 12, -16, 12, 16, -16, 16) +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -12, -16, -12, 16, 16, 16) +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 12, 16, 12, -16, -16, -16) +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -12, 16, -12, -16, 16, -16) +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 12, -16, 12, 16, -16, 16) +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -12, -16, -12, 16, 16, 16) +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 12, 16, 12, -16, -16, -16) +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -12, 16, -12, -16, 16, -16) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_seqgr"] +texture = ExtResource("1") +margins = Vector2i(32, 64) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(12, -10, 16, -10, 16, 16, -16, 16, -16, -16, 12, -16) +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(-12, -10, -16, -10, -16, 16, 16, 16, 16, -16, -12, -16) +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(12, 10, 16, 10, 16, -16, -16, -16, -16, 16, 12, 16) +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(-12, 10, -16, 10, -16, -16, 16, -16, 16, 16, -12, 16) +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(12, -10, 16, -10, 16, 16, -16, 16, -16, -16, 12, -16) +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(-12, -10, -16, -10, -16, 16, 16, 16, 16, -16, -12, -16) +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(12, 10, 16, 10, 16, -16, -16, -16, -16, 16, 12, 16) +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(-12, 10, -16, 10, -16, -16, 16, -16, 16, 16, -12, 16) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_5an2c"] +texture = ExtResource("1") +margins = Vector2i(64, 0) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 16, -10, 16, 16, -16, 16) +0:0/0/physics_layer_0/polygon_0/one_way = true +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -16, -10, -16, 16, 16, 16) +0:0/1/physics_layer_0/polygon_0/one_way = true +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 10, 16, 10, 16, -16, -16, -16) +0:0/2/physics_layer_0/polygon_0/one_way = true +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 10, -16, 10, -16, -16, 16, -16) +0:0/3/physics_layer_0/polygon_0/one_way = true +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 16, -10, 16, 16, -16, 16) +0:0/4/physics_layer_0/polygon_0/one_way = true +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -16, -10, -16, 16, 16, 16) +0:0/5/physics_layer_0/polygon_0/one_way = true +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 10, 16, 10, 16, -16, -16, -16) +0:0/6/physics_layer_0/polygon_0/one_way = true +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 10, -16, 10, -16, -16, 16, -16) +0:0/7/physics_layer_0/polygon_0/one_way = true + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_diy7l"] +texture = ExtResource("1") +margins = Vector2i(96, 0) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 12, -10, 12, 16, -16, 16) +0:0/0/physics_layer_0/polygon_0/one_way = true +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -12, -10, -12, 16, 16, 16) +0:0/1/physics_layer_0/polygon_0/one_way = true +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 10, 12, 10, 12, -16, -16, -16) +0:0/2/physics_layer_0/polygon_0/one_way = true +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 10, -12, 10, -12, -16, 16, -16) +0:0/3/physics_layer_0/polygon_0/one_way = true +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -10, 12, -10, 12, 16, -16, 16) +0:0/4/physics_layer_0/polygon_0/one_way = true +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -10, -12, -10, -12, 16, 16, 16) +0:0/5/physics_layer_0/polygon_0/one_way = true +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 10, 12, 10, 12, -16, -16, -16) +0:0/6/physics_layer_0/polygon_0/one_way = true +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 10, -12, 10, -12, -16, 16, -16) +0:0/7/physics_layer_0/polygon_0/one_way = true + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_05unx"] +texture = ExtResource("1") +margins = Vector2i(0, 32) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16) +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -16, -16, -16, 16, 16, 16) +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16) +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -16, 16, -16, -16, 16, -16) +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16) +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -16, -16, -16, 16, 16, 16) +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16) +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -16, 16, -16, -16, 16, -16) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_ucjks"] +texture = ExtResource("1") +margins = Vector2i(192, 32) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 8, -16, 8) +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -16, -16, -16, 8, 16, 8) +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -8, -16, -8) +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -16, 16, -16, -8, 16, -8) +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 8, -16, 8) +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -16, -16, -16, 8, 16, 8) +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -8, -16, -8) +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -16, 16, -16, -8, 16, -8) + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_dq2ee"] +texture = ExtResource("1") +margins = Vector2i(224, 32) +texture_region_size = Vector2i(32, 32) +0:0/next_alternative_id = 8 +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 12, -16, 12, 8, -16, 8) +0:0/1 = 1 +0:0/1/flip_h = true +0:0/1/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/1/physics_layer_0/angular_velocity = 0.0 +0:0/1/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -12, -16, -12, 8, 16, 8) +0:0/2 = 2 +0:0/2/flip_v = true +0:0/2/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/2/physics_layer_0/angular_velocity = 0.0 +0:0/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 12, 16, 12, -8, -16, -8) +0:0/3 = 3 +0:0/3/flip_h = true +0:0/3/flip_v = true +0:0/3/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/3/physics_layer_0/angular_velocity = 0.0 +0:0/3/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -12, 16, -12, -8, 16, -8) +0:0/4 = 4 +0:0/4/transpose = true +0:0/4/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/4/physics_layer_0/angular_velocity = 0.0 +0:0/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 12, -16, 12, 8, -16, 8) +0:0/5 = 5 +0:0/5/flip_h = true +0:0/5/transpose = true +0:0/5/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/5/physics_layer_0/angular_velocity = 0.0 +0:0/5/physics_layer_0/polygon_0/points = PackedVector2Array(16, -16, -12, -16, -12, 8, 16, 8) +0:0/6 = 6 +0:0/6/flip_v = true +0:0/6/transpose = true +0:0/6/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/6/physics_layer_0/angular_velocity = 0.0 +0:0/6/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 12, 16, 12, -8, -16, -8) +0:0/7 = 7 +0:0/7/flip_h = true +0:0/7/flip_v = true +0:0/7/transpose = true +0:0/7/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/7/physics_layer_0/angular_velocity = 0.0 +0:0/7/physics_layer_0/polygon_0/points = PackedVector2Array(16, 16, -12, 16, -12, -8, 16, -8) + +[resource] +tile_size = Vector2i(32, 32) +physics_layer_0/collision_layer = 16 +physics_layer_0/collision_mask = 0 +sources/0 = SubResource("TileSetAtlasSource_24d4o") +sources/1 = SubResource("TileSetAtlasSource_opo1u") +sources/2 = SubResource("TileSetAtlasSource_l8f8l") +sources/3 = SubResource("TileSetAtlasSource_5pwh6") +sources/4 = SubResource("TileSetAtlasSource_seqgr") +sources/5 = SubResource("TileSetAtlasSource_5an2c") +sources/6 = SubResource("TileSetAtlasSource_diy7l") +sources/7 = SubResource("TileSetAtlasSource_05unx") +sources/8 = SubResource("TileSetAtlasSource_ucjks") +sources/9 = SubResource("TileSetAtlasSource_dq2ee") +sources/10 = SubResource("TileSetAtlasSource_val0e") +sources/11 = SubResource("TileSetAtlasSource_vw3dp") +sources/12 = SubResource("TileSetAtlasSource_ofvgn") +sources/13 = SubResource("TileSetAtlasSource_suguu") +sources/14 = SubResource("TileSetAtlasSource_erd6k") diff --git a/2d/platformer/assets/audio/music/music.ogg b/2d/platformer/music.ogg similarity index 100% rename from 2d/platformer/assets/audio/music/music.ogg rename to 2d/platformer/music.ogg diff --git a/2d/platformer/music.ogg.import b/2d/platformer/music.ogg.import new file mode 100644 index 00000000..30d59955 --- /dev/null +++ b/2d/platformer/music.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://cx6hrmvjvhkt5" +path="res://.godot/imported/music.ogg-3bd46d3a4b41702b152014078d12a390.oggvorbisstr" + +[deps] + +source_file="res://music.ogg" +dest_files=["res://.godot/imported/music.ogg-3bd46d3a4b41702b152014078d12a390.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/2d/platformer/music.tscn b/2d/platformer/music.tscn new file mode 100644 index 00000000..9efe63fe --- /dev/null +++ b/2d/platformer/music.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://do7htx4sqmcnh"] + +[ext_resource type="AudioStream" uid="uid://cx6hrmvjvhkt5" path="res://music.ogg" id="1_8pjkj"] + +[node name="Music" type="AudioStreamPlayer"] +process_mode = 1 +stream = ExtResource("1_8pjkj") +autoplay = true diff --git a/2d/platformer/player/bullet.gd b/2d/platformer/player/bullet.gd new file mode 100644 index 00000000..67ce6bf3 --- /dev/null +++ b/2d/platformer/player/bullet.gd @@ -0,0 +1,13 @@ +class_name Bullet extends RigidBody2D + + +@onready var animation_player := $AnimationPlayer as AnimationPlayer + + +func destroy() -> void: + animation_player.play(&"destroy") + + +func _on_body_entered(body: Node) -> void: + if body is Enemy: + (body as Enemy).destroy() diff --git a/2d/platformer/src/Objects/Bullet.tscn b/2d/platformer/player/bullet.tscn similarity index 64% rename from 2d/platformer/src/Objects/Bullet.tscn rename to 2d/platformer/player/bullet.tscn index bb98800c..6fca3a1b 100644 --- a/2d/platformer/src/Objects/Bullet.tscn +++ b/2d/platformer/player/bullet.tscn @@ -1,41 +1,41 @@ -[gd_scene load_steps=8 format=2] +[gd_scene load_steps=9 format=3 uid="uid://bdeyraansvyga"] -[ext_resource path="res://assets/art/player/bullet/bullet.png" type="Texture2D" id=1] -[ext_resource path="res://src/Objects/Bullet.gd" type="Script" id=2] +[ext_resource type="Script" path="res://player/bullet.gd" id="1_cokcn"] +[ext_resource type="Texture2D" uid="uid://c2aisfmq85suf" path="res://player/bullet.webp" id="2_4bup8"] -[sub_resource type="CanvasItemMaterial" id=1] +[sub_resource type="CanvasItemMaterial" id="1"] -[sub_resource type="CanvasItemMaterial" id=2] +[sub_resource type="CanvasItemMaterial" id="2"] blend_mode = 1 -[sub_resource type="CanvasItemMaterial" id=3] +[sub_resource type="CanvasItemMaterial" id="3"] -[sub_resource type="CircleShape2D" id=4] +[sub_resource type="CircleShape2D" id="4"] radius = 4.5 -[sub_resource type="Animation" id=5] +[sub_resource type="Animation" id="5"] resource_name = "destroy" length = 0.3 tracks/0/type = "method" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath(".") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0.3), "transitions": PackedFloat32Array(1), "values": [{ "args": [], -"method": "queue_free" +"method": &"queue_free" }] } tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true tracks/1/path = NodePath("Sprite2D:self_modulate") tracks/1/interp = 1 tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true tracks/1/keys = { "times": PackedFloat32Array(0, 0.3), "transitions": PackedFloat32Array(1, 1), @@ -43,11 +43,11 @@ tracks/1/keys = { "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] } tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true tracks/2/path = NodePath("GPUParticles2D:self_modulate") tracks/2/interp = 1 tracks/2/loop_wrap = true -tracks/2/imported = false -tracks/2/enabled = true tracks/2/keys = { "times": PackedFloat32Array(0, 0.3), "transitions": PackedFloat32Array(1, 1), @@ -55,40 +55,45 @@ tracks/2/keys = { "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] } -[node name="Bullet" type="RigidDynamicBody2D"] -material = SubResource( 1 ) +[sub_resource type="AnimationLibrary" id="AnimationLibrary_li3y6"] +_data = { +"destroy": SubResource("5") +} + +[node name="Bullet" type="RigidBody2D"] +material = SubResource("1") collision_layer = 0 collision_mask = 26 continuous_cd = 2 -contacts_reported = 1 +max_contacts_reported = 4 contact_monitor = true -script = ExtResource( 2 ) +script = ExtResource("1_cokcn") [node name="GPUParticles2D" type="CPUParticles2D" parent="."] -material = SubResource( 2 ) +material = SubResource("2") emitting = false lifetime = 0.3 speed_scale = 3.0 -local_coords = false -texture = ExtResource( 1 ) +texture = ExtResource("2_4bup8") spread = 0.0 gravity = Vector2(0, 0) -scale_amount = 0.8 color = Color(1, 1, 1, 0.705882) [node name="Sprite2D" type="Sprite2D" parent="."] -material = SubResource( 3 ) -texture = ExtResource( 1 ) +material = SubResource("3") +texture = ExtResource("2_4bup8") [node name="CollisionShape2D" type="CollisionShape2D" parent="."] -shape = SubResource( 4 ) +shape = SubResource("4") [node name="Timer" type="Timer" parent="."] one_shot = true autostart = true [node name="AnimationPlayer" type="AnimationPlayer" parent="."] -anims/destroy = SubResource( 5 ) +libraries = { +"": SubResource("AnimationLibrary_li3y6") +} [connection signal="body_entered" from="." to="." method="_on_body_entered"] [connection signal="timeout" from="Timer" to="." method="destroy"] diff --git a/2d/platformer/player/bullet.webp b/2d/platformer/player/bullet.webp new file mode 100644 index 00000000..ce3faace Binary files /dev/null and b/2d/platformer/player/bullet.webp differ diff --git a/2d/platformer/assets/art/player/bullet/bullet.png.import b/2d/platformer/player/bullet.webp.import similarity index 68% rename from 2d/platformer/assets/art/player/bullet/bullet.png.import rename to 2d/platformer/player/bullet.webp.import index afa1337e..89deb15b 100644 --- a/2d/platformer/assets/art/player/bullet/bullet.png.import +++ b/2d/platformer/player/bullet.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://c2aisfmq85suf" -path="res://.godot/imported/bullet.png-a148438922f3743d5615622ef8134c9f.ctex" +path="res://.godot/imported/bullet.webp-afcd8f50a20e81f25285b6f580e633e3.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/player/bullet/bullet.png" -dest_files=["res://.godot/imported/bullet.png-a148438922f3743d5615622ef8134c9f.ctex"] +source_file="res://player/bullet.webp" +dest_files=["res://.godot/imported/bullet.webp-afcd8f50a20e81f25285b6f580e633e3.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/assets/audio/sfx/coin_pickup.wav b/2d/platformer/player/coin_pickup.wav similarity index 100% rename from 2d/platformer/assets/audio/sfx/coin_pickup.wav rename to 2d/platformer/player/coin_pickup.wav diff --git a/2d/platformer/assets/audio/sfx/coin_pickup.wav.import b/2d/platformer/player/coin_pickup.wav.import similarity index 54% rename from 2d/platformer/assets/audio/sfx/coin_pickup.wav.import rename to 2d/platformer/player/coin_pickup.wav.import index 05aec83b..078cd01b 100644 --- a/2d/platformer/assets/audio/sfx/coin_pickup.wav.import +++ b/2d/platformer/player/coin_pickup.wav.import @@ -3,12 +3,12 @@ importer="wav" type="AudioStreamWAV" uid="uid://bw67pgdlhpqd0" -path="res://.godot/imported/coin_pickup.wav-69d455f3063e30fd994846647c281aea.sample" +path="res://.godot/imported/coin_pickup.wav-cc06e43e2f58c4fe505090708655bec0.sample" [deps] -source_file="res://assets/audio/sfx/coin_pickup.wav" -dest_files=["res://.godot/imported/coin_pickup.wav-69d455f3063e30fd994846647c281aea.sample"] +source_file="res://player/coin_pickup.wav" +dest_files=["res://.godot/imported/coin_pickup.wav-cc06e43e2f58c4fe505090708655bec0.sample"] [params] diff --git a/2d/platformer/player/gun.gd b/2d/platformer/player/gun.gd new file mode 100644 index 00000000..d6af8b3c --- /dev/null +++ b/2d/platformer/player/gun.gd @@ -0,0 +1,25 @@ +class_name Gun extends Marker2D +## Represents a weapon that spawns and shoots bullets. +## The Cooldown timer controls the cooldown duration between shots. + + +const BULLET_VELOCITY = 500.0 +const Bullet = preload("res://player/bullet.tscn") + +@onready var sound_shoot := $Shoot as AudioStreamPlayer2D +@onready var timer := $Cooldown as Timer + + +# This method is only called by Player.gd. +func shoot(direction: float = 1.0) -> bool: + if not timer.is_stopped(): + return false + var bullet := Bullet.instantiate() as Bullet + bullet.global_position = global_position + bullet.linear_velocity = Vector2(direction * BULLET_VELOCITY, 0.0) + + bullet.set_as_top_level(true) + add_child(bullet) + sound_shoot.play() + timer.start() + return true diff --git a/2d/platformer/assets/audio/sfx/jump.wav b/2d/platformer/player/jump.wav similarity index 100% rename from 2d/platformer/assets/audio/sfx/jump.wav rename to 2d/platformer/player/jump.wav diff --git a/2d/platformer/assets/audio/sfx/jump.wav.import b/2d/platformer/player/jump.wav.import similarity index 56% rename from 2d/platformer/assets/audio/sfx/jump.wav.import rename to 2d/platformer/player/jump.wav.import index 28eafef4..86566d30 100644 --- a/2d/platformer/assets/audio/sfx/jump.wav.import +++ b/2d/platformer/player/jump.wav.import @@ -3,12 +3,12 @@ importer="wav" type="AudioStreamWAV" uid="uid://i2vnokf2khqj" -path="res://.godot/imported/jump.wav-127418ac4fc0b61a7fed0684053202c7.sample" +path="res://.godot/imported/jump.wav-d94eb6ad27159bf77e7ba7ab65914fbd.sample" [deps] -source_file="res://assets/audio/sfx/jump.wav" -dest_files=["res://.godot/imported/jump.wav-127418ac4fc0b61a7fed0684053202c7.sample"] +source_file="res://player/jump.wav" +dest_files=["res://.godot/imported/jump.wav-d94eb6ad27159bf77e7ba7ab65914fbd.sample"] [params] diff --git a/2d/platformer/player/player.gd b/2d/platformer/player/player.gd new file mode 100644 index 00000000..d6fb1357 --- /dev/null +++ b/2d/platformer/player/player.gd @@ -0,0 +1,88 @@ +class_name Player extends CharacterBody2D + + +signal coin_collected() + +const WALK_SPEED = 200.0 +const ACCELERATION_SPEED = WALK_SPEED * 6.0 +const JUMP_VELOCITY = -400.0 +## Maximum speed at which the player can fall. +const TERMINAL_VELOCITY = 400 + +## The player listens for input actions appended with this suffix.[br] +## Used to separate controls for multiple players in splitscreen. +@export var action_suffix := "" + +var gravity: int = ProjectSettings.get("physics/2d/default_gravity") +@onready var platform_detector := $PlatformDetector as RayCast2D +@onready var animation_player := $AnimationPlayer as AnimationPlayer +@onready var shoot_timer := $ShootAnimation as Timer +@onready var sprite := $Sprite2D as Sprite2D +@onready var jump_sound := $Jump as AudioStreamPlayer2D +@onready var gun = sprite.get_node(^"Gun") as Gun +@onready var camera := $Camera as Camera2D +var _double_jump_charged := false + + +func _physics_process(delta: float) -> void: + if is_on_floor(): + _double_jump_charged = true + if Input.is_action_just_pressed("jump" + action_suffix): + try_jump() + elif Input.is_action_just_released("jump" + action_suffix) and velocity.y < 0.0: + # The player let go of jump early, reduce vertical momentum. + velocity.y *= 0.6 + # Fall. + velocity.y = minf(TERMINAL_VELOCITY, velocity.y + gravity * delta) + + var direction := Input.get_axis("move_left" + action_suffix, "move_right" + action_suffix) * WALK_SPEED + velocity.x = move_toward(velocity.x, direction, ACCELERATION_SPEED * delta) + + if not is_zero_approx(velocity.x): + if velocity.x > 0.0: + sprite.scale.x = 1.0 + else: + sprite.scale.x = -1.0 + + floor_stop_on_slope = not platform_detector.is_colliding() + move_and_slide() + + var is_shooting := false + if Input.is_action_just_pressed("shoot" + action_suffix): + is_shooting = gun.shoot(sprite.scale.x) + + var animation := get_new_animation(is_shooting) + if animation != animation_player.current_animation and shoot_timer.is_stopped(): + if is_shooting: + shoot_timer.start() + animation_player.play(animation) + + +func get_new_animation(is_shooting := false) -> String: + var animation_new: String + if is_on_floor(): + if absf(velocity.x) > 0.1: + animation_new = "run" + else: + animation_new = "idle" + else: + if velocity.y > 0.0: + animation_new = "falling" + else: + animation_new = "jumping" + if is_shooting: + animation_new += "_weapon" + return animation_new + + +func try_jump() -> void: + if is_on_floor(): + jump_sound.pitch_scale = 1.0 + elif _double_jump_charged: + _double_jump_charged = false + velocity.x *= 2.5 + jump_sound.pitch_scale = 1.5 + else: + return + velocity.y = JUMP_VELOCITY + jump_sound.play() diff --git a/2d/platformer/src/Actors/Player.tscn b/2d/platformer/player/player.tscn similarity index 69% rename from 2d/platformer/src/Actors/Player.tscn rename to 2d/platformer/player/player.tscn index 2bc6212c..7bd84bb1 100644 --- a/2d/platformer/src/Actors/Player.tscn +++ b/2d/platformer/player/player.tscn @@ -1,26 +1,21 @@ -[gd_scene load_steps=21 format=2] +[gd_scene load_steps=18 format=3 uid="uid://d0ni64ucb3ym2"] -[ext_resource path="res://src/Actors/Player.gd" type="Script" id=1] -[ext_resource path="res://assets/art/player/robot_demo.png" type="Texture2D" id=2] -[ext_resource path="res://assets/audio/sfx/jump.wav" type="AudioStream" id=3] -[ext_resource path="res://assets/audio/sfx/shoot.wav" type="AudioStream" id=4] -[ext_resource path="res://assets/art/ui/touch_button_left.png" type="Texture2D" id=5] -[ext_resource path="res://assets/art/ui/touch_button_right.png" type="Texture2D" id=6] -[ext_resource path="res://assets/art/ui/touch_button_jump.png" type="Texture2D" id=7] -[ext_resource path="res://assets/art/ui/touch_button_fire.png" type="Texture2D" id=8] -[ext_resource path="res://src/Actors/Gun.gd" type="Script" id=9] +[ext_resource type="Script" path="res://player/player.gd" id="1"] +[ext_resource type="Texture2D" uid="uid://go76jbr7e1px" path="res://player/player.webp" id="2"] +[ext_resource type="AudioStream" uid="uid://i2vnokf2khqj" path="res://player/jump.wav" id="3"] +[ext_resource type="AudioStream" uid="uid://bpxywy45eqgwy" path="res://player/shoot.wav" id="4"] +[ext_resource type="Script" path="res://player/gun.gd" id="9"] -[sub_resource type="Animation" id=1] +[sub_resource type="Animation" id="1"] resource_name = "crouch" length = 0.01 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), @@ -28,17 +23,16 @@ tracks/0/keys = { "values": [22] } -[sub_resource type="Animation" id=2] +[sub_resource type="Animation" id="2"] resource_name = "falling" length = 0.01 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), @@ -46,17 +40,16 @@ tracks/0/keys = { "values": [21] } -[sub_resource type="Animation" id=3] +[sub_resource type="Animation" id="3"] resource_name = "falling_weapon" length = 0.5 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), @@ -64,16 +57,15 @@ tracks/0/keys = { "values": [26] } -[sub_resource type="Animation" id=4] +[sub_resource type="Animation" id="4"] length = 7.0 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0, 1.25, 1.5, 2, 4.5, 4.75, 5, 5.25), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), @@ -81,16 +73,15 @@ tracks/0/keys = { "values": [16, 17, 18, 16, 19, 20, 19, 16] } -[sub_resource type="Animation" id=5] +[sub_resource type="Animation" id="5"] length = 0.5 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), @@ -98,16 +89,15 @@ tracks/0/keys = { "values": [25] } -[sub_resource type="Animation" id=6] +[sub_resource type="Animation" id="6"] length = 0.5 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0, 0.25, 0.5), "transitions": PackedFloat32Array(1, 1, 1), @@ -115,16 +105,15 @@ tracks/0/keys = { "values": [23, 24, 23] } -[sub_resource type="Animation" id=7] +[sub_resource type="Animation" id="7"] length = 0.5 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), @@ -132,16 +121,15 @@ tracks/0/keys = { "values": [26] } -[sub_resource type="Animation" id=8] +[sub_resource type="Animation" id="8"] length = 1.25 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0, 0.25, 0.5, 0.75, 1, 1.25), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), @@ -149,16 +137,15 @@ tracks/0/keys = { "values": [0, 1, 2, 3, 4, 0] } -[sub_resource type="Animation" id=9] +[sub_resource type="Animation" id="9"] length = 1.25 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0, 0.25, 0.5, 0.75, 1, 1.25), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), @@ -166,16 +153,15 @@ tracks/0/keys = { "values": [5, 6, 7, 8, 9, 5] } -[sub_resource type="Animation" id=10] +[sub_resource type="Animation" id="10"] length = 1.25 -loop = true step = 0.25 tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true tracks/0/path = NodePath("Sprite2D:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true tracks/0/keys = { "times": PackedFloat32Array(0, 0.25, 0.5, 0.75, 1, 1.25), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), @@ -183,68 +169,75 @@ tracks/0/keys = { "values": [10, 11, 12, 13, 14, 5] } -[sub_resource type="RectangleShape2D" id=11] -extents = Vector2(10, 14) +[sub_resource type="AnimationLibrary" id="AnimationLibrary_r678v"] +_data = { +"crouch": SubResource("1"), +"falling": SubResource("2"), +"falling_weapon": SubResource("3"), +"idle": SubResource("4"), +"idle_weapon": SubResource("5"), +"jumping": SubResource("6"), +"jumping_weapon": SubResource("7"), +"run": SubResource("8"), +"run_weapon": SubResource("9"), +"standing_weapon_ready": SubResource("10") +} + +[sub_resource type="RectangleShape2D" id="11"] +size = Vector2(20, 28) [node name="Player" type="CharacterBody2D"] -collision_mask = 30 -script = ExtResource( 1 ) +collision_mask = 28 +floor_max_angle = 0.907571 +floor_snap_length = 20.0 +safe_margin = 0.2 +script = ExtResource("1") [node name="ShootAnimation" type="Timer" parent="."] -process_mode = 0 wait_time = 0.2 one_shot = true [node name="PlatformDetector" type="RayCast2D" parent="."] -enabled = true -cast_to = Vector2(0, 6) collision_mask = 8 [node name="Sprite2D" type="Sprite2D" parent="."] position = Vector2(0, -14) -texture = ExtResource( 2 ) +texture = ExtResource("2") hframes = 16 vframes = 2 frame = 16 -[node name="Gun" type="Position2D" parent="Sprite2D"] +[node name="Gun" type="Marker2D" parent="Sprite2D"] position = Vector2(14, 1) -script = ExtResource( 9 ) +script = ExtResource("9") [node name="Shoot" type="AudioStreamPlayer2D" parent="Sprite2D/Gun"] position = Vector2(-30.6589, -6.13176) -stream = ExtResource( 4 ) +stream = ExtResource("4") [node name="Cooldown" type="Timer" parent="Sprite2D/Gun"] -process_mode = 0 wait_time = 0.3 one_shot = true [node name="AnimationPlayer" type="AnimationPlayer" parent="."] -playback_speed = 2.6 -anims/crouch = SubResource( 1 ) -anims/falling = SubResource( 2 ) -anims/falling_weapon = SubResource( 3 ) -anims/idle = SubResource( 4 ) -anims/idle_weapon = SubResource( 5 ) -anims/jumping = SubResource( 6 ) -anims/jumping_weapon = SubResource( 7 ) -anims/run = SubResource( 8 ) -anims/run_weapon = SubResource( 9 ) -anims/standing_weapon_ready = SubResource( 10 ) +libraries = { +"": SubResource("AnimationLibrary_r678v") +} -[node name="Camera3D" type="Camera2D" parent="."] +[node name="Camera" type="Camera2D" parent="."] position = Vector2(0, -28) -current = true -zoom = Vector2(0.5, 0.5) -process_mode = 0 +zoom = Vector2(2, 2) +limit_left = -315 +limit_top = -250 +limit_right = 955 +limit_bottom = 690 [node name="CollisionShape2D" type="CollisionShape2D" parent="."] position = Vector2(0, -14) -shape = SubResource( 11 ) +shape = SubResource("11") [node name="Jump" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource( 3 ) +stream = ExtResource("3") [node name="UI" type="CanvasLayer" parent="."] layer = 0 @@ -252,7 +245,6 @@ layer = 0 [node name="Left" type="TouchScreenButton" parent="UI"] position = Vector2(27.7593, 360.87) scale = Vector2(1.49157, 1.46265) -normal = ExtResource( 5 ) passby_press = true action = "move_left" visibility_mode = 1 @@ -260,7 +252,6 @@ visibility_mode = 1 [node name="Right" type="TouchScreenButton" parent="UI"] position = Vector2(121.542, 361.415) scale = Vector2(1.49157, 1.46265) -normal = ExtResource( 6 ) passby_press = true action = "move_right" visibility_mode = 1 @@ -268,13 +259,11 @@ visibility_mode = 1 [node name="Jump" type="TouchScreenButton" parent="UI"] position = Vector2(666.224, 359.02) scale = Vector2(1.49157, 1.46265) -normal = ExtResource( 7 ) action = "jump" visibility_mode = 1 [node name="Fire" type="TouchScreenButton" parent="UI"] position = Vector2(668.073, 262.788) scale = Vector2(1.49157, 1.46265) -normal = ExtResource( 8 ) action = "shoot" visibility_mode = 1 diff --git a/2d/platformer/player/player.webp b/2d/platformer/player/player.webp new file mode 100644 index 00000000..6343dfc7 Binary files /dev/null and b/2d/platformer/player/player.webp differ diff --git a/2d/platformer/assets/art/player/robot_demo.png.import b/2d/platformer/player/player.webp.import similarity index 68% rename from 2d/platformer/assets/art/player/robot_demo.png.import rename to 2d/platformer/player/player.webp.import index e86fae7e..93a3536c 100644 --- a/2d/platformer/assets/art/player/robot_demo.png.import +++ b/2d/platformer/player/player.webp.import @@ -3,22 +3,22 @@ importer="texture" type="CompressedTexture2D" uid="uid://go76jbr7e1px" -path="res://.godot/imported/robot_demo.png-cd7cbcf6d0c47d4a233ea7ce93b142c2.ctex" +path="res://.godot/imported/player.webp-f8efd9c2246a95708b9c4853ed21513e.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/art/player/robot_demo.png" -dest_files=["res://.godot/imported/robot_demo.png-cd7cbcf6d0c47d4a233ea7ce93b142c2.ctex"] +source_file="res://player/player.webp" +dest_files=["res://.godot/imported/player.webp-f8efd9c2246a95708b9c4853ed21513e.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 -compress/bptc_ldr=0 compress/normal_map=0 compress/channel_pack=0 mipmaps/generate=false diff --git a/2d/platformer/assets/audio/sfx/shoot.wav b/2d/platformer/player/shoot.wav similarity index 100% rename from 2d/platformer/assets/audio/sfx/shoot.wav rename to 2d/platformer/player/shoot.wav diff --git a/2d/platformer/assets/audio/sfx/shoot.wav.import b/2d/platformer/player/shoot.wav.import similarity index 56% rename from 2d/platformer/assets/audio/sfx/shoot.wav.import rename to 2d/platformer/player/shoot.wav.import index c887c229..6b42b0e8 100644 --- a/2d/platformer/assets/audio/sfx/shoot.wav.import +++ b/2d/platformer/player/shoot.wav.import @@ -3,12 +3,12 @@ importer="wav" type="AudioStreamWAV" uid="uid://bpxywy45eqgwy" -path="res://.godot/imported/shoot.wav-f3ce9b4ae60220ecd3cf78df7278a10f.sample" +path="res://.godot/imported/shoot.wav-c76164c7ce3589c9fdcbf989e9819ed2.sample" [deps] -source_file="res://assets/audio/sfx/shoot.wav" -dest_files=["res://.godot/imported/shoot.wav-f3ce9b4ae60220ecd3cf78df7278a10f.sample"] +source_file="res://player/shoot.wav" +dest_files=["res://.godot/imported/shoot.wav-c76164c7ce3589c9fdcbf989e9819ed2.sample"] [params] diff --git a/2d/platformer/project.godot b/2d/platformer/project.godot index 9bf7358d..65050ced 100644 --- a/2d/platformer/project.godot +++ b/2d/platformer/project.godot @@ -8,59 +8,20 @@ config_version=5 -_global_script_classes=[{ -"base": "CharacterBody2D", -"class": &"Actor", -"language": &"GDScript", -"path": "res://src/Actors/Actor.gd" -}, { -"base": "RigidBody2D", -"class": &"Bullet", -"language": &"GDScript", -"path": "res://src/Objects/Bullet.gd" -}, { -"base": "Area2D", -"class": &"Coin", -"language": &"GDScript", -"path": "res://src/Objects/Coin.gd" -}, { -"base": "Actor", -"class": &"Enemy", -"language": &"GDScript", -"path": "res://src/Actors/Enemy.gd" -}, { -"base": "Marker2D", -"class": &"Gun", -"language": &"GDScript", -"path": "res://src/Actors/Gun.gd" -}, { -"base": "Actor", -"class": &"Player", -"language": &"GDScript", -"path": "res://src/Actors/Player.gd" -}] -_global_script_class_icons={ -"Actor": "", -"Bullet": "", -"Coin": "", -"Enemy": "", -"Gun": "", -"Player": "" -} - [application] config/name="Platformer 2D" -config/description="This demo is a pixel art 2D platformer with graphics and sound. +config/description="This demo is a pixel art 2D platformer with single-player +and two player splitscreen multiplayer. -It shows you how to code characters and physics-based objects +It demonstrates how to code characters and physics-based objects in a real game context. This is a relatively complete demo where the player can jump, walk on slopes, fire bullets, -interact with enemies, and more. It contains one closed -level, and the player is invincible, unlike the enemies." -run/main_scene="res://src/Main/Game.tscn" +interact with enemies, and collect items. It contains one +level. The player is invincible, unlike the enemies." +run/main_scene="res://game_singleplayer.tscn" config/features=PackedStringArray("4.0") -config/icon="res://icon.png" +config/icon="res://icon.webp" target_fps="60" [debug] @@ -69,7 +30,6 @@ gdscript/warnings/unsafe_property_access=true gdscript/warnings/unsafe_method_access=true gdscript/warnings/unsafe_cast=true gdscript/warnings/unsafe_call_argument=true -gdscript/completion/autocomplete_setters_and_getters=true [display] @@ -105,108 +65,95 @@ texture={ jump={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777232,"physical_keycode":0,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":87,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null) ] } move_left={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777231,"physical_keycode":0,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":65,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null) ] } move_right={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777233,"physical_keycode":0,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":68,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null) ] } shoot={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":2,"pressure":0.0,"pressed":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":90,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"echo":false,"script":null) , Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"pressed":false,"double_click":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777350,"physical_keycode":0,"unicode":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777238,"physical_keycode":0,"unicode":0,"echo":false,"script":null) ] } toggle_fullscreen={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777254,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194342,"key_label":0,"unicode":0,"echo":false,"script":null) ] } toggle_pause={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777217,"physical_keycode":0,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) +"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"echo":false,"script":null) ] } jump_p1={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":87,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null) ] } move_left_p1={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":65,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null) ] } move_right_p1={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":68,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null) ] } shoot_p1={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":90,"physical_keycode":0,"unicode":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":2,"pressure":0.0,"pressed":false,"script":null) ] } jump_p2={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777232,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":73,"key_label":0,"unicode":105,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":0,"pressure":0.0,"pressed":false,"script":null) ] } move_left_p2={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777231,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":74,"key_label":0,"unicode":106,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":14,"pressure":0.0,"pressed":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":1,"axis":0,"axis_value":-1.0,"script":null) ] } move_right_p2={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777233,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":76,"key_label":0,"unicode":108,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":15,"pressure":0.0,"pressed":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":1,"axis":0,"axis_value":1.0,"script":null) ] } shoot_p2={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777350,"physical_keycode":0,"unicode":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777238,"physical_keycode":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":47,"key_label":0,"unicode":47,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":2,"pressure":0.0,"pressed":false,"script":null) ] } -splitscreen={ -"deadzone": 0.5, -"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":16777218,"physical_keycode":0,"unicode":0,"echo":false,"script":null) -] -} [layer_names] diff --git a/2d/platformer/screenshots/layout.png b/2d/platformer/screenshots/layout.png deleted file mode 100644 index 58c74579..00000000 Binary files a/2d/platformer/screenshots/layout.png and /dev/null differ diff --git a/2d/platformer/screenshots/layout.webp b/2d/platformer/screenshots/layout.webp new file mode 100644 index 00000000..fca43ae6 Binary files /dev/null and b/2d/platformer/screenshots/layout.webp differ diff --git a/2d/platformer/screenshots/shoot.png b/2d/platformer/screenshots/shoot.png deleted file mode 100644 index 12d2660c..00000000 Binary files a/2d/platformer/screenshots/shoot.png and /dev/null differ diff --git a/2d/platformer/screenshots/shoot.webp b/2d/platformer/screenshots/shoot.webp new file mode 100644 index 00000000..e1be4b36 Binary files /dev/null and b/2d/platformer/screenshots/shoot.webp differ diff --git a/2d/platformer/src/Actors/Actor.gd b/2d/platformer/src/Actors/Actor.gd deleted file mode 100644 index 990d9eb0..00000000 --- a/2d/platformer/src/Actors/Actor.gd +++ /dev/null @@ -1,17 +0,0 @@ -class_name Actor -extends CharacterBody2D - -# Both the Player and Enemy inherit this scene as they have shared behaviours -# such as speed and are affected by gravity. - - -@export var speed = Vector2(150.0, 350.0) -@onready var gravity = ProjectSettings.get("physics/2d/default_gravity") - -const FLOOR_NORMAL = Vector2.UP - -# _physics_process is called after the inherited _physics_process function. -# This allows the Player and Enemy scenes to be affected by gravity. -func _physics_process(delta): - velocity.y += gravity * delta - move_and_slide() diff --git a/2d/platformer/src/Actors/Enemy.gd b/2d/platformer/src/Actors/Enemy.gd deleted file mode 100644 index 7f57c1f9..00000000 --- a/2d/platformer/src/Actors/Enemy.gd +++ /dev/null @@ -1,77 +0,0 @@ -class_name Enemy -extends Actor - - -enum State { - WALKING, - DEAD, -} - -var _state = State.WALKING - -@onready var platform_detector = $PlatformDetector -@onready var floor_detector_left = $FloorDetectorLeft -@onready var floor_detector_right = $FloorDetectorRight -@onready var sprite = $Sprite2D -@onready var animation_player = $AnimationPlayer - -# This function is called when the scene enters the scene tree. -# We can initialize variables here. -func _ready(): - velocity.x = speed.x - -# Physics process is a built-in loop in Godot. -# If you define _physics_process on a node, Godot will call it every frame. - -# At a glance, you can see that the physics process loop: -# 1. Calculates the move velocity. -# 2. Moves the character. -# 3. Updates the sprite direction. -# 4. Updates the animation. - -# Splitting the physics process logic into functions not only makes it -# easier to read, it help to change or improve the code later on: -# - If you need to change a calculation, you can use Go To -> Function -# (Ctrl Alt F) to quickly jump to the corresponding function. -# - If you split the character into a state machine or more advanced pattern, -# you can easily move individual functions. -func _physics_process(_delta): - # If the enemy encounters a wall or an edge, the horizontal velocity is flipped. - if not floor_detector_left.is_colliding(): - velocity.x = speed.x - elif not floor_detector_right.is_colliding(): - velocity.x = -speed.x - - if is_on_wall(): - velocity.x *= -1 - - # We only update the y value of _velocity as we want to handle the horizontal movement ourselves. - # TODO: This information should be set to the CharacterBody properties instead of arguments. - move_and_slide() - - # We flip the Sprite2D depending on which way the enemy is moving. - if velocity.x > 0: - sprite.scale.x = 1 - else: - sprite.scale.x = -1 - - var animation = get_new_animation() - if animation != animation_player.current_animation: - animation_player.play(animation) - - -func destroy(): - _state = State.DEAD - velocity = Vector2.ZERO - - -func get_new_animation(): - var animation_new = "" - if _state == State.WALKING: - if velocity.x == 0: - animation_new = "idle" - else: - animation_new = "walk" - else: - animation_new = "destroy" - return animation_new diff --git a/2d/platformer/src/Actors/Gun.gd b/2d/platformer/src/Actors/Gun.gd deleted file mode 100644 index 5d3de5d6..00000000 --- a/2d/platformer/src/Actors/Gun.gd +++ /dev/null @@ -1,26 +0,0 @@ -class_name Gun -extends Marker2D -# Represents a weapon that spawns and shoots bullets. -# The Cooldown timer controls the cooldown duration between shots. - - -const BULLET_VELOCITY = 500.0 -const Bullet = preload("res://src/Objects/Bullet.tscn") - -@onready var sound_shoot = $Shoot -@onready var timer = $Cooldown - - -# This method is only called by Player.gd. -func shoot(direction = 1): - if not timer.is_stopped(): - return false - var bullet = Bullet.instantiate() - bullet.global_position = global_position - bullet.linear_velocity = Vector2(direction * BULLET_VELOCITY, 0) - - bullet.set_as_top_level(true) - add_child(bullet) - sound_shoot.play() - timer.start() - return true diff --git a/2d/platformer/src/Actors/Player.gd b/2d/platformer/src/Actors/Player.gd deleted file mode 100644 index ea358d18..00000000 --- a/2d/platformer/src/Actors/Player.gd +++ /dev/null @@ -1,133 +0,0 @@ -class_name Player -extends Actor - - -# warning-ignore:unused_signal -signal collect_coin() - -const FLOOR_DETECT_DISTANCE = 20.0 - -@export var action_suffix: String = "" - -@onready var platform_detector = $PlatformDetector -@onready var animation_player = $AnimationPlayer -@onready var shoot_timer = $ShootAnimation -@onready var sprite = $Sprite2D -@onready var sound_jump = $Jump -@onready var gun = sprite.get_node(^"Gun") - - -func _ready(): - # Static types are necessary here to avoid warnings. - var camera: Camera2D = $Camera3D - if action_suffix == "_p1": - camera.custom_viewport = $"../.." - await get_tree().process_frame - camera.make_current() - elif action_suffix == "_p2": - var viewport: SubViewport = $"../../../../ViewportContainer2/Viewport2" - viewport.world_2d = ($"../.." as SubViewport).world_2d - camera.custom_viewport = viewport - await get_tree().process_frame - camera.make_current() - - -# Physics process is a built-in loop in Godot. -# If you define _physics_process on a node, Godot will call it every frame. - -# We use separate functions to calculate the direction and velocity to make this one easier to read. -# At a glance, you can see that the physics process loop: -# 1. Calculates the move direction. -# 2. Calculates the move velocity. -# 3. Moves the character. -# 4. Updates the sprite direction. -# 5. Shoots bullets. -# 6. Updates the animation. - -# Splitting the physics process logic into functions not only makes it -# easier to read, it help to change or improve the code later on: -# - If you need to change a calculation, you can use Go To -> Function -# (Ctrl Alt F) to quickly jump to the corresponding function. -# - If you split the character into a state machine or more advanced pattern, -# you can easily move individual functions. -func _physics_process(_delta): - # Play jump sound - if Input.is_action_just_pressed("jump" + action_suffix) and is_on_floor(): - sound_jump.play() - - var direction = get_direction() - - var is_jump_interrupted = Input.is_action_just_released("jump" + action_suffix) and velocity.y < 0.0 - velocity = calculate_move_velocity(velocity, direction, speed, is_jump_interrupted) - - var snap_vector = Vector2.ZERO - if direction.y == 0.0: - snap_vector = Vector2.DOWN * FLOOR_DETECT_DISTANCE - var is_on_platform = platform_detector.is_colliding() - # TODO: This information should be set to the CharacterBody properties instead of arguments. - move_and_slide() - #velocity, snap_vector, FLOOR_NORMAL, not is_on_platform, 4, 0.9, false - - # When the character’s direction changes, we want to to scale the Sprite2D accordingly to flip it. - # This will make Robi face left or right depending on the direction you move. - if direction.x != 0: - if direction.x > 0: - sprite.scale.x = 1 - else: - sprite.scale.x = -1 - - # We use the sprite's scale to store Robi’s look direction which allows us to shoot - # bullets forward. - # There are many situations like these where you can reuse existing properties instead of - # creating new variables. - var is_shooting = false - if Input.is_action_just_pressed("shoot" + action_suffix): - is_shooting = gun.shoot(sprite.scale.x) - - var animation = get_new_animation(is_shooting) - if animation != animation_player.current_animation and shoot_timer.is_stopped(): - if is_shooting: - shoot_timer.start() - animation_player.play(animation) - - -func get_direction(): - return Vector2( - Input.get_action_strength("move_right" + action_suffix) - Input.get_action_strength("move_left" + action_suffix), - -1 if is_on_floor() and Input.is_action_just_pressed("jump" + action_suffix) else 0 - ) - - -# This function calculates a new velocity whenever you need it. -# It allows you to interrupt jumps. -func calculate_move_velocity( - linear_velocity, - direction, - speed, - is_jump_interrupted - ): - linear_velocity.x = speed.x * direction.x - if direction.y != 0.0: - linear_velocity.y = speed.y * direction.y - if is_jump_interrupted: - # Decrease the Y velocity by multiplying it, but don't set it to 0 - # as to not be too abrupt. - linear_velocity.y *= 0.6 - return linear_velocity - - -func get_new_animation(is_shooting = false): - var animation_new = "" - if is_on_floor(): - if abs(velocity.x) > 0.1: - animation_new = "run" - else: - animation_new = "idle" - else: - if velocity.y > 0: - animation_new = "falling" - else: - animation_new = "jumping" - if is_shooting: - animation_new += "_weapon" - return animation_new diff --git a/2d/platformer/src/Level/Level.gd b/2d/platformer/src/Level/Level.gd deleted file mode 100644 index 9d76c70b..00000000 --- a/2d/platformer/src/Level/Level.gd +++ /dev/null @@ -1,15 +0,0 @@ -extends Node2D - -const LIMIT_LEFT = -315 -const LIMIT_TOP = -250 -const LIMIT_RIGHT = 955 -const LIMIT_BOTTOM = 690 - -func _ready(): - for child in get_children(): - if child is Player: - var camera = child.get_node(^"Camera3D") - camera.limit_left = LIMIT_LEFT - camera.limit_top = LIMIT_TOP - camera.limit_right = LIMIT_RIGHT - camera.limit_bottom = LIMIT_BOTTOM diff --git a/2d/platformer/src/Level/Level.tscn b/2d/platformer/src/Level/Level.tscn deleted file mode 100644 index a479d842..00000000 --- a/2d/platformer/src/Level/Level.tscn +++ /dev/null @@ -1,267 +0,0 @@ -[gd_scene load_steps=12 format=2] - -[ext_resource path="res://assets/art/tileset/tileset.tres" type="TileSet" id=1] -[ext_resource path="res://src/Actors/Enemy.tscn" type="PackedScene" id=2] -[ext_resource path="res://src/Platforms/Platform.tscn" type="PackedScene" id=3] -[ext_resource path="res://src/Objects/Coin.tscn" type="PackedScene" id=4] -[ext_resource path="res://src/Level/Level.gd" type="Script" id=5] -[ext_resource path="res://assets/art/platforms/moving_platform.png" type="Texture2D" id=6] -[ext_resource path="res://src/Level/ParallaxBackground.tscn" type="PackedScene" id=7] -[ext_resource path="res://assets/audio/music/music.ogg" type="AudioStream" id=8] -[ext_resource path="res://src/Level/Music.gd" type="Script" id=9] - -[sub_resource type="Animation" id=1] -resource_name = "move" -length = 4.0 -loop = true -tracks/0/type = "value" -tracks/0/path = NodePath(".:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 2), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Vector2(707, 400), Vector2(566, 303)] -} - -[sub_resource type="Animation" id=2] -length = 8.0 -loop = true -tracks/0/type = "value" -tracks/0/path = NodePath(".:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 4), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Vector2(-47, 80), Vector2(-47, 407)] -} - -[node name="Level" type="Node2D"] -process_mode = 1 -script = ExtResource( 5 ) - -[node name="TileMap" type="TileMap" parent="."] -tile_set = ExtResource( 1 ) -cell_size = Vector2(32, 32) -collision_layer = 16 -collision_mask = 0 -format = 1 -tile_data = PackedInt32Array(-65546, 536870913, 0, -65545, 1, 0, -131044, 536870913, 0, -131043, 1, 0, -10, 536870915, 0, -9, 3, 0, -65508, 536870915, 0, -65507, 3, 0, 65526, 536870915, 0, 65527, 3, 0, 28, 536870915, 0, 29, 3, 0, 131062, 536870915, 0, 131063, 3, 0, 131069, 536870918, 0, 131070, 5, 0, 131071, 5, 0, 65536, 5, 0, 65537, 5, 0, 65538, 5, 0, 65539, 5, 0, 65540, 6, 0, 65564, 536870915, 0, 65565, 3, 0, 196598, 536870915, 0, 196599, 3, 0, 131080, 536870913, 0, 131081, 0, 0, 131082, 0, 0, 131083, 0, 0, 131084, 0, 0, 131085, 1, 0, 131100, 536870915, 0, 131101, 3, 0, 262134, 536870915, 0, 262135, 3, 0, 196616, 536870921, 0, 196617, 8, 0, 196618, 8, 0, 196619, 8, 0, 196620, 8, 0, 196621, 9, 0, 196626, 536870913, 0, 196627, 0, 0, 196628, 0, 0, 196629, 0, 0, 196630, 0, 0, 196631, 0, 0, 196632, 0, 0, 196633, 0, 0, 196634, 0, 0, 196635, 0, 0, 196636, 536870916, 0, 196637, 3, 0, 327670, 536870915, 0, 327671, 3, 0, 262149, 536870918, 0, 262150, 6, 0, 262162, 536870921, 0, 262163, 536870920, 0, 262164, 536870920, 0, 262165, 536870920, 0, 262166, 536870920, 0, 262167, 536870922, 0, 262168, 7, 0, 262169, 7, 0, 262170, 7, 0, 262171, 7, 0, 262172, 7, 0, 262173, 3, 0, 393206, 536870915, 0, 393207, 3, 0, 327682, 536870918, 0, 327683, 6, 0, 327703, 536870921, 0, 327704, 536870920, 0, 327705, 536870922, 0, 327706, 7, 0, 327707, 7, 0, 327708, 7, 0, 327709, 3, 0, 458742, 536870915, 0, 458743, 4, 0, 458744, 0, 0, 458745, 0, 0, 458746, 1, 0, 393241, 536870921, 0, 393242, 536870920, 0, 393243, 536870920, 0, 393244, 536870922, 0, 393245, 3, 0, 524278, 536870915, 0, 524279, 536870919, 0, 524280, 536870919, 0, 524281, 536870919, 0, 524282, 3, 0, 458754, 536870913, 0, 458755, 0, 0, 458756, 0, 0, 458757, 2, 0, 458764, 536870913, 0, 458765, 1, 0, 458780, 536870915, 0, 458781, 3, 0, 589814, 536870915, 0, 589815, 536870919, 0, 589816, 536870919, 0, 589817, 536870919, 0, 589818, 3, 0, 524290, 536870915, 0, 524291, 7, 0, 524292, 7, 0, 524294, 536870912, 0, 524295, 536870912, 0, 524296, 536870912, 0, 524297, 536870912, 0, 524298, 536870912, 0, 524299, 536870912, 0, 524300, 536870916, 0, 524301, 3, 0, 524316, 536870915, 0, 524317, 3, 0, 655350, 536870915, 0, 655351, 536870919, 0, 655352, 536870919, 0, 655353, 536870919, 0, 655354, 3, 0, 589826, 536870915, 0, 589827, 7, 0, 589828, 7, 0, 589829, 7, 0, 589830, 7, 0, 589831, 7, 0, 589832, 7, 0, 589833, 7, 0, 589834, 7, 0, 589835, 7, 0, 589836, 7, 0, 589837, 4, 0, 589838, 0, 0, 589839, 1, 0, 589852, 536870915, 0, 589853, 3, 0, 720886, 536870915, 0, 720887, 536870919, 0, 720888, 536870919, 0, 720889, 536870919, 0, 720890, 3, 0, 655362, 536870921, 0, 655363, 536870920, 0, 655364, 536870920, 0, 655365, 536870920, 0, 655366, 536870920, 0, 655367, 536870920, 0, 655368, 536870920, 0, 655369, 536870920, 0, 655370, 536870920, 0, 655371, 536870920, 0, 655372, 536870920, 0, 655373, 536870920, 0, 655374, 536870920, 0, 655375, 9, 0, 655388, 536870915, 0, 655389, 3, 0, 786422, 536870915, 0, 786423, 536870919, 0, 786424, 536870919, 0, 786425, 536870919, 0, 786426, 3, 0, 720924, 536870915, 0, 720925, 3, 0, 851958, 536870915, 0, 851959, 536870919, 0, 851960, 536870919, 0, 851961, 536870919, 0, 851962, 3, 0, 786456, 536870918, 0, 786457, 536870917, 0, 786458, 6, 0, 786460, 536870915, 0, 786461, 3, 0, 917494, 536870915, 0, 917495, 536870919, 0, 917496, 536870919, 0, 917497, 536870919, 0, 917498, 4, 0, 917499, 0, 0, 917500, 0, 0, 917501, 0, 0, 917502, 0, 0, 917503, 0, 0, 851968, 0, 0, 851969, 1, 0, 851996, 536870915, 0, 851997, 3, 0, 983030, 536870915, 0, 983031, 536870919, 0, 983032, 536870919, 0, 983033, 536870919, 0, 983034, 536870919, 0, 983035, 536870919, 0, 983036, 536870919, 0, 983037, 536870919, 0, 983038, 536870919, 0, 983039, 536870919, 0, 917504, 536870919, 0, 917505, 3, 0, 917526, 536870913, 0, 917527, 536870912, 0, 917528, 536870912, 0, 917529, 0, 0, 917530, 536870912, 0, 917531, 536870912, 0, 917532, 536870916, 0, 917533, 3, 0, 1048566, 536870915, 0, 1048567, 536870919, 0, 1048568, 536870919, 0, 1048569, 536870919, 0, 1048570, 536870919, 0, 1048571, 536870919, 0, 1048572, 536870919, 0, 1048573, 536870919, 0, 1048574, 536870919, 0, 1048575, 536870919, 0, 983040, 536870919, 0, 983041, 3, 0, 983057, 536870918, 0, 983058, 5, 0, 983059, 6, 0, 983062, 536870915, 0, 983063, 7, 0, 983064, 7, 0, 983065, 7, 0, 983066, 7, 0, 983067, 7, 0, 983068, 7, 0, 983069, 3, 0, 1114102, 536870915, 0, 1114103, 536870919, 0, 1114104, 536870919, 0, 1114105, 536870919, 0, 1114106, 536870919, 0, 1114107, 536870919, 0, 1114108, 536870919, 0, 1114109, 536870919, 0, 1114110, 536870919, 0, 1114111, 536870919, 0, 1048576, 536870919, 0, 1048577, 3, 0, 1048579, 536870926, 0, 1048598, 536870915, 0, 1048599, 7, 0, 1048600, 7, 0, 1048601, 7, 0, 1048602, 7, 0, 1048603, 7, 0, 1048604, 7, 0, 1048605, 3, 0, 1179638, 536870915, 0, 1179639, 536870919, 0, 1179640, 536870919, 0, 1179641, 536870919, 0, 1179642, 536870919, 0, 1179643, 536870919, 0, 1179644, 536870919, 0, 1179645, 536870919, 0, 1179646, 536870919, 0, 1179647, 536870919, 0, 1114112, 536870919, 0, 1114113, 4, 0, 1114114, 0, 0, 1114115, 536870925, 0, 1114116, 0, 0, 1114117, 2, 0, 1114123, 536870926, 0, 1114126, 536870918, 0, 1114127, 5, 0, 1114128, 6, 0, 1114133, 536870914, 0, 1114134, 536870916, 0, 1114135, 7, 0, 1114136, 7, 0, 1114137, 7, 0, 1114138, 7, 0, 1114139, 7, 0, 1114140, 7, 0, 1114141, 3, 0, 1245174, 536870915, 0, 1245175, 536870919, 0, 1245176, 536870919, 0, 1245177, 536870919, 0, 1245178, 536870919, 0, 1245179, 536870919, 0, 1245180, 536870919, 0, 1245181, 536870919, 0, 1245182, 536870919, 0, 1245183, 536870919, 0, 1179648, 536870919, 0, 1179649, 536870919, 0, 1179650, 536870919, 0, 1179651, 536870919, 0, 1179652, 7, 0, 1179654, 2, 0, 1179658, 536870913, 0, 1179659, 536870925, 0, 1179660, 1, 0, 1179668, 536870914, 0, 1179670, 7, 0, 1179671, 7, 0, 1179672, 7, 0, 1179673, 7, 0, 1179674, 7, 0, 1179675, 7, 0, 1179676, 7, 0, 1179677, 3, 0, 1310710, 536870915, 0, 1310711, 536870919, 0, 1310712, 536870919, 0, 1310713, 536870919, 0, 1310714, 536870919, 0, 1310715, 536870919, 0, 1310716, 536870919, 0, 1310717, 536870919, 0, 1310718, 536870919, 0, 1310719, 536870919, 0, 1245184, 536870919, 0, 1245185, 536870919, 0, 1245186, 536870919, 0, 1245187, 536870919, 0, 1245188, 536870919, 0, 1245189, 7, 0, 1245191, 2, 0, 1245194, 536870915, 0, 1245195, 7, 0, 1245196, 3, 0, 1245203, 536870914, 0, 1245205, 7, 0, 1245206, 7, 0, 1245207, 7, 0, 1245208, 7, 0, 1245209, 7, 0, 1245210, 7, 0, 1245211, 7, 0, 1245212, 7, 0, 1245213, 3, 0, 1376246, 536870915, 0, 1376247, 536870919, 0, 1376248, 536870919, 0, 1376249, 536870919, 0, 1376250, 536870919, 0, 1376251, 536870919, 0, 1376252, 536870919, 0, 1376253, 536870919, 0, 1376254, 536870919, 0, 1376255, 536870919, 0, 1310720, 536870919, 0, 1310721, 536870919, 0, 1310722, 536870919, 0, 1310723, 536870919, 0, 1310724, 536870919, 0, 1310725, 536870919, 0, 1310726, 7, 0, 1310728, 536870912, 0, 1310729, 536870912, 0, 1310730, 536870916, 0, 1310731, 7, 0, 1310732, 4, 0, 1310733, 0, 0, 1310734, 0, 0, 1310735, 0, 0, 1310736, 0, 0, 1310737, 0, 0, 1310738, 536870912, 0, 1310740, 7, 0, 1310741, 7, 0, 1310742, 7, 0, 1310743, 7, 0, 1310744, 7, 0, 1310745, 7, 0, 1310746, 7, 0, 1310747, 7, 0, 1310748, 7, 0, 1310749, 3, 0, 1441782, 536870921, 0, 1441783, 536870920, 0, 1441784, 536870920, 0, 1441785, 536870920, 0, 1441786, 536870920, 0, 1441787, 536870920, 0, 1441788, 536870920, 0, 1441789, 536870920, 0, 1441790, 536870920, 0, 1441791, 536870920, 0, 1376256, 536870920, 0, 1376257, 536870920, 0, 1376258, 536870920, 0, 1376259, 536870920, 0, 1376260, 536870920, 0, 1376261, 536870920, 0, 1376262, 536870920, 0, 1376263, 536870920, 0, 1376264, 536870920, 0, 1376265, 536870920, 0, 1376266, 536870920, 0, 1376267, 536870920, 0, 1376268, 536870920, 0, 1376269, 536870920, 0, 1376270, 536870920, 0, 1376271, 536870920, 0, 1376272, 536870920, 0, 1376273, 536870920, 0, 1376274, 536870920, 0, 1376275, 536870920, 0, 1376276, 536870920, 0, 1376277, 536870920, 0, 1376278, 536870920, 0, 1376279, 536870920, 0, 1376280, 536870920, 0, 1376281, 536870920, 0, 1376282, 536870920, 0, 1376283, 536870920, 0, 1376284, 8, 0, 1376285, 9, 0) - -[node name="Coins" type="Node" parent="."] - -[node name="CoinsArc" type="Node2D" parent="Coins"] -position = Vector2(269.878, 573.77) - -[node name="Coin" parent="Coins/CoinsArc" instance=ExtResource( 4 )] -position = Vector2(-14.7314, 29.9809) - -[node name="Coin2" parent="Coins/CoinsArc" instance=ExtResource( 4 )] -position = Vector2(0.0855715, 0.070923) - -[node name="Coin3" parent="Coins/CoinsArc" instance=ExtResource( 4 )] -position = Vector2(31.2736, -17.854) - -[node name="CoinsVertical" type="Node2D" parent="Coins"] -position = Vector2(366.022, 518.94) - -[node name="Coin" parent="Coins/CoinsVertical" instance=ExtResource( 4 )] -position = Vector2(-0.0551455, 15.9351) - -[node name="Coin2" parent="Coins/CoinsVertical" instance=ExtResource( 4 )] -position = Vector2(-0.0551455, -0.0649415) - -[node name="Coin3" parent="Coins/CoinsVertical" instance=ExtResource( 4 )] -position = Vector2(-0.0551455, -16.065) - -[node name="CoinsVertical2" type="Node2D" parent="Coins"] -position = Vector2(509.055, -8.98655) - -[node name="Coin" parent="Coins/CoinsVertical2" instance=ExtResource( 4 )] -position = Vector2(-0.0551455, 15.9351) - -[node name="Coin2" parent="Coins/CoinsVertical2" instance=ExtResource( 4 )] -position = Vector2(-0.0551455, -0.0649415) - -[node name="Coin3" parent="Coins/CoinsVertical2" instance=ExtResource( 4 )] -position = Vector2(-0.0551455, -16.065) - -[node name="CoinsSquare" type="Node2D" parent="Coins"] -position = Vector2(-214.835, 161.6) - -[node name="Coin" parent="Coins/CoinsSquare" instance=ExtResource( 4 )] -position = Vector2(-16, -16) - -[node name="Coin2" parent="Coins/CoinsSquare" instance=ExtResource( 4 )] -position = Vector2(16, -16) - -[node name="Coin3" parent="Coins/CoinsSquare" instance=ExtResource( 4 )] -position = Vector2(-16, 16) - -[node name="Coin4" parent="Coins/CoinsSquare" instance=ExtResource( 4 )] -position = Vector2(16, 16) - -[node name="CoinsSquare2" type="Node2D" parent="Coins"] -position = Vector2(347.552, 33.4742) - -[node name="Coin" parent="Coins/CoinsSquare2" instance=ExtResource( 4 )] -position = Vector2(-16, -16) - -[node name="Coin2" parent="Coins/CoinsSquare2" instance=ExtResource( 4 )] -position = Vector2(16, -16) - -[node name="Coin3" parent="Coins/CoinsSquare2" instance=ExtResource( 4 )] -position = Vector2(-16, 16) - -[node name="Coin4" parent="Coins/CoinsSquare2" instance=ExtResource( 4 )] -position = Vector2(16, 16) - -[node name="CoinsSquare3" type="Node2D" parent="Coins"] -position = Vector2(676.585, 58.6425) - -[node name="Coin" parent="Coins/CoinsSquare3" instance=ExtResource( 4 )] -position = Vector2(-16, -16) - -[node name="Coin2" parent="Coins/CoinsSquare3" instance=ExtResource( 4 )] -position = Vector2(16, -16) - -[node name="Coin3" parent="Coins/CoinsSquare3" instance=ExtResource( 4 )] -position = Vector2(-16, 16) - -[node name="Coin4" parent="Coins/CoinsSquare3" instance=ExtResource( 4 )] -position = Vector2(16, 16) - -[node name="CoinsSquare4" type="Node2D" parent="Coins"] -position = Vector2(796.29, 58.6425) - -[node name="Coin" parent="Coins/CoinsSquare4" instance=ExtResource( 4 )] -position = Vector2(-16, -16) - -[node name="Coin2" parent="Coins/CoinsSquare4" instance=ExtResource( 4 )] -position = Vector2(16, -16) - -[node name="Coin3" parent="Coins/CoinsSquare4" instance=ExtResource( 4 )] -position = Vector2(-16, 16) - -[node name="Coin4" parent="Coins/CoinsSquare4" instance=ExtResource( 4 )] -position = Vector2(16, 16) - -[node name="CoinsHorizontal" type="Node2D" parent="Coins"] -position = Vector2(36.6204, 402.991) - -[node name="Coin" parent="Coins/CoinsHorizontal" instance=ExtResource( 4 )] -position = Vector2(-16, 0) - -[node name="Coin2" parent="Coins/CoinsHorizontal" instance=ExtResource( 4 )] - -[node name="Coin3" parent="Coins/CoinsHorizontal" instance=ExtResource( 4 )] -position = Vector2(16, 0) - -[node name="CoinsHorizontal2" type="Node2D" parent="Coins"] -position = Vector2(668.605, 431.544) - -[node name="Coin" parent="Coins/CoinsHorizontal2" instance=ExtResource( 4 )] -position = Vector2(-16, 0) - -[node name="Coin2" parent="Coins/CoinsHorizontal2" instance=ExtResource( 4 )] - -[node name="Coin3" parent="Coins/CoinsHorizontal2" instance=ExtResource( 4 )] -position = Vector2(16, 0) - -[node name="CoinsHorizontal3" type="Node2D" parent="Coins"] -position = Vector2(335.585, 155.872) - -[node name="Coin" parent="Coins/CoinsHorizontal3" instance=ExtResource( 4 )] -position = Vector2(-16, 0) - -[node name="Coin2" parent="Coins/CoinsHorizontal3" instance=ExtResource( 4 )] - -[node name="Coin3" parent="Coins/CoinsHorizontal3" instance=ExtResource( 4 )] -position = Vector2(16, 0) - -[node name="CoinsHorizontal4" type="Node2D" parent="Coins"] -position = Vector2(-63.444, 20.5902) - -[node name="Coin" parent="Coins/CoinsHorizontal4" instance=ExtResource( 4 )] -position = Vector2(-16, 0) - -[node name="Coin2" parent="Coins/CoinsHorizontal4" instance=ExtResource( 4 )] - -[node name="Coin3" parent="Coins/CoinsHorizontal4" instance=ExtResource( 4 )] -position = Vector2(16, 0) - -[node name="CoinsHorizontal5" type="Node2D" parent="Coins"] -position = Vector2(127.607, 20.5902) - -[node name="Coin" parent="Coins/CoinsHorizontal5" instance=ExtResource( 4 )] -position = Vector2(-16, 0) - -[node name="Coin2" parent="Coins/CoinsHorizontal5" instance=ExtResource( 4 )] - -[node name="Coin3" parent="Coins/CoinsHorizontal5" instance=ExtResource( 4 )] -position = Vector2(16, 0) - -[node name="Platforms" type="Node" parent="."] - -[node name="Platform" parent="Platforms" instance=ExtResource( 3 )] -position = Vector2(707, 400) - -[node name="AnimationPlayer" type="AnimationPlayer" parent="Platforms/Platform"] -autoplay = "move" -playback_process_mode = 0 -anims/move = SubResource( 1 ) - -[node name="Platform2" parent="Platforms" instance=ExtResource( 3 )] -position = Vector2(-47, 80) - -[node name="AnimationPlayer" type="AnimationPlayer" parent="Platforms/Platform2"] -autoplay = "move" -playback_process_mode = 0 -anims/move = SubResource( 2 ) - -[node name="PlatformStatic" type="StaticBody2D" parent="Platforms"] -position = Vector2(569.935, 105.877) -rotation = 0.355618 -z_index = -1 -collision_layer = 16 -collision_mask = 0 - -[node name="Sprite2" type="Sprite2D" parent="Platforms/PlatformStatic"] -position = Vector2(-88.692, 10.5003) -rotation = -0.246293 -texture = ExtResource( 6 ) - -[node name="Sprite2D" type="Sprite2D" parent="Platforms/PlatformStatic"] -texture = ExtResource( 6 ) - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Platforms/PlatformStatic"] -position = Vector2(-0.0684814, 0.0254364) -polygon = PackedVector2Array(-129.699, 9.94633, -47, -10.5, 8, -7, 10, -1.5, -46.75, -4, -130, 15) - -[node name="Enemies" type="Node" parent="."] - -[node name="Enemy" parent="Enemies" instance=ExtResource( 2 )] -position = Vector2(271.04, 245.639) - -[node name="Enemy2" parent="Enemies" instance=ExtResource( 2 )] -position = Vector2(346.109, 48.5631) - -[node name="Enemy3" parent="Enemies" instance=ExtResource( 2 )] -position = Vector2(632.725, 78.5545) - -[node name="Enemy4" parent="Enemies" instance=ExtResource( 2 )] -position = Vector2(828.515, 77.262) - -[node name="ParallaxBackground" parent="." instance=ExtResource( 7 )] - -[node name="Music" type="AudioStreamPlayer" parent="."] -stream = ExtResource( 8 ) -autoplay = true -script = ExtResource( 9 ) diff --git a/2d/platformer/src/Level/Music.gd b/2d/platformer/src/Level/Music.gd deleted file mode 100644 index 10893213..00000000 --- a/2d/platformer/src/Level/Music.gd +++ /dev/null @@ -1,16 +0,0 @@ -extends AudioStreamPlayer - -const DOUBLE_VOLUME_DB = 6 # Do not change. Represents doubling of sound pressure. - -@export var base_volume_db: int = -14 - -func _ready(): - # To avoid AudioStreamPlayer2D sounds playing on top of each other and - # being very loud, let's decrease the volume for splitscreen mode, but - # increase the music volume to keep the music at the same volume. - if get_parent().get_owner().name == "Splitscreen": - AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), base_volume_db - DOUBLE_VOLUME_DB) - volume_db = DOUBLE_VOLUME_DB - else: - AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), base_volume_db) - volume_db = 0 diff --git a/2d/platformer/src/Main/Game.gd b/2d/platformer/src/Main/Game.gd deleted file mode 100644 index 49e580e6..00000000 --- a/2d/platformer/src/Main/Game.gd +++ /dev/null @@ -1,43 +0,0 @@ -extends Node -# This class contains controls that should always be accessible, like pausing -# the game or toggling the window full-screen. - - -# The "_" prefix is a convention to indicate that variables are private, -# that is to say, another node or script should not access them. -@onready var _pause_menu = $InterfaceLayer/PauseMenu - - -func _notification(what): - if what == NOTIFICATION_WM_CLOSE_REQUEST: - # We need to clean up a little bit first to avoid SubViewport errors. - if name == "Splitscreen": - $Black/SplitContainer/ViewportContainer1.free() - $Black.queue_free() - - -func _unhandled_input(event): - if event.is_action_pressed("toggle_fullscreen"): - OS.window_fullscreen = not OS.window_fullscreen - get_tree().set_input_as_handled() - # The GlobalControls node, in the Stage scene, is set to process even - # when the game is paused, so this code keeps running. - # To see that, select GlobalControls, and scroll down to the Pause category - # in the inspector. - elif event.is_action_pressed("toggle_pause"): - var tree = get_tree() - tree.paused = not tree.paused - if tree.paused: - _pause_menu.open() - else: - _pause_menu.close() - get_tree().set_input_as_handled() - - elif event.is_action_pressed("splitscreen"): - if name == "Splitscreen": - # We need to clean up a little bit first to avoid SubViewport errors. - $Black/SplitContainer/ViewportContainer1.free() - $Black.queue_free() - get_tree().change_scene("res://src/Main/Game.tscn") - else: - get_tree().change_scene("res://src/Main/Splitscreen.tscn") diff --git a/2d/platformer/src/Main/Game.tscn b/2d/platformer/src/Main/Game.tscn deleted file mode 100644 index 08deb37c..00000000 --- a/2d/platformer/src/Main/Game.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://b0qd6b4ipb0iv"] - -[ext_resource type="PackedScene" path="res://src/UserInterface/PauseMenu.tscn" id="1"] -[ext_resource type="Script" path="res://src/Main/Game.gd" id="2"] -[ext_resource type="PackedScene" path="res://src/Level/Level.tscn" id="3"] -[ext_resource type="PackedScene" path="res://src/Actors/Player.tscn" id="4"] - -[node name="Game" type="Node"] -process_mode = 3 -script = ExtResource("2") - -[node name="Level" parent="." instance=ExtResource("3")] - -[node name="Player" parent="Level" instance=ExtResource("4")] -position = Vector2(90, 546) - -[node name="InterfaceLayer" type="CanvasLayer" parent="."] -layer = 100 - -[node name="PauseMenu" parent="InterfaceLayer" instance=ExtResource("1")] -layout_mode = 3 -anchors_preset = 15 diff --git a/2d/platformer/src/Main/Splitscreen.tscn b/2d/platformer/src/Main/Splitscreen.tscn deleted file mode 100644 index 839a8787..00000000 --- a/2d/platformer/src/Main/Splitscreen.tscn +++ /dev/null @@ -1,80 +0,0 @@ -[gd_scene load_steps=6 format=2] - -[ext_resource path="res://src/UserInterface/PauseMenu.tscn" type="PackedScene" id=1] -[ext_resource path="res://src/Main/Game.gd" type="Script" id=2] -[ext_resource path="res://src/Level/Level.tscn" type="PackedScene" id=3] -[ext_resource path="res://src/Actors/Player.tscn" type="PackedScene" id=4] -[ext_resource path="res://src/Level/ParallaxBackground.tscn" type="PackedScene" id=5] - -[node name="Splitscreen" type="Node"] -process_mode = 3 -script = ExtResource( 2 ) - -[node name="InterfaceLayer" type="CanvasLayer" parent="."] -layer = 100 - -[node name="PauseMenu" parent="InterfaceLayer" instance=ExtResource( 1 )] - -[node name="Black" type="ColorRect" parent="."] -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_right = 6.10352e-05 -offset_bottom = 3.05176e-05 -color = Color(0, 0, 0, 1) - -[node name="SplitContainer" type="HSplitContainer" parent="Black"] -anchor_right = 1.0 -anchor_bottom = 1.0 -dragger_visibility = 1 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="ViewportContainer1" type="SubViewportContainer" parent="Black/SplitContainer"] -offset_right = 394.0 -offset_bottom = 480.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -stretch = true -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Viewport1" type="SubViewport" parent="Black/SplitContainer/ViewportContainer1"] -size = Vector2(394, 480) -size_override_stretch = true -handle_input_locally = false -usage = 0 -render_target_update_mode = 3 -audio_listener_enable_2d = true - -[node name="Level" parent="Black/SplitContainer/ViewportContainer1/Viewport1" instance=ExtResource( 3 )] - -[node name="Player1" parent="Black/SplitContainer/ViewportContainer1/Viewport1/Level" instance=ExtResource( 4 )] -position = Vector2(90, 546) -action_suffix = "_p1" - -[node name="Player2" parent="Black/SplitContainer/ViewportContainer1/Viewport1/Level" instance=ExtResource( 4 )] -position = Vector2(120, 546) -action_suffix = "_p2" - -[node name="ViewportContainer2" type="SubViewportContainer" parent="Black/SplitContainer"] -offset_left = 406.0 -offset_right = 800.0 -offset_bottom = 480.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -stretch = true -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Viewport2" type="SubViewport" parent="Black/SplitContainer/ViewportContainer2"] -size = Vector2(394, 480) -size_override_stretch = true -handle_input_locally = false -usage = 0 -render_target_update_mode = 3 -audio_listener_enable_2d = true - -[node name="ParallaxBackground" parent="Black/SplitContainer/ViewportContainer2/Viewport2" instance=ExtResource( 5 )] diff --git a/2d/platformer/src/Objects/Bullet.gd b/2d/platformer/src/Objects/Bullet.gd deleted file mode 100644 index 7b35e9fe..00000000 --- a/2d/platformer/src/Objects/Bullet.gd +++ /dev/null @@ -1,14 +0,0 @@ -class_name Bullet -extends RigidBody2D - - -@onready var animation_player = $AnimationPlayer - - -func destroy(): - animation_player.play("destroy") - - -func _on_body_entered(body): - if body is Enemy: - body.destroy() diff --git a/2d/platformer/src/Objects/Coin.gd b/2d/platformer/src/Objects/Coin.gd deleted file mode 100644 index 1fe195f3..00000000 --- a/2d/platformer/src/Objects/Coin.gd +++ /dev/null @@ -1,16 +0,0 @@ -class_name Coin -extends Area2D -# Collectible that disappears when the player touches it. - -@onready var animation_player = $AnimationPlayer - -# The Coins only detects collisions with the Player thanks to its collision mask. -# This prevents other characters such as enemies from picking up coins. - -# When the player collides with a coin, the coin plays its "picked" animation. -# The animation takes cares of making the coin disappear, but also deactivates its -# collisions and frees it from memory, saving us from writing more complex code. -# Click the AnimationPlayer node to see the animation timeline. -func _on_body_entered(_body): - animation_player.play("picked") - _body.emit_signal("collect_coin") diff --git a/2d/platformer/src/Platforms/Platform.tscn b/2d/platformer/src/Platforms/Platform.tscn deleted file mode 100644 index e10ef13c..00000000 --- a/2d/platformer/src/Platforms/Platform.tscn +++ /dev/null @@ -1,21 +0,0 @@ -[gd_scene load_steps=3 format=2] - -[ext_resource path="res://assets/art/platforms/moving_platform.png" type="Texture2D" id=2] - -[sub_resource type="RectangleShape2D" id=1] -extents = Vector2(47, 6) - -[node name="Platform" type="CharacterBody2D"] -z_index = -1 -collision_layer = 8 -collision_mask = 0 -collision/safe_margin = 0.12 -motion/sync_to_physics = true - -[node name="Sprite2D" type="Sprite2D" parent="."] -texture = ExtResource( 2 ) - -[node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2(0, -4) -shape = SubResource( 1 ) -one_way_collision = true diff --git a/2d/platformer/src/UserInterface/CoinsCounter.gd b/2d/platformer/src/UserInterface/CoinsCounter.gd deleted file mode 100644 index 9ddcb41f..00000000 --- a/2d/platformer/src/UserInterface/CoinsCounter.gd +++ /dev/null @@ -1,25 +0,0 @@ -extends Panel - -var coins_collected = 0 - -@onready var coins_label = $Label - - -func _ready(): - coins_label.set_text(str(coins_collected)) - # Static types are necessary here to avoid warnings. - var anim_sprite: AnimatedSprite2D = $AnimatedSprite2D - anim_sprite.play() - # Check if the game is in splitscreen mode by checking the scene root name. - if get_tree().get_root().get_child(0).name == "Splitscreen": - var _level_node = get_node(^"../../../../Black/SplitContainer/ViewportContainer1/Viewport1/Level") - _level_node.get_node(^"Player1").collect_coin.connect(self._collect_coin) - _level_node.get_node(^"Player2").collect_coin.connect(self._collect_coin) - else: - var _player_path = get_node(^"../../../../Level/Player") - _player_path.collect_coin.connect(self._collect_coin) - - -func _collect_coin(): - coins_collected += 1 - coins_label.set_text(str(coins_collected)) diff --git a/2d/platformer/src/UserInterface/CoinsCounter.tscn b/2d/platformer/src/UserInterface/CoinsCounter.tscn deleted file mode 100644 index 1dd7364d..00000000 --- a/2d/platformer/src/UserInterface/CoinsCounter.tscn +++ /dev/null @@ -1,63 +0,0 @@ -[gd_scene load_steps=10 format=2] - -[ext_resource path="res://assets/theme/user_interface.tres" type="Theme" id=1] -[ext_resource path="res://assets/art/coin/coin.png" type="Texture2D" id=2] -[ext_resource path="res://src/UserInterface/CoinsCounter.gd" type="Script" id=3] - -[sub_resource type="StyleBoxFlat" id=1] -bg_color = Color(0, 0, 0, 0.5) - -[sub_resource type="AtlasTexture" id=2] -atlas = ExtResource( 2 ) -region = Rect2(0, 0, 8, 8) - -[sub_resource type="AtlasTexture" id=3] -atlas = ExtResource( 2 ) -region = Rect2(8, 0, 8, 8) - -[sub_resource type="AtlasTexture" id=4] -atlas = ExtResource( 2 ) -region = Rect2(16, 0, 8, 8) - -[sub_resource type="AtlasTexture" id=5] -atlas = ExtResource( 2 ) -region = Rect2(24, 0, 8, 8) - -[sub_resource type="SpriteFrames" id=6] -animations = [{ -"frames": [SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ), SubResource( 4 ), SubResource( 3 )], -"loop": true, -"name": "coin_spinning", -"speed": 6.5 -}] - -[node name="CoinsCounter" type="Panel"] -offset_left = 5.0 -offset_top = 5.0 -offset_right = 100.0 -offset_bottom = 45.0 -rect_min_size = Vector2(100, 45) -theme = ExtResource( 1 ) -custom_styles/panel = SubResource( 1 ) -script = ExtResource( 3 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Label" type="Label" parent="."] -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_right = -8.0 -text = "100" -align = 2 -valign = 1 -autowrap = true -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] -position = Vector2(21.5, 22.5) -scale = Vector2(4.375, 4.375) -frames = SubResource( 6 ) -animation = "coin_spinning" diff --git a/2d/platformer/src/UserInterface/PauseMenu.gd b/2d/platformer/src/UserInterface/PauseMenu.gd deleted file mode 100644 index e022c9b5..00000000 --- a/2d/platformer/src/UserInterface/PauseMenu.gd +++ /dev/null @@ -1,58 +0,0 @@ -extends Control - - -@export var _start_position: Vector2 = Vector2(0, -20) -@export var _end_position: Vector2 = Vector2.ZERO -@export var fade_in_duration: float = 0.3 -@export var fade_out_duration: float = 0.2 - -@onready var center_cont = $ColorRect/CenterContainer -@onready var resume_button = center_cont.get_node(^"VBoxContainer/ResumeButton") - -@onready var root = get_tree().get_root() -@onready var scene_root = root.get_child(root.get_child_count() - 1) -@onready var tween = $Tween - - -func _ready(): - hide() - - -func close(): - get_tree().paused = false - # Tween's interpolate_property has these arguments: - # (Target object, "Property:OptionalSubProperty", From value, To value, - # Tween duration, Transition type, Easing type, Optional delay) - tween.interpolate_property(self, "modulate:a", 1.0, 0.0, - fade_out_duration, Tween.TRANS_LINEAR, Tween.EASE_IN) - tween.interpolate_property(center_cont, "position", - _end_position, _start_position, fade_out_duration, - Tween.TRANS_CUBIC, Tween.EASE_OUT) - tween.start() - - -func open(): - show() - resume_button.grab_focus() - - tween.interpolate_property(self, "modulate:a", 0.0, 1.0, - fade_in_duration, Tween.TRANS_LINEAR, Tween.EASE_IN) - tween.interpolate_property(center_cont, "position", - _start_position, _end_position, fade_in_duration, - Tween.TRANS_CUBIC, Tween.EASE_OUT) - tween.start() - - -func _on_ResumeButton_pressed(): - if not tween.is_active(): - close() - - -func _on_QuitButton_pressed(): - scene_root.notification(NOTIFICATION_WM_CLOSE_REQUEST) - get_tree().quit() - - -func _on_Tween_all_completed(): - if modulate.a < 0.5: - hide()