5 Commits
46 changed files with 978 additions and 152 deletions

No files matched your search

+4 -104
View File
@@ -1,105 +1,5 @@
Week 4 - Environment
1. Create a second terrain for vegetation
Learn to use the tilemap layer to easily add vegetation to your level.
* Add a terrain to your terrain set zero
* Import and atlas your graphics (32x32)
* Paint terrain rules
2. Setting Display properties
Learn to set display properties to size the viewport and scale it.
Go to project settings:
Display>Window
Viewport Width 480
Viewport Height 270
This makes the viewport small, but we can now scale it up to the size we want to play at
Advanced settings: on
Window width override: 960
Window height override: 540
And finally how to handle the up-scaling
Stretch>Mode: viewport
aspect: keep
scale: 1.0
At this point you can control the scaling.
The closer the viewport setting is to the scaled size, the more of the
scene will be revealed.
You should add a camera to the player so that the viewport will show the area around them.
3. Creating a background
Create a "sky"
Create a color block the same size as your viewport (480x270)
Create a parallax2D > Add a child Sprite2D to it
Assign the graphic to be the sprite in Sprite2D
Offset the graphic in Sprite2D, 1/2 width, 1/2 height
In the parallax2D parent, set scroll scale to x:1.0 y:1.0
Repeat Size: x:480 y:270
Create a "midground" parallax2D
Scroll Scale x:1.05 y:1.0
Repeat Size x:480 y:0
Create a "foreground"
Scroll Scale x:1.1 y:1.0
Repeat Size x:480 y:0
Optional - Create a "front" parallax2D
4. Custom Graphics
Set up GIMP for creating custom pixel art
Make a background
Create a new document, set to the size of viewport (480x270)
Set up Canvas for Pixel Art
View > Show Grid
Image > Configure Grid
Spacing > 1 horizontal 1 vertical (pixels) > set foreground colour
Set up Tool for Pixel Art
Select "pencil" by click-hold on drawing tools
In tool options:
Size: 1.0
Hardness: 100
The pencil tool creates the hard edges we want in pixel art.
Saving your file as .xcf file will save your grid settings, but will not
automatically show the grid when you open the file. You will still need to
go to View > Show Grid
Turning Images into Pixel Art
When you bring in a reference image there is a good chance it will need to
have work done. A good way to get used to using reference images is to use
a silhoette image.
Get an image
Paste it as a new single layer
Scale it using the scaling tool
Use the colour picker tool to select the black
Make a new layer
Use the paint bucket tool to fill the selection (can now delete reference)
With the selection painted it will snap the paint to whole pixels, but
you will likely see some fuzzy edges because some of the pixels around edges
will be partially transparent.
You can use the colour picker tool set to "select by alpha". Now when you select
a transparent pixel, it will add all pixels with the same transparency to the
selection.
You can now use the paint bucket to fill the selection with an appropriate colour.
When done you can paint bucket the main colour (no selection) to flood-fill any
remaining partially transparent pixels.
Editing Pixel Art
You might want to customize your character art! Conveniently, your sprite sheets
are designed so that each limb of the character is composed of a consistent
colour in each frame.
This allows us to use the "colour selection" tool to select the limb in every frame.
And as above, the paint bucket can be used to fill the limb with an appropriate colour.
When complete, you can draw in anything else you like, though you will have to
do it for each cell. If you save it to your Godot project, it will overwrite
the graphics, and instantly show up in your game!
Scaling Pixel Art
Be aware that if you scale pixel art, there is a very high chance the edges will
become fuzzy and indistinct. This is because of "interpolation".
To avoid this problem, set the scaling tool to Interpolation - None.
Now when you scale your pixel art it will snap to the closes whole pixel,
maintaining the crisp edges.
Week 5:
Coin collection, bad guys, dealing damage
In this lesson, we get some enemies in the game, and along the way w
learn some valuable principles.
Binary file not shown.

After

Width:  |  Height:  |  Size: 908 B

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cn1qvqti2u0pk"
path="res://.godot/imported/mushroom_32x64.png-f773d82c5be18b26897c2ebfe3849a39.ctex"
uid="uid://bj3ccpqo3t7pv"
path="res://.godot/imported/slime_green.png-e5d60b3e093812754197fdd9edfc7bf5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/environment/mushroom_32x64.png"
dest_files=["res://.godot/imported/mushroom_32x64.png-f773d82c5be18b26897c2ebfe3849a39.ctex"]
source_file="res://assets/enemies/slime/slime_green.png"
dest_files=["res://.godot/imported/slime_green.png-e5d60b3e093812754197fdd9edfc7bf5.ctex"]
[params]
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bhr2gp8fktmd7"
path="res://.godot/imported/foreground.png-3151a7c34530c015b33a4ea37acc5e2f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/environment/bg/foreground.png"
dest_files=["res://.godot/imported/foreground.png-3151a7c34530c015b33a4ea37acc5e2f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bfhtipeqja1da"
path="res://.godot/imported/midground.png-03eab17df5ff63383933587ac063d6c8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/environment/bg/midground.png"
dest_files=["res://.godot/imported/midground.png-03eab17df5ff63383933587ac063d6c8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

+1 -1
View File
@@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b583o88duaqu"
uid="uid://dfikkb3kxl5vf"
path="res://.godot/imported/sky.png-86cc6f428916ab8e3e1824da6ccc3df5.ctex"
metadata={
"vram_texture": false
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://er1mfomleylu"
path="res://.godot/imported/plane_512x512.png-d829dffdb6fbf8fcd999f98a3b97a20e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/environment/flavour/plane_512x512.png"
dest_files=["res://.godot/imported/plane_512x512.png-d829dffdb6fbf8fcd999f98a3b97a20e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cewk7bgu5elop"
path="res://.godot/imported/mushroom_32x64.png-b1dbb217db4b1cc7fe723fa9cbf9622b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/environment/veggies/mushroom_32x64.png"
dest_files=["res://.godot/imported/mushroom_32x64.png-b1dbb217db4b1cc7fe723fa9cbf9622b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
File renamed without changes.
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bcgol8iru1j5n"
path="res://.godot/imported/veg_32x32.png-1a23bbefe425ba5c243b7f4852257a1b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/environment/veggies/veg_32x32.png"
dest_files=["res://.godot/imported/veg_32x32.png-1a23bbefe425ba5c243b7f4852257a1b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cj3we2brsknxh"
path="res://.godot/imported/veg_32x32.png-f547c76da23451f9a832bbe2fb852b32.ctex"
uid="uid://brsknqptomuux"
path="res://.godot/imported/coin.png-f4453cae0c71d6ed2110d4ba8123634d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/environment/veg_32x32.png"
dest_files=["res://.godot/imported/veg_32x32.png-f547c76da23451f9a832bbe2fb852b32.ctex"]
source_file="res://assets/pickups/coin.png"
dest_files=["res://.godot/imported/coin.png-f4453cae0c71d6ed2110d4ba8123634d.ctex"]
[params]
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://k0r4u3odrun4"
path="res://.godot/imported/Player Death 64x64.png-4a0ce04f5d26e871d084fcfc48e67d00.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/player/death/Player Death 64x64.png"
dest_files=["res://.godot/imported/Player Death 64x64.png-4a0ce04f5d26e871d084fcfc48e67d00.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c7ike4q1xl2gy"
path="res://.godot/imported/Player Hurt 48x48.png-4f3bee63f7b077a423955d655b236738.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/player/hurt/Player Hurt 48x48.png"
dest_files=["res://.godot/imported/Player Hurt 48x48.png-4f3bee63f7b077a423955d655b236738.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cmobbopn07ooi"
path="res://.godot/imported/plane_00.png-715574c35ac58427959c768c95980a6f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/source/plane_00.png"
dest_files=["res://.godot/imported/plane_00.png-715574c35ac58427959c768c95980a6f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://74b6xr74ylk0"
path="res://.godot/imported/plane_01.png-78095a15e23617810bded5bfa5f5ebae.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/source/plane_01.png"
dest_files=["res://.godot/imported/plane_01.png-78095a15e23617810bded5bfa5f5ebae.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://djdtyvgn5noje"
path="res://.godot/imported/plane_02.png-8b33a4b74ab76c2899e86cb37ed79d24.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/source/plane_02.png"
dest_files=["res://.godot/imported/plane_02.png-8b33a4b74ab76c2899e86cb37ed79d24.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bh3jkggvx0spp"
path="res://.godot/imported/plane_03.png-511bd1045c45b614ee2bbad36f4dd30b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/source/plane_03.png"
dest_files=["res://.godot/imported/plane_03.png-511bd1045c45b614ee2bbad36f4dd30b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
+2 -2
View File
@@ -17,8 +17,8 @@ config/icon="res://icon.svg"
[display]
window/size/viewport_width=580
window/size/viewport_height=370
window/size/viewport_width=480
window/size/viewport_height=270
window/size/window_width_override=960
window/size/window_height_override=540
window/stretch/mode="viewport"
+1
View File
@@ -20,4 +20,5 @@ rotation = -3.1367095
scale = Vector2(0.07999989, 0.08039169)
texture = ExtResource("2_y25gk")
[connection signal="area_entered" from="." to="." method="_on_body_entered"]
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
+113
View File
@@ -0,0 +1,113 @@
[gd_scene format=3 uid="uid://cfmbd0jdbrvd1"]
[ext_resource type="Script" uid="uid://d2sc7mlvheh7m" path="res://scripts/coin.gd" id="1_i64fm"]
[ext_resource type="Texture2D" uid="uid://brsknqptomuux" path="res://assets/pickups/coin.png" id="1_rwqht"]
[sub_resource type="CircleShape2D" id="CircleShape2D_i64fm"]
radius = 6.0
[sub_resource type="AtlasTexture" id="AtlasTexture_11l1o"]
atlas = ExtResource("1_rwqht")
region = Rect2(0, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_d14el"]
atlas = ExtResource("1_rwqht")
region = Rect2(16, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_1ikuy"]
atlas = ExtResource("1_rwqht")
region = Rect2(32, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_wnlwo"]
atlas = ExtResource("1_rwqht")
region = Rect2(48, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_jig8b"]
atlas = ExtResource("1_rwqht")
region = Rect2(64, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_xmuha"]
atlas = ExtResource("1_rwqht")
region = Rect2(80, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_kfxoj"]
atlas = ExtResource("1_rwqht")
region = Rect2(96, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_jsmju"]
atlas = ExtResource("1_rwqht")
region = Rect2(112, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_s0mny"]
atlas = ExtResource("1_rwqht")
region = Rect2(128, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_7cc30"]
atlas = ExtResource("1_rwqht")
region = Rect2(144, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_rojmm"]
atlas = ExtResource("1_rwqht")
region = Rect2(160, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_ls27i"]
atlas = ExtResource("1_rwqht")
region = Rect2(176, 0, 16, 16)
[sub_resource type="SpriteFrames" id="SpriteFrames_ssuvv"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_11l1o")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_d14el")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_1ikuy")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_wnlwo")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jig8b")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_xmuha")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_kfxoj")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jsmju")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_s0mny")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_7cc30")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_rojmm")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ls27i")
}],
"loop": true,
"name": &"default",
"speed": 12.0
}]
[node name="Coin" type="Area2D" unique_id=354461121]
script = ExtResource("1_i64fm")
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=151276741]
shape = SubResource("CircleShape2D_i64fm")
debug_color = Color(0.6971114, 0.4832114, 0.29441354, 0.41960785)
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=221062566]
texture_filter = 1
sprite_frames = SubResource("SpriteFrames_ssuvv")
autoplay = "default"
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
+73 -22
View File
@@ -1,14 +1,19 @@
[gd_scene format=4 uid="uid://ch6sfehmsskcs"]
[ext_resource type="Script" uid="uid://dtv434qd1rfmu" path="res://scripts/game.gd" id="1_lnu2h"]
[ext_resource type="Texture2D" uid="uid://b583o88duaqu" path="res://assets/environment/bg/sky.png" id="2_0tnpc"]
[ext_resource type="Texture2D" uid="uid://dfikkb3kxl5vf" path="res://assets/environment/bg/sky.png" id="2_0tnpc"]
[ext_resource type="Script" uid="uid://b5c00ybml8rj" path="res://scripts/scene_manager.gd" id="2_lbhrr"]
[ext_resource type="Texture2D" uid="uid://b6fqvrq70n5al" path="res://assets/environment/Terrain (32x32).png" id="2_p57ef"]
[ext_resource type="Texture2D" uid="uid://cn1qvqti2u0pk" path="res://assets/environment/mushroom_32x64.png" id="3_gee14"]
[ext_resource type="Texture2D" uid="uid://cj3we2brsknxh" path="res://assets/environment/veg_32x32.png" id="4_0tnpc"]
[ext_resource type="Texture2D" uid="uid://bcgol8iru1j5n" path="res://assets/environment/veggies/veg_32x32.png" id="3_gee14"]
[ext_resource type="Texture2D" uid="uid://bfhtipeqja1da" path="res://assets/environment/bg/midground.png" id="3_vtaks"]
[ext_resource type="Texture2D" uid="uid://cewk7bgu5elop" path="res://assets/environment/veggies/mushroom_32x64.png" id="4_0tnpc"]
[ext_resource type="PackedScene" uid="uid://byl4bdrupii3k" path="res://scenes/player.tscn" id="4_iywne"]
[ext_resource type="Texture2D" uid="uid://bhr2gp8fktmd7" path="res://assets/environment/bg/foreground.png" id="4_kvpfn"]
[ext_resource type="Texture2D" uid="uid://er1mfomleylu" path="res://assets/environment/flavour/plane_512x512.png" id="5_dinhu"]
[ext_resource type="PackedScene" uid="uid://b6cmg0k8qjoxi" path="res://scenes/crate.tscn" id="5_iywne"]
[ext_resource type="PackedScene" uid="uid://b3hgbbmb0nohj" path="res://scenes/trigger.tscn" id="5_p57ef"]
[ext_resource type="PackedScene" uid="uid://cfmbd0jdbrvd1" path="res://scenes/coin.tscn" id="13_kvuet"]
[ext_resource type="PackedScene" uid="uid://b23q2ppkeamyh" path="res://scenes/slime.tscn" id="14_trtic"]
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_u5sy4"]
texture = ExtResource("2_p57ef")
@@ -370,18 +375,18 @@ texture = ExtResource("3_gee14")
texture_region_size = Vector2i(32, 32)
0:0/0 = 0
0:0/0/terrain_set = 0
0:0/0/terrains_peering_bit/bottom_side = 1
0:1/0 = 0
0:1/0/terrain_set = 0
0:1/0/terrain = 1
0:1/0/terrains_peering_bit/top_side = 1
0:0/0/terrain = 1
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_kvpfn"]
texture = ExtResource("4_0tnpc")
texture_region_size = Vector2i(32, 32)
0:0/0 = 0
0:0/0/terrain_set = 0
0:0/0/terrain = 1
0:0/0/terrains_peering_bit/bottom_side = 1
0:1/0 = 0
0:1/0/terrain_set = 0
0:1/0/terrain = 1
0:1/0/terrains_peering_bit/top_side = 1
[sub_resource type="TileSet" id="TileSet_gee14"]
tile_size = Vector2i(32, 32)
@@ -389,7 +394,7 @@ physics_layer_0/collision_layer = 1
terrain_set_0/mode = 0
terrain_set_0/terrain_0/name = "LeafyGreen"
terrain_set_0/terrain_0/color = Color(0.5, 0.34375, 0.25, 1)
terrain_set_0/terrain_1/name = "Veg 1"
terrain_set_0/terrain_1/name = "Veg"
terrain_set_0/terrain_1/color = Color(0.5, 0.4375, 0.25, 1)
sources/0 = SubResource("TileSetAtlasSource_u5sy4")
sources/1 = SubResource("TileSetAtlasSource_vtaks")
@@ -402,38 +407,65 @@ sources/2 = SubResource("TileSetAtlasSource_kvpfn")
[node name="Game" type="Node2D" unique_id=981419409]
script = ExtResource("1_lnu2h")
[node name="Parallax2D" type="Parallax2D" parent="." unique_id=2081148083]
repeat_size = Vector2(580, 370)
[node name="bg" type="Node2D" parent="." unique_id=2006279143]
[node name="Sprite2D" type="Sprite2D" parent="Parallax2D" unique_id=879239814]
[node name="sky" type="Parallax2D" parent="bg" unique_id=96096944]
repeat_size = Vector2(480, 270)
[node name="Sprite2D" type="Sprite2D" parent="bg/sky" unique_id=8390549]
texture = ExtResource("2_0tnpc")
offset = Vector2(290, 185)
offset = Vector2(240, 135)
[node name="midgfround" type="Parallax2D" parent="bg" unique_id=698172308]
scroll_scale = Vector2(1.05, 1)
repeat_size = Vector2(480, 0)
[node name="Sprite2D" type="Sprite2D" parent="bg/midgfround" unique_id=603045131]
texture_filter = 1
texture = ExtResource("3_vtaks")
centered = false
offset = Vector2(0, 200)
[node name="foreground" type="Parallax2D" parent="bg" unique_id=991647999]
scroll_scale = Vector2(1.1, 1)
repeat_size = Vector2(480, 0)
[node name="Sprite2D" type="Sprite2D" parent="bg/foreground" unique_id=1856428018]
texture_filter = 1
texture = ExtResource("4_kvpfn")
offset = Vector2(240, 330)
[node name="plane" type="Sprite2D" parent="bg" unique_id=2025512082]
texture_filter = 1
position = Vector2(944, 322)
texture = ExtResource("5_dinhu")
[node name="TileMapLayer" type="TileMapLayer" parent="." unique_id=1253342998]
tile_map_data = PackedByteArray("AAARAA0AAAAQAAQAAAARAAwAAAAPAAMAAAASAAwAAAABAAQAAAATAAwAAAAQAAQAAAATAAsAAAAEAAAAAAAUAAkAAAAAAAQAAAAVAAkAAAABAAQAAAAWAAkAAAACAAQAAAAXABEAAAAAAAQAAAAYABEAAAAQAAQAAAAYABAAAAAPAAMAAAAZABAAAAABAAQAAAAaABAAAAABAAQAAAAbABAAAAAQAAQAAAAbAA8AAAAEAAAAAAAbAAwAAAAAAAIAAAAbAAsAAAAAAAAAAAAcAAsAAAABAAAAAAAcAAwAAAABAAIAAAAdAAwAAAACAAIAAAAdAAsAAAAJAAMAAAAeAAsAAAACAAQAAAANAA0AAAAAAAQAAAAOAA0AAAABAAQAAAAPAA0AAAABAAQAAAAQAA0AAAABAAQAAAAKAA8AAAAAAAQAAAALAA8AAAABAAQAAAAMAA8AAAABAAQAAAANAA8AAAAKAAMAAAAOAA8AAAABAAAAAAAPAA8AAAABAAAAAAAQAA8AAAACAAAAAAAQABAAAAACAAEAAAAPABAAAAAGAAAAAAAOABAAAAAGAAAAAAANABAAAAAJAAEAAAANABEAAAAAAAIAAAAOABEAAAABAAIAAAAPABEAAAABAAIAAAAQABEAAAAJAAQAAAARABEAAAABAAQAAAASABEAAAAMAAQAAAASABAAAAAEAAAAAAATABEAAAACAAQAAAAbAA4AAgAAAAAAAAAbAAoAAQAAAAEAAAAbAAkAAQAAAAAAAAAKAA4AAQAAAAEAAAAKAA0AAQAAAAAAAAALAA4AAgAAAAAAAAAVAAgAAgAAAAAAAAA=")
texture_filter = 1
tile_map_data = PackedByteArray("AAARAA0AAAAQAAQAAAARAAwAAAAPAAMAAAASAAwAAAABAAQAAAATAAwAAAAQAAQAAAATAAsAAAAEAAAAAAAUAAkAAAAAAAQAAAAVAAkAAAABAAQAAAAWAAkAAAACAAQAAAAXABEAAAAAAAQAAAAYABEAAAAQAAQAAAAYABAAAAAPAAMAAAAZABAAAAABAAQAAAAaABAAAAABAAQAAAAbABAAAAAQAAQAAAAbAA8AAAAEAAAAAAAbAAwAAAAAAAIAAAAbAAsAAAAAAAAAAAAcAAsAAAABAAAAAAAcAAwAAAABAAIAAAAdAAwAAAACAAIAAAAdAAsAAAAJAAMAAAAeAAsAAAACAAQAAAANAA0AAAAAAAQAAAAOAA0AAAABAAQAAAAPAA0AAAABAAQAAAAQAA0AAAABAAQAAAAKAA8AAAAAAAQAAAALAA8AAAABAAQAAAAMAA8AAAABAAQAAAANAA8AAAAKAAMAAAAOAA8AAAABAAAAAAAPAA8AAAABAAAAAAAQAA8AAAACAAAAAAAQABAAAAACAAEAAAAPABAAAAAGAAAAAAAOABAAAAAGAAAAAAANABAAAAAJAAEAAAANABEAAAAAAAIAAAAOABEAAAABAAIAAAAPABEAAAABAAIAAAAQABEAAAAJAAQAAAARABEAAAABAAQAAAASABEAAAAMAAQAAAASABAAAAAEAAAAAAATABEAAAACAAQAAAANAAwAAQAAAAAAAAAWAAgAAQAAAAAAAAAKAA4AAgAAAAEAAAAKAA0AAgAAAAAAAAA=")
tile_set = SubResource("TileSet_gee14")
[node name="SceneManager" type="Node2D" parent="." unique_id=323246552]
script = ExtResource("2_lbhrr")
[node name="Player" parent="." unique_id=2145223914 instance=ExtResource("4_iywne")]
position = Vector2(490, 380)
position = Vector2(446.00003, 465.00003)
[node name="Crates" type="Node2D" parent="." unique_id=207771395]
[node name="Crate" parent="Crates" unique_id=1609374030 instance=ExtResource("5_iywne")]
position = Vector2(951, 332.99997)
position = Vector2(916, 337)
[node name="Crate3" parent="Crates" unique_id=249514132 instance=ExtResource("5_iywne")]
position = Vector2(731, 340)
position = Vector2(690, 263)
[node name="Crate2" parent="Crates" unique_id=1603366376 instance=ExtResource("5_iywne")]
position = Vector2(558, 368)
position = Vector2(458, 355)
[node name="Walls" type="Node2D" parent="." unique_id=80334518]
[node name="StaticBody2D" type="StaticBody2D" parent="Walls" unique_id=1863997109]
position = Vector2(553.00006, 401)
position = Vector2(1143, 277)
scale = Vector2(3.4000025, 1)
metadata/_edit_group_ = true
@@ -449,7 +481,7 @@ metadata/_edit_group_ = true
shape = SubResource("RectangleShape2D_8cj0n")
[node name="StaticBody2D3" type="StaticBody2D" parent="Walls" unique_id=2089762008]
position = Vector2(734.00006, 377)
position = Vector2(1125, 128.00002)
scale = Vector2(3.4000025, 1)
metadata/_edit_group_ = true
@@ -457,7 +489,7 @@ metadata/_edit_group_ = true
shape = SubResource("RectangleShape2D_8cj0n")
[node name="StaticBody2D2" type="StaticBody2D" parent="Walls" unique_id=2038269484]
position = Vector2(681.00006, 398)
position = Vector2(1160.0001, 202)
rotation = -0.7375178
scale = Vector2(3.4000025, 1)
metadata/_edit_group_ = true
@@ -484,6 +516,25 @@ intent = "fan"
position = Vector2(953.99994, 442.99997)
intent = "teleport"
[node name="Coins" type="Node2D" parent="." unique_id=2040053188]
position = Vector2(459, 408)
[node name="Coin" parent="Coins" unique_id=354461121 instance=ExtResource("13_kvuet")]
[node name="Coin2" parent="Coins" unique_id=987971109 instance=ExtResource("13_kvuet")]
position = Vector2(116, -31)
[node name="Coin3" parent="Coins" unique_id=1071266659 instance=ExtResource("13_kvuet")]
position = Vector2(164, -65)
[node name="Enemies" type="Node2D" parent="." unique_id=791989786]
[node name="Slime" parent="Enemies" unique_id=822623820 instance=ExtResource("14_trtic")]
position = Vector2(401, 470)
[node name="Slime2" parent="Enemies" unique_id=1058828655 instance=ExtResource("14_trtic")]
position = Vector2(654, 277)
[connection signal="areaTriggerSignal" from="Triggers/Trigger" to="." method="_on_trigger"]
[connection signal="areaTriggerSignal" from="Triggers/Trigger2" to="." method="_on_trigger"]
[connection signal="areaTriggerSignal" from="Triggers/Trigger3" to="." method="_on_trigger"]
+115 -7
View File
@@ -4,7 +4,9 @@
[ext_resource type="Texture2D" uid="uid://b1ai5l50rwv4u" path="res://assets/player/idle/Player Idle 48x48.png" id="2_g2els"]
[ext_resource type="Texture2D" uid="uid://dngnhx41kw3mw" path="res://assets/player/charging/Player Punch 64x64.png" id="2_qlg0r"]
[ext_resource type="Texture2D" uid="uid://cgyc5mlhrd472" path="res://assets/player/jump_fall/player jump 48x48.png" id="3_dqkch"]
[ext_resource type="Texture2D" uid="uid://k0r4u3odrun4" path="res://assets/player/death/Player Death 64x64.png" id="3_fjrip"]
[ext_resource type="Texture2D" uid="uid://di17x5ovjtvtt" path="res://assets/player/run/player run 48x48.png" id="3_qhqgy"]
[ext_resource type="Texture2D" uid="uid://c7ike4q1xl2gy" path="res://assets/player/hurt/Player Hurt 48x48.png" id="5_smehm"]
[sub_resource type="CircleShape2D" id="CircleShape2D_uwrxv"]
@@ -12,10 +14,66 @@
atlas = ExtResource("2_qlg0r")
region = Rect2(128, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_pf23h"]
atlas = ExtResource("3_fjrip")
region = Rect2(0, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_dt7fs"]
atlas = ExtResource("3_fjrip")
region = Rect2(48, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_wqfne"]
atlas = ExtResource("3_fjrip")
region = Rect2(96, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_wnwbv"]
atlas = ExtResource("3_fjrip")
region = Rect2(144, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_gl8cc"]
atlas = ExtResource("3_fjrip")
region = Rect2(192, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_487ah"]
atlas = ExtResource("3_fjrip")
region = Rect2(240, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_md1ol"]
atlas = ExtResource("3_fjrip")
region = Rect2(288, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_bj30b"]
atlas = ExtResource("3_fjrip")
region = Rect2(336, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_jc3p3"]
atlas = ExtResource("3_fjrip")
region = Rect2(384, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_hax0n"]
atlas = ExtResource("3_fjrip")
region = Rect2(432, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_4ni07"]
atlas = ExtResource("3_dqkch")
region = Rect2(96, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_t4otl"]
atlas = ExtResource("5_smehm")
region = Rect2(0, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_j2b1d"]
atlas = ExtResource("5_smehm")
region = Rect2(48, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_cs1tg"]
atlas = ExtResource("5_smehm")
region = Rect2(96, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_2dvfe"]
atlas = ExtResource("5_smehm")
region = Rect2(144, 0, 48, 48)
[sub_resource type="AtlasTexture" id="AtlasTexture_qhqgy"]
atlas = ExtResource("2_g2els")
region = Rect2(0, 0, 48, 48)
@@ -120,6 +178,41 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_pf23h")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_dt7fs")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_wqfne")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_wnwbv")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_gl8cc")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_487ah")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_md1ol")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_bj30b")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jc3p3")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_hax0n")
}],
"loop": false,
"name": &"death",
"speed": 12.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_4ni07")
}],
"loop": false,
@@ -128,6 +221,23 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_t4otl")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_j2b1d")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_cs1tg")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2dvfe")
}],
"loop": false,
"name": &"hurt",
"speed": 12.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_qhqgy")
}, {
"duration": 1.0,
@@ -232,21 +342,19 @@ target_position = Vector2(16.891893, 0)
target_position = Vector2(-17.56757, -0.67567575)
[node name="RightSpawn" type="Marker2D" parent="." unique_id=72314368]
position = Vector2(12.837839, -8.1081085)
position = Vector2(12.837839, 0)
[node name="LeftSpawn" type="Marker2D" parent="." unique_id=374152113]
position = Vector2(-12.837839, -8.108109)
position = Vector2(-12.837839, 0.6756754)
[node name="PlayerGraphic" type="AnimatedSprite2D" parent="." unique_id=174634956]
texture_filter = 1
position = Vector2(0, -6.081082)
sprite_frames = SubResource("SpriteFrames_jej6c")
animation = &"shoving"
animation = &"death"
autoplay = "idle"
frame = 2
frame_progress = 1.0
[node name="Camera2D" type="Camera2D" parent="." unique_id=144867956]
offset = Vector2(0, -50)
[node name="Camera2D" type="Camera2D" parent="." unique_id=839648774]
offset = Vector2(0, -60)
[connection signal="animation_finished" from="PlayerGraphic" to="." method="_on_animation_finished"]
+71
View File
@@ -0,0 +1,71 @@
[gd_scene format=3 uid="uid://b23q2ppkeamyh"]
[ext_resource type="Texture2D" uid="uid://bj3ccpqo3t7pv" path="res://assets/enemies/slime/slime_green.png" id="1_371uh"]
[ext_resource type="Script" uid="uid://d215jspbbgtq6" path="res://scripts/slime.gd" id="1_p2gj0"]
[sub_resource type="AtlasTexture" id="AtlasTexture_p2gj0"]
atlas = ExtResource("1_371uh")
region = Rect2(0, 24, 24, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_n6pvg"]
atlas = ExtResource("1_371uh")
region = Rect2(24, 24, 24, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_pjw23"]
atlas = ExtResource("1_371uh")
region = Rect2(48, 24, 24, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_2npkn"]
atlas = ExtResource("1_371uh")
region = Rect2(72, 24, 24, 24)
[sub_resource type="SpriteFrames" id="SpriteFrames_fd6lc"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_p2gj0")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_n6pvg")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_pjw23")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2npkn")
}],
"loop": true,
"name": &"idle",
"speed": 12.0
}]
[sub_resource type="CircleShape2D" id="CircleShape2D_gstla"]
[node name="Slime" type="Area2D" unique_id=822623820 groups=["shootable"]]
script = ExtResource("1_p2gj0")
[node name="SlimeGraphic" type="AnimatedSprite2D" parent="." unique_id=610452905]
texture_filter = 1
position = Vector2(0, -1)
sprite_frames = SubResource("SpriteFrames_fd6lc")
animation = &"idle"
autoplay = "idle"
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1641996317]
shape = SubResource("CircleShape2D_gstla")
[node name="RightCast" type="RayCast2D" parent="." unique_id=460628221]
target_position = Vector2(16, 0)
[node name="RightDownCast" type="RayCast2D" parent="." unique_id=1352799730]
position = Vector2(9, 0)
target_position = Vector2(1, 14)
[node name="LeftDownCast" type="RayCast2D" parent="." unique_id=1378900976]
position = Vector2(-9, 0)
target_position = Vector2(1, 14)
[node name="LeftCast" type="RayCast2D" parent="." unique_id=1023073791]
target_position = Vector2(-16, 0)
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
+2 -1
View File
@@ -9,5 +9,6 @@ func _process(delta: float) -> void:
func _on_body_entered(body: Node2D) -> void:
if body is Crate:
if body.is_in_group("shootable"):
print("bullet hit!")
bulletHitSignal.emit(body,self)
+7
View File
@@ -0,0 +1,7 @@
class_name Coin extends Area2D
signal coinCollectedSignal(body,coin)
func _on_body_entered(body: Node2D) -> void:
if body is Player:
print("you hit a coin")
coinCollectedSignal.emit(body,self)
+1
View File
@@ -0,0 +1 @@
uid://d2sc7mlvheh7m
+50 -1
View File
@@ -2,10 +2,19 @@ class_name GameController extends Node2D
signal destroySignal(body)
signal fanTriggerSignal(body, fanDirection)
signal teleportTriggerSignal(body)
signal playerDamagedSignal(currentHealth,maxHealth)
signal playerDeathSignal
var numberOfCrates = 2
var timeAvailable = 50
var totalCoinsCollected = 0
var timer = Timer.new()
var enemiesDict={}
var playerStartingHealth = 100
var playerHealth = 100
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
get_window().grab_focus()
@@ -20,7 +29,7 @@ func countdown()->void:
timeAvailable-=1
if timeAvailable<=0 and numberOfCrates>0:
print("LOOOOOSAH")
get_tree().reload_current_scene()
playerDeathSignal.emit()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
@@ -31,6 +40,7 @@ func _on_trigger(body: Variant, trigger: Variant, intent:String) -> void:
print("GC knows trigger fired")
match intent:
"destroy":
if body is RigidBody2D:
destroySignal.emit(body)
"fan":
print("do a fan effect")
@@ -45,9 +55,25 @@ func crateTotal(howmany):
if numberOfCrates == 0:
print("YOU WON!!!")
get_tree().reload_current_scene()
func coinCollected(body,coin)->void:
totalCoinsCollected +=1
print("GC knows coin collected")
destroySignal.emit(coin)
func coinTotal(totalAmount)->void:
print("GC knows total coins remaining "+str(totalAmount))
func bulletDamage(body, _bullet)->void:
print("bullet hit")
if body.is_in_group("shootable"):
if body is Crate:
destroySignal.emit(body)
destroySignal.emit(_bullet)
if body is Slime:
enemiesDict[body]["health"] -= 10
if enemiesDict[body]["health"]<=0:
#kill the enemy
enemiesDict.erase(body)
destroySignal.emit(body)
destroySignal.emit(_bullet)
@@ -55,3 +81,26 @@ func rocketDamage(body, rocket)->void:
if body.is_in_group("shootable"):
print("Rocket strikes target!")
destroySignal.emit(body)
func addEnemyToLevel(enemy:Slime)->void:
var enemyStat = {
"health": 30+randi_range(0,10),
"damage": 20+randi_range(0,10)
}
enemiesDict[enemy]=enemyStat
func _on_slime_damage(body, slime:Slime)->void:
#remove damage from player health
print("remove damage from player "+str(enemiesDict[slime]["damage"]))
playerHealth -= enemiesDict[slime]["damage"]
if playerHealth <=0:
print("You DED")
#send a signal about player death
playerDeathSignal.emit()
else:
print("You damaged")
#send a signal about player damage
playerDamagedSignal.emit(playerHealth,playerStartingHealth)
func loadLevel()->void:
get_tree().reload_current_scene()
+23 -6
View File
@@ -2,6 +2,8 @@ class_name Player extends CharacterBody2D
signal pushSignal(body, direction)
signal shootSignal(markerPosition, speed)
signal fireSignal(markerPosition, direction, speed)
signal deathAnimationCompleteSignal
@onready var right_cast: RayCast2D = $RightCast
@onready var left_cast: RayCast2D = $LeftCast
@onready var right_spawn: Marker2D = $RightSpawn
@@ -19,11 +21,18 @@ const JUMP_VELOCITY = -400.0
enum FaceDirection {RIGHT,LEFT}
var facing:FaceDirection = FaceDirection.RIGHT
enum PlayerStates {IDLE,RUNNING,JUMPING,FALLING,CHARGING,SHOVING}
enum PlayerStates {IDLE,RUNNING,JUMPING,FALLING,CHARGING,SHOVING,HURT,DEAD}
var current_player_state:PlayerStates = PlayerStates.IDLE
var upJump:bool = false
func hurt(health,maxhealth)->void:
print("player hurt")
current_player_state=PlayerStates.HURT
func kill()->void:
print("player killed")
current_player_state=PlayerStates.DEAD
func _physics_process(delta: float) -> void:
if current_player_state != PlayerStates.DEAD:
handle_input()
handle_movement(delta)
handle_states()
@@ -39,7 +48,6 @@ func handle_input()->void:
upJump = true
# Handle shove.
if Input.is_action_just_pressed("shove"):
print("I want to shove")
if pushRightEnabled and facing==FaceDirection.RIGHT:
current_player_state= PlayerStates.CHARGING
pushTimer = Time.get_ticks_msec()
@@ -60,7 +68,7 @@ func handle_input()->void:
current_player_state = PlayerStates.SHOVING
#Handle Shoot Bullet
if Input.is_action_just_pressed("shoot"):
print("Ima shoot a bullet")
#marker postion, speed
match facing:
FaceDirection.RIGHT:
@@ -69,7 +77,7 @@ func handle_input()->void:
shootSignal.emit(left_spawn.global_transform, -800)
#Handle fire rocket
if Input.is_action_just_pressed("fire"):
print("Ima fire rocket")
match facing:
FaceDirection.RIGHT:
fireSignal.emit(right_spawn.global_transform,Vector2(1,0), 800)
@@ -95,7 +103,7 @@ func handle_movement(delta)->void:
velocity += get_gravity() * delta
func handle_collisions()->void:
if right_cast.is_colliding():
print("Right raycast collision")
var collider = right_cast.get_collider()
if collider is Node:
pushRightEnabled = true
@@ -104,7 +112,7 @@ func handle_collisions()->void:
pushRightEnabled = false
if left_cast.is_colliding():
print("Left raycast collision")
var collider = left_cast.get_collider()
if collider is Node:
pushLeftEnabled = true
@@ -148,6 +156,10 @@ func handle_animation()->void:
player_graphic.play("charging")
PlayerStates.SHOVING:
player_graphic.play("shoving")
PlayerStates.HURT:
player_graphic.play("hurt")
PlayerStates.DEAD:
player_graphic.play("death")
func _on_animation_finished() -> void:
@@ -156,3 +168,8 @@ func _on_animation_finished() -> void:
upJump = false
PlayerStates.SHOVING:
current_player_state = PlayerStates.IDLE
PlayerStates.HURT:
current_player_state = PlayerStates.IDLE
PlayerStates.DEAD:
#emit signal for end of death animation
deathAnimationCompleteSignal.emit()
+33
View File
@@ -2,6 +2,9 @@ extends Node2D
@onready var game: GameController = $".."
@onready var crates: Node2D = $"../Crates"
@onready var player: Player = $"../Player"
@onready var coin: Coin = $"../Coins/Coin"
@onready var coins: Node2D = $"../Coins"
@onready var enemies: Node2D = $"../Enemies"
var bullet = preload("res://scenes/bullet.tscn")
var rocket = preload("res://scenes/rocket.tscn")
@@ -17,11 +20,17 @@ func _ready() -> void:
player.pushSignal.connect(pushTarget)
player.shootSignal.connect(makeBullet)
player.fireSignal.connect(makeRocket)
player.deathAnimationCompleteSignal.connect(game.loadLevel)
#signals from the GameController
game.destroySignal.connect(destroy)
game.fanTriggerSignal.connect(pushTarget)
game.teleportTriggerSignal.connect(teleportTarget)
game.playerDamagedSignal.connect(player.hurt)
game.playerDeathSignal.connect(player.kill)
#signals from pickups
coin.coinCollectedSignal.connect(game.coinCollected)
buildLevel()
@@ -32,6 +41,17 @@ func _process(delta: float) -> void:
func buildLevel()->void:
#tell GC how many crates...
updateCrates()
updateCoins()
updateEnemies()
func updateEnemies()->void:
if enemies:
for obj in enemies.get_children():
if obj is Slime:
game.addEnemyToLevel(obj)
#hook up to game controller
if not obj.slimeDamageSignal.is_connected(game._on_slime_damage):
obj.slimeDamageSignal.connect(game._on_slime_damage)
func updateCrates()->void:
var totalCrates = 0
@@ -44,6 +64,19 @@ func updateCrates()->void:
game.crateTotal(totalCrates)
#any time a coin exits tree, game controller is updated
func updateCoins()->void:
var totalCoins = 0
if coins:
for obj in coins.get_children():
if obj is Coin:
if not obj.coinCollectedSignal.is_connected(game.coinCollected):
obj.coinCollectedSignal.connect(game.coinCollected)
if not obj.tree_exited.is_connected(updateCoins):
obj.tree_exited.connect(updateCoins)
totalCoins +=1
game.coinTotal(totalCoins)
func pushTarget(body,pushDirection)->void:
if body is RigidBody2D:
body.apply_central_impulse(pushDirection)
+33
View File
@@ -0,0 +1,33 @@
class_name Slime extends Area2D
@onready var right_cast: RayCast2D = $RightCast
@onready var right_down_cast: RayCast2D = $RightDownCast
@onready var left_down_cast: RayCast2D = $LeftDownCast
@onready var left_cast: RayCast2D = $LeftCast
@onready var slime_graphic: AnimatedSprite2D = $SlimeGraphic
var speed:int = 100
var direction = 1
signal slimeDamageSignal(body,slime)
#Animation code
func _process(delta: float) -> void:
if not right_down_cast.is_colliding():
direction = -1
slime_graphic.flip_h = true
if not left_down_cast.is_colliding():
direction = 1
slime_graphic.flip_h = false
if right_cast.is_colliding() && not right_cast.get_collider() is Player:
direction = -1
slime_graphic.flip_h = true
if left_cast.is_colliding() && not left_cast.get_collider() is Player:
direction = 1
slime_graphic.flip_h = false
position.x += direction * speed * delta
func _on_body_entered(body: Node2D) -> void:
if body is Player:
slimeDamageSignal.emit(body, self)
+1
View File
@@ -0,0 +1 @@
uid://d215jspbbgtq6