diff --git a/boxboy/boxboy.gd b/boxboy/boxboy.gd index fb8c79b..b428163 100644 --- a/boxboy/boxboy.gd +++ b/boxboy/boxboy.gd @@ -3,13 +3,24 @@ class_name BoxBoy extends CharacterBody2D @onready var _sprite = $AnimatedSprite2D const MOVE_FORCE: int = 300 -const JUMP_FORCE: int = 800 +const JUMP_FORCE: int = 500 #about 4 tiles -const GRAVITY_UP: int = 15 -const GRAVITY_DOWN: int = 30 +const GRAVITY_RISING: int = 15 +const GRAVITY_FALLING: int = 30 +#bouncy platform +const BOUNCE_FORCE: int = -820 #about 10 tiles +var just_bounced: bool = false #allow max bounce height (i.e. ignore jump input) + +#floaty field +const FLOATY_RISING: int = -10 +const FLOATY_FALLING: int = -30 +var floaty_counter: int = 0 + +#limits const MAX_MOVE_SPEED: int = 300 const MAX_FALL_SPEED: int = 500 +const MAX_FLOATY_SPEED: int = -300 #boilerplate func _ready(): @@ -17,19 +28,31 @@ func _ready(): #movement func _physics_process(_delta) -> void: - #input, jumps + #jump input if is_on_floor() and Input.is_action_just_pressed("input_jump"): velocity.y -= JUMP_FORCE + if floaty_counter > 0: + #inverted - could tweak the rise? + if is_rising(): + velocity.y += FLOATY_RISING + else: + velocity.y += FLOATY_FALLING #fall faster than you rise - if is_airborne_rising() and Input.is_action_pressed("input_jump"): - velocity.y += GRAVITY_UP + elif is_rising() and (Input.is_action_pressed("input_jump") or just_bounced): + velocity.y += GRAVITY_RISING else: - velocity.y += GRAVITY_DOWN + velocity.y += GRAVITY_FALLING + just_bounced = false - if is_airborne_falling() and velocity.y > MAX_FALL_SPEED: + #terminal velocity + if floaty_counter > 0: + if velocity.y < MAX_FLOATY_SPEED: + velocity.y = MAX_FLOATY_SPEED + elif is_falling() and velocity.y > MAX_FALL_SPEED: velocity.y = MAX_FALL_SPEED - + + print(velocity.y) #input, walking var move_dir = Input.get_axis("input_left", "input_right") @@ -55,10 +78,19 @@ func _on_animation_finished() -> void: _sprite.play("idle", 2) #utils -func is_airborne() -> bool: return !is_on_floor() -func is_airborne_rising() -> bool: return !is_on_floor() and velocity.y < 0 -func is_airborne_falling() -> bool: return !is_on_floor() and velocity.y >= 0 +#func is_airborne() -> bool: return !is_on_floor() +func is_rising() -> bool: return velocity.y < 0 +func is_falling() -> bool: return velocity.y >= 0 #external actions func apply_bounce() -> void: - velocity.y -= JUMP_FORCE + velocity.y = BOUNCE_FORCE + just_bounced = true + +func enable_float() -> void: + floaty_counter += 1 + pass + +func disable_float() -> void: + floaty_counter -= 1 + pass diff --git a/platforms/Bouncy.tscn b/platforms/Bouncy.tscn index 67eb85e..35af6ee 100644 --- a/platforms/Bouncy.tscn +++ b/platforms/Bouncy.tscn @@ -19,11 +19,14 @@ size = Vector2(32, 16) [node name="Bouncy" type="Area2D"] script = ExtResource("1_uccqy") +metadata/_edit_group_ = true [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] sprite_frames = SubResource("SpriteFrames_npa0g") +metadata/_edit_lock_ = true [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("RectangleShape2D_qqmjc") +metadata/_edit_lock_ = true [connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/platforms/Floaty.tscn b/platforms/Floaty.tscn new file mode 100644 index 0000000..4d95576 --- /dev/null +++ b/platforms/Floaty.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=5 format=3 uid="uid://8gd74f7ltuwk"] + +[ext_resource type="Script" uid="uid://6xvc47rc3xnp" path="res://platforms/floaty.gd" id="1_nilcs"] +[ext_resource type="Texture2D" uid="uid://uo0dn2kbqhh8" path="res://platforms/floaty.png" id="1_tt70t"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_nilcs"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_tt70t") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cftfe"] +size = Vector2(64, 64) + +[node name="Floaty" type="Area2D"] +script = ExtResource("1_nilcs") +metadata/_edit_group_ = true + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] +z_index = -100 +sprite_frames = SubResource("SpriteFrames_nilcs") +metadata/_edit_lock_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_cftfe") +metadata/_edit_lock_ = true + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] +[connection signal="body_exited" from="." to="." method="_on_body_exited"] diff --git a/platforms/bouncy.gd b/platforms/bouncy.gd index 8f7d235..a280f0d 100644 --- a/platforms/bouncy.gd +++ b/platforms/bouncy.gd @@ -1,6 +1,6 @@ extends Area2D func _on_body_entered(body) -> void: - print("collision") + #print("collision") if body is BoxBoy: body.apply_bounce() diff --git a/platforms/bouncy.xcf b/platforms/bouncy.xcf index 9e6a3ad..e820fc1 100644 Binary files a/platforms/bouncy.xcf and b/platforms/bouncy.xcf differ diff --git a/platforms/floaty.gd b/platforms/floaty.gd new file mode 100644 index 0000000..e1b78d8 --- /dev/null +++ b/platforms/floaty.gd @@ -0,0 +1,10 @@ +extends Area2D + +func _on_body_entered(body) -> void: + #print("collision") + if body is BoxBoy: + body.enable_float() + +func _on_body_exited(body) -> void: + if body is BoxBoy: + body.disable_float() diff --git a/platforms/floaty.gd.uid b/platforms/floaty.gd.uid new file mode 100644 index 0000000..d68f2fa --- /dev/null +++ b/platforms/floaty.gd.uid @@ -0,0 +1 @@ +uid://6xvc47rc3xnp diff --git a/platforms/floaty.png b/platforms/floaty.png new file mode 100644 index 0000000..fe08a12 Binary files /dev/null and b/platforms/floaty.png differ diff --git a/platforms/floaty.png.import b/platforms/floaty.png.import new file mode 100644 index 0000000..cacf3cd --- /dev/null +++ b/platforms/floaty.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://uo0dn2kbqhh8" +path="res://.godot/imported/floaty.png-42918432e8e7ab00ea08963791112ec0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://platforms/floaty.png" +dest_files=["res://.godot/imported/floaty.png-42918432e8e7ab00ea08963791112ec0.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 diff --git a/platforms/floaty.xcf b/platforms/floaty.xcf new file mode 100644 index 0000000..e4a9d2d Binary files /dev/null and b/platforms/floaty.xcf differ diff --git a/project.godot b/project.godot index 67d2f76..8667a48 100644 --- a/project.godot +++ b/project.godot @@ -15,11 +15,6 @@ run/main_scene="res://scene.tscn" config/features=PackedStringArray("4.5", "Forward Plus") config/icon="res://icon.svg" -[display] - -window/size/viewport_width=800 -window/size/viewport_height=600 - [input] input_right={ diff --git a/scene.tscn b/scene.tscn index cdee063..5f209a2 100644 --- a/scene.tscn +++ b/scene.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=11 format=4 uid="uid://b7ndmr6uvnyqb"] +[gd_scene load_steps=12 format=4 uid="uid://b7ndmr6uvnyqb"] [ext_resource type="Texture2D" uid="uid://ddl0kxl0inw6r" path="res://tiles/atlas.png" id="1_3253y"] [ext_resource type="Script" uid="uid://c2x51mppxugpn" path="res://boxboy/boxboy.gd" id="1_nxogm"] [ext_resource type="Texture2D" uid="uid://bpjhq0b2dae1d" path="res://boxboy/boxboy.png" id="1_ulcgi"] [ext_resource type="PackedScene" uid="uid://b1hpr05b5sgww" path="res://platforms/Bouncy.tscn" id="4_u3cyc"] +[ext_resource type="PackedScene" uid="uid://8gd74f7ltuwk" path="res://platforms/Floaty.tscn" id="5_m7jmp"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_u3cyc"] texture = ExtResource("1_3253y") @@ -57,24 +58,30 @@ height = 32.0 [node name="Node2D" type="Node2D"] [node name="TileMapLayer" type="TileMapLayer" parent="."] -position = Vector2(117, 76) -tile_map_data = PackedByteArray("AAD9/w0ABAAAAAAAAAD9/w4ABAABAAAAAAD9/w8ABAABAAAAAAD+/w0ABAAAAAAAAAD+/w4ABAABAAAAAAD+/w8ABAABAAAAAAD//w0ABAAAAAAAAAD//w4ABAABAAAAAAD//w8ABAABAAAAAAAAAA0ABAAAAAAAAAAAAA4ABAABAAAAAAAAAA8ABAABAAAAAAABAA0ABAAAAAAAAAABAA4ABAABAAAAAAABAA8ABAABAAAAAAACAA0ABAAAAAAAAAACAA4ABAABAAAAAAACAA8ABAABAAAAAAADAA0ABAAAAAAAAAADAA4ABAABAAAAAAADAA8ABAABAAAAAAAEAA0ABAAAAAAAAAAEAA4ABAABAAAAAAAEAA8ABAABAAAAAAAFAA0ABAAAAAAAAAAFAA4ABAABAAAAAAAFAA8ABAABAAAAAAAGAA0ABAAAAAAAAAAGAA4ABAABAAAAAAAGAA8ABAABAAAAAAAHAA0ABAAAAAAAAAAHAA4ABAABAAAAAAAHAA8ABAABAAAAAAAIAA0ABAAAAAAAAAAIAA4ABAABAAAAAAAIAA8ABAABAAAAAAAJAA0ABAAAAAAAAAAJAA4ABAABAAAAAAAJAA8ABAABAAAAAAAKAA0ABAAAAAAAAAAKAA4ABAABAAAAAAAKAA8ABAABAAAAAAALAA0ABAAAAAAAAAALAA4ABAABAAAAAAALAA8ABAABAAAAAAAMAA0ABAAAAAAAAAAMAA4ABAABAAAAAAAMAA8ABAABAAAAAAANAA0ABAAAAAAAAAANAA4ABAABAAAAAAANAA8ABAABAAAAAAAOAA0ABAAAAAAAAAAOAA4ABAABAAAAAAAOAA8ABAABAAAAAAAPAA0ABAAAAAAAAAAPAA4ABAABAAAAAAAPAA8ABAABAAAAAAAQAA0ABAAAAAAAAAAQAA4ABAABAAAAAAAQAA8ABAABAAAAAAARAA0ABAAAAAAAAAARAA4ABAABAAAAAAARAA8ABAABAAAAAAASAA0ABAAAAAAAAAASAA4ABAABAAAAAAASAA8ABAABAAAAAAATAA0ABAAAAAAAAAATAA4ABAABAAAAAAATAA8ABAABAAAAAAAUAA0ABAAAAAAAAAAUAA4ABAABAAAAAAAUAA8ABAABAAAAAAAVAA0ABAAAAAAAAAAVAA4ABAABAAAAAAAVAA8ABAABAAAAAAAWAA0ABAAAAAAAAAAWAA4ABAABAAAAAAAWAA8ABAABAAAAAAAXAA0ABAAAAAAAAAAXAA4ABAABAAAAAAAXAA8ABAABAAAAAAAYAA0ABAAAAAAAAAAYAA4ABAABAAAAAAAYAA8ABAABAAAAAAAZAA0ABAAAAAAAAAAZAA4ABAABAAAAAAAZAA8ABAABAAAAAAAaAA0ABAAAAAAAAAAaAA4ABAABAAAAAAAaAA8ABAABAAAAAAAbAA0ABAAAAAAAAAAbAA4ABAABAAAAAAAbAA8ABAABAAAAAAAcAA0ABAAAAAAAAAAcAA4ABAABAAAAAAAcAA8ABAABAAAAAAAdAA0ABAAAAAAAAAAdAA4ABAABAAAAAAAdAA8ABAABAAAAAAAeAA0ABAAAAAAAAAAeAA4ABAABAAAAAAAeAA8ABAABAAAAAAAfAA0ABAAAAAAAAAAfAA4ABAABAAAAAAAfAA8ABAABAAAAAAD9/xAABAABAAAAAAD+/xAABAABAAAAAAD//xAABAABAAAAAAAAABAABAABAAAAAAABABAABAABAAAAAAACABAABAABAAAAAAADABAABAABAAAAAAAEABAABAABAAAAAAAFABAABAABAAAAAAAGABAABAABAAAAAAAHABAABAABAAAAAAAIABAABAABAAAAAAAJABAABAABAAAAAAAKABAABAABAAAAAAALABAABAABAAAAAAAMABAABAABAAAAAAANABAABAABAAAAAAAOABAABAABAAAAAAAPABAABAABAAAAAAAQABAABAABAAAAAAARABAABAABAAAAAAASABAABAABAAAAAAATABAABAABAAAAAAAUABAABAABAAAAAAAVABAABAABAAAAAAAWABAABAABAAAAAAAXABAABAABAAAAAAAYABAABAABAAAAAAAZABAABAABAAAAAAAaABAABAABAAAAAAAbABAABAABAAAAAAAcABAABAABAAAAAAAdABAABAABAAAAAAAeABAABAABAAAAAAAfABAABAABAAAAAAAWAAoABAABAAAAAAAXAAoABAABAAAAAAAYAAoABAABAAAAAAAZAAoABAABAAAAAAAaAAoABAABAAAAAAAbAAoABAABAAAAAAAcAAoABAABAAAAAAAWAAkABAAAAAAAAAAXAAkABAAAAAAAAAAYAAkABAAAAAAAAAAZAAkABAAAAAAAAAAaAAkABAAAAAAAAAAbAAkABAAAAAAAAAAcAAkABAAAAAAAAAA=") +tile_map_data = PackedByteArray("AAD9/w0ABAAAAAAAAAD9/w4ABAABAAAAAAD9/w8ABAABAAAAAAD+/w0ABAAAAAAAAAD+/w4ABAABAAAAAAD+/w8ABAABAAAAAAD//w0ABAAAAAAAAAD//w4ABAABAAAAAAD//w8ABAABAAAAAAAAAA0ABAAAAAAAAAAAAA4ABAABAAAAAAAAAA8ABAABAAAAAAABAA0ABAAAAAAAAAABAA4ABAABAAAAAAABAA8ABAABAAAAAAACAA0ABAAAAAAAAAACAA4ABAABAAAAAAACAA8ABAABAAAAAAADAA0ABAAAAAAAAAADAA4ABAABAAAAAAADAA8ABAABAAAAAAAEAA0ABAAAAAAAAAAEAA4ABAABAAAAAAAEAA8ABAABAAAAAAAFAA0ABAAAAAAAAAAFAA4ABAABAAAAAAAFAA8ABAABAAAAAAAGAA0ABAAAAAAAAAAGAA4ABAABAAAAAAAGAA8ABAABAAAAAAAHAA0ABAAAAAAAAAAHAA4ABAABAAAAAAAHAA8ABAABAAAAAAAIAA0ABAAAAAAAAAAIAA4ABAABAAAAAAAIAA8ABAABAAAAAAAJAA0ABAAAAAAAAAAJAA4ABAABAAAAAAAJAA8ABAABAAAAAAAKAA0ABAAAAAAAAAAKAA4ABAABAAAAAAAKAA8ABAABAAAAAAALAA0ABAAAAAAAAAALAA4ABAABAAAAAAALAA8ABAABAAAAAAAMAA0ABAAAAAAAAAAMAA4ABAABAAAAAAAMAA8ABAABAAAAAAANAA0ABAAAAAAAAAANAA4ABAABAAAAAAANAA8ABAABAAAAAAAOAA0ABAAAAAAAAAAOAA4ABAABAAAAAAAOAA8ABAABAAAAAAAPAA0ABAAAAAAAAAAPAA4ABAABAAAAAAAPAA8ABAABAAAAAAAQAA4ABAABAAAAAAAQAA8ABAABAAAAAAARAA0ABAAAAAAAAAARAA4ABAABAAAAAAARAA8ABAABAAAAAAASAA0ABAAAAAAAAAASAA4ABAABAAAAAAASAA8ABAABAAAAAAATAA0ABAAAAAAAAAATAA4ABAABAAAAAAATAA8ABAABAAAAAAAUAA0ABAAAAAAAAAAUAA4ABAABAAAAAAAUAA8ABAABAAAAAAAVAA0ABAAAAAAAAAAVAA4ABAABAAAAAAAVAA8ABAABAAAAAAAWAA0ABAAAAAAAAAAWAA4ABAABAAAAAAAWAA8ABAABAAAAAAAXAA0ABAAAAAAAAAAXAA4ABAABAAAAAAAXAA8ABAABAAAAAAAYAA0ABAAAAAAAAAAYAA4ABAABAAAAAAAYAA8ABAABAAAAAAAZAA0ABAAAAAAAAAAZAA4ABAABAAAAAAAZAA8ABAABAAAAAAAaAA0ABAAAAAAAAAAaAA4ABAABAAAAAAAaAA8ABAABAAAAAAAbAA0ABAAAAAAAAAAbAA4ABAABAAAAAAAbAA8ABAABAAAAAAAcAA0ABAAAAAAAAAAcAA4ABAABAAAAAAAcAA8ABAABAAAAAAAdAA0ABAAAAAAAAAAdAA4ABAABAAAAAAAdAA8ABAABAAAAAAAeAA0ABAAAAAAAAAAeAA4ABAABAAAAAAAeAA8ABAABAAAAAAAfAA0ABAAAAAAAAAAfAA4ABAABAAAAAAAfAA8ABAABAAAAAAD9/xAABAABAAAAAAD+/xAABAABAAAAAAD//xAABAABAAAAAAAAABAABAABAAAAAAABABAABAABAAAAAAACABAABAABAAAAAAADABAABAABAAAAAAAEABAABAABAAAAAAAFABAABAABAAAAAAAGABAABAABAAAAAAAHABAABAABAAAAAAAIABAABAABAAAAAAAJABAABAABAAAAAAAKABAABAABAAAAAAALABAABAABAAAAAAAMABAABAABAAAAAAANABAABAABAAAAAAAOABAABAABAAAAAAAPABAABAABAAAAAAAQABAABAABAAAAAAARABAABAABAAAAAAASABAABAABAAAAAAATABAABAABAAAAAAAUABAABAABAAAAAAAVABAABAABAAAAAAAWABAABAABAAAAAAAXABAABAABAAAAAAAYABAABAABAAAAAAAZABAABAABAAAAAAAaABAABAABAAAAAAAbABAABAABAAAAAAAcABAABAABAAAAAAAdABAABAABAAAAAAAeABAABAABAAAAAAAfABAABAABAAAAAAAWAAoABAABAAAAAAAXAAoABAABAAAAAAAYAAoABAABAAAAAAAZAAoABAABAAAAAAAaAAoABAABAAAAAAAbAAoABAABAAAAAAAcAAoABAABAAAAAAAWAAkABAAAAAAAAAAXAAkABAAAAAAAAAAYAAkABAAAAAAAAAAZAAkABAAAAAAAAAAaAAkABAAAAAAAAAAbAAkABAAAAAAAAAAcAAkABAAAAAAAAAASAAMABAACAAAAAAASAAIABAACAAAAAAAQAA0ABAAAAAAAAAA=") tile_set = SubResource("TileSet_xlvrw") +metadata/_edit_lock_ = true [node name="Boxboy" type="CharacterBody2D" parent="."] -position = Vector2(117, 76) +position = Vector2(128, 384) script = ExtResource("1_nxogm") [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Boxboy"] sprite_frames = SubResource("SpriteFrames_y2354") animation = &"idle" +metadata/_edit_lock_ = true [node name="CollisionShape2D" type="CollisionShape2D" parent="Boxboy"] shape = SubResource("CapsuleShape2D_ulcgi") +metadata/_edit_lock_ = true [node name="Camera2D" type="Camera2D" parent="Boxboy"] +metadata/_edit_lock_ = true [node name="Bouncy" parent="." instance=ExtResource("4_u3cyc")] -position = Vector2(622, 475) +position = Vector2(528, 408) + +[node name="Floaty" parent="." instance=ExtResource("5_m7jmp")] +position = Vector2(224, 384) [connection signal="animation_finished" from="Boxboy/AnimatedSprite2D" to="Boxboy" method="_on_animation_finished"]