Fixes for jump height and jump on top

This commit is contained in:
Jakob Feldmann 2023-02-20 14:07:27 +01:00
parent 53215e0673
commit d3df3b1424
6 changed files with 75 additions and 85 deletions

View File

@ -202,7 +202,6 @@ func jump():
v = consider_jumping_on_top() v = consider_jumping_on_top()
if(v == zero_vector && can_reverse_facing_direction()): if(v == zero_vector && can_reverse_facing_direction()):
reverse_facing_direction() reverse_facing_direction()
jump()
velocity = v velocity = v
@ -218,21 +217,23 @@ func correct_jump_direction(v: Vector2) -> Vector2:
func consider_jump_headspace(v: Vector2) -> Vector2: func consider_jump_headspace(v: Vector2) -> Vector2:
var height = calculate_jump_height(v) var height = calculate_jump_height(v)
var distance = calculate_jump_distance(v) var distance = calculate_jump_distance(v)
var angle = (v * get_facing_direction()).angle()
# Half distance is an estimate of the jumps apex() # Half distance is an estimate of the jumps apex()
var height_collider = check_feeler(Vector2(get_facing_direction()*(distance/2), (-height)), Vector2(0,-20)) #TODO Consider sprite size for height
var height_collider = check_feeler(Vector2(get_facing_direction()*(distance/2), (-height)), Vector2(0,-23))
if(height_collider != null): if(height_collider != null):
# check half jump height var collision_point = feeler_raycast.get_collision_point()
var half_height_v = jump_height_to_velocity(height/3, v) var target_height = collision_point.y - (feeler_raycast.global_position.y - 23)
var half_height = calculate_jump_height(half_height_v) var new_angle = angle * (0.75 if target_height > -26 else 0.86)
height_collider = check_feeler(Vector2(get_facing_direction()*(distance/2), (-half_height)), Vector2(0,-20)) var new_distance = default_jump_distance * (0.66 if target_height > -26 else 0.75)
v = velocity_for_jump_distance(new_distance, abs(new_angle))
v = correct_jump_direction(v)
height = calculate_jump_height(v)
distance = calculate_jump_distance(v) * get_facing_direction()
height_collider = check_feeler(Vector2(get_facing_direction()*(distance/2), (-height)), Vector2(0,-23))
if(height_collider != null && can_reverse_facing_direction()): if(height_collider != null && can_reverse_facing_direction()):
print("no safe height for frog jump") print("no safe height for frog jump")
return Vector2(0,0) return Vector2(0,0)
else:
var collision_point = feeler_raycast.get_collision_point()
#TODO Consider sprite size for height
var target_height = collision_point.y - (feeler_raycast.global_position.y - 9)
v = jump_height_to_velocity(abs(target_height), v)
return v return v
@ -246,7 +247,7 @@ func consider_jump_landing_space(v: Vector2) -> Vector2:
# TODO Unpacked loop, make function or something? # TODO Unpacked loop, make function or something?
# Shortens the jump in steps to make it more safe # Shortens the jump in steps to make it more safe
if(!is_jump_path_safe(v, global_position) || collider != null): if(!is_jump_path_safe(v, global_position) || collider != null):
jump_distance = calculate_jump_distance(v) - 24 jump_distance = calculate_jump_distance(v) - 18
v = change_jump_distance(jump_distance, v) v = change_jump_distance(jump_distance, v)
jump_height = calculate_jump_height(v) jump_height = calculate_jump_height(v)
v = correct_jump_direction(v) v = correct_jump_direction(v)
@ -258,9 +259,46 @@ func consider_jump_landing_space(v: Vector2) -> Vector2:
v = correct_jump_direction(v) v = correct_jump_direction(v)
collider = check_feeler(Vector2(jump_distance * get_facing_direction(), - jump_height/2)) collider = check_feeler(Vector2(jump_distance * get_facing_direction(), - jump_height/2))
if((!is_jump_path_safe(v, global_position) || collider != null) && can_reverse_facing_direction()): if((!is_jump_path_safe(v, global_position) || collider != null) && can_reverse_facing_direction()):
print("no safe landing space found")
return Vector2(0,0) return Vector2(0,0)
return v return v
func consider_jumping_on_top() -> Vector2:
var collider = check_feeler(Vector2(42 * get_facing_direction(),0))
var facing = 0 if get_facing_direction() >= 0 else - 1
if (collider == null):
return Vector2(0,0)
var local_position = tilemap.to_local(feeler_raycast.get_collision_point())
var map_position = tilemap.world_to_map(local_position)
var tile_position = Vector2(map_position.x + facing, map_position.y)
print(tile_position)
# TODO Here the climb height of frog is limited to one constantly
if (tilemap.get_cell(tile_position.x, tile_position.y - 1) != -1 &&
#TODO 9 is the navigation tile!
tilemap.get_cell(tile_position.x, tile_position.y - 1) != 9):
print("wall is more than one high")
return Vector2(0,0)
print("wall is only one high")
var tile_upper_left_corner = tilemap.to_global(tilemap.map_to_world(tile_position))
var tile_upper_right_corner = Vector2(tile_upper_left_corner.x + tilemap.cell_size.x, tile_upper_left_corner.y)
var jump_angle = 0
if(facing < 0):
var frog_bottom_left_corner = Vector2($EnemyBody.global_position.x - $EnemyBody.shape.extents.x,
$EnemyBody.global_position.y + $EnemyBody.shape.extents.y)
jump_angle = frog_bottom_left_corner.angle_to_point(tile_upper_right_corner)
print(rad2deg(jump_angle))
else:
var frog_bottom_right_corner = Vector2($EnemyBody.global_position.x + $EnemyBody.shape.extents.x,
$EnemyBody.global_position.y + $EnemyBody.shape.extents.y)
jump_angle = frog_bottom_right_corner.angle_to_point(tile_upper_left_corner) - PI
print(rad2deg(jump_angle))
if(abs(rad2deg(jump_angle)) < 78):
return correct_jump_direction(velocity_for_jump_distance(default_jump_distance/2, abs(deg2rad(80))))
else:
return velocity_for_jump_distance(10, abs(deg2rad(45))) * -1 * facing
# Tries to shorten the jump, so that it lands in a tiles center # Tries to shorten the jump, so that it lands in a tiles center
func jump_to_tile_center(v: Vector2) -> Vector2: func jump_to_tile_center(v: Vector2) -> Vector2:
@ -310,50 +348,6 @@ func calculate_jump_height(v: Vector2) -> float:
return abs((pow(v.length(), 2) * pow(sin(v.angle()), 2))/(2*_gravity)) return abs((pow(v.length(), 2) * pow(sin(v.angle()), 2))/(2*_gravity))
func consider_jumping_on_top() -> Vector2:
var collider = check_feeler(Vector2(36 * get_facing_direction(),0))
var facing = 0 if get_facing_direction() >= 0 else - 1
if (collider == null):
return Vector2(0,0)
var local_position = tilemap.to_local(feeler_raycast.get_collision_point())
var map_position = tilemap.world_to_map(local_position)
var tile_position = Vector2(map_position.x + facing, map_position.y)
# print(tile_position)
# TODO Here the climb height of frog is limited to one constantly
if (tilemap.get_cell(tile_position.x, tile_position.y - 1) != -1):
# print("wall is more than one high")
return Vector2(0,0)
# print("wall is only one high")
var tile_upper_left_corner = tilemap.to_global(tilemap.map_to_world(tile_position))
var tile_upper_right_corner = Vector2(tile_upper_left_corner.x + tilemap.cell_size.x, tile_upper_left_corner.y)
var jump_angle = 0
if(facing < 0):
var frog_bottom_left_corner = Vector2($EnemyBody.global_position.x - $EnemyBody.shape.extents.x,
$EnemyBody.global_position.y + $EnemyBody.shape.extents.y)
jump_angle = frog_bottom_left_corner.angle_to_point(tile_upper_right_corner)
else:
var frog_bottom_right_corner = Vector2($EnemyBody.global_position.x + $EnemyBody.shape.extents.x,
$EnemyBody.global_position.y + $EnemyBody.shape.extents.y)
jump_angle = frog_bottom_right_corner.angle_to_point(tile_upper_left_corner) - PI
# print(rad2deg(jump_angle))
# if(abs(rad2deg(jump_angle)) < default_jump_angle):
# return correct_jump_direction(velocity_for_jump_distance(default_jump_distance/2, abs(deg2rad(default_jump_angle))))
if(abs(rad2deg(jump_angle)) < 78):
return correct_jump_direction(velocity_for_jump_distance(default_jump_distance/2, abs(deg2rad(80))))
else:
return velocity_for_jump_distance(8, abs(deg2rad(45))) * -1 * facing
return Vector2(0,0)
# Check if there is another obstacle above the block or do a regular jump with adjusted parameters instead(for checking)
# Cast from bottom corner to upper tile corner
# Check the angle of the raycast
# Return small jump backwards if the angle is too steep
# Make the angle 1 deg steeper
# Return a jump along the angled raycast
# Only works for jumps on straight ground # Only works for jumps on straight ground
func calculate_jump_distance(v: Vector2) -> float: func calculate_jump_distance(v: Vector2) -> float:
return abs((pow(v.length(), 2) * sin(-1 * 2 * v.angle()))/(_gravity)) return abs((pow(v.length(), 2) * sin(-1 * 2 * v.angle()))/(_gravity))

View File

@ -335,18 +335,18 @@ states/midJumping/node = SubResource( 26 )
states/midJumping/position = Vector2( 184, -141 ) states/midJumping/position = Vector2( 184, -141 )
transitions = [ "idleHappy", "liftOff", SubResource( 27 ), "liftOff", "midJumping", SubResource( 28 ), "idleMean", "liftOff", SubResource( 29 ), "midJumping", "liftOff", SubResource( 30 ), "liftOff", "idleMean", SubResource( 31 ), "liftOff", "idleHappy", SubResource( 32 ) ] transitions = [ "idleHappy", "liftOff", SubResource( 27 ), "liftOff", "midJumping", SubResource( 28 ), "idleMean", "liftOff", SubResource( 29 ), "midJumping", "liftOff", SubResource( 30 ), "liftOff", "idleMean", SubResource( 31 ), "liftOff", "idleHappy", SubResource( 32 ) ]
start_node = "idleHappy" start_node = "idleHappy"
graph_offset = Vector2( -317, -204 ) graph_offset = Vector2( -340, -193 )
[sub_resource type="AnimationNodeStateMachinePlayback" id=11] [sub_resource type="AnimationNodeStateMachinePlayback" id=11]
[sub_resource type="RectangleShape2D" id=1] [sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 12, 7 ) extents = Vector2( 12, 9 )
[sub_resource type="RectangleShape2D" id=2] [sub_resource type="RectangleShape2D" id=2]
extents = Vector2( 15, 5.12039 ) extents = Vector2( 15, 5.12039 )
[sub_resource type="RectangleShape2D" id=3] [sub_resource type="RectangleShape2D" id=3]
extents = Vector2( 18.2143, 14.3338 ) extents = Vector2( 18.2143, 13.5955 )
[node name="WhatAreFrog" type="KinematicBody2D" groups=["harmful"]] [node name="WhatAreFrog" type="KinematicBody2D" groups=["harmful"]]
collision_layer = 2 collision_layer = 2
@ -439,7 +439,6 @@ collision_mask = 9
collide_with_areas = true collide_with_areas = true
[node name="EnemyBody" type="CollisionShape2D" parent="." groups=["harmful"]] [node name="EnemyBody" type="CollisionShape2D" parent="." groups=["harmful"]]
position = Vector2( 0, 2 )
shape = SubResource( 1 ) shape = SubResource( 1 )
[node name="cshape" type="Node2D" parent="."] [node name="cshape" type="Node2D" parent="."]
@ -459,8 +458,7 @@ collision_layer = 2
input_pickable = false input_pickable = false
[node name="CollisionShape2D" type="CollisionShape2D" parent="StompDetector"] [node name="CollisionShape2D" type="CollisionShape2D" parent="StompDetector"]
position = Vector2( 0.714287, 1.56134 ) position = Vector2( 1.19209e-07, -1.42857 )
scale = Vector2( 1, 1 )
shape = SubResource( 2 ) shape = SubResource( 2 )
[node name="EnemySkin" type="Area2D" parent="." groups=["player"]] [node name="EnemySkin" type="Area2D" parent="." groups=["player"]]
@ -470,7 +468,7 @@ collision_layer = 2
collision_mask = 126 collision_mask = 126
[node name="CollisionPolygon2D" type="CollisionShape2D" parent="EnemySkin"] [node name="CollisionPolygon2D" type="CollisionShape2D" parent="EnemySkin"]
position = Vector2( -0.357144, -1.42857 ) position = Vector2( 0, -0.738329 )
scale = Vector2( 1, 1 ) scale = Vector2( 1, 1 )
shape = SubResource( 3 ) shape = SubResource( 3 )

View File

@ -1,4 +1,4 @@
[gd_resource type="TileSet" load_steps=24 format=2] [gd_resource type="TileSet" load_steps=25 format=2]
[ext_resource path="res://assets/environment/blocks/Slope-45.png" type="Texture" id=1] [ext_resource path="res://assets/environment/blocks/Slope-45.png" type="Texture" id=1]
[ext_resource path="res://assets/environment/blocks/Alien-Ship-Ground-Inner.png" type="Texture" id=2] [ext_resource path="res://assets/environment/blocks/Alien-Ship-Ground-Inner.png" type="Texture" id=2]
@ -19,6 +19,9 @@ points = PoolVector2Array( 0, 0, 24, 0, 24, 24, 0, 24 )
[sub_resource type="OccluderPolygon2D" id=18] [sub_resource type="OccluderPolygon2D" id=18]
polygon = PoolVector2Array( 0, 0, 24, 0, 24, 24, 0, 24 ) polygon = PoolVector2Array( 0, 0, 24, 0, 24, 24, 0, 24 )
[sub_resource type="ConvexPolygonShape2D" id=28]
points = PoolVector2Array( 0, 0, 24, 0, 24, 24, 0, 24 )
[sub_resource type="OccluderPolygon2D" id=20] [sub_resource type="OccluderPolygon2D" id=20]
polygon = PoolVector2Array( 0, 0, 24, 0, 24, 24, 0, 24 ) polygon = PoolVector2Array( 0, 0, 24, 0, 24, 24, 0, 24 )
@ -88,9 +91,16 @@ outlines = [ PoolVector2Array( 0, 0, 24, 0, 24, 24, 0, 24 ) ]
1/navigation_offset = Vector2( 0, 0 ) 1/navigation_offset = Vector2( 0, 0 )
1/shape_offset = Vector2( 0, 0 ) 1/shape_offset = Vector2( 0, 0 )
1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) 1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
1/shape = SubResource( 28 )
1/shape_one_way = false 1/shape_one_way = false
1/shape_one_way_margin = 0.0 1/shape_one_way_margin = 1.0
1/shapes = [ ] 1/shapes = [ {
"autotile_coord": Vector2( 0, 0 ),
"one_way": false,
"one_way_margin": 1.0,
"shape": SubResource( 28 ),
"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
} ]
1/z_index = 0 1/z_index = 0
2/name = "Alien-ship1-Edge-Unanimated.png 2" 2/name = "Alien-ship1-Edge-Unanimated.png 2"
2/texture = ExtResource( 5 ) 2/texture = ExtResource( 5 )

View File

@ -80,10 +80,10 @@ wait_time = 20.0
[node name="BlobbyCam" parent="." instance=ExtResource( 12 )] [node name="BlobbyCam" parent="." instance=ExtResource( 12 )]
[node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"] [node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"]
frame = 9 frame = 0
[node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"] [node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"]
frame = 0 frame = 5
[node name="Blobby" parent="." instance=ExtResource( 2 )] [node name="Blobby" parent="." instance=ExtResource( 2 )]
unique_name_in_owner = true unique_name_in_owner = true
@ -157,6 +157,7 @@ playback_process_mode = 0
anims/Horizontal = SubResource( 6 ) anims/Horizontal = SubResource( 6 )
[node name="TileMap" type="TileMap" parent="."] [node name="TileMap" type="TileMap" parent="."]
unique_name_in_owner = true
tile_set = ExtResource( 1 ) tile_set = ExtResource( 1 )
cell_size = Vector2( 24, 24 ) cell_size = Vector2( 24, 24 )
cell_quadrant_size = 3 cell_quadrant_size = 3

View File

@ -127,7 +127,7 @@ shape = SubResource( 3 )
position = Vector2( 0, 1.5 ) position = Vector2( 0, 1.5 )
z_index = -1 z_index = -1
frames = SubResource( 5 ) frames = SubResource( 5 )
frame = 10 frame = 17
playing = true playing = true
[node name="TileMap" type="TileMap" parent="."] [node name="TileMap" type="TileMap" parent="."]

File diff suppressed because one or more lines are too long