From e323bead2ecee69c13cd26895042917985532916 Mon Sep 17 00:00:00 2001 From: Nathan Lovato Date: Tue, 4 Feb 2020 21:50:54 -0600 Subject: [PATCH 01/12] Remake the 2d/platformer demo from scratch This Godot project is a complete rewrite of the official Platformer 2D demo. This is part of a proposal to improve and harmonize the official demo projects. We want to: - Teach good programming practices with Godot. - Bring demos to a higher quality standard. - Unify the code in the demos. See the [open issue](https://github.com/godotengine/godot-demo-projects/issues/390) for more information. This new demo showcases features from the original, and works with Godot 3.2. Co-authored-by: Johnny Goss --- 2d/platformer/Stage.tscn | 268 --------------- 2d/platformer/TileSet.tres | 243 ------------- 2d/platformer/TilesetEdit.tscn | 324 ------------------ .../art/background/cloud_1.png} | Bin .../art/background/cloud_1.png.import} | 6 +- .../art/background/cloud_2.png} | Bin .../assets/art/background/cloud_2.png.import | 34 ++ .../art/background/cloud_3.png} | Bin .../assets/art/background/cloud_3.png.import | 34 ++ .../art/background/distant_platforms_1.png | Bin 0 -> 5203 bytes .../background/distant_platforms_1.png.import | 34 ++ .../art/background/distant_platforms_2.png | Bin 0 -> 5779 bytes .../background/distant_platforms_2.png.import | 34 ++ .../art/background/sky.png} | Bin .../art/background/sky.png.import} | 6 +- 2d/platformer/{ => assets/art}/coin/coin.png | Bin .../{ => assets/art}/coin/coin.png.import | 6 +- .../{ => assets/art}/enemy/enemy.png | Bin .../{ => assets/art}/enemy/enemy.png.import | 6 +- .../assets/art/platforms/moving_platform.png | Bin 0 -> 1037 bytes .../art/platforms}/moving_platform.png.import | 6 +- .../art/platforms}/one_way_platform.png | Bin .../platforms}/one_way_platform.png.import | 6 +- .../art/player/bullet}/bullet.png | Bin .../art/player/bullet}/bullet.png.import | 6 +- .../{ => assets/art}/player/robot_demo.png | Bin .../art}/player/robot_demo.png.import | 6 +- .../assets/art/tileset/tiles_demo.png | Bin 0 -> 5167 bytes .../art/tileset}/tiles_demo.png.import | 6 +- 2d/platformer/assets/art/tileset/tileset.tres | 263 ++++++++++++++ .../art/ui/touch_button_fire.png} | Bin .../art/ui/touch_button_fire.png.import} | 6 +- .../art/ui/touch_button_jump.png} | Bin .../art/ui/touch_button_jump.png.import} | 6 +- .../art/ui/touch_button_left.png} | Bin .../art/ui/touch_button_left.png.import} | 6 +- .../art/ui/touch_button_right.png} | Bin .../art/ui/touch_button_right.png.import} | 6 +- .../{audio => assets/audio/music}/music.ogg | Bin .../assets/audio/music/music.ogg.import | 15 + .../audio/sfx/coin_pickup.wav} | Bin .../assets/audio/sfx/coin_pickup.wav.import | 21 ++ .../audio/sfx/explode.wav} | Bin .../audio/sfx/explode.wav.import} | 6 +- .../audio/sfx/hit.wav} | Bin .../audio/sfx/hit.wav.import} | 6 +- .../audio/sfx/jump.wav} | Bin .../audio/sfx/jump.wav.import} | 6 +- .../audio/sfx/shoot.wav} | Bin .../audio/sfx/shoot.wav.import} | 6 +- .../assets/theme/fonts/kenney_mini_square.ttf | Bin 0 -> 23996 bytes .../assets/theme/user_interface.tres | 82 +++++ 2d/platformer/audio/music.ogg.import | 15 - 2d/platformer/audio/sound_explode.wav.import | 21 -- 2d/platformer/background/scroll_bg_fg_1.png | Bin 5401 -> 0 bytes .../background/scroll_bg_fg_1.png.import | 34 -- 2d/platformer/background/scroll_bg_fg_2.png | Bin 6003 -> 0 bytes .../background/scroll_bg_fg_2.png.import | 34 -- 2d/platformer/coin/Coin.tscn | 140 -------- 2d/platformer/coin/coin.gd | 11 - 2d/platformer/enemy/enemy.gd | 50 --- 2d/platformer/platform/MovingPlatform.tscn | 16 - 2d/platformer/platform/OneWayPlatform.tscn | 17 - 2d/platformer/platform/moving_platform.gd | 17 - 2d/platformer/platform/moving_platform.png | Bin 1094 -> 0 bytes 2d/platformer/player/bullet.gd | 11 - 2d/platformer/player/osb_left.png.import | 34 -- 2d/platformer/player/osb_right.png.import | 34 -- 2d/platformer/player/player.gd | 97 ------ 2d/platformer/project.godot | 58 +++- 2d/platformer/src/Actors/Actor.gd | 18 + 2d/platformer/src/Actors/Enemy.gd | 78 +++++ .../{enemy => src/Actors}/Enemy.tscn | 179 ++++++---- 2d/platformer/src/Actors/Gun.gd | 24 ++ 2d/platformer/src/Actors/Player.gd | 96 ++++++ .../{player => src/Actors}/Player.tscn | 85 +++-- 2d/platformer/src/Level/Level.tscn | 275 +++++++++++++++ .../Level/ParallaxBackground.tscn} | 36 +- 2d/platformer/src/Main/Game.gd | 26 ++ 2d/platformer/src/Main/Game.tscn | 16 + 2d/platformer/src/Objects/Bullet.gd | 14 + .../{player => src/Objects}/Bullet.tscn | 30 +- 2d/platformer/src/Objects/Coin.gd | 15 + 2d/platformer/src/Objects/Coin.tscn | 161 +++++++++ 2d/platformer/src/Platforms/Platform.tscn | 21 ++ 2d/platformer/src/UserInterface/PauseMenu.gd | 26 ++ .../src/UserInterface/PauseMenu.tscn | 56 +++ 2d/platformer/tiles_demo.png | Bin 4057 -> 0 bytes 88 files changed, 1631 insertions(+), 1568 deletions(-) delete mode 100644 2d/platformer/Stage.tscn delete mode 100644 2d/platformer/TileSet.tres delete mode 100644 2d/platformer/TilesetEdit.tscn rename 2d/platformer/{background/scroll_bg_cloud_1.png => assets/art/background/cloud_1.png} (100%) rename 2d/platformer/{player/osb_jump.png.import => assets/art/background/cloud_1.png.import} (69%) rename 2d/platformer/{background/scroll_bg_cloud_2.png => assets/art/background/cloud_2.png} (100%) create mode 100644 2d/platformer/assets/art/background/cloud_2.png.import rename 2d/platformer/{background/scroll_bg_cloud_3.png => assets/art/background/cloud_3.png} (100%) create mode 100644 2d/platformer/assets/art/background/cloud_3.png.import create mode 100644 2d/platformer/assets/art/background/distant_platforms_1.png create mode 100644 2d/platformer/assets/art/background/distant_platforms_1.png.import create mode 100644 2d/platformer/assets/art/background/distant_platforms_2.png create mode 100644 2d/platformer/assets/art/background/distant_platforms_2.png.import rename 2d/platformer/{background/scroll_bg_sky.png => assets/art/background/sky.png} (100%) rename 2d/platformer/{player/osb_fire.png.import => assets/art/background/sky.png.import} (70%) rename 2d/platformer/{ => assets/art}/coin/coin.png (100%) rename 2d/platformer/{ => assets/art}/coin/coin.png.import (71%) rename 2d/platformer/{ => assets/art}/enemy/enemy.png (100%) rename 2d/platformer/{ => assets/art}/enemy/enemy.png.import (71%) create mode 100644 2d/platformer/assets/art/platforms/moving_platform.png rename 2d/platformer/{platform => assets/art/platforms}/moving_platform.png.import (67%) rename 2d/platformer/{platform => assets/art/platforms}/one_way_platform.png (100%) rename 2d/platformer/{platform => assets/art/platforms}/one_way_platform.png.import (66%) rename 2d/platformer/{player => assets/art/player/bullet}/bullet.png (100%) rename 2d/platformer/{player => assets/art/player/bullet}/bullet.png.import (70%) rename 2d/platformer/{ => assets/art}/player/robot_demo.png (100%) rename 2d/platformer/{ => assets/art}/player/robot_demo.png.import (68%) create mode 100644 2d/platformer/assets/art/tileset/tiles_demo.png rename 2d/platformer/{ => assets/art/tileset}/tiles_demo.png.import (68%) create mode 100644 2d/platformer/assets/art/tileset/tileset.tres rename 2d/platformer/{player/osb_fire.png => assets/art/ui/touch_button_fire.png} (100%) rename 2d/platformer/{background/scroll_bg_cloud_1.png.import => assets/art/ui/touch_button_fire.png.import} (67%) rename 2d/platformer/{player/osb_jump.png => assets/art/ui/touch_button_jump.png} (100%) rename 2d/platformer/{background/scroll_bg_cloud_2.png.import => assets/art/ui/touch_button_jump.png.import} (67%) rename 2d/platformer/{player/osb_left.png => assets/art/ui/touch_button_left.png} (100%) rename 2d/platformer/{background/scroll_bg_cloud_3.png.import => assets/art/ui/touch_button_left.png.import} (67%) rename 2d/platformer/{player/osb_right.png => assets/art/ui/touch_button_right.png} (100%) rename 2d/platformer/{background/scroll_bg_sky.png.import => assets/art/ui/touch_button_right.png.import} (66%) rename 2d/platformer/{audio => assets/audio/music}/music.ogg (100%) create mode 100644 2d/platformer/assets/audio/music/music.ogg.import rename 2d/platformer/{audio/sound_coin.wav => assets/audio/sfx/coin_pickup.wav} (100%) create mode 100644 2d/platformer/assets/audio/sfx/coin_pickup.wav.import rename 2d/platformer/{audio/sound_explode.wav => assets/audio/sfx/explode.wav} (100%) rename 2d/platformer/{audio/sound_shoot.wav.import => assets/audio/sfx/explode.wav.import} (51%) rename 2d/platformer/{audio/sound_hit.wav => assets/audio/sfx/hit.wav} (100%) rename 2d/platformer/{audio/sound_hit.wav.import => assets/audio/sfx/hit.wav.import} (51%) rename 2d/platformer/{audio/sound_jump.wav => assets/audio/sfx/jump.wav} (100%) rename 2d/platformer/{audio/sound_coin.wav.import => assets/audio/sfx/jump.wav.import} (51%) rename 2d/platformer/{audio/sound_shoot.wav => assets/audio/sfx/shoot.wav} (100%) rename 2d/platformer/{audio/sound_jump.wav.import => assets/audio/sfx/shoot.wav.import} (51%) create mode 100644 2d/platformer/assets/theme/fonts/kenney_mini_square.ttf create mode 100644 2d/platformer/assets/theme/user_interface.tres delete mode 100644 2d/platformer/audio/music.ogg.import delete mode 100644 2d/platformer/audio/sound_explode.wav.import delete mode 100644 2d/platformer/background/scroll_bg_fg_1.png delete mode 100644 2d/platformer/background/scroll_bg_fg_1.png.import delete mode 100644 2d/platformer/background/scroll_bg_fg_2.png delete mode 100644 2d/platformer/background/scroll_bg_fg_2.png.import delete mode 100644 2d/platformer/coin/Coin.tscn delete mode 100644 2d/platformer/coin/coin.gd delete mode 100644 2d/platformer/enemy/enemy.gd delete mode 100644 2d/platformer/platform/MovingPlatform.tscn delete mode 100644 2d/platformer/platform/OneWayPlatform.tscn delete mode 100644 2d/platformer/platform/moving_platform.gd delete mode 100644 2d/platformer/platform/moving_platform.png delete mode 100644 2d/platformer/player/bullet.gd delete mode 100644 2d/platformer/player/osb_left.png.import delete mode 100644 2d/platformer/player/osb_right.png.import delete mode 100644 2d/platformer/player/player.gd create mode 100644 2d/platformer/src/Actors/Actor.gd create mode 100644 2d/platformer/src/Actors/Enemy.gd rename 2d/platformer/{enemy => src/Actors}/Enemy.tscn (52%) create mode 100644 2d/platformer/src/Actors/Gun.gd create mode 100644 2d/platformer/src/Actors/Player.gd rename 2d/platformer/{player => src/Actors}/Player.tscn (74%) create mode 100644 2d/platformer/src/Level/Level.tscn rename 2d/platformer/{background/ParallaxBg.tscn => src/Level/ParallaxBackground.tscn} (54%) create mode 100644 2d/platformer/src/Main/Game.gd create mode 100644 2d/platformer/src/Main/Game.tscn create mode 100644 2d/platformer/src/Objects/Bullet.gd rename 2d/platformer/{player => src/Objects}/Bullet.tscn (74%) create mode 100644 2d/platformer/src/Objects/Coin.gd create mode 100644 2d/platformer/src/Objects/Coin.tscn create mode 100644 2d/platformer/src/Platforms/Platform.tscn create mode 100644 2d/platformer/src/UserInterface/PauseMenu.gd create mode 100644 2d/platformer/src/UserInterface/PauseMenu.tscn delete mode 100644 2d/platformer/tiles_demo.png diff --git a/2d/platformer/Stage.tscn b/2d/platformer/Stage.tscn deleted file mode 100644 index 5bef7416..00000000 --- a/2d/platformer/Stage.tscn +++ /dev/null @@ -1,268 +0,0 @@ -[gd_scene load_steps=9 format=2] - -[ext_resource path="res://TileSet.tres" type="TileSet" id=1] -[ext_resource path="res://coin/Coin.tscn" type="PackedScene" id=2] -[ext_resource path="res://platform/MovingPlatform.tscn" type="PackedScene" id=3] -[ext_resource path="res://platform/OneWayPlatform.tscn" type="PackedScene" id=4] -[ext_resource path="res://enemy/Enemy.tscn" type="PackedScene" id=5] -[ext_resource path="res://background/ParallaxBg.tscn" type="PackedScene" id=6] -[ext_resource path="res://player/Player.tscn" type="PackedScene" id=7] -[ext_resource path="res://audio/music.ogg" type="AudioStream" id=8] - -[node name="Stage" type="Node"] - -[node name="TileMap" type="TileMap" parent="."] -tile_set = ExtResource( 1 ) -cell_quadrant_size = 8 -format = 1 -tile_data = PoolIntArray( 0, 2, 0, 65536, 2, 0, 131072, 2, 0, 196608, 2, 0, 196626, 9, 0, 262144, 2, 0, 262162, 8, 0, 327680, 2, 0, 327697, 536870921, 0, 327698, 7, 0, 393216, 2, 0, 393234, 7, 0, 393276, 536870914, 0, 393277, 536870922, 0, 393278, 536870922, 0, 393279, 536870922, 0, 393280, 536870922, 0, 393281, 536870922, 0, 393282, 536870922, 0, 393283, 536870922, 0, 393284, 536870922, 0, 393285, 536870922, 0, 458752, 2, 0, 458770, 8, 0, 458812, 536870914, 0, 458813, 536870922, 0, 458814, 536870922, 0, 458815, 536870922, 0, 458816, 536870922, 0, 458817, 536870922, 0, 458818, 536870922, 0, 458819, 536870922, 0, 458820, 536870922, 0, 458821, 536870922, 0, 524288, 4, 0, 524289, 1, 0, 524348, 536870914, 0, 524349, 536870922, 0, 524350, 536870922, 0, 524351, 536870922, 0, 524352, 536870922, 0, 524353, 536870922, 0, 524354, 536870922, 0, 524355, 536870922, 0, 524356, 536870922, 0, 524357, 536870922, 0, 589824, 10, 0, 589825, 13, 0, 589860, 536870914, 0, 589861, 10, 0, 589862, 10, 0, 589863, 10, 0, 589864, 10, 0, 589865, 10, 0, 589866, 10, 0, 589867, 10, 0, 589868, 10, 0, 589869, 2, 0, 589884, 536870914, 0, 589885, 536870922, 0, 589886, 536870922, 0, 589887, 536870922, 0, 589888, 536870922, 0, 589889, 536870922, 0, 589890, 536870922, 0, 589891, 536870922, 0, 589892, 536870922, 0, 589893, 536870922, 0, 655360, 2, 0, 655396, 536870914, 0, 655397, 10, 0, 655398, 10, 0, 655399, 10, 0, 655400, 10, 0, 655401, 10, 0, 655402, 10, 0, 655403, 10, 0, 655404, 10, 0, 655405, 2, 0, 655420, 536870914, 0, 655421, 536870922, 0, 655422, 536870922, 0, 655423, 536870922, 0, 655424, 536870922, 0, 655425, 536870922, 0, 655426, 536870922, 0, 655427, 536870922, 0, 655428, 536870922, 0, 655429, 536870922, 0, 720896, 2, 0, 720932, 536870914, 0, 720933, 10, 0, 720934, 10, 0, 720935, 10, 0, 720936, 10, 0, 720937, 10, 0, 720938, 10, 0, 720939, 10, 0, 720940, 10, 0, 720941, 2, 0, 720956, 536870914, 0, 720957, 536870922, 0, 720958, 536870922, 0, 720959, 536870922, 0, 720960, 536870922, 0, 720961, 536870922, 0, 720962, 536870922, 0, 720963, 536870922, 0, 720964, 536870922, 0, 720965, 536870922, 0, 786432, 2, 0, 786437, 9, 0, 786468, 536870914, 0, 786469, 10, 0, 786470, 10, 0, 786471, 10, 0, 786472, 10, 0, 786473, 10, 0, 786474, 10, 0, 786475, 10, 0, 786476, 10, 0, 786477, 2, 0, 786492, 536870914, 0, 786493, 536870922, 0, 786494, 536870922, 0, 786495, 536870922, 0, 786496, 536870922, 0, 786497, 536870922, 0, 786498, 536870922, 0, 786499, 536870922, 0, 786500, 536870922, 0, 786501, 536870922, 0, 851968, 2, 0, 851973, 7, 0, 852004, 536870914, 0, 852005, 10, 0, 852006, 10, 0, 852007, 10, 0, 852008, 10, 0, 852009, 10, 0, 852010, 10, 0, 852011, 10, 0, 852012, 10, 0, 852013, 2, 0, 852028, 536870914, 0, 852029, 536870922, 0, 852030, 536870922, 0, 852031, 536870922, 0, 852032, 536870922, 0, 852033, 536870922, 0, 852034, 536870922, 0, 852035, 536870922, 0, 852036, 536870922, 0, 852037, 536870922, 0, 917504, 2, 0, 917506, 9, 0, 917509, 7, 0, 917512, 536870921, 0, 917540, 536870914, 0, 917541, 10, 0, 917542, 10, 0, 917543, 10, 0, 917544, 10, 0, 917545, 10, 0, 917546, 10, 0, 917547, 10, 0, 917548, 10, 0, 917549, 2, 0, 917564, 536870914, 0, 917565, 536870922, 0, 917566, 536870922, 0, 917567, 536870922, 0, 917568, 536870922, 0, 917569, 536870922, 0, 917570, 536870922, 0, 917571, 536870922, 0, 917572, 536870922, 0, 917573, 536870922, 0, 983040, 2, 0, 983042, 7, 0, 983045, 7, 0, 983048, 536870920, 0, 983076, 536870914, 0, 983077, 10, 0, 983078, 10, 0, 983079, 10, 0, 983080, 10, 0, 983081, 10, 0, 983082, 10, 0, 983083, 10, 0, 983084, 10, 0, 983085, 2, 0, 983100, 536870914, 0, 983101, 536870922, 0, 983102, 536870922, 0, 983103, 536870922, 0, 983104, 536870922, 0, 983105, 536870922, 0, 983106, 536870922, 0, 983107, 536870922, 0, 983108, 536870922, 0, 983109, 536870922, 0, 1048576, 2, 0, 1048578, 8, 0, 1048581, 8, 0, 1048584, 536870919, 0, 1048612, 536870914, 0, 1048613, 10, 0, 1048614, 10, 0, 1048615, 10, 0, 1048616, 10, 0, 1048617, 10, 0, 1048618, 10, 0, 1048619, 10, 0, 1048620, 10, 0, 1048621, 2, 0, 1048636, 536870914, 0, 1048637, 536870922, 0, 1048638, 536870922, 0, 1048639, 536870922, 0, 1048640, 536870922, 0, 1048641, 536870922, 0, 1048642, 536870922, 0, 1048643, 536870922, 0, 1048644, 536870922, 0, 1048645, 536870922, 0, 1114112, 4, 0, 1114113, 0, 0, 1114114, 6, 0, 1114115, 0, 0, 1114116, 0, 0, 1114117, 6, 0, 1114118, 1, 0, 1114120, 536870919, 0, 1114127, 536870913, 0, 1114128, 0, 0, 1114129, 15, 0, 1114139, 536870927, 0, 1114140, 0, 0, 1114141, 536870912, 0, 1114142, 536870912, 0, 1114143, 536870912, 0, 1114144, 15, 0, 1114148, 536870925, 0, 1114149, 536870923, 0, 1114150, 536870923, 0, 1114151, 536870923, 0, 1114152, 536870923, 0, 1114153, 536870923, 0, 1114154, 536870923, 0, 1114155, 536870923, 0, 1114156, 536870923, 0, 1114157, 13, 0, 1114172, 536870914, 0, 1114173, 536870922, 0, 1114174, 536870922, 0, 1114175, 536870922, 0, 1114176, 536870922, 0, 1114177, 536870922, 0, 1114178, 536870922, 0, 1114179, 536870922, 0, 1114180, 536870922, 0, 1114181, 536870922, 0, 1179648, 10, 0, 1179649, 10, 0, 1179650, 10, 0, 1179651, 10, 0, 1179652, 10, 0, 1179653, 10, 0, 1179654, 2, 0, 1179656, 536870919, 0, 1179663, 536870914, 0, 1179664, 2, 0, 1179676, 536870914, 0, 1179677, 536870922, 0, 1179678, 536870922, 0, 1179679, 2, 0, 1179700, 536870913, 0, 1179701, 536870912, 0, 1179702, 536870912, 0, 1179703, 536870912, 0, 1179704, 536870912, 0, 1179705, 536870912, 0, 1179706, 536870912, 0, 1179707, 536870912, 0, 1179708, 536870916, 0, 1179709, 536870922, 0, 1179710, 536870922, 0, 1179711, 536870922, 0, 1179712, 536870922, 0, 1179713, 536870922, 0, 1179714, 536870922, 0, 1179715, 536870922, 0, 1179716, 536870922, 0, 1179717, 536870922, 0, 1245184, 10, 0, 1245185, 10, 0, 1245186, 10, 0, 1245187, 10, 0, 1245188, 10, 0, 1245189, 10, 0, 1245190, 4, 0, 1245191, 1, 0, 1245192, 536870919, 0, 1245199, 536870914, 0, 1245200, 2, 0, 1245212, 536870914, 0, 1245213, 536870922, 0, 1245214, 536870922, 0, 1245215, 2, 0, 1245236, 536870914, 0, 1245237, 536870922, 0, 1245238, 536870922, 0, 1245239, 536870922, 0, 1245240, 536870922, 0, 1245241, 536870922, 0, 1245242, 536870922, 0, 1245243, 536870922, 0, 1245244, 536870922, 0, 1245245, 536870922, 0, 1245246, 536870922, 0, 1245247, 536870922, 0, 1245248, 536870922, 0, 1245249, 536870922, 0, 1245250, 536870922, 0, 1245251, 536870922, 0, 1245252, 536870922, 0, 1245253, 536870922, 0, 1310720, 10, 0, 1310721, 10, 0, 1310722, 10, 0, 1310723, 10, 0, 1310724, 10, 0, 1310725, 10, 0, 1310726, 10, 0, 1310727, 4, 0, 1310728, 6, 0, 1310729, 1, 0, 1310735, 536870914, 0, 1310736, 2, 0, 1310748, 536870914, 0, 1310749, 536870922, 0, 1310750, 536870922, 0, 1310751, 2, 0, 1310772, 536870914, 0, 1310773, 536870922, 0, 1310774, 536870922, 0, 1310775, 536870922, 0, 1310776, 536870922, 0, 1310777, 536870922, 0, 1310778, 536870922, 0, 1310779, 536870922, 0, 1310780, 536870922, 0, 1310781, 536870922, 0, 1310782, 536870922, 0, 1310783, 536870922, 0, 1310784, 536870922, 0, 1310785, 536870922, 0, 1310786, 536870922, 0, 1310787, 536870922, 0, 1310788, 536870922, 0, 1310789, 536870922, 0, 1376256, 10, 0, 1376257, 10, 0, 1376258, 10, 0, 1376259, 10, 0, 1376260, 10, 0, 1376261, 10, 0, 1376262, 10, 0, 1376263, 10, 0, 1376264, 10, 0, 1376265, 4, 0, 1376266, 0, 0, 1376267, 0, 0, 1376268, 0, 0, 1376269, 0, 0, 1376270, 0, 0, 1376271, 536870916, 0, 1376272, 2, 0, 1376284, 536870914, 0, 1376285, 536870922, 0, 1376286, 536870922, 0, 1376287, 2, 0, 1376308, 536870914, 0, 1376309, 536870922, 0, 1376310, 536870922, 0, 1376311, 536870922, 0, 1376312, 536870922, 0, 1376313, 536870922, 0, 1376314, 536870922, 0, 1376315, 536870922, 0, 1376316, 536870922, 0, 1376317, 536870922, 0, 1376318, 536870922, 0, 1376319, 536870922, 0, 1376320, 536870922, 0, 1376321, 536870922, 0, 1376322, 536870922, 0, 1376323, 536870922, 0, 1376324, 536870922, 0, 1376325, 536870922, 0, 1441792, 10, 0, 1441793, 10, 0, 1441794, 10, 0, 1441795, 10, 0, 1441796, 10, 0, 1441797, 10, 0, 1441798, 10, 0, 1441799, 10, 0, 1441800, 10, 0, 1441801, 10, 0, 1441802, 10, 0, 1441803, 10, 0, 1441804, 10, 0, 1441805, 10, 0, 1441806, 10, 0, 1441807, 10, 0, 1441808, 2, 0, 1441820, 536870914, 0, 1441821, 536870922, 0, 1441822, 536870922, 0, 1441823, 2, 0, 1441844, 536870914, 0, 1441845, 536870922, 0, 1441846, 536870922, 0, 1441847, 536870922, 0, 1441848, 536870922, 0, 1441849, 536870922, 0, 1441850, 536870922, 0, 1441851, 536870922, 0, 1441852, 536870922, 0, 1441853, 536870922, 0, 1441854, 536870922, 0, 1441855, 536870922, 0, 1441856, 536870922, 0, 1441857, 536870922, 0, 1441858, 536870922, 0, 1441859, 536870922, 0, 1441860, 536870922, 0, 1441861, 536870922, 0, 1507328, 10, 0, 1507329, 10, 0, 1507330, 10, 0, 1507331, 10, 0, 1507332, 10, 0, 1507333, 10, 0, 1507334, 10, 0, 1507335, 10, 0, 1507336, 10, 0, 1507337, 10, 0, 1507338, 10, 0, 1507339, 10, 0, 1507340, 10, 0, 1507341, 10, 0, 1507342, 10, 0, 1507343, 10, 0, 1507344, 2, 0, 1507356, 536870914, 0, 1507357, 536870922, 0, 1507358, 536870922, 0, 1507359, 4, 0, 1507360, 0, 0, 1507361, 0, 0, 1507362, 0, 0, 1507363, 0, 0, 1507364, 0, 0, 1507365, 0, 0, 1507366, 12, 0, 1507380, 536870914, 0, 1507381, 536870922, 0, 1507382, 536870922, 0, 1507383, 536870922, 0, 1507384, 536870922, 0, 1507385, 536870922, 0, 1507386, 536870922, 0, 1507387, 536870922, 0, 1507388, 536870922, 0, 1507389, 536870922, 0, 1507390, 536870922, 0, 1507391, 536870922, 0, 1507392, 536870922, 0, 1507393, 536870922, 0, 1507394, 536870922, 0, 1507395, 536870922, 0, 1507396, 536870922, 0, 1507397, 536870922, 0, 1572864, 10, 0, 1572865, 10, 0, 1572866, 10, 0, 1572867, 10, 0, 1572868, 10, 0, 1572869, 10, 0, 1572870, 10, 0, 1572871, 10, 0, 1572872, 10, 0, 1572873, 10, 0, 1572874, 10, 0, 1572875, 10, 0, 1572876, 10, 0, 1572877, 10, 0, 1572878, 10, 0, 1572879, 10, 0, 1572880, 2, 0, 1572892, 536870914, 0, 1572893, 536870922, 0, 1572894, 536870922, 0, 1572895, 536870922, 0, 1572896, 536870922, 0, 1572897, 536870922, 0, 1572898, 536870922, 0, 1572899, 536870922, 0, 1572900, 536870922, 0, 1572901, 536870922, 0, 1572903, 12, 0, 1572916, 536870914, 0, 1572917, 536870922, 0, 1572918, 536870922, 0, 1572919, 536870922, 0, 1572920, 536870922, 0, 1572921, 536870922, 0, 1572922, 536870922, 0, 1572923, 536870922, 0, 1572924, 536870922, 0, 1572925, 536870922, 0, 1572926, 536870922, 0, 1572927, 536870922, 0, 1572928, 536870922, 0, 1572929, 536870922, 0, 1572930, 536870922, 0, 1572931, 536870922, 0, 1572932, 536870922, 0, 1572933, 536870922, 0, 1638400, 10, 0, 1638401, 10, 0, 1638402, 10, 0, 1638403, 10, 0, 1638404, 10, 0, 1638405, 10, 0, 1638406, 10, 0, 1638407, 10, 0, 1638408, 10, 0, 1638409, 10, 0, 1638410, 10, 0, 1638411, 10, 0, 1638412, 10, 0, 1638413, 10, 0, 1638414, 10, 0, 1638415, 10, 0, 1638416, 2, 0, 1638428, 536870914, 0, 1638429, 536870922, 0, 1638430, 536870922, 0, 1638431, 536870922, 0, 1638432, 536870922, 0, 1638433, 536870922, 0, 1638434, 536870922, 0, 1638435, 536870922, 0, 1638436, 536870922, 0, 1638437, 536870922, 0, 1638438, 536870922, 0, 1638440, 12, 0, 1638452, 536870914, 0, 1638453, 536870922, 0, 1638454, 536870922, 0, 1638455, 536870922, 0, 1638456, 536870922, 0, 1638457, 536870922, 0, 1638458, 536870922, 0, 1638459, 536870922, 0, 1638460, 536870922, 0, 1638461, 536870922, 0, 1638462, 536870922, 0, 1638463, 536870922, 0, 1638464, 536870922, 0, 1638465, 536870922, 0, 1638466, 536870922, 0, 1638467, 536870922, 0, 1638468, 536870922, 0, 1638469, 536870922, 0, 1703964, 536870914, 0, 1703965, 536870922, 0, 1703966, 536870922, 0, 1703967, 536870922, 0, 1703968, 536870922, 0, 1703969, 536870922, 0, 1703970, 536870922, 0, 1703971, 536870922, 0, 1703972, 536870922, 0, 1703973, 536870922, 0, 1703974, 536870922, 0, 1703975, 536870922, 0, 1703977, 12, 0, 1703988, 536870914, 0, 1703989, 536870922, 0, 1703990, 536870922, 0, 1703991, 536870922, 0, 1703992, 536870922, 0, 1703993, 536870922, 0, 1703994, 536870922, 0, 1703995, 536870922, 0, 1703996, 536870922, 0, 1703997, 536870922, 0, 1703998, 536870922, 0, 1703999, 536870922, 0, 1704000, 536870922, 0, 1704001, 536870922, 0, 1704002, 536870922, 0, 1704003, 536870922, 0, 1704004, 536870922, 0, 1704005, 536870922, 0, 1769500, 536870914, 0, 1769501, 536870922, 0, 1769502, 536870922, 0, 1769503, 536870922, 0, 1769504, 536870922, 0, 1769505, 536870922, 0, 1769506, 536870922, 0, 1769507, 536870922, 0, 1769508, 536870922, 0, 1769509, 536870922, 0, 1769510, 536870922, 0, 1769511, 536870922, 0, 1769512, 536870922, 0, 1769514, 12, 0, 1769524, 536870914, 0, 1769525, 536870922, 0, 1769526, 536870922, 0, 1769527, 536870922, 0, 1769528, 536870922, 0, 1769529, 536870922, 0, 1769530, 536870922, 0, 1769531, 536870922, 0, 1769532, 536870922, 0, 1769533, 536870922, 0, 1769534, 536870922, 0, 1769535, 536870922, 0, 1769536, 536870922, 0, 1769537, 536870922, 0, 1769538, 536870922, 0, 1769539, 536870922, 0, 1769540, 536870922, 0, 1769541, 536870922, 0, 1835036, 536870914, 0, 1835037, 536870922, 0, 1835038, 536870922, 0, 1835039, 536870922, 0, 1835040, 536870922, 0, 1835041, 536870922, 0, 1835042, 536870922, 0, 1835043, 536870922, 0, 1835044, 536870922, 0, 1835045, 536870922, 0, 1835046, 536870922, 0, 1835047, 536870922, 0, 1835048, 536870922, 0, 1835049, 536870922, 0, 1835051, 12, 0, 1835060, 536870914, 0, 1835061, 536870922, 0, 1835062, 536870922, 0, 1835063, 536870922, 0, 1835064, 536870922, 0, 1835065, 536870922, 0, 1835066, 536870922, 0, 1835067, 536870922, 0, 1835068, 536870922, 0, 1835069, 536870922, 0, 1835070, 536870922, 0, 1835071, 536870922, 0, 1835072, 536870922, 0, 1835073, 536870922, 0, 1835074, 536870922, 0, 1835075, 536870922, 0, 1835076, 536870922, 0, 1835077, 536870922, 0, 1900572, 536870914, 0, 1900573, 536870922, 0, 1900574, 536870922, 0, 1900575, 536870922, 0, 1900576, 536870922, 0, 1900577, 536870922, 0, 1900578, 536870922, 0, 1900579, 536870922, 0, 1900580, 536870922, 0, 1900581, 536870922, 0, 1900582, 536870922, 0, 1900583, 536870922, 0, 1900584, 536870922, 0, 1900585, 536870922, 0, 1900586, 536870922, 0, 1900588, 0, 0, 1900589, 0, 0, 1900590, 0, 0, 1900591, 0, 0, 1900592, 0, 0, 1900593, 0, 0, 1900594, 0, 0, 1900595, 0, 0, 1900596, 536870916, 0, 1900597, 536870922, 0, 1900598, 536870922, 0, 1900599, 536870922, 0, 1900600, 536870922, 0, 1900601, 536870922, 0, 1900602, 536870922, 0, 1900603, 536870922, 0, 1900604, 536870922, 0, 1900605, 536870922, 0, 1900606, 536870922, 0, 1900607, 536870922, 0, 1900608, 536870922, 0, 1900609, 536870922, 0, 1900610, 536870922, 0, 1900611, 536870922, 0, 1900612, 536870922, 0, 1900613, 536870922, 0, 1966108, 536870914, 0, 1966109, 536870922, 0, 1966110, 536870922, 0, 1966111, 536870922, 0, 1966112, 536870922, 0, 1966113, 536870922, 0, 1966114, 536870922, 0, 1966115, 536870922, 0, 1966116, 536870922, 0, 1966117, 536870922, 0, 1966118, 536870922, 0, 1966119, 536870922, 0, 1966120, 536870922, 0, 1966121, 536870922, 0, 1966122, 536870922, 0, 1966123, 536870922, 0, 1966124, 536870922, 0, 1966125, 536870922, 0, 1966126, 536870922, 0, 1966127, 536870922, 0, 1966128, 536870922, 0, 1966129, 536870922, 0, 1966130, 536870922, 0, 1966131, 536870922, 0, 1966132, 536870922, 0, 1966133, 536870922, 0, 1966134, 536870922, 0, 1966135, 536870922, 0, 1966136, 536870922, 0, 1966137, 536870922, 0, 1966138, 536870922, 0, 1966139, 536870922, 0, 1966140, 536870922, 0, 1966141, 536870922, 0, 1966142, 536870922, 0, 1966143, 536870922, 0, 1966144, 536870922, 0, 1966145, 536870922, 0, 1966146, 536870922, 0, 1966147, 536870922, 0, 1966148, 536870922, 0, 1966149, 536870922, 0, 2031644, 536870914, 0, 2031645, 536870922, 0, 2031646, 536870922, 0, 2031647, 536870922, 0, 2031648, 536870922, 0, 2031649, 536870922, 0, 2031650, 536870922, 0, 2031651, 536870922, 0, 2031652, 536870922, 0, 2031653, 536870922, 0, 2031654, 536870922, 0, 2031655, 536870922, 0, 2031656, 536870922, 0, 2031657, 536870922, 0, 2031658, 536870922, 0, 2031659, 536870922, 0, 2031660, 536870922, 0, 2031661, 536870922, 0, 2031662, 536870922, 0, 2031663, 536870922, 0, 2031664, 536870922, 0, 2031665, 536870922, 0, 2031666, 536870922, 0, 2031667, 536870922, 0, 2031668, 536870922, 0, 2031669, 536870922, 0, 2031670, 536870922, 0, 2031671, 536870922, 0, 2031672, 536870922, 0, 2031673, 536870922, 0, 2031674, 536870922, 0, 2031675, 536870922, 0, 2031676, 536870922, 0, 2031677, 536870922, 0, 2031678, 536870922, 0, 2031679, 536870922, 0, 2031680, 536870922, 0, 2031681, 536870922, 0, 2031682, 536870922, 0, 2031683, 536870922, 0, 2031684, 536870922, 0, 2031685, 536870922, 0, 2097180, 536870914, 0, 2097181, 536870922, 0, 2097182, 536870922, 0, 2097183, 536870922, 0, 2097184, 536870922, 0, 2097185, 536870922, 0, 2097186, 536870922, 0, 2097187, 536870922, 0, 2097188, 536870922, 0, 2097189, 536870922, 0, 2097190, 536870922, 0, 2097191, 536870922, 0, 2097192, 536870922, 0, 2097193, 536870922, 0, 2097194, 536870922, 0, 2097195, 536870922, 0, 2097196, 536870922, 0, 2097197, 536870922, 0, 2097198, 536870922, 0, 2097199, 536870922, 0, 2097200, 536870922, 0, 2097201, 536870922, 0, 2097202, 536870922, 0, 2097203, 536870922, 0, 2097204, 536870922, 0, 2097205, 536870922, 0, 2097206, 536870922, 0, 2097207, 536870922, 0, 2097208, 536870922, 0, 2097209, 536870922, 0, 2097210, 536870922, 0, 2097211, 536870922, 0, 2097212, 536870922, 0, 2097213, 536870922, 0, 2097214, 536870922, 0, 2097215, 536870922, 0, 2097216, 536870922, 0, 2097217, 536870922, 0, 2097218, 536870922, 0, 2097219, 536870922, 0, 2097220, 536870922, 0, 2097221, 536870922, 0, 2162716, 536870914, 0, 2162717, 536870922, 0, 2162718, 536870922, 0, 2162719, 536870922, 0, 2162720, 536870922, 0, 2162721, 536870922, 0, 2162722, 536870922, 0, 2162723, 536870922, 0, 2162724, 536870922, 0, 2162725, 536870922, 0, 2162726, 536870922, 0, 2162727, 536870922, 0, 2162728, 536870922, 0, 2162729, 536870922, 0, 2162730, 536870922, 0, 2162731, 536870922, 0, 2162732, 536870922, 0, 2162733, 536870922, 0, 2162734, 536870922, 0, 2162735, 536870922, 0, 2162736, 536870922, 0, 2162737, 536870922, 0, 2162738, 536870922, 0, 2162739, 536870922, 0, 2162740, 536870922, 0, 2162741, 536870922, 0, 2162742, 536870922, 0, 2162743, 536870922, 0, 2162744, 536870922, 0, 2162745, 536870922, 0, 2162746, 536870922, 0, 2162747, 536870922, 0, 2162748, 536870922, 0, 2162749, 536870922, 0, 2162750, 536870922, 0, 2162751, 536870922, 0, 2162752, 536870922, 0, 2162753, 536870922, 0, 2162754, 536870922, 0, 2162755, 536870922, 0, 2162756, 536870922, 0, 2162757, 536870922, 0, 2228252, 536870914, 0, 2228253, 536870922, 0, 2228254, 536870922, 0, 2228255, 536870922, 0, 2228256, 536870922, 0, 2228257, 536870922, 0, 2228258, 536870922, 0, 2228259, 536870922, 0, 2228260, 536870922, 0, 2228261, 536870922, 0, 2228262, 536870922, 0, 2228263, 536870922, 0, 2228264, 536870922, 0, 2228265, 536870922, 0, 2228266, 536870922, 0, 2228267, 536870922, 0, 2228268, 536870922, 0, 2228269, 536870922, 0, 2228270, 536870922, 0, 2228271, 536870922, 0, 2228272, 536870922, 0, 2228273, 536870922, 0, 2228274, 536870922, 0, 2228275, 536870922, 0, 2228276, 536870922, 0, 2228277, 536870922, 0, 2228278, 536870922, 0, 2228279, 536870922, 0, 2228280, 536870922, 0, 2228281, 536870922, 0, 2228282, 536870922, 0, 2228283, 536870922, 0, 2228284, 536870922, 0, 2228285, 536870922, 0, 2228286, 536870922, 0, 2228287, 536870922, 0, 2228288, 536870922, 0, 2228289, 536870922, 0, 2228290, 536870922, 0, 2228291, 536870922, 0, 2228292, 536870922, 0, 2228293, 536870922, 0, 2293788, 536870914, 0, 2293789, 536870922, 0, 2293790, 536870922, 0, 2293791, 536870922, 0, 2293792, 536870922, 0, 2293793, 536870922, 0, 2293794, 536870922, 0, 2293795, 536870922, 0, 2293796, 536870922, 0, 2293797, 536870922, 0, 2293798, 536870922, 0, 2293799, 536870922, 0, 2293800, 536870922, 0, 2293801, 536870922, 0, 2293802, 536870922, 0, 2293803, 536870922, 0, 2293804, 536870922, 0, 2293805, 536870922, 0, 2293806, 536870922, 0, 2293807, 536870922, 0, 2293808, 536870922, 0, 2293809, 536870922, 0, 2293810, 536870922, 0, 2293811, 536870922, 0, 2293812, 536870922, 0, 2293813, 536870922, 0, 2293814, 536870922, 0, 2293815, 536870922, 0, 2293816, 536870922, 0, 2293817, 536870922, 0, 2293818, 536870922, 0, 2293819, 536870922, 0, 2293820, 536870922, 0, 2293821, 536870922, 0, 2293822, 536870922, 0, 2293823, 536870922, 0, 2293824, 536870922, 0, 2293825, 536870922, 0, 2293826, 536870922, 0, 2293827, 536870922, 0, 2293828, 536870922, 0, 2293829, 536870922, 0, 2293830, 536870922, 0, 2359324, 536870914, 0, 2359325, 536870922, 0, 2359326, 536870922, 0, 2359327, 536870922, 0, 2359328, 536870922, 0, 2359329, 536870922, 0, 2359330, 536870922, 0, 2359331, 536870922, 0, 2359332, 536870922, 0, 2359333, 536870922, 0, 2359334, 536870922, 0, 2359335, 536870922, 0, 2359336, 536870922, 0, 2359337, 536870922, 0, 2359338, 536870922, 0, 2359339, 536870922, 0, 2359340, 536870922, 0, 2359341, 536870922, 0, 2359342, 536870922, 0, 2359343, 536870922, 0, 2359344, 536870922, 0, 2359345, 536870922, 0, 2359346, 536870922, 0, 2359347, 536870922, 0, 2359348, 536870922, 0, 2359349, 536870922, 0, 2359350, 536870922, 0, 2359351, 536870922, 0, 2359352, 536870922, 0, 2359353, 536870922, 0, 2359354, 536870922, 0, 2359355, 536870922, 0, 2359356, 536870922, 0, 2359357, 536870922, 0, 2359358, 536870922, 0, 2359359, 536870922, 0, 2359360, 536870922, 0, 2359361, 536870922, 0, 2359362, 536870922, 0, 2359363, 536870922, 0, 2359364, 536870922, 0, 2359365, 536870922, 0, 2359366, 536870922, 0, 2424860, 536870914, 0, 2424861, 536870922, 0, 2424862, 536870922, 0, 2424863, 536870922, 0, 2424864, 536870922, 0, 2424865, 536870922, 0, 2424866, 536870922, 0, 2424867, 536870922, 0, 2424868, 536870922, 0, 2424869, 536870922, 0, 2424870, 536870922, 0, 2424871, 536870922, 0, 2424872, 536870922, 0, 2424873, 536870922, 0, 2424874, 536870922, 0, 2424875, 536870922, 0, 2424876, 536870922, 0, 2424877, 536870922, 0, 2424878, 536870922, 0, 2424879, 536870922, 0, 2424880, 536870922, 0, 2424881, 536870922, 0, 2424882, 536870922, 0, 2424883, 536870922, 0, 2424884, 536870922, 0, 2424885, 536870922, 0, 2424886, 536870922, 0, 2424887, 536870922, 0, 2424888, 536870922, 0, 2424889, 536870922, 0, 2424890, 536870922, 0, 2424891, 536870922, 0, 2424892, 536870922, 0, 2424893, 536870922, 0, 2424894, 536870922, 0, 2424895, 536870922, 0, 2424896, 536870922, 0, 2424897, 536870922, 0, 2424898, 536870922, 0, 2424899, 536870922, 0, 2424900, 536870922, 0, 2424901, 536870922, 0, 2424902, 536870922, 0, 2490397, 536870922, 0, 2490398, 536870922, 0, 2490399, 536870922, 0, 2490400, 536870922, 0, 2490401, 536870922, 0, 2490402, 536870922, 0, 2490403, 536870922, 0, 2490404, 536870922, 0, 2490405, 536870922, 0, 2490406, 536870922, 0, 2490407, 536870922, 0, 2490408, 536870922, 0, 2490409, 536870922, 0, 2490410, 536870922, 0, 2490411, 536870922, 0, 2490412, 536870922, 0, 2490413, 536870922, 0, 2490414, 536870922, 0, 2490415, 536870922, 0, 2490416, 536870922, 0, 2490417, 536870922, 0, 2490418, 536870922, 0, 2490419, 536870922, 0, 2490420, 536870922, 0, 2490421, 536870922, 0, 2490422, 536870922, 0, 2490423, 536870922, 0, 2490424, 536870922, 0, 2490425, 536870922, 0, 2490426, 536870922, 0, 2490427, 536870922, 0, 2490428, 536870922, 0, 2490429, 536870922, 0, 2490430, 536870922, 0, 2490431, 536870922, 0, 2490432, 536870922, 0, 2490433, 536870922, 0, 2490434, 536870922, 0, 2490435, 536870922, 0, 2490436, 536870922, 0, 2490437, 536870922, 0, 2555933, 536870922, 0, 2555934, 536870922, 0, 2555935, 536870922, 0, 2555936, 536870922, 0, 2555937, 536870922, 0, 2555938, 536870922, 0, 2555939, 536870922, 0, 2555940, 536870922, 0, 2555941, 536870922, 0, 2555942, 536870922, 0, 2555943, 536870922, 0, 2555944, 536870922, 0, 2555945, 536870922, 0, 2555946, 536870922, 0, 2555947, 536870922, 0, 2555948, 536870922, 0, 2555949, 536870922, 0, 2555950, 536870922, 0, 2555951, 536870922, 0, 2555952, 536870922, 0, 2555953, 536870922, 0, 2555954, 536870922, 0, 2555955, 536870922, 0, 2555956, 536870922, 0, 2555957, 536870922, 0, 2555958, 536870922, 0, 2555959, 536870922, 0, 2555960, 536870922, 0, 2555961, 536870922, 0, 2555962, 536870922, 0, 2555963, 536870922, 0, 2555964, 536870922, 0, 2555965, 536870922, 0, 2555966, 536870922, 0, 2555967, 536870922, 0, 2555968, 536870922, 0, 2555969, 536870922, 0, 2555970, 536870922, 0, 2555971, 536870922, 0, 2555972, 536870922, 0, 2555973, 536870922, 0, 2621469, 536870922, 0, 2621470, 536870922, 0, 2621471, 536870922, 0, 2621472, 536870922, 0, 2621473, 536870922, 0, 2621474, 536870922, 0, 2621475, 536870922, 0, 2621476, 536870922, 0, 2621477, 536870922, 0, 2621478, 536870922, 0, 2621479, 536870922, 0, 2621480, 536870922, 0, 2621481, 536870922, 0, 2621482, 536870922, 0, 2621483, 536870922, 0, 2621484, 536870922, 0, 2621485, 536870922, 0, 2621486, 536870922, 0, 2621487, 536870922, 0, 2621488, 536870922, 0, 2621489, 536870922, 0, 2621490, 536870922, 0, 2621491, 536870922, 0, 2621492, 536870922, 0, 2621493, 536870922, 0, 2621494, 536870922, 0, 2621495, 536870922, 0, 2621496, 536870922, 0, 2621497, 536870922, 0, 2621498, 536870922, 0, 2621499, 536870922, 0, 2621500, 536870922, 0, 2621501, 536870922, 0, 2621502, 536870922, 0, 2621503, 536870922, 0, 2621504, 536870922, 0, 2621505, 536870922, 0, 2621506, 536870922, 0, 2621507, 536870922, 0, 2621508, 536870922, 0, 2687006, 536870922, 0, 2687007, 536870922, 0, 2687008, 536870922, 0, 2687009, 536870922, 0, 2687010, 536870922, 0, 2687011, 536870922, 0, 2687012, 536870922, 0, 2687013, 536870922, 0, 2687014, 536870922, 0, 2687015, 536870922, 0, 2687016, 536870922, 0, 2687017, 536870922, 0, 2687018, 536870922, 0, 2687019, 536870922, 0, 2687020, 536870922, 0, 2687021, 536870922, 0, 2687022, 536870922, 0, 2687023, 536870922, 0, 2687024, 536870922, 0, 2687025, 536870922, 0, 2687026, 536870922, 0, 2687027, 536870922, 0, 2687028, 536870922, 0, 2687029, 536870922, 0, 2687030, 536870922, 0, 2687031, 536870922, 0, 2687032, 536870922, 0, 2687033, 536870922, 0, 2687034, 536870922, 0, 2687035, 536870922, 0, 2687036, 536870922, 0, 2687037, 536870922, 0, 2687038, 536870922, 0, 2687039, 536870922, 0, 2687040, 536870922, 0, 2687041, 536870922, 0, 2687042, 536870922, 0, 2687043, 536870922, 0, 2687044, 536870922, 0, 2752543, 536870922, 0, 2752544, 536870922, 0, 2752545, 536870922, 0, 2752546, 536870922, 0, 2752547, 536870922, 0, 2752548, 536870922, 0, 2752549, 536870922, 0, 2752550, 536870922, 0, 2752551, 536870922, 0, 2752552, 536870922, 0, 2752553, 536870922, 0, 2752554, 536870922, 0, 2752555, 536870922, 0, 2752556, 536870922, 0, 2752557, 536870922, 0, 2752558, 536870922, 0, 2752559, 536870922, 0, 2752560, 536870922, 0, 2752561, 536870922, 0, 2752562, 536870922, 0, 2752563, 536870922, 0, 2752564, 536870922, 0, 2752565, 536870922, 0, 2752566, 536870922, 0, 2752567, 536870922, 0, 2752568, 536870922, 0, 2752569, 536870922, 0, 2752570, 536870922, 0, 2752571, 536870922, 0, 2752572, 536870922, 0, 2752573, 536870922, 0, 2752574, 536870922, 0, 2752575, 536870922, 0, 2752576, 536870922, 0, 2752577, 536870922, 0, 2752578, 536870922, 0, 2752579, 536870922, 0, 2818083, 536870922, 0, 2818084, 536870922, 0, 2818085, 536870922, 0, 2818086, 536870922, 0, 2818087, 536870922, 0, 2818088, 536870922, 0, 2818089, 536870922, 0, 2818090, 536870922, 0, 2818091, 536870922, 0, 2818092, 536870922, 0, 2818093, 536870922, 0, 2818094, 536870922, 0, 2818095, 536870922, 0, 2818096, 536870922, 0, 2818097, 536870922, 0, 2818098, 536870922, 0, 2818099, 536870922, 0, 2818100, 536870922, 0, 2818101, 536870922, 0, 2818102, 536870922, 0, 2818103, 536870922, 0, 2818104, 536870922, 0, 2818105, 536870922, 0, 2818106, 536870922, 0, 2818107, 536870922, 0, 2818108, 536870922, 0, 2818109, 536870922, 0, 2818110, 536870922, 0, 2818111, 536870922, 0, 2818112, 536870922, 0, 2818113, 536870922, 0 ) -__meta__ = { -"_edit_lock_": true -} - -[node name="Coins" type="Node" parent="."] - -[node name="Coin1" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 672, 1179 ) - -[node name="Coin2" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 704, 1179 ) - -[node name="Coin3" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 736, 1179 ) - -[node name="Coin4" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1120, 992 ) - -[node name="Coin5" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1152, 992 ) - -[node name="Coin6" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1184, 992 ) - -[node name="Coin7" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1216, 992 ) - -[node name="Coin8" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1248, 992 ) - -[node name="Coin9" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1568, 864 ) - -[node name="Coin10" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1632, 864 ) - -[node name="Coin11" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1169.44, 677.369 ) - -[node name="Coin12" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1233.44, 677.369 ) - -[node name="Coin13" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 924.453, 566.264 ) - -[node name="Coin14" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 988.453, 566.264 ) - -[node name="Coin15" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 983.872, 336.653 ) - -[node name="Coin16" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1047.87, 336.653 ) - -[node name="Coin17" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1111.87, 336.653 ) - -[node name="Coin18" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1111.87, 272.653 ) - -[node name="Coin19" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 1047.87, 272.653 ) - -[node name="Coin20" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 983.872, 272.653 ) - -[node name="Coin21" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 3726.65, 1102.79 ) - -[node name="Coin22" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 89.5989, 481.217 ) - -[node name="Coin23" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 3735.94, 1095.49 ) - -[node name="Coin24" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 3743.9, 1084.22 ) - -[node name="Coin25" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 3745.23, 1072.28 ) - -[node name="Coin26" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 3733.95, 1063.65 ) - -[node name="Coin27" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 3725.99, 1072.94 ) - -[node name="Coin28" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 88.272, 448.71 ) - -[node name="Coin29" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 79.6476, 457.334 ) - -[node name="Coin30" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 82.9647, 468.612 ) - -[node name="Coin31" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 2159.07, 1356.49 ) - -[node name="Coin32" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 2223.07, 1356.49 ) - -[node name="Coin33" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 2287.07, 1356.49 ) - -[node name="Coin34" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 2287.07, 1292.49 ) - -[node name="Coin35" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 2223.07, 1292.49 ) - -[node name="Coin36" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 2159.07, 1292.49 ) - -[node name="Coin37" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 4172.75, 605.058 ) - -[node name="Coin38" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 4236.75, 605.058 ) - -[node name="Coin39" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 4300.75, 605.058 ) - -[node name="Coin40" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 4300.75, 541.058 ) - -[node name="Coin41" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 4236.75, 541.058 ) - -[node name="Coin42" parent="Coins" instance=ExtResource( 2 )] -position = Vector2( 4172.75, 541.058 ) - -[node name="Props" type="Node" parent="."] - -[node name="MovingPlatform" parent="Props" instance=ExtResource( 3 )] -position = Vector2( 1451.86, 742.969 ) - -[node name="MovingPlatform2" parent="Props" instance=ExtResource( 3 )] -position = Vector2( 719.199, 1123.81 ) -motion = Vector2( 100, 0 ) -cycle = 4.0 - -[node name="Still" parent="Props" instance=ExtResource( 3 )] -position = Vector2( 1231.37, 1105.18 ) -rotation = -0.163314 - -[node name="Still1" parent="Props" instance=ExtResource( 3 )] -position = Vector2( 1384.28, 1066.4 ) -rotation = -0.321902 - -[node name="Still2" parent="Props" instance=ExtResource( 3 )] -position = Vector2( 1552.7, 1032.05 ) -rotation = -0.0826906 - -[node name="Still3" parent="Props" instance=ExtResource( 3 )] -position = Vector2( 1700.06, 1066.92 ) -rotation = 0.547997 - -[node name="OneWayPlatform1" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 967.609, 836.547 ) - -[node name="OneWayPlatform2" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 1190.78, 754.282 ) - -[node name="OneWayPlatform3" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 953.762, 638.622 ) - -[node name="OneWayPlatform4" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 1256.76, 638.622 ) - -[node name="OneWayPlatform5" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 1039.29, 409.746 ) - -[node name="OneWayPlatform6" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 1192.93, 520.298 ) - -[node name="OneWayPlatform7" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 2784.9, 1655.71 ) - -[node name="OneWayPlatform8" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 2976.23, 1555 ) - -[node name="OneWayPlatform9" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 3122.25, 1469.41 ) - -[node name="OneWayPlatform10" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 3200.29, 1353.6 ) - -[node name="OneWayPlatform11" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 3200.29, 1237.8 ) - -[node name="OneWayPlatform12" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 1099.56, 940.804 ) - -[node name="OneWayPlatform13" parent="Props" instance=ExtResource( 4 )] -position = Vector2( 1339.63, 967.879 ) - -[node name="Player" parent="." instance=ExtResource( 7 )] -position = Vector2( 251.684, 1045.6 ) - -[node name="Enemies" type="Node" parent="."] - -[node name="Enemy1" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 734.693, 1064.22 ) - -[node name="Enemy2" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 707.665, 1225.05 ) - -[node name="Enemy3" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 1125.21, 1053.06 ) - -[node name="Enemy4" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 1292.11, 1059.24 ) - -[node name="Enemy5" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 968.927, 766.466 ) - -[node name="Enemy6" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 3080.34, 1807.61 ) - -[node name="Enemy7" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 1457.6, 688.741 ) - -[node name="Enemy8" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 1264.06, 571.713 ) - -[node name="Enemy9" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 3590.85, 1114.86 ) - -[node name="Enemy10" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 3546.2, 1356.19 ) - -[node name="Enemy11" parent="Enemies" instance=ExtResource( 5 )] -position = Vector2( 2215.3, 1429.39 ) - -[node name="ParallaxBg" parent="." instance=ExtResource( 6 )] - -[node name="Label" type="Label" parent="."] -margin_left = 12.0 -margin_top = -202.0 -margin_right = 358.0 -margin_bottom = -10.0 -size_flags_horizontal = 2 -size_flags_vertical = 0 -text = "This is a simple demo on how to make a platformer game with Godot.\"This version uses physics and the 2D physics engine for motion and collision.\"\"The demo also shows the benefits of using the scene system, where coins,\"enemies and the player are edited separatedly and instanced in the stage.\"\"To edit the base tiles for the tileset, open the tileset_edit.tscn file and follow \"instructions.\"" -autowrap = true - -[node name="Music" type="AudioStreamPlayer" parent="."] -stream = ExtResource( 8 ) -autoplay = true diff --git a/2d/platformer/TileSet.tres b/2d/platformer/TileSet.tres deleted file mode 100644 index 276213d1..00000000 --- a/2d/platformer/TileSet.tres +++ /dev/null @@ -1,243 +0,0 @@ -[gd_resource type="TileSet" load_steps=14 format=2] - -[ext_resource path="res://tiles_demo.png" type="Texture" id=1] - -[sub_resource type="ConvexPolygonShape2D" id=1] - -custom_solver_bias = 0.0 -points = PoolVector2Array( 32, -24, 32, 32, -32, 32, -32, -24 ) - -[sub_resource type="ConvexPolygonShape2D" id=2] - -custom_solver_bias = 0.0 -points = PoolVector2Array( -32, -24, 24, -24, 24, 32, -32, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=3] - -custom_solver_bias = 0.0 -points = PoolVector2Array( 32, -32, 32, 32, -32, 32, -32, -32 ) - -[sub_resource type="ConvexPolygonShape2D" id=4] - -custom_solver_bias = 0.0 -points = PoolVector2Array( -32, -56, 32, 8, 32, 64, -32, 64 ) - -[sub_resource type="ConvexPolygonShape2D" id=5] - -custom_solver_bias = 0.0 -points = PoolVector2Array( -32, -32, 24, -32, 24, 32, -32, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=6] - -custom_solver_bias = 0.0 -points = PoolVector2Array( 32, -24, 32, 24, -32, 24, -32, -24 ) - -[sub_resource type="ConvexPolygonShape2D" id=7] - -custom_solver_bias = 0.0 -points = PoolVector2Array( 24, -24, 24, 24, -32, 24, -32, -24 ) - -[sub_resource type="ConvexPolygonShape2D" id=8] - -custom_solver_bias = 0.0 -points = PoolVector2Array( -32, -32, 24, -32, 24, 32, -32, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=9] - -custom_solver_bias = 0.0 -points = PoolVector2Array( -64, -32, -8, -32, -8, 32, -64, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=10] - -custom_solver_bias = 0.0 -points = PoolVector2Array( -32, -32, 24, -32, 32, -24, 32, 32, -32, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=11] - -custom_solver_bias = 0.0 -points = PoolVector2Array( -32, -24, 32, -24, 32, 32, -32, 32 ) - -[sub_resource type="ConvexPolygonShape2D" id=12] - -custom_solver_bias = 0.0 -points = PoolVector2Array( -32, -24, 32, -24, 32, 32, -32, 32 ) - -[resource] - -0/name = "floor" -0/texture = ExtResource( 1 ) -0/tex_offset = Vector2( 0, 0 ) -0/modulate = Color( 1, 1, 1, 1 ) -0/region = Rect2( 0, 0, 64, 64 ) -0/occluder_offset = Vector2( 32, 32 ) -0/navigation_offset = Vector2( 32, 32 ) -0/shapes = [ { -"one_way": false, -"shape": SubResource( 1 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 32 ) -} ] -1/name = "edge" -1/texture = ExtResource( 1 ) -1/tex_offset = Vector2( 0, 0 ) -1/modulate = Color( 1, 1, 1, 1 ) -1/region = Rect2( 64, 0, 64, 64 ) -1/occluder_offset = Vector2( 32, 32 ) -1/navigation_offset = Vector2( 32, 32 ) -1/shapes = [ { -"one_way": false, -"shape": SubResource( 2 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 32 ) -} ] -2/name = "wall" -2/texture = ExtResource( 1 ) -2/tex_offset = Vector2( 0, 0 ) -2/modulate = Color( 1, 1, 1, 1 ) -2/region = Rect2( 64, 64, 64, 64 ) -2/occluder_offset = Vector2( 32, 32 ) -2/navigation_offset = Vector2( 32, 32 ) -2/shapes = [ { -"one_way": false, -"shape": SubResource( 8 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 32 ) -} ] -3/name = "wall_deco" -3/texture = ExtResource( 1 ) -3/tex_offset = Vector2( 0, 0 ) -3/modulate = Color( 1, 1, 1, 1 ) -3/region = Rect2( 320, 128, 128, 64 ) -3/occluder_offset = Vector2( 64, 32 ) -3/navigation_offset = Vector2( 64, 32 ) -3/shapes = [ { -"one_way": false, -"shape": SubResource( 9 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 64, 32 ) -} ] -4/name = "corner" -4/texture = ExtResource( 1 ) -4/tex_offset = Vector2( 0, 0 ) -4/modulate = Color( 1, 1, 1, 1 ) -4/region = Rect2( 64, 128, 64, 64 ) -4/occluder_offset = Vector2( 32, 32 ) -4/navigation_offset = Vector2( 32, 32 ) -4/shapes = [ { -"one_way": false, -"shape": SubResource( 10 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 32 ) -} ] -5/name = "flowers" -5/texture = ExtResource( 1 ) -5/tex_offset = Vector2( 0, 0 ) -5/modulate = Color( 1, 1, 1, 1 ) -5/region = Rect2( 192, 192, 64, 64 ) -5/occluder_offset = Vector2( 32, 32 ) -5/navigation_offset = Vector2( 32, 32 ) -5/shapes = [ { -"one_way": false, -"shape": SubResource( 11 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 32 ) -} ] -6/name = "tree_base" -6/texture = ExtResource( 1 ) -6/tex_offset = Vector2( 0, 0 ) -6/modulate = Color( 1, 1, 1, 1 ) -6/region = Rect2( 256, 192, 64, 64 ) -6/occluder_offset = Vector2( 32, 32 ) -6/navigation_offset = Vector2( 32, 32 ) -6/shapes = [ { -"one_way": false, -"shape": SubResource( 12 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 32 ) -} ] -7/name = "tree_mid" -7/texture = ExtResource( 1 ) -7/tex_offset = Vector2( 0, 0 ) -7/modulate = Color( 1, 1, 1, 1 ) -7/region = Rect2( 256, 128, 64, 64 ) -7/occluder_offset = Vector2( 32, 32 ) -7/navigation_offset = Vector2( 32, 32 ) -7/shapes = [ ] -8/name = "tree_mid 2" -8/texture = ExtResource( 1 ) -8/tex_offset = Vector2( 0, 0 ) -8/modulate = Color( 1, 1, 1, 1 ) -8/region = Rect2( 256, 64, 64, 64 ) -8/occluder_offset = Vector2( 32, 32 ) -8/navigation_offset = Vector2( 32, 32 ) -8/shapes = [ ] -9/name = "tree_top" -9/texture = ExtResource( 1 ) -9/tex_offset = Vector2( 0, 0 ) -9/modulate = Color( 1, 1, 1, 1 ) -9/region = Rect2( 256, 0, 64, 64 ) -9/occluder_offset = Vector2( 32, 32 ) -9/navigation_offset = Vector2( 32, 32 ) -9/shapes = [ ] -10/name = "solid" -10/texture = ExtResource( 1 ) -10/tex_offset = Vector2( 0, 0 ) -10/modulate = Color( 1, 1, 1, 1 ) -10/region = Rect2( 0, 64, 64, 64 ) -10/occluder_offset = Vector2( 32, 32 ) -10/navigation_offset = Vector2( 32, 32 ) -10/shapes = [ ] -11/name = "ceiling" -11/texture = ExtResource( 1 ) -11/tex_offset = Vector2( 0, 0 ) -11/modulate = Color( 1, 1, 1, 1 ) -11/region = Rect2( 384, 64, 64, 64 ) -11/occluder_offset = Vector2( 32, 32 ) -11/navigation_offset = Vector2( 32, 32 ) -11/shapes = [ { -"one_way": false, -"shape": SubResource( 3 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 32 ) -} ] -12/name = "ramp" -12/texture = ExtResource( 1 ) -12/tex_offset = Vector2( 0, 0 ) -12/modulate = Color( 1, 1, 1, 1 ) -12/region = Rect2( 128, 128, 64, 128 ) -12/occluder_offset = Vector2( 32, 64 ) -12/navigation_offset = Vector2( 32, 64 ) -12/shapes = [ { -"one_way": false, -"shape": SubResource( 4 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 64 ) -} ] -13/name = "ceiling2wall" -13/texture = ExtResource( 1 ) -13/tex_offset = Vector2( 0, 0 ) -13/modulate = Color( 1, 1, 1, 1 ) -13/region = Rect2( 448, 64, 64, 64 ) -13/occluder_offset = Vector2( 32, 32 ) -13/navigation_offset = Vector2( 32, 32 ) -13/shapes = [ { -"one_way": false, -"shape": SubResource( 5 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 32 ) -} ] -14/name = "platform_floor" -14/texture = ExtResource( 1 ) -14/tex_offset = Vector2( 0, 0 ) -14/modulate = Color( 1, 1, 1, 1 ) -14/region = Rect2( 128, 0, 64, 64 ) -14/occluder_offset = Vector2( 32, 32 ) -14/navigation_offset = Vector2( 32, 32 ) -14/shapes = [ { -"one_way": false, -"shape": SubResource( 6 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 32 ) -} ] -15/name = "platform_edge" -15/texture = ExtResource( 1 ) -15/tex_offset = Vector2( 0, 0 ) -15/modulate = Color( 1, 1, 1, 1 ) -15/region = Rect2( 192, 0, 64, 64 ) -15/occluder_offset = Vector2( 32, 32 ) -15/navigation_offset = Vector2( 32, 32 ) -15/shapes = [ { -"one_way": false, -"shape": SubResource( 7 ), -"shape_transform": Transform2D( 1, 0, 0, 1, 32, 32 ) -} ] - diff --git a/2d/platformer/TilesetEdit.tscn b/2d/platformer/TilesetEdit.tscn deleted file mode 100644 index 7b0153a3..00000000 --- a/2d/platformer/TilesetEdit.tscn +++ /dev/null @@ -1,324 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://tiles_demo.png" type="Texture" id=1] - -[node name="Node" type="Node"] - -[node name="floor" type="Sprite" parent="."] - -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 0, 0, 64, 64 ) - -[node name="collision" type="StaticBody2D" parent="floor"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="floor/collision"] - -build_mode = 0 -polygon = PoolVector2Array( 32, -24, 32, 32, -32, 32, -32, -24 ) - -[node name="edge" type="Sprite" parent="."] - -position = Vector2( 64, 0 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 64, 0, 64, 64 ) - -[node name="collision" type="StaticBody2D" parent="edge"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="edge/collision"] - -build_mode = 0 -polygon = PoolVector2Array( -32, -24, 24, -24, 24, 32, -32, 32 ) - -[node name="wall" type="Sprite" parent="."] - -position = Vector2( 64, 64 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 64, 64, 64, 64 ) - -[node name="collision" type="StaticBody2D" parent="wall"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="wall/collision"] - -build_mode = 0 -polygon = PoolVector2Array( -32, -32, 24, -32, 24, 32, -32, 32 ) - -[node name="wall_deco" type="Sprite" parent="."] - -position = Vector2( 96, 128 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 320, 128, 128, 64 ) - -[node name="collision" type="StaticBody2D" parent="wall_deco"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="wall_deco/collision"] - -build_mode = 0 -polygon = PoolVector2Array( -64, -32, -8, -32, -8, 32, -64, 32 ) - -[node name="corner" type="Sprite" parent="."] - -position = Vector2( 64, 192 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 64, 128, 64, 64 ) - -[node name="collision" type="StaticBody2D" parent="corner"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="corner/collision"] - -build_mode = 0 -polygon = PoolVector2Array( -32, -32, 24, -32, 32, -24, 32, 32, -32, 32 ) - -[node name="flowers" type="Sprite" parent="."] - -position = Vector2( 128, 192 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 192, 192, 64, 64 ) - -[node name="collision" type="StaticBody2D" parent="flowers"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="flowers/collision"] - -build_mode = 0 -polygon = PoolVector2Array( -32, 32, 32, 32, 32, -24, -32, -24 ) - -[node name="tree_base" type="Sprite" parent="."] - -position = Vector2( 192, 192 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 256, 192, 64, 64 ) - -[node name="collision" type="StaticBody2D" parent="tree_base"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="tree_base/collision"] - -build_mode = 0 -polygon = PoolVector2Array( -32, 32, 32, 32, 32, -24, -32, -24 ) - -[node name="tree_mid" type="Sprite" parent="."] - -position = Vector2( 192, 128 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 256, 128, 64, 64 ) - -[node name="tree_mid 2" type="Sprite" parent="."] - -position = Vector2( 192, 64 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 256, 64, 64, 64 ) - -[node name="tree_top" type="Sprite" parent="."] - -position = Vector2( 192, 0 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 256, 0, 64, 64 ) - -[node name="solid" type="Sprite" parent="."] - -position = Vector2( 0, 64 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 0, 64, 64, 64 ) - -[node name="ceiling" type="Sprite" parent="."] - -position = Vector2( 0, 128 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 384, 64, 64, 64 ) - -[node name="collision" type="StaticBody2D" parent="ceiling"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="ceiling/collision"] - -build_mode = 0 -polygon = PoolVector2Array( 32, -32, 32, 32, -32, 32, -32, -32 ) - -[node name="ramp" type="Sprite" parent="."] - -position = Vector2( 256, 224 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 128, 128, 64, 128 ) - -[node name="collision" type="StaticBody2D" parent="ramp"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="ramp/collision"] - -build_mode = 0 -polygon = PoolVector2Array( -32, -56, 32, 8, 32, 64, -32, 64 ) - -[node name="ceiling2wall" type="Sprite" parent="."] - -position = Vector2( 0, 192 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 448, 64, 64, 64 ) - -[node name="collision" type="StaticBody2D" parent="ceiling2wall"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="ceiling2wall/collision"] - -build_mode = 0 -polygon = PoolVector2Array( -32, -32, 24, -32, 24, 32, -32, 32 ) - -[node name="platform_floor" type="Sprite" parent="."] - -position = Vector2( 0, 256 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 128, 0, 64, 64 ) - -[node name="collision" type="StaticBody2D" parent="platform_floor"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="platform_floor/collision"] - -build_mode = 0 -polygon = PoolVector2Array( 32, -24, 32, 24, -32, 24, -32, -24 ) - -[node name="platform_edge" type="Sprite" parent="."] - -position = Vector2( 64, 256 ) -texture = ExtResource( 1 ) -region_enabled = true -region_rect = Rect2( 192, 0, 64, 64 ) - -[node name="collision" type="StaticBody2D" parent="platform_edge"] - -input_pickable = false -collision_layer = 1 -collision_mask = 1 -constant_linear_velocity = Vector2( 0, 0 ) -constant_angular_velocity = 0.0 -friction = 1.0 -bounce = 0.0 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="platform_edge/collision"] - -build_mode = 0 -polygon = PoolVector2Array( 24, -24, 24, 24, -32, 24, -32, -24 ) - -[node name="help" type="Label" parent="."] - -anchor_left = 0.0 -anchor_top = 0.0 -anchor_right = 0.0 -anchor_bottom = 0.0 -margin_left = 1.0 -margin_top = 331.0 -margin_right = 727.0 -margin_bottom = 422.0 -rect_pivot_offset = Vector2( 0, 0 ) -rect_clip_content = false -mouse_filter = 2 -size_flags_horizontal = 2 -size_flags_vertical = 0 -text = "This scene serves as a tool for editing the tileset. -Nodes (sprites) and their respective collisionsare edited here. - -To create a tileset from this, a \"TileSet\" resoucre must be created. Use the helper in: Scene -> Convert To -> TileSet. -This will save a tileset. Saving over it will merge your changes. - -Finally, the saved tileset resource (tileset.tres in this case), can be opened to be used into a TileMap node for editing a tile map." -percent_visible = 1.0 -lines_skipped = 0 -max_lines_visible = -1 - - diff --git a/2d/platformer/background/scroll_bg_cloud_1.png b/2d/platformer/assets/art/background/cloud_1.png similarity index 100% rename from 2d/platformer/background/scroll_bg_cloud_1.png rename to 2d/platformer/assets/art/background/cloud_1.png diff --git a/2d/platformer/player/osb_jump.png.import b/2d/platformer/assets/art/background/cloud_1.png.import similarity index 69% rename from 2d/platformer/player/osb_jump.png.import rename to 2d/platformer/assets/art/background/cloud_1.png.import index 14db95e3..720169ee 100644 --- a/2d/platformer/player/osb_jump.png.import +++ b/2d/platformer/assets/art/background/cloud_1.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/osb_jump.png-0d4d2b2d1a7d2c11e3e4fd800b8589ed.stex" +path="res://.import/cloud_1.png-03c0ad8be397b731df0dd38fa3c87727.stex" metadata={ "vram_texture": false } [deps] -source_file="res://player/osb_jump.png" -dest_files=[ "res://.import/osb_jump.png-0d4d2b2d1a7d2c11e3e4fd800b8589ed.stex" ] +source_file="res://assets/art/background/cloud_1.png" +dest_files=[ "res://.import/cloud_1.png-03c0ad8be397b731df0dd38fa3c87727.stex" ] [params] diff --git a/2d/platformer/background/scroll_bg_cloud_2.png b/2d/platformer/assets/art/background/cloud_2.png similarity index 100% rename from 2d/platformer/background/scroll_bg_cloud_2.png rename to 2d/platformer/assets/art/background/cloud_2.png diff --git a/2d/platformer/assets/art/background/cloud_2.png.import b/2d/platformer/assets/art/background/cloud_2.png.import new file mode 100644 index 00000000..7fa52aad --- /dev/null +++ b/2d/platformer/assets/art/background/cloud_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/cloud_2.png-4ddf8c5bceca4aa07a8bc86d7d788e02.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/art/background/cloud_2.png" +dest_files=[ "res://.import/cloud_2.png-4ddf8c5bceca4aa07a8bc86d7d788e02.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/2d/platformer/background/scroll_bg_cloud_3.png b/2d/platformer/assets/art/background/cloud_3.png similarity index 100% rename from 2d/platformer/background/scroll_bg_cloud_3.png rename to 2d/platformer/assets/art/background/cloud_3.png diff --git a/2d/platformer/assets/art/background/cloud_3.png.import b/2d/platformer/assets/art/background/cloud_3.png.import new file mode 100644 index 00000000..67c7f71c --- /dev/null +++ b/2d/platformer/assets/art/background/cloud_3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/cloud_3.png-a1b7dc71aa84bea9cb4f78f585dcc65d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/art/background/cloud_3.png" +dest_files=[ "res://.import/cloud_3.png-a1b7dc71aa84bea9cb4f78f585dcc65d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/2d/platformer/assets/art/background/distant_platforms_1.png b/2d/platformer/assets/art/background/distant_platforms_1.png new file mode 100644 index 0000000000000000000000000000000000000000..99821f356b51b81309f06a9212b6df201ee6a66a GIT binary patch literal 5203 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 HWXAp+-!hgl#x{#tEW-;*sVODVg` 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 Crp2%T literal 0 HcmV?d00001 diff --git a/2d/platformer/assets/art/background/distant_platforms_2.png.import b/2d/platformer/assets/art/background/distant_platforms_2.png.import new file mode 100644 index 00000000..73225a0e --- /dev/null +++ b/2d/platformer/assets/art/background/distant_platforms_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/distant_platforms_2.png-ba010b30987da6d74062ce964ab450ef.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/art/background/distant_platforms_2.png" +dest_files=[ "res://.import/distant_platforms_2.png-ba010b30987da6d74062ce964ab450ef.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/2d/platformer/background/scroll_bg_sky.png b/2d/platformer/assets/art/background/sky.png similarity index 100% rename from 2d/platformer/background/scroll_bg_sky.png rename to 2d/platformer/assets/art/background/sky.png diff --git a/2d/platformer/player/osb_fire.png.import b/2d/platformer/assets/art/background/sky.png.import similarity index 70% rename from 2d/platformer/player/osb_fire.png.import rename to 2d/platformer/assets/art/background/sky.png.import index 8dc16ac3..535ab1c6 100644 --- a/2d/platformer/player/osb_fire.png.import +++ b/2d/platformer/assets/art/background/sky.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/osb_fire.png-67a49910acd764fd7c67429af0ad5cb8.stex" +path="res://.import/sky.png-c175b712c46edc17f2b5fc55b9de3c49.stex" metadata={ "vram_texture": false } [deps] -source_file="res://player/osb_fire.png" -dest_files=[ "res://.import/osb_fire.png-67a49910acd764fd7c67429af0ad5cb8.stex" ] +source_file="res://assets/art/background/sky.png" +dest_files=[ "res://.import/sky.png-c175b712c46edc17f2b5fc55b9de3c49.stex" ] [params] diff --git a/2d/platformer/coin/coin.png b/2d/platformer/assets/art/coin/coin.png similarity index 100% rename from 2d/platformer/coin/coin.png rename to 2d/platformer/assets/art/coin/coin.png diff --git a/2d/platformer/coin/coin.png.import b/2d/platformer/assets/art/coin/coin.png.import similarity index 71% rename from 2d/platformer/coin/coin.png.import rename to 2d/platformer/assets/art/coin/coin.png.import index d63f0ad6..6efc0524 100644 --- a/2d/platformer/coin/coin.png.import +++ b/2d/platformer/assets/art/coin/coin.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/coin.png-c9e5c2f51b2a10beb2d794afbbee004f.stex" +path="res://.import/coin.png-87689993f83db6056500d4fa153313d8.stex" metadata={ "vram_texture": false } [deps] -source_file="res://coin/coin.png" -dest_files=[ "res://.import/coin.png-c9e5c2f51b2a10beb2d794afbbee004f.stex" ] +source_file="res://assets/art/coin/coin.png" +dest_files=[ "res://.import/coin.png-87689993f83db6056500d4fa153313d8.stex" ] [params] diff --git a/2d/platformer/enemy/enemy.png b/2d/platformer/assets/art/enemy/enemy.png similarity index 100% rename from 2d/platformer/enemy/enemy.png rename to 2d/platformer/assets/art/enemy/enemy.png diff --git a/2d/platformer/enemy/enemy.png.import b/2d/platformer/assets/art/enemy/enemy.png.import similarity index 71% rename from 2d/platformer/enemy/enemy.png.import rename to 2d/platformer/assets/art/enemy/enemy.png.import index a7c3f0b9..e8eb575f 100644 --- a/2d/platformer/enemy/enemy.png.import +++ b/2d/platformer/assets/art/enemy/enemy.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/enemy.png-1891d9038eeed672a2459bc4e7db5910.stex" +path="res://.import/enemy.png-c2f48b2558d3b68a547452306041a310.stex" metadata={ "vram_texture": false } [deps] -source_file="res://enemy/enemy.png" -dest_files=[ "res://.import/enemy.png-1891d9038eeed672a2459bc4e7db5910.stex" ] +source_file="res://assets/art/enemy/enemy.png" +dest_files=[ "res://.import/enemy.png-c2f48b2558d3b68a547452306041a310.stex" ] [params] diff --git a/2d/platformer/assets/art/platforms/moving_platform.png b/2d/platformer/assets/art/platforms/moving_platform.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d7ce398f98c40191c9e378e8a2d6637f2c7f47 GIT binary patch literal 1037 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 Bw`BkT diff --git a/2d/platformer/background/scroll_bg_fg_1.png.import b/2d/platformer/background/scroll_bg_fg_1.png.import deleted file mode 100644 index 08be05e9..00000000 --- a/2d/platformer/background/scroll_bg_fg_1.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/scroll_bg_fg_1.png-20c90ebded5095c6863cdf6b1b82882d.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://background/scroll_bg_fg_1.png" -dest_files=[ "res://.import/scroll_bg_fg_1.png-20c90ebded5095c6863cdf6b1b82882d.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=1 -flags/filter=false -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=true -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -stream=false -size_limit=0 -detect_3d=false -svg/scale=1.0 diff --git a/2d/platformer/background/scroll_bg_fg_2.png b/2d/platformer/background/scroll_bg_fg_2.png deleted file mode 100644 index d1e7480f7b4b25ac3dc3acc26482632c8ac970da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6003 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 DS3&P< diff --git a/2d/platformer/player/bullet.gd b/2d/platformer/player/bullet.gd deleted file mode 100644 index 49708fbc..00000000 --- a/2d/platformer/player/bullet.gd +++ /dev/null @@ -1,11 +0,0 @@ -extends RigidBody2D - -class_name Bullet - - -func _on_bullet_body_enter(body): - if body.has_method("hit_by_bullet"): - body.call("hit_by_bullet") - -func _on_Timer_timeout(): - ($Anim as AnimationPlayer).play("shutdown") diff --git a/2d/platformer/player/osb_left.png.import b/2d/platformer/player/osb_left.png.import deleted file mode 100644 index 02a50bd1..00000000 --- a/2d/platformer/player/osb_left.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/osb_left.png-95ec3a371455889d592aa8cae0a755bc.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://player/osb_left.png" -dest_files=[ "res://.import/osb_left.png-95ec3a371455889d592aa8cae0a755bc.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=0 -flags/filter=false -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=true -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -stream=false -size_limit=0 -detect_3d=false -svg/scale=1.0 diff --git a/2d/platformer/player/osb_right.png.import b/2d/platformer/player/osb_right.png.import deleted file mode 100644 index 35a3522c..00000000 --- a/2d/platformer/player/osb_right.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/osb_right.png-db9bb4651315f3d42b87bd17a86cce76.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://player/osb_right.png" -dest_files=[ "res://.import/osb_right.png-db9bb4651315f3d42b87bd17a86cce76.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=0 -flags/filter=false -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=true -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -stream=false -size_limit=0 -detect_3d=false -svg/scale=1.0 diff --git a/2d/platformer/player/player.gd b/2d/platformer/player/player.gd deleted file mode 100644 index 681f6573..00000000 --- a/2d/platformer/player/player.gd +++ /dev/null @@ -1,97 +0,0 @@ -extends KinematicBody2D - -class_name Player - - -const GRAVITY_VEC = Vector2(0, 900) -const FLOOR_NORMAL = Vector2(0, -1) -const SLOPE_SLIDE_STOP = 25.0 -const WALK_SPEED = 250 # pixels/sec -const JUMP_SPEED = 480 -const SIDING_CHANGE_SPEED = 10 -const BULLET_VELOCITY = 1000 -const SHOOT_TIME_SHOW_WEAPON = 0.2 - -var linear_vel = Vector2() -var shoot_time = 99999 # time since last shot - -var anim = "" - -# cache the sprite here for fast access (we will set scale to flip it often) -onready var sprite = $Sprite -# cache bullet for fast access -var Bullet = preload("res://player/Bullet.tscn") - - -func _physics_process(delta): - # Increment counters - shoot_time += delta - - ### MOVEMENT ### - - # Apply gravity - linear_vel += delta * GRAVITY_VEC - # Move and slide - linear_vel = move_and_slide(linear_vel, FLOOR_NORMAL, SLOPE_SLIDE_STOP) - # Detect if we are on floor - only works if called *after* move_and_slide - var on_floor = is_on_floor() - - ### CONTROL ### - - # Horizontal movement - var target_speed = 0 - if Input.is_action_pressed("move_left"): - target_speed -= 1 - if Input.is_action_pressed("move_right"): - target_speed += 1 - - target_speed *= WALK_SPEED - linear_vel.x = lerp(linear_vel.x, target_speed, 0.1) - - # Jumping - if on_floor and Input.is_action_just_pressed("jump"): - linear_vel.y = -JUMP_SPEED - ($SoundJump as AudioStreamPlayer2D).play() - - # Shooting - if Input.is_action_just_pressed("shoot"): - var bullet = Bullet.instance() - bullet.position = ($Sprite/BulletShoot as Position2D).global_position # use node for shoot position - bullet.linear_velocity = Vector2(sprite.scale.x * BULLET_VELOCITY, 0) - bullet.add_collision_exception_with(self) # don't want player to collide with bullet - get_parent().add_child(bullet) # don't want bullet to move with me, so add it as child of parent - ($SoundShoot as AudioStreamPlayer2D).play() - shoot_time = 0 - - ### ANIMATION ### - - var new_anim = "idle" - - if on_floor: - if linear_vel.x < -SIDING_CHANGE_SPEED: - sprite.scale.x = -1 - new_anim = "run" - - if linear_vel.x > SIDING_CHANGE_SPEED: - sprite.scale.x = 1 - new_anim = "run" - else: - # We want the character to immediately change facing side when the player - # tries to change direction, during air control. - # This allows for example the player to shoot quickly left then right. - if Input.is_action_pressed("move_left") and not Input.is_action_pressed("move_right"): - sprite.scale.x = -1 - if Input.is_action_pressed("move_right") and not Input.is_action_pressed("move_left"): - sprite.scale.x = 1 - - if linear_vel.y < 0: - new_anim = "jumping" - else: - new_anim = "falling" - - if shoot_time < SHOOT_TIME_SHOW_WEAPON: - new_anim += "_weapon" - - if new_anim != anim: - anim = new_anim - ($Anim as AnimationPlayer).play(anim) diff --git a/2d/platformer/project.godot b/2d/platformer/project.godot index bbd89f03..9350ec7a 100644 --- a/2d/platformer/project.godot +++ b/2d/platformer/project.godot @@ -9,43 +9,49 @@ config_version=4 _global_script_classes=[ { +"base": "KinematicBody2D", +"class": "Actor", +"language": "GDScript", +"path": "res://src/Actors/Actor.gd" +}, { "base": "RigidBody2D", "class": "Bullet", "language": "GDScript", -"path": "res://player/bullet.gd" +"path": "res://src/Objects/Bullet.gd" }, { "base": "Area2D", "class": "Coin", "language": "GDScript", -"path": "res://coin/coin.gd" +"path": "res://src/Objects/Coin.gd" }, { -"base": "KinematicBody2D", +"base": "Actor", "class": "Enemy", "language": "GDScript", -"path": "res://enemy/enemy.gd" +"path": "res://src/Actors/Enemy.gd" }, { -"base": "Node2D", -"class": "MovingPlatform", +"base": "Position2D", +"class": "Gun", "language": "GDScript", -"path": "res://platform/moving_platform.gd" +"path": "res://src/Actors/Gun.gd" }, { -"base": "KinematicBody2D", +"base": "Actor", "class": "Player", "language": "GDScript", -"path": "res://player/player.gd" +"path": "res://src/Actors/Player.gd" } ] _global_script_class_icons={ +"Actor": "", "Bullet": "", "Coin": "", "Enemy": "", -"MovingPlatform": "", +"Gun": "", "Player": "" } [application] config/name="Platformer 2D" -run/main_scene="res://Stage.tscn" +run/main_scene="res://src/Main/Game.tscn" config/icon="res://icon.png" target_fps="60" @@ -61,8 +67,11 @@ gdscript/warnings/unsafe_call_argument=true window/size/width=800 window/size/height=480 +window/size/test_width=1600 +window/size/test_height=960 +window/dpi/allow_hidpi=true window/stretch/mode="2d" -window/stretch/aspect="keep_height" +window/stretch/aspect="expand" stretch/aspect="keep_height" stretch/mode="2d" @@ -80,18 +89,21 @@ jump={ "deadzone": 0.5, "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"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,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null) ] } move_left={ "deadzone": 0.5, "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"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,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null) ] } move_right={ "deadzone": 0.5, "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"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,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null) ] } shoot={ @@ -99,6 +111,7 @@ shoot={ "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"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) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":90,"unicode":0,"echo":false,"script":null) +, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) ] } spawn={ @@ -107,6 +120,25 @@ spawn={ , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) ] } +toggle_fullscreen={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777254,"unicode":0,"echo":false,"script":null) + ] +} +toggle_pause={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"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) + ] +} + +[layer_names] + +2d_physics/layer_1="player" +2d_physics/layer_2="enemies" +2d_physics/layer_3="coins" +2d_physics/layer_4="platforms" +2d_physics/layer_5="ground" [physics] @@ -124,9 +156,9 @@ mipmap_policy=1 quality/intended_usage/framebuffer_allocation=0 quality/intended_usage/framebuffer_allocation.mobile=1 +quality/2d/use_pixel_snap=true quality/filters/anisotropic_filter_level=2 quality/filters/use_nearest_mipmap_filter=true -quality/voxel_cone_tracing/high_quality=false quality/depth/hdr=false [texture_import] diff --git a/2d/platformer/src/Actors/Actor.gd b/2d/platformer/src/Actors/Actor.gd new file mode 100644 index 00000000..980768f4 --- /dev/null +++ b/2d/platformer/src/Actors/Actor.gd @@ -0,0 +1,18 @@ +extends KinematicBody2D +class_name Actor + +# 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(400.0, 500.0) +export var gravity = 3500.0 + +const FLOOR_NORMAL = Vector2.UP + +var _velocity = Vector2.ZERO + +# _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 diff --git a/2d/platformer/src/Actors/Enemy.gd b/2d/platformer/src/Actors/Enemy.gd new file mode 100644 index 00000000..6db70ac0 --- /dev/null +++ b/2d/platformer/src/Actors/Enemy.gd @@ -0,0 +1,78 @@ +extends Actor +class_name Enemy + + +onready var platform_detector = $PlatformDetector +onready var floor_detector_left = $FloorDetectorLeft +onready var floor_detector_right = $FloorDetectorRight +onready var sprite = $Sprite +onready var animation_player = $AnimationPlayer + +enum State {WALKING, DEAD} + +var _state = State.WALKING + +# 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): + _velocity = calculate_move_velocity(_velocity) + + # We only update the y value of _velocity as we want to handle the horizontal movement ourselves. + _velocity.y = move_and_slide(_velocity, FLOOR_NORMAL).y + + # We flip the Sprite depending on which way the enemy is moving. + sprite.scale.x = 1 if _velocity.x > 0 else -1 + + var animation = get_new_animation() + if animation != animation_player.current_animation: + animation_player.play(animation) + + +func destroy(): + _state = State.DEAD + _velocity = Vector2.ZERO + + +# This function calculates a new velocity whenever you need it. +# If the enemy encounters a wall or an edge, the horizontal velocity is flipped. +func calculate_move_velocity( + linear_velocity + ): + var velocity = linear_velocity + + 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 + + return velocity + + +func get_new_animation(): + var animation_new = "" + if _state == State.WALKING: + animation_new = "walk" if abs(_velocity.x) > 0 else "idle" + else: + animation_new = "destroy" + return animation_new diff --git a/2d/platformer/enemy/Enemy.tscn b/2d/platformer/src/Actors/Enemy.tscn similarity index 52% rename from 2d/platformer/enemy/Enemy.tscn rename to 2d/platformer/src/Actors/Enemy.tscn index 501f08dc..ae55902c 100644 --- a/2d/platformer/enemy/Enemy.tscn +++ b/2d/platformer/src/Actors/Enemy.tscn @@ -1,15 +1,16 @@ -[gd_scene load_steps=13 format=2] +[gd_scene load_steps=15 format=2] -[ext_resource path="res://enemy/enemy.gd" type="Script" id=1] -[ext_resource path="res://enemy/enemy.png" type="Texture" id=2] -[ext_resource path="res://player/bullet.png" type="Texture" id=3] -[ext_resource path="res://audio/sound_hit.wav" type="AudioStream" id=4] -[ext_resource path="res://audio/sound_explode.wav" type="AudioStream" id=5] +[ext_resource path="res://assets/art/player/bullet/bullet.png" type="Texture" 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="Texture" id=4] +[ext_resource path="res://src/Actors/Enemy.gd" type="Script" id=5] -[sub_resource type="Animation" id=1] -resource_name = "explode" -length = 5.0 -step = 0.0 +[sub_resource type="CanvasItemMaterial" id=1] + +[sub_resource type="Animation" id=2] +resource_name = "destroy" +length = 1.5 tracks/0/type = "value" tracks/0/path = NodePath("Sprite:frame") tracks/0/interp = 1 @@ -20,7 +21,7 @@ tracks/0/keys = { "times": PoolRealArray( 0 ), "transitions": PoolRealArray( 1 ), "update": 0, -"values": [ 0 ] +"values": [ 7 ] } tracks/1/type = "value" tracks/1/path = NodePath("Sprite:rotation_degrees") @@ -29,8 +30,8 @@ tracks/1/loop_wrap = true tracks/1/imported = false tracks/1/enabled = true tracks/1/keys = { -"times": PoolRealArray( 0, 3.2 ), -"transitions": PoolRealArray( 0.5, 1 ), +"times": PoolRealArray( 0, 0.8 ), +"transitions": PoolRealArray( 0.0796601, 1 ), "update": 0, "values": [ 0.0, 180.0 ] } @@ -41,10 +42,10 @@ tracks/2/loop_wrap = true tracks/2/imported = false tracks/2/enabled = true tracks/2/keys = { -"times": PoolRealArray( 2.6, 3.4 ), -"transitions": PoolRealArray( 1, 1 ), +"times": PoolRealArray( 0, 0.3, 0.9 ), +"transitions": PoolRealArray( 1, 1, 1 ), "update": 0, -"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] } tracks/3/type = "value" tracks/3/path = NodePath("Explosion:emitting") @@ -53,7 +54,7 @@ tracks/3/loop_wrap = true tracks/3/imported = false tracks/3/enabled = true tracks/3/keys = { -"times": PoolRealArray( 0, 2.8 ), +"times": PoolRealArray( 0, 0.8 ), "transitions": PoolRealArray( 1, 1 ), "update": 1, "values": [ false, true ] @@ -65,13 +66,13 @@ tracks/4/loop_wrap = true tracks/4/imported = false tracks/4/enabled = true tracks/4/keys = { -"times": PoolRealArray( 2.8, 3.4 ), +"times": PoolRealArray( 0.4, 0.8 ), "transitions": PoolRealArray( 1, 1 ), "update": 0, "values": [ 1.0, 4.0 ] } tracks/5/type = "value" -tracks/5/path = NodePath("SoundHit:playing") +tracks/5/path = NodePath("Hit:playing") tracks/5/interp = 1 tracks/5/loop_wrap = true tracks/5/imported = false @@ -83,13 +84,13 @@ tracks/5/keys = { "values": [ true ] } tracks/6/type = "value" -tracks/6/path = NodePath("SoundExplode:playing") +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 = { -"times": PoolRealArray( 2.9 ), +"times": PoolRealArray( 0.6 ), "transitions": PoolRealArray( 1 ), "update": 1, "values": [ true ] @@ -101,15 +102,39 @@ tracks/7/loop_wrap = true tracks/7/imported = false tracks/7/enabled = true tracks/7/keys = { -"times": PoolRealArray( 4.2 ), +"times": PoolRealArray( 1.5 ), "transitions": PoolRealArray( 1 ), "values": [ { "args": [ ], "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 = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ 0 ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Sprite:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0, 0.2, 0.4 ), +"transitions": PoolRealArray( 2.2974, 0.183011, 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ), Vector2( 0, -32 ), Vector2( 0, 0 ) ] +} -[sub_resource type="Animation" id=2] +[sub_resource type="Animation" id=3] length = 6.75 loop = true step = 0.25 @@ -126,8 +151,7 @@ tracks/0/keys = { "values": [ 5, 6, 5, 6, 5, 6, 7, 6, 7, 5 ] } -[sub_resource type="Animation" id=3] -resource_name = "walk" +[sub_resource type="Animation" id=4] length = 1.25 loop = true step = 0.25 @@ -144,8 +168,6 @@ tracks/0/keys = { "values": [ 0, 1, 2, 3, 4, 0 ] } -[sub_resource type="CanvasItemMaterial" id=4] - [sub_resource type="CapsuleShape2D" id=5] radius = 13.4556 height = 14.2002 @@ -153,58 +175,73 @@ height = 14.2002 [sub_resource type="CanvasItemMaterial" id=6] blend_mode = 1 -[sub_resource type="ParticlesMaterial" id=7] +[sub_resource type="Gradient" id=7] +offsets = PoolRealArray( 0.562963, 1 ) +colors = PoolColorArray( 1, 1, 1, 1, 0, 0, 0, 1 ) + +[sub_resource type="GradientTexture" id=8] +gradient = SubResource( 7 ) +width = 256 + +[sub_resource type="ParticlesMaterial" id=9] +emission_shape = 1 +emission_sphere_radius = 8.0 flag_disable_z = true -gravity = Vector3( 0, 98, 0 ) +spread = 180.0 +gravity = Vector3( 0, 250, 0 ) +initial_velocity = 120.0 +initial_velocity_random = 0.5 orbit_velocity = 0.0 orbit_velocity_random = 0.0 +angle = 720.0 +angle_random = 1.0 +scale = 0.4 +scale_random = 1.0 +color_ramp = SubResource( 8 ) +hue_variation = 0.05 +hue_variation_random = 0.46 [node name="Enemy" type="KinematicBody2D"] -script = ExtResource( 1 ) +collision_layer = 2 +collision_mask = 24 +script = ExtResource( 5 ) +speed = Vector2( 150, 500 ) +gravity = 1800.0 -[node name="Enabler" type="VisibilityEnabler2D" parent="."] -position = Vector2( 16.2569, 11.0034 ) -scale = Vector2( 23.5056, 10.8629 ) -pause_particles = false +[node name="PlatformDetector" type="RayCast2D" parent="."] +position = Vector2( 0, 12 ) +enabled = true +cast_to = Vector2( 0, 8 ) +collision_mask = 8 -[node name="Anim" type="AnimationPlayer" parent="."] -anims/explode = SubResource( 1 ) -anims/idle = SubResource( 2 ) -anims/walk = SubResource( 3 ) +[node name="FloorDetectorLeft" type="RayCast2D" parent="."] +position = Vector2( -30, -8 ) +enabled = true +cast_to = Vector2( 0, 70 ) +collision_mask = 24 + +[node name="FloorDetectorRight" type="RayCast2D" parent="."] +position = Vector2( 31.16, -8 ) +enabled = true +cast_to = Vector2( 0, 70 ) +collision_mask = 24 [node name="Sprite" type="Sprite" parent="."] -material = SubResource( 4 ) -texture = ExtResource( 2 ) +material = SubResource( 1 ) +texture = ExtResource( 4 ) flip_h = true hframes = 8 +frame = 5 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/destroy = SubResource( 2 ) +anims/idle = SubResource( 3 ) +anims/walk = SubResource( 4 ) [node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2( -0.00525069, -0.727495 ) rotation = -1.5708 shape = SubResource( 5 ) -[node name="DetectFloorLeft" type="RayCast2D" parent="."] -position = Vector2( -33.2868, -9.34363 ) -enabled = true -cast_to = Vector2( 0, 45 ) - -[node name="DetectWallLeft" type="RayCast2D" parent="."] -position = Vector2( -12.1361, -0.739977 ) -rotation = 1.5708 -enabled = true -cast_to = Vector2( 0, 20 ) - -[node name="DetectWallRight" type="RayCast2D" parent="."] -position = Vector2( 3.2788, -0.381488 ) -rotation = -1.5708 -enabled = true -cast_to = Vector2( 0, 20 ) - -[node name="DetectFloorRight" type="RayCast2D" parent="."] -position = Vector2( 29.1987, -9.34363 ) -enabled = true -cast_to = Vector2( 0, 45 ) - [node name="Explosion" type="Particles2D" parent="."] self_modulate = Color( 1, 1, 1, 0.12 ) material = SubResource( 6 ) @@ -213,13 +250,13 @@ amount = 32 lifetime = 0.5 one_shot = true speed_scale = 1.2 -explosiveness = 0.1 -process_material = SubResource( 7 ) -texture = ExtResource( 3 ) +explosiveness = 0.76 +draw_order = 215832976 +process_material = SubResource( 9 ) +texture = ExtResource( 1 ) -[node name="SoundHit" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource( 4 ) - -[node name="SoundExplode" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource( 5 ) +[node name="Hit" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource( 3 ) +[node name="Explode" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource( 2 ) diff --git a/2d/platformer/src/Actors/Gun.gd b/2d/platformer/src/Actors/Gun.gd new file mode 100644 index 00000000..588f2893 --- /dev/null +++ b/2d/platformer/src/Actors/Gun.gd @@ -0,0 +1,24 @@ +extends Position2D +class_name Gun +# Represents a weapon that spawns and shoots bullets. +# The Cooldown timer controls the cooldown duration between shots. + + +onready var sound_shoot = $Shoot +onready var timer = $Cooldown + +const Bullet = preload("res://src/Objects/Bullet.tscn") +const BULLET_VELOCITY = 1000.0 + + +func shoot(direction = 1): + if not timer.is_stopped(): + return false + var bullet = Bullet.instance() + bullet.global_position = global_position + bullet.linear_velocity = Vector2(direction * BULLET_VELOCITY, 0) + + bullet.set_as_toplevel(true) + add_child(bullet) + sound_shoot.play() + return true diff --git a/2d/platformer/src/Actors/Player.gd b/2d/platformer/src/Actors/Player.gd new file mode 100644 index 00000000..0b39f6f6 --- /dev/null +++ b/2d/platformer/src/Actors/Player.gd @@ -0,0 +1,96 @@ +extends Actor +class_name Player + + +const FLOOR_DETECT_DISTANCE = 40.0 + +onready var platform_detector = $PlatformDetector +onready var sprite = $Sprite +onready var animation_player = $AnimationPlayer +onready var shoot_timer = $ShootAnimation +onready var gun = $Sprite/Gun + + +# 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): + var direction = get_direction() + + var is_jump_interrupted = Input.is_action_just_released("jump") and _velocity.y < 0.0 + _velocity = calculate_move_velocity(_velocity, direction, speed, is_jump_interrupted) + + var snap_vector = Vector2.DOWN * FLOOR_DETECT_DISTANCE if direction.y == 0.0 else Vector2.ZERO + var is_on_platform = platform_detector.is_colliding() + _velocity = move_and_slide_with_snap( + _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 Sprite accordingly to flip it. + # This will make Robi face left or right depending on the direction you move. + if direction.x != 0: + sprite.scale.x = direction.x + + # 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"): + 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") - Input.get_action_strength("move_left"), + -Input.get_action_strength("jump") if is_on_floor() and Input.is_action_just_pressed("jump") else 0.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 + ): + var velocity = linear_velocity + velocity.x = speed.x * direction.x + if direction.y != 0.0: + velocity.y = speed.y * direction.y + if is_jump_interrupted: + velocity.y = 0.0 + return velocity + + +func get_new_animation(is_shooting = false): + var animation_new = "" + if is_on_floor(): + animation_new = "run" if abs(_velocity.x) > 0.1 else "idle" + else: + animation_new = "falling" if _velocity.y > 0 else "jumping" + if is_shooting: + animation_new += "_weapon" + return animation_new diff --git a/2d/platformer/player/Player.tscn b/2d/platformer/src/Actors/Player.tscn similarity index 74% rename from 2d/platformer/player/Player.tscn rename to 2d/platformer/src/Actors/Player.tscn index aacabf25..234d976d 100644 --- a/2d/platformer/player/Player.tscn +++ b/2d/platformer/src/Actors/Player.tscn @@ -1,13 +1,14 @@ -[gd_scene load_steps=20 format=2] +[gd_scene load_steps=21 format=2] -[ext_resource path="res://player/player.gd" type="Script" id=1] -[ext_resource path="res://player/robot_demo.png" type="Texture" id=2] -[ext_resource path="res://audio/sound_jump.wav" type="AudioStream" id=3] -[ext_resource path="res://audio/sound_shoot.wav" type="AudioStream" id=4] -[ext_resource path="res://player/osb_left.png" type="Texture" id=5] -[ext_resource path="res://player/osb_right.png" type="Texture" id=6] -[ext_resource path="res://player/osb_jump.png" type="Texture" id=7] -[ext_resource path="res://player/osb_fire.png" type="Texture" id=8] +[ext_resource path="res://src/Actors/Player.gd" type="Script" id=1] +[ext_resource path="res://assets/art/player/robot_demo.png" type="Texture" 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="Texture" id=5] +[ext_resource path="res://assets/art/ui/touch_button_right.png" type="Texture" id=6] +[ext_resource path="res://assets/art/ui/touch_button_jump.png" type="Texture" id=7] +[ext_resource path="res://assets/art/ui/touch_button_fire.png" type="Texture" id=8] +[ext_resource path="res://src/Actors/Gun.gd" type="Script" id=9] [sub_resource type="Animation" id=1] resource_name = "crouch" @@ -182,26 +183,47 @@ tracks/0/keys = { "values": [ 10, 11, 12, 13, 14, 5 ] } -[sub_resource type="CapsuleShape2D" id=11] -height = 44.4787 +[sub_resource type="RectangleShape2D" id=11] +extents = Vector2( 10, 27 ) [node name="Player" type="KinematicBody2D"] +collision_mask = 30 script = ExtResource( 1 ) +speed = Vector2( 300, 700 ) +gravity = 1800.0 + +[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="Sprite" type="Sprite" parent="."] +position = Vector2( 0, -28 ) texture = ExtResource( 2 ) vframes = 2 hframes = 16 -frame = 22 +frame = 16 -[node name="Smoke" type="Node2D" parent="Sprite"] -position = Vector2( 20.7312, 3.21187 ) -rotation = -1.45648 - -[node name="BulletShoot" type="Position2D" parent="Sprite"] +[node name="Gun" type="Position2D" parent="Sprite"] position = Vector2( 30.6589, 6.13176 ) +script = ExtResource( 9 ) -[node name="Anim" type="AnimationPlayer" parent="."] +[node name="Shoot" type="AudioStreamPlayer2D" parent="Sprite/Gun"] +position = Vector2( -30.6589, -6.13176 ) +stream = ExtResource( 4 ) + +[node name="Cooldown" type="Timer" parent="Sprite/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 ) @@ -214,20 +236,17 @@ anims/run_weapon = SubResource( 9 ) anims/standing_weapon_ready = SubResource( 10 ) [node name="Camera" type="Camera2D" parent="."] +position = Vector2( 0, -28 ) current = true -limit_left = 0 -limit_top = 0 +process_mode = 0 [node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2( 0.291992, -0.835023 ) +position = Vector2( 0, -27 ) shape = SubResource( 11 ) -[node name="SoundJump" type="AudioStreamPlayer2D" parent="."] +[node name="Jump" type="AudioStreamPlayer2D" parent="."] stream = ExtResource( 3 ) -[node name="SoundShoot" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource( 4 ) - [node name="UI" type="CanvasLayer" parent="."] layer = 0 @@ -247,23 +266,15 @@ passby_press = true action = "move_right" visibility_mode = 1 -[node name="BottomRightAnchor" type="Control" parent="UI"] -anchor_left = 1.0 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -margin_left = -40.0 -margin_top = -40.0 - -[node name="Jump" type="TouchScreenButton" parent="UI/BottomRightAnchor"] -position = Vector2( -98.151, -83.768 ) +[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/BottomRightAnchor"] -position = Vector2( -96.302, -180 ) +[node name="Fire" type="TouchScreenButton" parent="UI"] +position = Vector2( 668.073, 262.788 ) scale = Vector2( 1.49157, 1.46265 ) normal = ExtResource( 8 ) action = "shoot" diff --git a/2d/platformer/src/Level/Level.tscn b/2d/platformer/src/Level/Level.tscn new file mode 100644 index 00000000..7d335e7f --- /dev/null +++ b/2d/platformer/src/Level/Level.tscn @@ -0,0 +1,275 @@ +[gd_scene load_steps=11 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/Actors/Player.tscn" type="PackedScene" id=5] +[ext_resource path="res://assets/art/platforms/moving_platform.png" type="Texture" 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] + +[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": PoolRealArray( 0, 2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( 1414.49, 799.663 ), Vector2( 1131.8, 607.41 ) ] +} + +[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": PoolRealArray( 0, 4 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( -93.4945, 159.269 ), Vector2( -93.4945, 814.766 ) ] +} + +[node name="Level" type="Node2D"] +pause_mode = 1 + +[node name="TileMap" type="TileMap" parent="."] +tile_set = ExtResource( 1 ) +collision_layer = 16 +collision_mask = 0 +format = 1 +tile_data = PoolIntArray( -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, 536870922, 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, 536870922, 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, 536870922, 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( 539.755, 1147.54 ) + +[node name="Coin" parent="Coins/CoinsArc" instance=ExtResource( 4 )] +position = Vector2( -29.4628, 59.9619 ) + +[node name="Coin2" parent="Coins/CoinsArc" instance=ExtResource( 4 )] +position = Vector2( 0.171143, 0.141846 ) + +[node name="Coin3" parent="Coins/CoinsArc" instance=ExtResource( 4 )] +position = Vector2( 62.5472, -35.7081 ) + +[node name="CoinsVertical" type="Node2D" parent="Coins"] +position = Vector2( 732.045, 1037.88 ) + +[node name="Coin" parent="Coins/CoinsVertical" instance=ExtResource( 4 )] +position = Vector2( -0.110291, 31.8701 ) + +[node name="Coin2" parent="Coins/CoinsVertical" instance=ExtResource( 4 )] +position = Vector2( -0.110291, -0.129883 ) + +[node name="Coin3" parent="Coins/CoinsVertical" instance=ExtResource( 4 )] +position = Vector2( -0.110291, -32.1299 ) + +[node name="CoinsVertical2" type="Node2D" parent="Coins"] +position = Vector2( 1018.11, -17.9731 ) + +[node name="Coin" parent="Coins/CoinsVertical2" instance=ExtResource( 4 )] +position = Vector2( -0.110291, 31.8701 ) + +[node name="Coin2" parent="Coins/CoinsVertical2" instance=ExtResource( 4 )] +position = Vector2( -0.110291, -0.129883 ) + +[node name="Coin3" parent="Coins/CoinsVertical2" instance=ExtResource( 4 )] +position = Vector2( -0.110291, -32.1299 ) + +[node name="CoinsSquare" type="Node2D" parent="Coins"] +position = Vector2( -429.669, 323.199 ) + +[node name="Coin" parent="Coins/CoinsSquare" instance=ExtResource( 4 )] +position = Vector2( -32, -32 ) + +[node name="Coin2" parent="Coins/CoinsSquare" instance=ExtResource( 4 )] +position = Vector2( 32, -32 ) + +[node name="Coin3" parent="Coins/CoinsSquare" instance=ExtResource( 4 )] +position = Vector2( -32, 32 ) + +[node name="Coin4" parent="Coins/CoinsSquare" instance=ExtResource( 4 )] +position = Vector2( 32, 32 ) + +[node name="CoinsSquare2" type="Node2D" parent="Coins"] +position = Vector2( 695.105, 66.9483 ) + +[node name="Coin" parent="Coins/CoinsSquare2" instance=ExtResource( 4 )] +position = Vector2( -32, -32 ) + +[node name="Coin2" parent="Coins/CoinsSquare2" instance=ExtResource( 4 )] +position = Vector2( 32, -32 ) + +[node name="Coin3" parent="Coins/CoinsSquare2" instance=ExtResource( 4 )] +position = Vector2( -32, 32 ) + +[node name="Coin4" parent="Coins/CoinsSquare2" instance=ExtResource( 4 )] +position = Vector2( 32, 32 ) + +[node name="CoinsSquare3" type="Node2D" parent="Coins"] +position = Vector2( 1353.17, 117.285 ) + +[node name="Coin" parent="Coins/CoinsSquare3" instance=ExtResource( 4 )] +position = Vector2( -32, -32 ) + +[node name="Coin2" parent="Coins/CoinsSquare3" instance=ExtResource( 4 )] +position = Vector2( 32, -32 ) + +[node name="Coin3" parent="Coins/CoinsSquare3" instance=ExtResource( 4 )] +position = Vector2( -32, 32 ) + +[node name="Coin4" parent="Coins/CoinsSquare3" instance=ExtResource( 4 )] +position = Vector2( 32, 32 ) + +[node name="CoinsSquare4" type="Node2D" parent="Coins"] +position = Vector2( 1592.58, 117.285 ) + +[node name="Coin" parent="Coins/CoinsSquare4" instance=ExtResource( 4 )] +position = Vector2( -32, -32 ) + +[node name="Coin2" parent="Coins/CoinsSquare4" instance=ExtResource( 4 )] +position = Vector2( 32, -32 ) + +[node name="Coin3" parent="Coins/CoinsSquare4" instance=ExtResource( 4 )] +position = Vector2( -32, 32 ) + +[node name="Coin4" parent="Coins/CoinsSquare4" instance=ExtResource( 4 )] +position = Vector2( 32, 32 ) + +[node name="CoinsHorizontal" type="Node2D" parent="Coins"] +position = Vector2( 73.2408, 805.983 ) + +[node name="Coin" parent="Coins/CoinsHorizontal" instance=ExtResource( 4 )] +position = Vector2( -32, 0 ) + +[node name="Coin2" parent="Coins/CoinsHorizontal" instance=ExtResource( 4 )] + +[node name="Coin3" parent="Coins/CoinsHorizontal" instance=ExtResource( 4 )] +position = Vector2( 32, 0 ) + +[node name="CoinsHorizontal2" type="Node2D" parent="Coins"] +position = Vector2( 1337.21, 863.089 ) + +[node name="Coin" parent="Coins/CoinsHorizontal2" instance=ExtResource( 4 )] +position = Vector2( -32, 0 ) + +[node name="Coin2" parent="Coins/CoinsHorizontal2" instance=ExtResource( 4 )] + +[node name="Coin3" parent="Coins/CoinsHorizontal2" instance=ExtResource( 4 )] +position = Vector2( 32, 0 ) + +[node name="CoinsHorizontal3" type="Node2D" parent="Coins"] +position = Vector2( 671.17, 311.745 ) + +[node name="Coin" parent="Coins/CoinsHorizontal3" instance=ExtResource( 4 )] +position = Vector2( -32, 0 ) + +[node name="Coin2" parent="Coins/CoinsHorizontal3" instance=ExtResource( 4 )] + +[node name="Coin3" parent="Coins/CoinsHorizontal3" instance=ExtResource( 4 )] +position = Vector2( 32, 0 ) + +[node name="CoinsHorizontal4" type="Node2D" parent="Coins"] +position = Vector2( -126.888, 41.1804 ) + +[node name="Coin" parent="Coins/CoinsHorizontal4" instance=ExtResource( 4 )] +position = Vector2( -32, 0 ) + +[node name="Coin2" parent="Coins/CoinsHorizontal4" instance=ExtResource( 4 )] + +[node name="Coin3" parent="Coins/CoinsHorizontal4" instance=ExtResource( 4 )] +position = Vector2( 32, 0 ) + +[node name="CoinsHorizontal5" type="Node2D" parent="Coins"] +position = Vector2( 255.215, 41.1804 ) + +[node name="Coin" parent="Coins/CoinsHorizontal5" instance=ExtResource( 4 )] +position = Vector2( -32, 0 ) + +[node name="Coin2" parent="Coins/CoinsHorizontal5" instance=ExtResource( 4 )] + +[node name="Coin3" parent="Coins/CoinsHorizontal5" instance=ExtResource( 4 )] +position = Vector2( 32, 0 ) + +[node name="Platforms" type="Node" parent="."] + +[node name="Platform" parent="Platforms" instance=ExtResource( 3 )] +position = Vector2( 1414.49, 799.663 ) + +[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( -93.4945, 700.054 ) + +[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( 1139.87, 211.754 ) +rotation = 0.355618 +z_index = -1 +collision_layer = 16 +collision_mask = 0 + +[node name="Sprite2" type="Sprite" parent="Platforms/PlatformStatic"] +position = Vector2( -177.384, 21.0007 ) +rotation = -0.246293 +texture = ExtResource( 6 ) + +[node name="Sprite" type="Sprite" parent="Platforms/PlatformStatic"] +texture = ExtResource( 6 ) + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Platforms/PlatformStatic"] +polygon = PoolVector2Array( -261.093, 20.4292, -94.1774, -21.2967, 16.1709, -14.2775, 20.3489, -3.02834, -93.7491, -8.65489, -257.264, 30.7409 ) + +[node name="Enemies" type="Node" parent="."] + +[node name="Enemy" parent="Enemies" instance=ExtResource( 2 )] +position = Vector2( 542.081, 491.279 ) + +[node name="Enemy2" parent="Enemies" instance=ExtResource( 2 )] +position = Vector2( 692.218, 97.1263 ) + +[node name="Enemy3" parent="Enemies" instance=ExtResource( 2 )] +position = Vector2( 1265.45, 157.109 ) + +[node name="Enemy4" parent="Enemies" instance=ExtResource( 2 )] +position = Vector2( 1657.03, 154.524 ) + +[node name="Player" parent="." instance=ExtResource( 5 )] +position = Vector2( 173.294, 1093.02 ) + +[node name="Camera" parent="Player" index="4"] +limit_left = -626 +limit_top = -780 +limit_right = 1905 +limit_bottom = 1384 +limit_smoothed = true +editor_draw_limits = true + +[node name="ParallaxBackground" parent="." instance=ExtResource( 7 )] + +[node name="Music" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 8 ) +autoplay = true + +[editable path="Player"] diff --git a/2d/platformer/background/ParallaxBg.tscn b/2d/platformer/src/Level/ParallaxBackground.tscn similarity index 54% rename from 2d/platformer/background/ParallaxBg.tscn rename to 2d/platformer/src/Level/ParallaxBackground.tscn index 8d1c7256..ebfee2d0 100644 --- a/2d/platformer/background/ParallaxBg.tscn +++ b/2d/platformer/src/Level/ParallaxBackground.tscn @@ -1,20 +1,20 @@ [gd_scene load_steps=7 format=2] -[ext_resource path="res://background/scroll_bg_sky.png" type="Texture" id=1] -[ext_resource path="res://background/scroll_bg_cloud_1.png" type="Texture" id=2] -[ext_resource path="res://background/scroll_bg_cloud_2.png" type="Texture" id=3] -[ext_resource path="res://background/scroll_bg_cloud_3.png" type="Texture" id=4] -[ext_resource path="res://background/scroll_bg_fg_2.png" type="Texture" id=5] -[ext_resource path="res://background/scroll_bg_fg_1.png" type="Texture" id=6] +[ext_resource path="res://assets/art/background/sky.png" type="Texture" id=1] +[ext_resource path="res://assets/art/background/cloud_1.png" type="Texture" id=2] +[ext_resource path="res://assets/art/background/cloud_2.png" type="Texture" id=3] +[ext_resource path="res://assets/art/background/cloud_3.png" type="Texture" id=4] +[ext_resource path="res://assets/art/background/distant_platforms_2.png" type="Texture" id=5] +[ext_resource path="res://assets/art/background/distant_platforms_1.png" type="Texture" id=6] -[node name="ParallaxBg" type="ParallaxBackground"] +[node name="ParallaxBackground" type="ParallaxBackground"] scroll_base_scale = Vector2( 0.7, 0 ) [node name="Sky" type="ParallaxLayer" parent="."] motion_mirroring = Vector2( 800, 0 ) [node name="Sprite" type="Sprite" parent="Sky"] -scale = Vector2( 128, 0.94 ) +scale = Vector2( 32, 0.94 ) texture = ExtResource( 1 ) centered = false @@ -52,20 +52,24 @@ position = Vector2( 674, 70 ) texture = ExtResource( 4 ) centered = false -[node name="Mount2" type="ParallaxLayer" parent="."] +[node name="MountainsFar" type="ParallaxLayer" parent="."] motion_scale = Vector2( 0.2, 1 ) +motion_mirroring = Vector2( 800, 0 ) -[node name="Sprite" type="Sprite" parent="Mount2"] -position = Vector2( 0, 353 ) +[node name="Sprite" type="Sprite" parent="MountainsFar"] +position = Vector2( 0, 225 ) texture = ExtResource( 5 ) +centered = false region_enabled = true -region_rect = Rect2( 0, 0, 4096, 256 ) +region_rect = Rect2( 0, 0, 800, 256 ) -[node name="Mount1" type="ParallaxLayer" parent="."] +[node name="MountainsClose" type="ParallaxLayer" parent="."] motion_scale = Vector2( 0.4, 1 ) +motion_mirroring = Vector2( 800, 0 ) -[node name="Sprite" type="Sprite" parent="Mount1"] -position = Vector2( 0, 353 ) +[node name="Sprite" type="Sprite" parent="MountainsClose"] +position = Vector2( 0, 225 ) texture = ExtResource( 6 ) +centered = false region_enabled = true -region_rect = Rect2( 0, 0, 4096, 256 ) +region_rect = Rect2( 0, 0, 800, 256 ) diff --git a/2d/platformer/src/Main/Game.gd b/2d/platformer/src/Main/Game.gd new file mode 100644 index 00000000..d1f301a0 --- /dev/null +++ b/2d/platformer/src/Main/Game.gd @@ -0,0 +1,26 @@ +# This class contains controls that should always be accessible, like pausing +# the game or toggling the window full-screen. +extends Node + + +# 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 _input(event: InputEvent) -> void: + 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() diff --git a/2d/platformer/src/Main/Game.tscn b/2d/platformer/src/Main/Game.tscn new file mode 100644 index 00000000..e3157ca5 --- /dev/null +++ b/2d/platformer/src/Main/Game.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 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] + +[node name="Game" type="Node"] +pause_mode = 2 +script = ExtResource( 2 ) + +[node name="Level" parent="." instance=ExtResource( 3 )] + +[node name="InterfaceLayer" type="CanvasLayer" parent="."] +layer = 100 + +[node name="PauseMenu" parent="InterfaceLayer" instance=ExtResource( 1 )] diff --git a/2d/platformer/src/Objects/Bullet.gd b/2d/platformer/src/Objects/Bullet.gd new file mode 100644 index 00000000..ad3cdd28 --- /dev/null +++ b/2d/platformer/src/Objects/Bullet.gd @@ -0,0 +1,14 @@ +extends RigidBody2D +class_name Bullet + + +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/player/Bullet.tscn b/2d/platformer/src/Objects/Bullet.tscn similarity index 74% rename from 2d/platformer/player/Bullet.tscn rename to 2d/platformer/src/Objects/Bullet.tscn index 06413a6f..93a585f5 100644 --- a/2d/platformer/player/Bullet.tscn +++ b/2d/platformer/src/Objects/Bullet.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=9 format=2] -[ext_resource path="res://player/bullet.gd" type="Script" id=1] -[ext_resource path="res://player/bullet.png" type="Texture" id=2] +[ext_resource path="res://assets/art/player/bullet/bullet.png" type="Texture" id=1] +[ext_resource path="res://src/Objects/Bullet.gd" type="Script" id=2] [sub_resource type="CanvasItemMaterial" id=1] @@ -22,7 +22,8 @@ color = Color( 1, 1, 1, 0.705882 ) [sub_resource type="CircleShape2D" id=5] [sub_resource type="Animation" id=6] -length = 1.5 +resource_name = "destroy" +length = 0.3 tracks/0/type = "method" tracks/0/path = NodePath(".") tracks/0/interp = 1 @@ -30,7 +31,7 @@ tracks/0/loop_wrap = true tracks/0/imported = false tracks/0/enabled = true tracks/0/keys = { -"times": PoolRealArray( 1.31 ), +"times": PoolRealArray( 0.3 ), "transitions": PoolRealArray( 1 ), "values": [ { "args": [ ], @@ -44,7 +45,7 @@ tracks/1/loop_wrap = true tracks/1/imported = false tracks/1/enabled = true tracks/1/keys = { -"times": PoolRealArray( 0, 1 ), +"times": PoolRealArray( 0, 0.3 ), "transitions": PoolRealArray( 1, 1 ), "update": 0, "values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] @@ -56,7 +57,7 @@ tracks/2/loop_wrap = true tracks/2/imported = false tracks/2/enabled = true tracks/2/keys = { -"times": PoolRealArray( 0, 0.5 ), +"times": PoolRealArray( 0, 0.3 ), "transitions": PoolRealArray( 1, 1 ), "update": 0, "values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] @@ -64,10 +65,12 @@ tracks/2/keys = { [node name="Bullet" type="RigidBody2D"] material = SubResource( 1 ) +collision_layer = 0 +collision_mask = 26 continuous_cd = 2 contacts_reported = 1 contact_monitor = true -script = ExtResource( 1 ) +script = ExtResource( 2 ) [node name="Particles2D" type="Particles2D" parent="."] material = SubResource( 2 ) @@ -75,11 +78,11 @@ lifetime = 0.3 speed_scale = 3.0 local_coords = false process_material = SubResource( 3 ) -texture = ExtResource( 2 ) +texture = ExtResource( 1 ) [node name="Sprite" type="Sprite" parent="."] material = SubResource( 4 ) -texture = ExtResource( 2 ) +texture = ExtResource( 1 ) [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource( 5 ) @@ -88,8 +91,7 @@ shape = SubResource( 5 ) one_shot = true autostart = true -[node name="Anim" type="AnimationPlayer" parent="."] -anims/shutdown = SubResource( 6 ) - -[connection signal="body_entered" from="." to="." method="_on_bullet_body_enter"] -[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/destroy = SubResource( 6 ) +[connection signal="body_entered" from="." to="." method="_on_body_entered"] +[connection signal="timeout" from="Timer" to="." method="destroy"] diff --git a/2d/platformer/src/Objects/Coin.gd b/2d/platformer/src/Objects/Coin.gd new file mode 100644 index 00000000..4e2dc73a --- /dev/null +++ b/2d/platformer/src/Objects/Coin.gd @@ -0,0 +1,15 @@ +extends Area2D +class_name Coin +# 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") diff --git a/2d/platformer/src/Objects/Coin.tscn b/2d/platformer/src/Objects/Coin.tscn new file mode 100644 index 00000000..a240096e --- /dev/null +++ b/2d/platformer/src/Objects/Coin.tscn @@ -0,0 +1,161 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://assets/art/coin/coin.png" type="Texture" 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] + +[sub_resource type="Animation" id=1] +resource_name = "picked" +length = 1.5 +step = 0.25 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0 ] +} +tracks/1/type = "method" +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": PoolRealArray( 1 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ ], +"method": "queue_free" +} ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Sprite:self_modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0.25, 1.25 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"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/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 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": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Sprite:position") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 1.5 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ), Vector2( 0, -42 ) ] +} + +[sub_resource type="Animation" id=2] +length = 1.5 +loop = true +step = 0.25 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1, 1.25, 1.5 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 1, 2, 3, 2, 1, 0 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 2, +"values": [ Vector2( 0, 0 ) ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Sprite:self_modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 2, +"values": [ Color( 1, 1, 1, 1 ) ] +} +tracks/3/type = "value" +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": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 2, +"values": [ true ] +} + +[sub_resource type="CircleShape2D" id=3] + +[node name="Coin" type="Area2D"] +monitorable = false +collision_layer = 0 +script = ExtResource( 4 ) + +[node name="Sprite" type="Sprite" parent="."] +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 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +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/src/Platforms/Platform.tscn b/2d/platformer/src/Platforms/Platform.tscn new file mode 100644 index 00000000..1564b262 --- /dev/null +++ b/2d/platformer/src/Platforms/Platform.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://assets/art/platforms/moving_platform.png" type="Texture" id=2] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 94, 12 ) + +[node name="Platform" type="KinematicBody2D"] +z_index = -1 +collision_layer = 8 +collision_mask = 0 +collision/safe_margin = 0.12 +motion/sync_to_physics = true + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 2 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 0, -8 ) +shape = SubResource( 1 ) +one_way_collision = true diff --git a/2d/platformer/src/UserInterface/PauseMenu.gd b/2d/platformer/src/UserInterface/PauseMenu.gd new file mode 100644 index 00000000..95e869d6 --- /dev/null +++ b/2d/platformer/src/UserInterface/PauseMenu.gd @@ -0,0 +1,26 @@ +extends Control + + +onready var resume_button = $VBoxContainer/ResumeButton + + +func _ready(): + visible = false + + +func open(): + visible = true + resume_button.grab_focus() + + +func close(): + visible = false + + +func _on_ResumeButton_pressed() -> void: + get_tree().paused = false + visible = false + + +func _on_QuitButton_pressed() -> void: + get_tree().quit() diff --git a/2d/platformer/src/UserInterface/PauseMenu.tscn b/2d/platformer/src/UserInterface/PauseMenu.tscn new file mode 100644 index 00000000..5db54b7e --- /dev/null +++ b/2d/platformer/src/UserInterface/PauseMenu.tscn @@ -0,0 +1,56 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://assets/theme/user_interface.tres" type="Theme" id=1] +[ext_resource path="res://src/UserInterface/PauseMenu.gd" type="Script" id=2] + +[node name="PauseMenu" type="Control"] +pause_mode = 2 +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorRect" type="ColorRect" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color( 0, 0, 0, 0.211765 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -87.0 +margin_top = -125.0 +margin_right = 87.0 +margin_bottom = 126.0 +alignment = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="VBoxContainer"] +margin_top = 71.0 +margin_right = 174.0 +margin_bottom = 91.0 +text = "Game Paused" +align = 1 + +[node name="ResumeButton" type="Button" parent="VBoxContainer"] +margin_top = 95.0 +margin_right = 174.0 +margin_bottom = 135.0 +rect_min_size = Vector2( 0, 40 ) +text = "Resume" + +[node name="QuitButton" type="Button" parent="VBoxContainer"] +margin_top = 139.0 +margin_right = 174.0 +margin_bottom = 179.0 +rect_min_size = Vector2( 0, 40 ) +text = "Quit" +[connection signal="pressed" from="VBoxContainer/ResumeButton" to="." method="_on_ResumeButton_pressed"] +[connection signal="pressed" from="VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"] diff --git a/2d/platformer/tiles_demo.png b/2d/platformer/tiles_demo.png deleted file mode 100644 index a216b6899dc008d5a23a01e86e6a8f4a22e3ab12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4057 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 Date: Tue, 11 Feb 2020 17:21:15 -0600 Subject: [PATCH 02/12] Address requested changes in the review Remove unused spawn input action Add support for the gamepad's left stick for movement Use the project settings to store the gravity value project-wide Remove type hints --- 2d/platformer/project.godot | 9 +++------ 2d/platformer/src/Actors/Actor.gd | 2 +- 2d/platformer/src/Actors/Enemy.gd | 5 ++++- 2d/platformer/src/Main/Game.gd | 2 +- 2d/platformer/src/UserInterface/PauseMenu.gd | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/2d/platformer/project.godot b/2d/platformer/project.godot index 9350ec7a..e5646e07 100644 --- a/2d/platformer/project.godot +++ b/2d/platformer/project.godot @@ -97,6 +97,7 @@ move_left={ "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"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,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"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={ @@ -104,6 +105,7 @@ move_right={ "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"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,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null) ] } shoot={ @@ -114,12 +116,6 @@ shoot={ , Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) ] } -spawn={ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777244,"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) - ] -} toggle_fullscreen={ "deadzone": 0.5, "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777254,"unicode":0,"echo":false,"script":null) @@ -143,6 +139,7 @@ toggle_pause={ [physics] 2d/default_gravity=700 +2d/gravity_default=1800.0 [rasterizer] diff --git a/2d/platformer/src/Actors/Actor.gd b/2d/platformer/src/Actors/Actor.gd index 980768f4..288e9e1c 100644 --- a/2d/platformer/src/Actors/Actor.gd +++ b/2d/platformer/src/Actors/Actor.gd @@ -6,7 +6,7 @@ class_name Actor export var speed = Vector2(400.0, 500.0) -export var gravity = 3500.0 +export(float) var gravity = ProjectSettings.get("physics/2d/gravity_default") const FLOOR_NORMAL = Vector2.UP diff --git a/2d/platformer/src/Actors/Enemy.gd b/2d/platformer/src/Actors/Enemy.gd index 6db70ac0..21490309 100644 --- a/2d/platformer/src/Actors/Enemy.gd +++ b/2d/platformer/src/Actors/Enemy.gd @@ -8,7 +8,10 @@ onready var floor_detector_right = $FloorDetectorRight onready var sprite = $Sprite onready var animation_player = $AnimationPlayer -enum State {WALKING, DEAD} +enum State { + WALKING, + DEAD +} var _state = State.WALKING diff --git a/2d/platformer/src/Main/Game.gd b/2d/platformer/src/Main/Game.gd index d1f301a0..4e469abb 100644 --- a/2d/platformer/src/Main/Game.gd +++ b/2d/platformer/src/Main/Game.gd @@ -8,7 +8,7 @@ extends Node onready var _pause_menu = $InterfaceLayer/PauseMenu -func _input(event: InputEvent) -> void: +func _input(event): if event.is_action_pressed("toggle_fullscreen"): OS.window_fullscreen = not OS.window_fullscreen get_tree().set_input_as_handled() diff --git a/2d/platformer/src/UserInterface/PauseMenu.gd b/2d/platformer/src/UserInterface/PauseMenu.gd index 95e869d6..b94a13bf 100644 --- a/2d/platformer/src/UserInterface/PauseMenu.gd +++ b/2d/platformer/src/UserInterface/PauseMenu.gd @@ -17,10 +17,10 @@ func close(): visible = false -func _on_ResumeButton_pressed() -> void: +func _on_ResumeButton_pressed(): get_tree().paused = false visible = false -func _on_QuitButton_pressed() -> void: +func _on_QuitButton_pressed(): get_tree().quit() From 263bfd8bd3d333470588ff140931ba0e3abfa3f8 Mon Sep 17 00:00:00 2001 From: Nathan Lovato Date: Tue, 11 Feb 2020 18:22:26 -0600 Subject: [PATCH 03/12] Add README to the 2D platformer --- 2d/platformer/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 2d/platformer/README.md diff --git a/2d/platformer/README.md b/2d/platformer/README.md new file mode 100644 index 00000000..3a62ee9b --- /dev/null +++ b/2d/platformer/README.md @@ -0,0 +1,25 @@ +# 2D Platformer # + +This demo is a pixel art 2D platformer with graphics and sound. + +It shows you 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`. 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. + +## Features ## + +- Side-scrolling player controller. + - Can walk on and snap to slopes. + - Can shoot, including while jumping. +- 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. +- Platforms that can move in any direction. +- Gun that shoots bullets with rigid body (natural) physics. +- Collectible coins. +- Pause and pause menu. +- Pixel art visuals. +- Sound effects and music. + From ab04b998fc3a4c8773c774259adb5e5c4396c471 Mon Sep 17 00:00:00 2001 From: Nathan Lovato Date: Tue, 11 Feb 2020 21:56:08 -0600 Subject: [PATCH 04/12] Update the platformer demo's readme --- 2d/platformer/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/2d/platformer/README.md b/2d/platformer/README.md index 3a62ee9b..ad342ea4 100644 --- a/2d/platformer/README.md +++ b/2d/platformer/README.md @@ -1,14 +1,14 @@ -# 2D Platformer # +# 2D Platformer This demo is a pixel art 2D platformer with graphics and sound. It shows you 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`. You can open it from the default `Game.tscn` scene, or double click on `Level.tscn` in the `src/Level/` directory. +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. -## Features ## +## Features - Side-scrolling player controller. - Can walk on and snap to slopes. From bd6da6a6106dde7b6388df5401f7534d8d24f3e6 Mon Sep 17 00:00:00 2001 From: Nathan Lovato Date: Tue, 11 Feb 2020 22:08:01 -0600 Subject: [PATCH 05/12] Limit the window size --- 2d/platformer/project.godot | 2 -- 2d/platformer/src/Main/Game.gd | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/2d/platformer/project.godot b/2d/platformer/project.godot index e5646e07..f646e132 100644 --- a/2d/platformer/project.godot +++ b/2d/platformer/project.godot @@ -67,8 +67,6 @@ gdscript/warnings/unsafe_call_argument=true window/size/width=800 window/size/height=480 -window/size/test_width=1600 -window/size/test_height=960 window/dpi/allow_hidpi=true window/stretch/mode="2d" window/stretch/aspect="expand" diff --git a/2d/platformer/src/Main/Game.gd b/2d/platformer/src/Main/Game.gd index 4e469abb..9cd0c827 100644 --- a/2d/platformer/src/Main/Game.gd +++ b/2d/platformer/src/Main/Game.gd @@ -8,6 +8,11 @@ extends Node onready var _pause_menu = $InterfaceLayer/PauseMenu +func _init() -> void: + OS.min_window_size = OS.window_size + OS.max_window_size = OS.get_screen_size() + + func _input(event): if event.is_action_pressed("toggle_fullscreen"): OS.window_fullscreen = not OS.window_fullscreen From bebf8e8249fcd09769f72919f91ad52f21b18225 Mon Sep 17 00:00:00 2001 From: Nathan Lovato Date: Tue, 11 Feb 2020 22:18:48 -0600 Subject: [PATCH 06/12] Fix background disappearing when scaling the window Use the keep_height aspect ratio option as in the original demo. This prevents seeing the clear color when making the window tall Change the ParallaxBackground scene so mirrored sections don't disappear on wide windows --- .../background/distant_platforms_1.png.import | 2 +- .../background/distant_platforms_2.png.import | 2 +- .../assets/art/background/sky.png.import | 2 +- 2d/platformer/project.godot | 2 +- .../src/Level/ParallaxBackground.tscn | 83 ++++++++++++------- 5 files changed, 58 insertions(+), 33 deletions(-) diff --git a/2d/platformer/assets/art/background/distant_platforms_1.png.import b/2d/platformer/assets/art/background/distant_platforms_1.png.import index a3012eab..8abeb3a7 100644 --- a/2d/platformer/assets/art/background/distant_platforms_1.png.import +++ b/2d/platformer/assets/art/background/distant_platforms_1.png.import @@ -19,7 +19,7 @@ compress/lossy_quality=0.7 compress/hdr_mode=0 compress/bptc_ldr=0 compress/normal_map=0 -flags/repeat=0 +flags/repeat=1 flags/filter=false flags/mipmaps=false flags/anisotropic=false diff --git a/2d/platformer/assets/art/background/distant_platforms_2.png.import b/2d/platformer/assets/art/background/distant_platforms_2.png.import index 73225a0e..35996cd4 100644 --- a/2d/platformer/assets/art/background/distant_platforms_2.png.import +++ b/2d/platformer/assets/art/background/distant_platforms_2.png.import @@ -19,7 +19,7 @@ compress/lossy_quality=0.7 compress/hdr_mode=0 compress/bptc_ldr=0 compress/normal_map=0 -flags/repeat=0 +flags/repeat=1 flags/filter=false flags/mipmaps=false flags/anisotropic=false diff --git a/2d/platformer/assets/art/background/sky.png.import b/2d/platformer/assets/art/background/sky.png.import index 535ab1c6..883b852b 100644 --- a/2d/platformer/assets/art/background/sky.png.import +++ b/2d/platformer/assets/art/background/sky.png.import @@ -19,7 +19,7 @@ compress/lossy_quality=0.7 compress/hdr_mode=0 compress/bptc_ldr=0 compress/normal_map=0 -flags/repeat=0 +flags/repeat=1 flags/filter=false flags/mipmaps=false flags/anisotropic=false diff --git a/2d/platformer/project.godot b/2d/platformer/project.godot index f646e132..71d88db2 100644 --- a/2d/platformer/project.godot +++ b/2d/platformer/project.godot @@ -69,7 +69,7 @@ window/size/width=800 window/size/height=480 window/dpi/allow_hidpi=true window/stretch/mode="2d" -window/stretch/aspect="expand" +window/stretch/aspect="keep_height" stretch/aspect="keep_height" stretch/mode="2d" diff --git a/2d/platformer/src/Level/ParallaxBackground.tscn b/2d/platformer/src/Level/ParallaxBackground.tscn index ebfee2d0..d1dfe5e2 100644 --- a/2d/platformer/src/Level/ParallaxBackground.tscn +++ b/2d/platformer/src/Level/ParallaxBackground.tscn @@ -1,75 +1,100 @@ [gd_scene load_steps=7 format=2] -[ext_resource path="res://assets/art/background/sky.png" type="Texture" id=1] -[ext_resource path="res://assets/art/background/cloud_1.png" type="Texture" id=2] -[ext_resource path="res://assets/art/background/cloud_2.png" type="Texture" id=3] -[ext_resource path="res://assets/art/background/cloud_3.png" type="Texture" id=4] -[ext_resource path="res://assets/art/background/distant_platforms_2.png" type="Texture" id=5] +[ext_resource path="res://assets/art/background/distant_platforms_2.png" type="Texture" id=1] +[ext_resource path="res://assets/art/background/sky.png" type="Texture" id=2] +[ext_resource path="res://assets/art/background/cloud_1.png" type="Texture" id=3] +[ext_resource path="res://assets/art/background/cloud_2.png" type="Texture" id=4] +[ext_resource path="res://assets/art/background/cloud_3.png" type="Texture" id=5] [ext_resource path="res://assets/art/background/distant_platforms_1.png" type="Texture" id=6] [node name="ParallaxBackground" type="ParallaxBackground"] -scroll_base_scale = Vector2( 0.7, 0 ) +scroll_base_scale = Vector2( 0.4, 0 ) [node name="Sky" type="ParallaxLayer" parent="."] motion_mirroring = Vector2( 800, 0 ) [node name="Sprite" type="Sprite" parent="Sky"] -scale = Vector2( 32, 0.94 ) -texture = ExtResource( 1 ) +scale = Vector2( 128, 0.94 ) +texture = ExtResource( 2 ) centered = false [node name="Clouds" type="ParallaxLayer" parent="."] motion_scale = Vector2( 0.1, 1 ) -motion_mirroring = Vector2( 800, 0 ) [node name="Sprite1" type="Sprite" parent="Clouds"] position = Vector2( 28, 127 ) -texture = ExtResource( 2 ) +texture = ExtResource( 3 ) centered = false [node name="Sprite2" type="Sprite" parent="Clouds"] position = Vector2( 404, 24 ) -texture = ExtResource( 2 ) +texture = ExtResource( 3 ) centered = false [node name="Sprite3" type="Sprite" parent="Clouds"] position = Vector2( 154, 46 ) -texture = ExtResource( 3 ) +texture = ExtResource( 4 ) centered = false [node name="Sprite4" type="Sprite" parent="Clouds"] position = Vector2( 525, 130 ) -texture = ExtResource( 3 ) +texture = ExtResource( 4 ) centered = false [node name="Sprite5" type="Sprite" parent="Clouds"] position = Vector2( 255, 158 ) -texture = ExtResource( 4 ) +texture = ExtResource( 5 ) centered = false [node name="Sprite6" type="Sprite" parent="Clouds"] position = Vector2( 674, 70 ) +texture = ExtResource( 5 ) +centered = false + +[node name="Sprite12" type="Sprite" parent="Clouds"] +position = Vector2( 810.811, 127 ) +texture = ExtResource( 3 ) +centered = false + +[node name="Sprite11" type="Sprite" parent="Clouds"] +position = Vector2( 1186.81, 24 ) +texture = ExtResource( 3 ) +centered = false + +[node name="Sprite10" type="Sprite" parent="Clouds"] +position = Vector2( 936.811, 46 ) texture = ExtResource( 4 ) centered = false -[node name="MountainsFar" type="ParallaxLayer" parent="."] -motion_scale = Vector2( 0.2, 1 ) -motion_mirroring = Vector2( 800, 0 ) +[node name="Sprite9" type="Sprite" parent="Clouds"] +position = Vector2( 1307.81, 130 ) +texture = ExtResource( 4 ) +centered = false -[node name="Sprite" type="Sprite" parent="MountainsFar"] -position = Vector2( 0, 225 ) +[node name="Sprite8" type="Sprite" parent="Clouds"] +position = Vector2( 1037.81, 158 ) texture = ExtResource( 5 ) centered = false -region_enabled = true -region_rect = Rect2( 0, 0, 800, 256 ) -[node name="MountainsClose" type="ParallaxLayer" parent="."] -motion_scale = Vector2( 0.4, 1 ) -motion_mirroring = Vector2( 800, 0 ) - -[node name="Sprite" type="Sprite" parent="MountainsClose"] -position = Vector2( 0, 225 ) -texture = ExtResource( 6 ) +[node name="Sprite7" type="Sprite" parent="Clouds"] +position = Vector2( 1456.81, 70 ) +texture = ExtResource( 5 ) centered = false + +[node name="Mountains2" type="ParallaxLayer" parent="."] +motion_scale = Vector2( 0.2, 1 ) + +[node name="Sprite" type="Sprite" parent="Mountains2"] +position = Vector2( 0, 353 ) +texture = ExtResource( 1 ) region_enabled = true -region_rect = Rect2( 0, 0, 800, 256 ) +region_rect = Rect2( 0, 0, 4096, 256 ) + +[node name="Mountains1" type="ParallaxLayer" parent="."] +motion_scale = Vector2( 0.4, 1 ) + +[node name="Sprite" type="Sprite" parent="Mountains1"] +position = Vector2( 0, 353 ) +texture = ExtResource( 6 ) +region_enabled = true +region_rect = Rect2( 0, 0, 4096, 256 ) From 75df35b16513bb2ffa73e39def45e50ecf88cb7c Mon Sep 17 00:00:00 2001 From: Nathan Lovato Date: Wed, 12 Feb 2020 07:47:56 -0600 Subject: [PATCH 07/12] Improve background tiling, move parallax layers vertically --- .../art/background/distant_platforms_1.png | Bin 5203 -> 16057 bytes .../art/background/distant_platforms_2.png | Bin 5779 -> 17008 bytes .../src/Level/ParallaxBackground.tscn | 11 +++++++---- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/2d/platformer/assets/art/background/distant_platforms_1.png b/2d/platformer/assets/art/background/distant_platforms_1.png index 99821f356b51b81309f06a9212b6df201ee6a66a..3d78ae2551237f9ce7bd433476879ae2202ffd90 100644 GIT binary patch literal 16057 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 g{AwKRy!T#9T}Q1*^}*Bs1B1gCq5uE@ literal 5203 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 HWXApf;$l4iM07nfWz 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
N2iEM}&O$wpTMGy|KucJ!maqAPj=l)! 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 literal 5779 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 Crp2%T diff --git a/2d/platformer/src/Level/ParallaxBackground.tscn b/2d/platformer/src/Level/ParallaxBackground.tscn index d1dfe5e2..284469bf 100644 --- a/2d/platformer/src/Level/ParallaxBackground.tscn +++ b/2d/platformer/src/Level/ParallaxBackground.tscn @@ -20,6 +20,7 @@ centered = false [node name="Clouds" type="ParallaxLayer" parent="."] motion_scale = Vector2( 0.1, 1 ) +motion_offset = Vector2( -550, 0 ) [node name="Sprite1" type="Sprite" parent="Clouds"] position = Vector2( 28, 127 ) @@ -82,19 +83,21 @@ texture = ExtResource( 5 ) centered = false [node name="Mountains2" type="ParallaxLayer" parent="."] +position = Vector2( 0, 481 ) motion_scale = Vector2( 0.2, 1 ) [node name="Sprite" type="Sprite" parent="Mountains2"] -position = Vector2( 0, 353 ) +position = Vector2( 0, -114.388 ) texture = ExtResource( 1 ) region_enabled = true -region_rect = Rect2( 0, 0, 4096, 256 ) +region_rect = Rect2( 0, 0, 3072, 256 ) [node name="Mountains1" type="ParallaxLayer" parent="."] +position = Vector2( 0, 481 ) motion_scale = Vector2( 0.4, 1 ) [node name="Sprite" type="Sprite" parent="Mountains1"] -position = Vector2( 0, 353 ) +position = Vector2( 0, -100.279 ) texture = ExtResource( 6 ) region_enabled = true -region_rect = Rect2( 0, 0, 4096, 256 ) +region_rect = Rect2( 0, 0, 3072, 256 ) From 332cd3bb38f06f43721a9ce1df5266ade4b4dd68 Mon Sep 17 00:00:00 2001 From: Nathan Lovato Date: Wed, 12 Feb 2020 07:48:21 -0600 Subject: [PATCH 08/12] Remove return type hint --- 2d/platformer/src/Main/Game.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2d/platformer/src/Main/Game.gd b/2d/platformer/src/Main/Game.gd index 9cd0c827..c7da3287 100644 --- a/2d/platformer/src/Main/Game.gd +++ b/2d/platformer/src/Main/Game.gd @@ -8,7 +8,7 @@ extends Node onready var _pause_menu = $InterfaceLayer/PauseMenu -func _init() -> void: +func _init(): OS.min_window_size = OS.window_size OS.max_window_size = OS.get_screen_size() From 77800b3f155cb989589dce6f701ef0a90e97a531 Mon Sep 17 00:00:00 2001 From: Nathan Lovato Date: Wed, 12 Feb 2020 07:53:43 -0600 Subject: [PATCH 09/12] Add more clouds to cover wide and thin window sizes --- .../src/Level/ParallaxBackground.tscn | 54 ++++++++++++++----- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/2d/platformer/src/Level/ParallaxBackground.tscn b/2d/platformer/src/Level/ParallaxBackground.tscn index 284469bf..d27d098d 100644 --- a/2d/platformer/src/Level/ParallaxBackground.tscn +++ b/2d/platformer/src/Level/ParallaxBackground.tscn @@ -23,62 +23,92 @@ motion_scale = Vector2( 0.1, 1 ) motion_offset = Vector2( -550, 0 ) [node name="Sprite1" type="Sprite" parent="Clouds"] -position = Vector2( 28, 127 ) +position = Vector2( -190.006, 124.842 ) texture = ExtResource( 3 ) centered = false [node name="Sprite2" type="Sprite" parent="Clouds"] -position = Vector2( 404, 24 ) +position = Vector2( 185.994, 21.8415 ) texture = ExtResource( 3 ) centered = false [node name="Sprite3" type="Sprite" parent="Clouds"] -position = Vector2( 154, 46 ) +position = Vector2( -64.0056, 43.8415 ) texture = ExtResource( 4 ) centered = false [node name="Sprite4" type="Sprite" parent="Clouds"] -position = Vector2( 525, 130 ) +position = Vector2( 306.994, 127.842 ) texture = ExtResource( 4 ) centered = false [node name="Sprite5" type="Sprite" parent="Clouds"] -position = Vector2( 255, 158 ) +position = Vector2( 36.9944, 155.842 ) texture = ExtResource( 5 ) centered = false [node name="Sprite6" type="Sprite" parent="Clouds"] -position = Vector2( 674, 70 ) +position = Vector2( 455.994, 67.8415 ) texture = ExtResource( 5 ) centered = false [node name="Sprite12" type="Sprite" parent="Clouds"] -position = Vector2( 810.811, 127 ) +position = Vector2( 592.805, 124.842 ) texture = ExtResource( 3 ) centered = false [node name="Sprite11" type="Sprite" parent="Clouds"] -position = Vector2( 1186.81, 24 ) +position = Vector2( 968.805, 21.8415 ) texture = ExtResource( 3 ) centered = false [node name="Sprite10" type="Sprite" parent="Clouds"] -position = Vector2( 936.811, 46 ) +position = Vector2( 718.805, 43.8415 ) texture = ExtResource( 4 ) centered = false [node name="Sprite9" type="Sprite" parent="Clouds"] -position = Vector2( 1307.81, 130 ) +position = Vector2( 1089.8, 127.842 ) texture = ExtResource( 4 ) centered = false [node name="Sprite8" type="Sprite" parent="Clouds"] -position = Vector2( 1037.81, 158 ) +position = Vector2( 819.805, 155.842 ) texture = ExtResource( 5 ) centered = false [node name="Sprite7" type="Sprite" parent="Clouds"] -position = Vector2( 1456.81, 70 ) +position = Vector2( 1238.8, 67.8415 ) +texture = ExtResource( 5 ) +centered = false + +[node name="Sprite18" type="Sprite" parent="Clouds"] +position = Vector2( 1369.85, 124.842 ) +texture = ExtResource( 3 ) +centered = false + +[node name="Sprite17" type="Sprite" parent="Clouds"] +position = Vector2( 1745.85, 21.8415 ) +texture = ExtResource( 3 ) +centered = false + +[node name="Sprite16" type="Sprite" parent="Clouds"] +position = Vector2( 1495.85, 43.8415 ) +texture = ExtResource( 4 ) +centered = false + +[node name="Sprite15" type="Sprite" parent="Clouds"] +position = Vector2( 1866.85, 127.842 ) +texture = ExtResource( 4 ) +centered = false + +[node name="Sprite14" type="Sprite" parent="Clouds"] +position = Vector2( 1596.85, 155.842 ) +texture = ExtResource( 5 ) +centered = false + +[node name="Sprite13" type="Sprite" parent="Clouds"] +position = Vector2( 2015.85, 67.8415 ) texture = ExtResource( 5 ) centered = false From c117eb1847c0797e1fd966bfb424b8c6016363fc Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Wed, 12 Feb 2020 15:30:42 -0500 Subject: [PATCH 10/12] Minor style tweaks --- 2d/platformer/src/Actors/Actor.gd | 6 +-- 2d/platformer/src/Actors/Enemy.gd | 40 ++++++++++---------- 2d/platformer/src/Actors/Gun.gd | 8 ++-- 2d/platformer/src/Actors/Player.gd | 16 ++++---- 2d/platformer/src/Main/Game.gd | 2 +- 2d/platformer/src/Objects/Bullet.gd | 2 +- 2d/platformer/src/Objects/Coin.gd | 8 ++-- 2d/platformer/src/UserInterface/PauseMenu.gd | 8 ++-- 8 files changed, 44 insertions(+), 46 deletions(-) diff --git a/2d/platformer/src/Actors/Actor.gd b/2d/platformer/src/Actors/Actor.gd index 288e9e1c..0dc5ce74 100644 --- a/2d/platformer/src/Actors/Actor.gd +++ b/2d/platformer/src/Actors/Actor.gd @@ -1,8 +1,8 @@ -extends KinematicBody2D class_name Actor +extends KinematicBody2D -# Both the Player and Enemy inherit this scene as they have shared behaviours such as -# speed and are affected by gravity. +# 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(400.0, 500.0) diff --git a/2d/platformer/src/Actors/Enemy.gd b/2d/platformer/src/Actors/Enemy.gd index 21490309..0ed30b5b 100644 --- a/2d/platformer/src/Actors/Enemy.gd +++ b/2d/platformer/src/Actors/Enemy.gd @@ -1,13 +1,7 @@ -extends Actor class_name Enemy +extends Actor -onready var platform_detector = $PlatformDetector -onready var floor_detector_left = $FloorDetectorLeft -onready var floor_detector_right = $FloorDetectorRight -onready var sprite = $Sprite -onready var animation_player = $AnimationPlayer - enum State { WALKING, DEAD @@ -15,6 +9,12 @@ enum State { var _state = State.WALKING +onready var platform_detector = $PlatformDetector +onready var floor_detector_left = $FloorDetectorLeft +onready var floor_detector_right = $FloorDetectorRight +onready var sprite = $Sprite +onready var animation_player = $AnimationPlayer + # This function is called when the scene enters the scene tree. # We can initialize variables here. func _ready(): @@ -29,12 +29,12 @@ func _ready(): # 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. +# 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): _velocity = calculate_move_velocity(_velocity) @@ -49,16 +49,9 @@ func _physics_process(_delta): animation_player.play(animation) -func destroy(): - _state = State.DEAD - _velocity = Vector2.ZERO - - # This function calculates a new velocity whenever you need it. # If the enemy encounters a wall or an edge, the horizontal velocity is flipped. -func calculate_move_velocity( - linear_velocity - ): +func calculate_move_velocity(linear_velocity): var velocity = linear_velocity if not floor_detector_left.is_colliding(): @@ -72,6 +65,11 @@ func calculate_move_velocity( return velocity +func destroy(): + _state = State.DEAD + _velocity = Vector2.ZERO + + func get_new_animation(): var animation_new = "" if _state == State.WALKING: diff --git a/2d/platformer/src/Actors/Gun.gd b/2d/platformer/src/Actors/Gun.gd index 588f2893..f13b3afc 100644 --- a/2d/platformer/src/Actors/Gun.gd +++ b/2d/platformer/src/Actors/Gun.gd @@ -1,15 +1,15 @@ -extends Position2D class_name Gun +extends Position2D # Represents a weapon that spawns and shoots bullets. # The Cooldown timer controls the cooldown duration between shots. +const BULLET_VELOCITY = 1000.0 +const Bullet = preload("res://src/Objects/Bullet.tscn") + onready var sound_shoot = $Shoot onready var timer = $Cooldown -const Bullet = preload("res://src/Objects/Bullet.tscn") -const BULLET_VELOCITY = 1000.0 - func shoot(direction = 1): if not timer.is_stopped(): diff --git a/2d/platformer/src/Actors/Player.gd b/2d/platformer/src/Actors/Player.gd index 0b39f6f6..4e68b8e1 100644 --- a/2d/platformer/src/Actors/Player.gd +++ b/2d/platformer/src/Actors/Player.gd @@ -1,5 +1,5 @@ -extends Actor class_name Player +extends Actor const FLOOR_DETECT_DISTANCE = 40.0 @@ -23,12 +23,12 @@ onready var gun = $Sprite/Gun # 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. +# 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): var direction = get_direction() @@ -38,7 +38,7 @@ func _physics_process(_delta): var snap_vector = Vector2.DOWN * FLOOR_DETECT_DISTANCE if direction.y == 0.0 else Vector2.ZERO var is_on_platform = platform_detector.is_colliding() _velocity = move_and_slide_with_snap( - _velocity, snap_vector, FLOOR_NORMAL, not is_on_platform, 4, 0.9, false + _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 Sprite accordingly to flip it. diff --git a/2d/platformer/src/Main/Game.gd b/2d/platformer/src/Main/Game.gd index c7da3287..568fe27d 100644 --- a/2d/platformer/src/Main/Game.gd +++ b/2d/platformer/src/Main/Game.gd @@ -1,6 +1,6 @@ +extends Node # This class contains controls that should always be accessible, like pausing # the game or toggling the window full-screen. -extends Node # The "_" prefix is a convention to indicate that variables are private, diff --git a/2d/platformer/src/Objects/Bullet.gd b/2d/platformer/src/Objects/Bullet.gd index ad3cdd28..08d57b19 100644 --- a/2d/platformer/src/Objects/Bullet.gd +++ b/2d/platformer/src/Objects/Bullet.gd @@ -1,5 +1,5 @@ -extends RigidBody2D class_name Bullet +extends RigidBody2D onready var animation_player = $AnimationPlayer diff --git a/2d/platformer/src/Objects/Coin.gd b/2d/platformer/src/Objects/Coin.gd index 4e2dc73a..7cd6eb32 100644 --- a/2d/platformer/src/Objects/Coin.gd +++ b/2d/platformer/src/Objects/Coin.gd @@ -1,5 +1,5 @@ -extends Area2D class_name Coin +extends Area2D # Collectible that disappears when the player touches it. onready var animation_player = $AnimationPlayer @@ -7,9 +7,9 @@ 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. +# 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") diff --git a/2d/platformer/src/UserInterface/PauseMenu.gd b/2d/platformer/src/UserInterface/PauseMenu.gd index b94a13bf..f8e98dad 100644 --- a/2d/platformer/src/UserInterface/PauseMenu.gd +++ b/2d/platformer/src/UserInterface/PauseMenu.gd @@ -8,15 +8,15 @@ func _ready(): visible = false +func close(): + visible = false + + func open(): visible = true resume_button.grab_focus() -func close(): - visible = false - - func _on_ResumeButton_pressed(): get_tree().paused = false visible = false From 8d48b7f99499a83a23206cd99d31d7b5c3b1a9a0 Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Wed, 12 Feb 2020 15:51:56 -0500 Subject: [PATCH 11/12] Tweak background and organize clouds --- .../src/Level/ParallaxBackground.tscn | 121 ++++++++++++------ 1 file changed, 81 insertions(+), 40 deletions(-) diff --git a/2d/platformer/src/Level/ParallaxBackground.tscn b/2d/platformer/src/Level/ParallaxBackground.tscn index d27d098d..8b34be08 100644 --- a/2d/platformer/src/Level/ParallaxBackground.tscn +++ b/2d/platformer/src/Level/ParallaxBackground.tscn @@ -22,93 +22,134 @@ centered = false motion_scale = Vector2( 0.1, 1 ) motion_offset = Vector2( -550, 0 ) -[node name="Sprite1" type="Sprite" parent="Clouds"] -position = Vector2( -190.006, 124.842 ) +[node name="CloudGroup1" type="Node2D" parent="Clouds"] +position = Vector2( -780, 0 ) + +[node name="Sprite1" type="Sprite" parent="Clouds/CloudGroup1"] +position = Vector2( -200, 120 ) texture = ExtResource( 3 ) centered = false -[node name="Sprite2" type="Sprite" parent="Clouds"] -position = Vector2( 185.994, 21.8415 ) +[node name="Sprite2" type="Sprite" parent="Clouds/CloudGroup1"] +position = Vector2( 200, 20 ) texture = ExtResource( 3 ) centered = false -[node name="Sprite3" type="Sprite" parent="Clouds"] -position = Vector2( -64.0056, 43.8415 ) +[node name="Sprite3" type="Sprite" parent="Clouds/CloudGroup1"] +position = Vector2( -60, 40 ) texture = ExtResource( 4 ) centered = false -[node name="Sprite4" type="Sprite" parent="Clouds"] -position = Vector2( 306.994, 127.842 ) +[node name="Sprite4" type="Sprite" parent="Clouds/CloudGroup1"] +position = Vector2( 300, 130 ) texture = ExtResource( 4 ) centered = false -[node name="Sprite5" type="Sprite" parent="Clouds"] -position = Vector2( 36.9944, 155.842 ) +[node name="Sprite5" type="Sprite" parent="Clouds/CloudGroup1"] +position = Vector2( 30, 150 ) texture = ExtResource( 5 ) centered = false -[node name="Sprite6" type="Sprite" parent="Clouds"] -position = Vector2( 455.994, 67.8415 ) +[node name="Sprite6" type="Sprite" parent="Clouds/CloudGroup1"] +position = Vector2( 450, 70 ) texture = ExtResource( 5 ) centered = false -[node name="Sprite12" type="Sprite" parent="Clouds"] -position = Vector2( 592.805, 124.842 ) +[node name="CloudGroup2" type="Node2D" parent="Clouds"] + +[node name="Sprite1" type="Sprite" parent="Clouds/CloudGroup2"] +position = Vector2( -200, 120 ) texture = ExtResource( 3 ) centered = false -[node name="Sprite11" type="Sprite" parent="Clouds"] -position = Vector2( 968.805, 21.8415 ) +[node name="Sprite2" type="Sprite" parent="Clouds/CloudGroup2"] +position = Vector2( 200, 20 ) texture = ExtResource( 3 ) centered = false -[node name="Sprite10" type="Sprite" parent="Clouds"] -position = Vector2( 718.805, 43.8415 ) +[node name="Sprite3" type="Sprite" parent="Clouds/CloudGroup2"] +position = Vector2( -60, 40 ) texture = ExtResource( 4 ) centered = false -[node name="Sprite9" type="Sprite" parent="Clouds"] -position = Vector2( 1089.8, 127.842 ) +[node name="Sprite4" type="Sprite" parent="Clouds/CloudGroup2"] +position = Vector2( 300, 130 ) texture = ExtResource( 4 ) centered = false -[node name="Sprite8" type="Sprite" parent="Clouds"] -position = Vector2( 819.805, 155.842 ) +[node name="Sprite5" type="Sprite" parent="Clouds/CloudGroup2"] +position = Vector2( 30, 150 ) texture = ExtResource( 5 ) centered = false -[node name="Sprite7" type="Sprite" parent="Clouds"] -position = Vector2( 1238.8, 67.8415 ) +[node name="Sprite6" type="Sprite" parent="Clouds/CloudGroup2"] +position = Vector2( 450, 70 ) texture = ExtResource( 5 ) centered = false -[node name="Sprite18" type="Sprite" parent="Clouds"] -position = Vector2( 1369.85, 124.842 ) +[node name="CloudGroup3" type="Node2D" parent="Clouds"] +position = Vector2( 780, 0 ) + +[node name="Sprite1" type="Sprite" parent="Clouds/CloudGroup3"] +position = Vector2( -200, 120 ) texture = ExtResource( 3 ) centered = false -[node name="Sprite17" type="Sprite" parent="Clouds"] -position = Vector2( 1745.85, 21.8415 ) +[node name="Sprite2" type="Sprite" parent="Clouds/CloudGroup3"] +position = Vector2( 200, 20 ) texture = ExtResource( 3 ) centered = false -[node name="Sprite16" type="Sprite" parent="Clouds"] -position = Vector2( 1495.85, 43.8415 ) +[node name="Sprite3" type="Sprite" parent="Clouds/CloudGroup3"] +position = Vector2( -60, 40 ) texture = ExtResource( 4 ) centered = false -[node name="Sprite15" type="Sprite" parent="Clouds"] -position = Vector2( 1866.85, 127.842 ) +[node name="Sprite4" type="Sprite" parent="Clouds/CloudGroup3"] +position = Vector2( 300, 130 ) texture = ExtResource( 4 ) centered = false -[node name="Sprite14" type="Sprite" parent="Clouds"] -position = Vector2( 1596.85, 155.842 ) +[node name="Sprite5" type="Sprite" parent="Clouds/CloudGroup3"] +position = Vector2( 30, 150 ) texture = ExtResource( 5 ) centered = false -[node name="Sprite13" type="Sprite" parent="Clouds"] -position = Vector2( 2015.85, 67.8415 ) +[node name="Sprite6" type="Sprite" parent="Clouds/CloudGroup3"] +position = Vector2( 450, 70 ) +texture = ExtResource( 5 ) +centered = false + +[node name="CloudGroup4" type="Node2D" parent="Clouds"] +position = Vector2( 1560, 0 ) + +[node name="Sprite1" type="Sprite" parent="Clouds/CloudGroup4"] +position = Vector2( -200, 120 ) +texture = ExtResource( 3 ) +centered = false + +[node name="Sprite2" type="Sprite" parent="Clouds/CloudGroup4"] +position = Vector2( 200, 20 ) +texture = ExtResource( 3 ) +centered = false + +[node name="Sprite3" type="Sprite" parent="Clouds/CloudGroup4"] +position = Vector2( -60, 40 ) +texture = ExtResource( 4 ) +centered = false + +[node name="Sprite4" type="Sprite" parent="Clouds/CloudGroup4"] +position = Vector2( 300, 130 ) +texture = ExtResource( 4 ) +centered = false + +[node name="Sprite5" type="Sprite" parent="Clouds/CloudGroup4"] +position = Vector2( 30, 150 ) +texture = ExtResource( 5 ) +centered = false + +[node name="Sprite6" type="Sprite" parent="Clouds/CloudGroup4"] +position = Vector2( 450, 70 ) texture = ExtResource( 5 ) centered = false @@ -117,17 +158,17 @@ position = Vector2( 0, 481 ) motion_scale = Vector2( 0.2, 1 ) [node name="Sprite" type="Sprite" parent="Mountains2"] -position = Vector2( 0, -114.388 ) +position = Vector2( 0, -120 ) texture = ExtResource( 1 ) region_enabled = true -region_rect = Rect2( 0, 0, 3072, 256 ) +region_rect = Rect2( 0, 0, 4096, 256 ) [node name="Mountains1" type="ParallaxLayer" parent="."] position = Vector2( 0, 481 ) motion_scale = Vector2( 0.4, 1 ) [node name="Sprite" type="Sprite" parent="Mountains1"] -position = Vector2( 0, -100.279 ) +position = Vector2( 0, -100 ) texture = ExtResource( 6 ) region_enabled = true -region_rect = Rect2( 0, 0, 3072, 256 ) +region_rect = Rect2( 0, 0, 4096, 256 ) From d8546ece4230bae4de55a2ae28d93796323f5bac Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Wed, 12 Feb 2020 16:36:17 -0500 Subject: [PATCH 12/12] Add screenshots --- 2d/platformer/README.md | 4 ++++ 2d/platformer/screenshots/.gdignore | 0 2d/platformer/screenshots/layout.png | Bin 0 -> 111420 bytes 2d/platformer/screenshots/shoot.png | Bin 0 -> 31351 bytes 4 files changed, 4 insertions(+) create mode 100644 2d/platformer/screenshots/.gdignore create mode 100644 2d/platformer/screenshots/layout.png create mode 100644 2d/platformer/screenshots/shoot.png diff --git a/2d/platformer/README.md b/2d/platformer/README.md index ad342ea4..14dd89e0 100644 --- a/2d/platformer/README.md +++ b/2d/platformer/README.md @@ -23,3 +23,7 @@ We invite you to open the demo's GDScript files in the editor as they contain a - Pixel art visuals. - Sound effects and music. +## Screenshots + +![Player shooting in the direction of an enemy](screenshots/shoot.png) +![The entire level layout viewed in the editor](screenshots/layout.png) diff --git a/2d/platformer/screenshots/.gdignore b/2d/platformer/screenshots/.gdignore new file mode 100644 index 00000000..e69de29b diff --git a/2d/platformer/screenshots/layout.png b/2d/platformer/screenshots/layout.png new file mode 100644 index 0000000000000000000000000000000000000000..5df82475ae750833d82307ee4ecdc46beaf7c3f9 GIT binary patch literal 111420 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 literal 0 HcmV?d00001 diff --git a/2d/platformer/screenshots/shoot.png b/2d/platformer/screenshots/shoot.png new file mode 100644 index 0000000000000000000000000000000000000000..cbdd5f44eb20b4b0f3751012a49462a1f195df24 GIT binary patch literal 31351 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