Fixes for jump height and jump on top
This commit is contained in:
parent
53215e0673
commit
d3df3b1424
@ -202,7 +202,6 @@ func jump():
|
||||
v = consider_jumping_on_top()
|
||||
if(v == zero_vector && can_reverse_facing_direction()):
|
||||
reverse_facing_direction()
|
||||
jump()
|
||||
velocity = v
|
||||
|
||||
|
||||
@ -218,21 +217,23 @@ func correct_jump_direction(v: Vector2) -> Vector2:
|
||||
func consider_jump_headspace(v: Vector2) -> Vector2:
|
||||
var height = calculate_jump_height(v)
|
||||
var distance = calculate_jump_distance(v)
|
||||
var angle = (v * get_facing_direction()).angle()
|
||||
# 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):
|
||||
# check half jump height
|
||||
var half_height_v = jump_height_to_velocity(height/3, v)
|
||||
var half_height = calculate_jump_height(half_height_v)
|
||||
height_collider = check_feeler(Vector2(get_facing_direction()*(distance/2), (-half_height)), Vector2(0,-20))
|
||||
var collision_point = feeler_raycast.get_collision_point()
|
||||
var target_height = collision_point.y - (feeler_raycast.global_position.y - 23)
|
||||
var new_angle = angle * (0.75 if target_height > -26 else 0.86)
|
||||
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()):
|
||||
print("no safe height for frog jump")
|
||||
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
|
||||
|
||||
|
||||
@ -246,7 +247,7 @@ func consider_jump_landing_space(v: Vector2) -> Vector2:
|
||||
# TODO Unpacked loop, make function or something?
|
||||
# Shortens the jump in steps to make it more safe
|
||||
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)
|
||||
jump_height = calculate_jump_height(v)
|
||||
v = correct_jump_direction(v)
|
||||
@ -258,9 +259,46 @@ func consider_jump_landing_space(v: Vector2) -> Vector2:
|
||||
v = correct_jump_direction(v)
|
||||
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()):
|
||||
print("no safe landing space found")
|
||||
return Vector2(0,0)
|
||||
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
|
||||
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))
|
||||
|
||||
|
||||
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
|
||||
func calculate_jump_distance(v: Vector2) -> float:
|
||||
return abs((pow(v.length(), 2) * sin(-1 * 2 * v.angle()))/(_gravity))
|
||||
|
||||
@ -335,18 +335,18 @@ states/midJumping/node = SubResource( 26 )
|
||||
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 ) ]
|
||||
start_node = "idleHappy"
|
||||
graph_offset = Vector2( -317, -204 )
|
||||
graph_offset = Vector2( -340, -193 )
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachinePlayback" id=11]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=1]
|
||||
extents = Vector2( 12, 7 )
|
||||
extents = Vector2( 12, 9 )
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=2]
|
||||
extents = Vector2( 15, 5.12039 )
|
||||
|
||||
[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"]]
|
||||
collision_layer = 2
|
||||
@ -439,7 +439,6 @@ collision_mask = 9
|
||||
collide_with_areas = true
|
||||
|
||||
[node name="EnemyBody" type="CollisionShape2D" parent="." groups=["harmful"]]
|
||||
position = Vector2( 0, 2 )
|
||||
shape = SubResource( 1 )
|
||||
|
||||
[node name="cshape" type="Node2D" parent="."]
|
||||
@ -459,8 +458,7 @@ collision_layer = 2
|
||||
input_pickable = false
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="StompDetector"]
|
||||
position = Vector2( 0.714287, 1.56134 )
|
||||
scale = Vector2( 1, 1 )
|
||||
position = Vector2( 1.19209e-07, -1.42857 )
|
||||
shape = SubResource( 2 )
|
||||
|
||||
[node name="EnemySkin" type="Area2D" parent="." groups=["player"]]
|
||||
@ -470,7 +468,7 @@ collision_layer = 2
|
||||
collision_mask = 126
|
||||
|
||||
[node name="CollisionPolygon2D" type="CollisionShape2D" parent="EnemySkin"]
|
||||
position = Vector2( -0.357144, -1.42857 )
|
||||
position = Vector2( 0, -0.738329 )
|
||||
scale = Vector2( 1, 1 )
|
||||
shape = SubResource( 3 )
|
||||
|
||||
|
||||
@ -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/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]
|
||||
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]
|
||||
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/shape_offset = Vector2( 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_margin = 0.0
|
||||
1/shapes = [ ]
|
||||
1/shape_one_way_margin = 1.0
|
||||
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
|
||||
2/name = "Alien-ship1-Edge-Unanimated.png 2"
|
||||
2/texture = ExtResource( 5 )
|
||||
|
||||
@ -80,10 +80,10 @@ wait_time = 20.0
|
||||
[node name="BlobbyCam" parent="." instance=ExtResource( 12 )]
|
||||
|
||||
[node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"]
|
||||
frame = 9
|
||||
frame = 0
|
||||
|
||||
[node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"]
|
||||
frame = 0
|
||||
frame = 5
|
||||
|
||||
[node name="Blobby" parent="." instance=ExtResource( 2 )]
|
||||
unique_name_in_owner = true
|
||||
@ -157,6 +157,7 @@ playback_process_mode = 0
|
||||
anims/Horizontal = SubResource( 6 )
|
||||
|
||||
[node name="TileMap" type="TileMap" parent="."]
|
||||
unique_name_in_owner = true
|
||||
tile_set = ExtResource( 1 )
|
||||
cell_size = Vector2( 24, 24 )
|
||||
cell_quadrant_size = 3
|
||||
|
||||
@ -127,7 +127,7 @@ shape = SubResource( 3 )
|
||||
position = Vector2( 0, 1.5 )
|
||||
z_index = -1
|
||||
frames = SubResource( 5 )
|
||||
frame = 10
|
||||
frame = 17
|
||||
playing = true
|
||||
|
||||
[node name="TileMap" type="TileMap" parent="."]
|
||||
|
||||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user