Started working on a floaty field

This commit is contained in:
2026-01-27 19:15:00 +11:00
parent 8cf357ca68
commit ab0f5efa30
12 changed files with 146 additions and 24 deletions

View File

@@ -3,13 +3,24 @@ class_name BoxBoy extends CharacterBody2D
@onready var _sprite = $AnimatedSprite2D @onready var _sprite = $AnimatedSprite2D
const MOVE_FORCE: int = 300 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_RISING: int = 15
const GRAVITY_DOWN: int = 30 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_MOVE_SPEED: int = 300
const MAX_FALL_SPEED: int = 500 const MAX_FALL_SPEED: int = 500
const MAX_FLOATY_SPEED: int = -300
#boilerplate #boilerplate
func _ready(): func _ready():
@@ -17,19 +28,31 @@ func _ready():
#movement #movement
func _physics_process(_delta) -> void: func _physics_process(_delta) -> void:
#input, jumps #jump input
if is_on_floor() and Input.is_action_just_pressed("input_jump"): if is_on_floor() and Input.is_action_just_pressed("input_jump"):
velocity.y -= JUMP_FORCE velocity.y -= JUMP_FORCE
#fall faster than you rise if floaty_counter > 0:
if is_airborne_rising() and Input.is_action_pressed("input_jump"): #inverted - could tweak the rise?
velocity.y += GRAVITY_UP if is_rising():
velocity.y += FLOATY_RISING
else: else:
velocity.y += GRAVITY_DOWN velocity.y += FLOATY_FALLING
#fall faster than you rise
elif is_rising() and (Input.is_action_pressed("input_jump") or just_bounced):
velocity.y += GRAVITY_RISING
else:
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 velocity.y = MAX_FALL_SPEED
print(velocity.y)
#input, walking #input, walking
var move_dir = Input.get_axis("input_left", "input_right") var move_dir = Input.get_axis("input_left", "input_right")
@@ -55,10 +78,19 @@ func _on_animation_finished() -> void:
_sprite.play("idle", 2) _sprite.play("idle", 2)
#utils #utils
func is_airborne() -> bool: return !is_on_floor() #func is_airborne() -> bool: return !is_on_floor()
func is_airborne_rising() -> bool: return !is_on_floor() and velocity.y < 0 func is_rising() -> bool: return velocity.y < 0
func is_airborne_falling() -> bool: return !is_on_floor() and velocity.y >= 0 func is_falling() -> bool: return velocity.y >= 0
#external actions #external actions
func apply_bounce() -> void: 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

View File

@@ -19,11 +19,14 @@ size = Vector2(32, 16)
[node name="Bouncy" type="Area2D"] [node name="Bouncy" type="Area2D"]
script = ExtResource("1_uccqy") script = ExtResource("1_uccqy")
metadata/_edit_group_ = true
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
sprite_frames = SubResource("SpriteFrames_npa0g") sprite_frames = SubResource("SpriteFrames_npa0g")
metadata/_edit_lock_ = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="."] [node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("RectangleShape2D_qqmjc") shape = SubResource("RectangleShape2D_qqmjc")
metadata/_edit_lock_ = true
[connection signal="body_entered" from="." to="." method="_on_body_entered"] [connection signal="body_entered" from="." to="." method="_on_body_entered"]

34
platforms/Floaty.tscn Normal file
View File

@@ -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"]

View File

@@ -1,6 +1,6 @@
extends Area2D extends Area2D
func _on_body_entered(body) -> void: func _on_body_entered(body) -> void:
print("collision") #print("collision")
if body is BoxBoy: if body is BoxBoy:
body.apply_bounce() body.apply_bounce()

Binary file not shown.

10
platforms/floaty.gd Normal file
View File

@@ -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()

1
platforms/floaty.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://6xvc47rc3xnp

BIN
platforms/floaty.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -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

BIN
platforms/floaty.xcf Normal file

Binary file not shown.

View File

@@ -15,11 +15,6 @@ run/main_scene="res://scene.tscn"
config/features=PackedStringArray("4.5", "Forward Plus") config/features=PackedStringArray("4.5", "Forward Plus")
config/icon="res://icon.svg" config/icon="res://icon.svg"
[display]
window/size/viewport_width=800
window/size/viewport_height=600
[input] [input]
input_right={ input_right={

View File

@@ -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="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="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="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://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"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_u3cyc"]
texture = ExtResource("1_3253y") texture = ExtResource("1_3253y")
@@ -57,24 +58,30 @@ height = 32.0
[node name="Node2D" type="Node2D"] [node name="Node2D" type="Node2D"]
[node name="TileMapLayer" type="TileMapLayer" parent="."] [node name="TileMapLayer" type="TileMapLayer" parent="."]
position = Vector2(117, 76) tile_map_data = PackedByteArray("AAD9/w0ABAAAAAAAAAD9/w4ABAABAAAAAAD9/w8ABAABAAAAAAD+/w0ABAAAAAAAAAD+/w4ABAABAAAAAAD+/w8ABAABAAAAAAD//w0ABAAAAAAAAAD//w4ABAABAAAAAAD//w8ABAABAAAAAAAAAA0ABAAAAAAAAAAAAA4ABAABAAAAAAAAAA8ABAABAAAAAAABAA0ABAAAAAAAAAABAA4ABAABAAAAAAABAA8ABAABAAAAAAACAA0ABAAAAAAAAAACAA4ABAABAAAAAAACAA8ABAABAAAAAAADAA0ABAAAAAAAAAADAA4ABAABAAAAAAADAA8ABAABAAAAAAAEAA0ABAAAAAAAAAAEAA4ABAABAAAAAAAEAA8ABAABAAAAAAAFAA0ABAAAAAAAAAAFAA4ABAABAAAAAAAFAA8ABAABAAAAAAAGAA0ABAAAAAAAAAAGAA4ABAABAAAAAAAGAA8ABAABAAAAAAAHAA0ABAAAAAAAAAAHAA4ABAABAAAAAAAHAA8ABAABAAAAAAAIAA0ABAAAAAAAAAAIAA4ABAABAAAAAAAIAA8ABAABAAAAAAAJAA0ABAAAAAAAAAAJAA4ABAABAAAAAAAJAA8ABAABAAAAAAAKAA0ABAAAAAAAAAAKAA4ABAABAAAAAAAKAA8ABAABAAAAAAALAA0ABAAAAAAAAAALAA4ABAABAAAAAAALAA8ABAABAAAAAAAMAA0ABAAAAAAAAAAMAA4ABAABAAAAAAAMAA8ABAABAAAAAAANAA0ABAAAAAAAAAANAA4ABAABAAAAAAANAA8ABAABAAAAAAAOAA0ABAAAAAAAAAAOAA4ABAABAAAAAAAOAA8ABAABAAAAAAAPAA0ABAAAAAAAAAAPAA4ABAABAAAAAAAPAA8ABAABAAAAAAAQAA4ABAABAAAAAAAQAA8ABAABAAAAAAARAA0ABAAAAAAAAAARAA4ABAABAAAAAAARAA8ABAABAAAAAAASAA0ABAAAAAAAAAASAA4ABAABAAAAAAASAA8ABAABAAAAAAATAA0ABAAAAAAAAAATAA4ABAABAAAAAAATAA8ABAABAAAAAAAUAA0ABAAAAAAAAAAUAA4ABAABAAAAAAAUAA8ABAABAAAAAAAVAA0ABAAAAAAAAAAVAA4ABAABAAAAAAAVAA8ABAABAAAAAAAWAA0ABAAAAAAAAAAWAA4ABAABAAAAAAAWAA8ABAABAAAAAAAXAA0ABAAAAAAAAAAXAA4ABAABAAAAAAAXAA8ABAABAAAAAAAYAA0ABAAAAAAAAAAYAA4ABAABAAAAAAAYAA8ABAABAAAAAAAZAA0ABAAAAAAAAAAZAA4ABAABAAAAAAAZAA8ABAABAAAAAAAaAA0ABAAAAAAAAAAaAA4ABAABAAAAAAAaAA8ABAABAAAAAAAbAA0ABAAAAAAAAAAbAA4ABAABAAAAAAAbAA8ABAABAAAAAAAcAA0ABAAAAAAAAAAcAA4ABAABAAAAAAAcAA8ABAABAAAAAAAdAA0ABAAAAAAAAAAdAA4ABAABAAAAAAAdAA8ABAABAAAAAAAeAA0ABAAAAAAAAAAeAA4ABAABAAAAAAAeAA8ABAABAAAAAAAfAA0ABAAAAAAAAAAfAA4ABAABAAAAAAAfAA8ABAABAAAAAAD9/xAABAABAAAAAAD+/xAABAABAAAAAAD//xAABAABAAAAAAAAABAABAABAAAAAAABABAABAABAAAAAAACABAABAABAAAAAAADABAABAABAAAAAAAEABAABAABAAAAAAAFABAABAABAAAAAAAGABAABAABAAAAAAAHABAABAABAAAAAAAIABAABAABAAAAAAAJABAABAABAAAAAAAKABAABAABAAAAAAALABAABAABAAAAAAAMABAABAABAAAAAAANABAABAABAAAAAAAOABAABAABAAAAAAAPABAABAABAAAAAAAQABAABAABAAAAAAARABAABAABAAAAAAASABAABAABAAAAAAATABAABAABAAAAAAAUABAABAABAAAAAAAVABAABAABAAAAAAAWABAABAABAAAAAAAXABAABAABAAAAAAAYABAABAABAAAAAAAZABAABAABAAAAAAAaABAABAABAAAAAAAbABAABAABAAAAAAAcABAABAABAAAAAAAdABAABAABAAAAAAAeABAABAABAAAAAAAfABAABAABAAAAAAAWAAoABAABAAAAAAAXAAoABAABAAAAAAAYAAoABAABAAAAAAAZAAoABAABAAAAAAAaAAoABAABAAAAAAAbAAoABAABAAAAAAAcAAoABAABAAAAAAAWAAkABAAAAAAAAAAXAAkABAAAAAAAAAAYAAkABAAAAAAAAAAZAAkABAAAAAAAAAAaAAkABAAAAAAAAAAbAAkABAAAAAAAAAAcAAkABAAAAAAAAAASAAMABAACAAAAAAASAAIABAACAAAAAAAQAA0ABAAAAAAAAAA=")
tile_map_data = PackedByteArray("AAD9/w0ABAAAAAAAAAD9/w4ABAABAAAAAAD9/w8ABAABAAAAAAD+/w0ABAAAAAAAAAD+/w4ABAABAAAAAAD+/w8ABAABAAAAAAD//w0ABAAAAAAAAAD//w4ABAABAAAAAAD//w8ABAABAAAAAAAAAA0ABAAAAAAAAAAAAA4ABAABAAAAAAAAAA8ABAABAAAAAAABAA0ABAAAAAAAAAABAA4ABAABAAAAAAABAA8ABAABAAAAAAACAA0ABAAAAAAAAAACAA4ABAABAAAAAAACAA8ABAABAAAAAAADAA0ABAAAAAAAAAADAA4ABAABAAAAAAADAA8ABAABAAAAAAAEAA0ABAAAAAAAAAAEAA4ABAABAAAAAAAEAA8ABAABAAAAAAAFAA0ABAAAAAAAAAAFAA4ABAABAAAAAAAFAA8ABAABAAAAAAAGAA0ABAAAAAAAAAAGAA4ABAABAAAAAAAGAA8ABAABAAAAAAAHAA0ABAAAAAAAAAAHAA4ABAABAAAAAAAHAA8ABAABAAAAAAAIAA0ABAAAAAAAAAAIAA4ABAABAAAAAAAIAA8ABAABAAAAAAAJAA0ABAAAAAAAAAAJAA4ABAABAAAAAAAJAA8ABAABAAAAAAAKAA0ABAAAAAAAAAAKAA4ABAABAAAAAAAKAA8ABAABAAAAAAALAA0ABAAAAAAAAAALAA4ABAABAAAAAAALAA8ABAABAAAAAAAMAA0ABAAAAAAAAAAMAA4ABAABAAAAAAAMAA8ABAABAAAAAAANAA0ABAAAAAAAAAANAA4ABAABAAAAAAANAA8ABAABAAAAAAAOAA0ABAAAAAAAAAAOAA4ABAABAAAAAAAOAA8ABAABAAAAAAAPAA0ABAAAAAAAAAAPAA4ABAABAAAAAAAPAA8ABAABAAAAAAAQAA0ABAAAAAAAAAAQAA4ABAABAAAAAAAQAA8ABAABAAAAAAARAA0ABAAAAAAAAAARAA4ABAABAAAAAAARAA8ABAABAAAAAAASAA0ABAAAAAAAAAASAA4ABAABAAAAAAASAA8ABAABAAAAAAATAA0ABAAAAAAAAAATAA4ABAABAAAAAAATAA8ABAABAAAAAAAUAA0ABAAAAAAAAAAUAA4ABAABAAAAAAAUAA8ABAABAAAAAAAVAA0ABAAAAAAAAAAVAA4ABAABAAAAAAAVAA8ABAABAAAAAAAWAA0ABAAAAAAAAAAWAA4ABAABAAAAAAAWAA8ABAABAAAAAAAXAA0ABAAAAAAAAAAXAA4ABAABAAAAAAAXAA8ABAABAAAAAAAYAA0ABAAAAAAAAAAYAA4ABAABAAAAAAAYAA8ABAABAAAAAAAZAA0ABAAAAAAAAAAZAA4ABAABAAAAAAAZAA8ABAABAAAAAAAaAA0ABAAAAAAAAAAaAA4ABAABAAAAAAAaAA8ABAABAAAAAAAbAA0ABAAAAAAAAAAbAA4ABAABAAAAAAAbAA8ABAABAAAAAAAcAA0ABAAAAAAAAAAcAA4ABAABAAAAAAAcAA8ABAABAAAAAAAdAA0ABAAAAAAAAAAdAA4ABAABAAAAAAAdAA8ABAABAAAAAAAeAA0ABAAAAAAAAAAeAA4ABAABAAAAAAAeAA8ABAABAAAAAAAfAA0ABAAAAAAAAAAfAA4ABAABAAAAAAAfAA8ABAABAAAAAAD9/xAABAABAAAAAAD+/xAABAABAAAAAAD//xAABAABAAAAAAAAABAABAABAAAAAAABABAABAABAAAAAAACABAABAABAAAAAAADABAABAABAAAAAAAEABAABAABAAAAAAAFABAABAABAAAAAAAGABAABAABAAAAAAAHABAABAABAAAAAAAIABAABAABAAAAAAAJABAABAABAAAAAAAKABAABAABAAAAAAALABAABAABAAAAAAAMABAABAABAAAAAAANABAABAABAAAAAAAOABAABAABAAAAAAAPABAABAABAAAAAAAQABAABAABAAAAAAARABAABAABAAAAAAASABAABAABAAAAAAATABAABAABAAAAAAAUABAABAABAAAAAAAVABAABAABAAAAAAAWABAABAABAAAAAAAXABAABAABAAAAAAAYABAABAABAAAAAAAZABAABAABAAAAAAAaABAABAABAAAAAAAbABAABAABAAAAAAAcABAABAABAAAAAAAdABAABAABAAAAAAAeABAABAABAAAAAAAfABAABAABAAAAAAAWAAoABAABAAAAAAAXAAoABAABAAAAAAAYAAoABAABAAAAAAAZAAoABAABAAAAAAAaAAoABAABAAAAAAAbAAoABAABAAAAAAAcAAoABAABAAAAAAAWAAkABAAAAAAAAAAXAAkABAAAAAAAAAAYAAkABAAAAAAAAAAZAAkABAAAAAAAAAAaAAkABAAAAAAAAAAbAAkABAAAAAAAAAAcAAkABAAAAAAAAAA=")
tile_set = SubResource("TileSet_xlvrw") tile_set = SubResource("TileSet_xlvrw")
metadata/_edit_lock_ = true
[node name="Boxboy" type="CharacterBody2D" parent="."] [node name="Boxboy" type="CharacterBody2D" parent="."]
position = Vector2(117, 76) position = Vector2(128, 384)
script = ExtResource("1_nxogm") script = ExtResource("1_nxogm")
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Boxboy"] [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Boxboy"]
sprite_frames = SubResource("SpriteFrames_y2354") sprite_frames = SubResource("SpriteFrames_y2354")
animation = &"idle" animation = &"idle"
metadata/_edit_lock_ = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="Boxboy"] [node name="CollisionShape2D" type="CollisionShape2D" parent="Boxboy"]
shape = SubResource("CapsuleShape2D_ulcgi") shape = SubResource("CapsuleShape2D_ulcgi")
metadata/_edit_lock_ = true
[node name="Camera2D" type="Camera2D" parent="Boxboy"] [node name="Camera2D" type="Camera2D" parent="Boxboy"]
metadata/_edit_lock_ = true
[node name="Bouncy" parent="." instance=ExtResource("4_u3cyc")] [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"] [connection signal="animation_finished" from="Boxboy/AnimatedSprite2D" to="Boxboy" method="_on_animation_finished"]