rolling fiend automatically detects floor surface and can take inside corners again
This commit is contained in:
parent
47a369f9fb
commit
0460f6ec8e
3 changed files with 34 additions and 19 deletions
|
@ -4,19 +4,29 @@ export var move_speed: float = 0.0
|
|||
export var clockwise: bool = false
|
||||
|
||||
onready var floor_test = Physics2DShapeQueryParameters.new()
|
||||
onready var test_shape = $FloorTestShape
|
||||
|
||||
var floor_direction = Vector2.DOWN
|
||||
var floor_direction = Vector2.ZERO
|
||||
|
||||
func _ready():
|
||||
if clockwise:
|
||||
$AnimatedSprite.flip_h = true
|
||||
floor_test.set_shape($FloorTestShape.shape)
|
||||
floor_test.set_shape(test_shape.shape)
|
||||
floor_test.collision_layer = 1
|
||||
for dir in [Vector2.DOWN, Vector2.UP, Vector2.LEFT, Vector2.RIGHT]:
|
||||
if is_on_surface(dir):
|
||||
floor_direction = dir
|
||||
break
|
||||
|
||||
func _physics_process(delta):
|
||||
var rot_dir = -1.5708 if clockwise else 1.5708
|
||||
var space_state = get_world_2d().direct_space_state
|
||||
floor_test.transform = global_transform.translated(floor_direction)
|
||||
if space_state.collide_shape(floor_test, 1).empty():
|
||||
if !is_on_surface(floor_direction):
|
||||
floor_direction = floor_direction.rotated(-rot_dir)
|
||||
elif is_on_surface(floor_direction.rotated(rot_dir)):
|
||||
floor_direction = floor_direction.rotated(rot_dir)
|
||||
position += floor_direction.rotated(rot_dir) * move_speed * delta
|
||||
|
||||
func is_on_surface(dir):
|
||||
var space_state = get_world_2d().direct_space_state
|
||||
floor_test.transform = test_shape.global_transform.translated(dir)
|
||||
return space_state.collide_shape(floor_test, 1).size() > 0
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue