-added kinematic body

-added kinematic body demos
This commit is contained in:
Juan Linietsky
2014-02-22 20:28:19 -03:00
parent b62ec387f3
commit 7ca29bfaa7
42 changed files with 1171 additions and 559 deletions

View File

@ -0,0 +1,17 @@
extends Node2D
# member variables here, example:
# var a=2
# var b="textvar"
func _ready():
# Initalization here
pass
func _on_princess_body_enter( body ):
#the name of this editor-generated callback is unfortunate
get_node("youwin").show()

Binary file not shown.

View File

@ -0,0 +1,13 @@
[application]
name="Kinematic Collision"
main_scene="res://colworld.scn"
icon="res://icon.png"
[input]
move_up=[key(Up)]
move_left=[key(Left)]
move_right=[key(Right)]
move_bottom=[key(Down)]
jump=[key(Space)]

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

View File

@ -0,0 +1,116 @@
extends KinematicBody2D
# This is a simple collision demo showing how
# the kinematic cotroller works.
# move() will allow to move the node, and will
# always move it to a non-colliding spot,
# as long as it starts from a non-colliding spot too.
#pixels / second
const GRAVITY = 500.0
# Angle in degrees towards either side that the player can
# consider "floor".
const FLOOR_ANGLE_TOLERANCE = 40
const WALK_FORCE = 600
const WALK_MAX_SPEED = 200
const STOP_FORCE = 1300
const JUMP_SPEED = 200
const JUMP_MAX_AIRBORNE_TIME=0.2
var velocity = Vector2()
var on_air_time=100
var jumping=false
var prev_jump_pressed=false
func _fixed_process(delta):
#create forces
var force = Vector2(0,GRAVITY)
var stop = velocity.x!=0.0
var walk_left = Input.is_action_pressed("move_left")
var walk_right = Input.is_action_pressed("move_right")
var jump = Input.is_action_pressed("jump")
var stop=true
if (walk_left):
if (velocity.x<=0 and velocity.x > -WALK_MAX_SPEED):
force.x-=WALK_FORCE
stop=false
elif (walk_right):
if (velocity.x>=0 and velocity.x < WALK_MAX_SPEED):
force.x+=WALK_FORCE
stop=false
if (stop):
var vsign = sign(velocity.x)
var vlen = abs(velocity.x)
vlen -= STOP_FORCE * delta
if (vlen<0):
vlen=0
velocity.x=vlen*vsign
#integrate forces to velocity
velocity += force * delta
#integrate velocity into motion and move
var motion = velocity * delta
#move and consume motion
#
motion = move(motion)
var floor_velocity=Vector2()
if (is_colliding()):
#ran against something, is it the floor? get normal
var n = get_collision_normal()
if ( rad2deg(acos(n.dot( Vector2(0,-1)))) < FLOOR_ANGLE_TOLERANCE ):
#if angle to the "up" vectors is < angle tolerance
#char is on floor
on_air_time=0
floor_velocity=get_collider_velocity()
#velocity.y=0
# But we were moving and our motion was interrupted,
# so try to complete the motion by "sliding"
# by the normal
motion = n.slide(motion)
velocity = n.slide(velocity)
#then move again
move(motion)
if (floor_velocity!=Vector2()):
#if floor moves, move with floor
move(floor_velocity*delta)
if (jumping and velocity.y>0):
jumping=false
if (on_air_time<JUMP_MAX_AIRBORNE_TIME and jump and not prev_jump_pressed and not jumping):
velocity.y=-JUMP_SPEED
jumping=true
on_air_time+=delta
prev_jump_pressed=jump
func _ready():
# Initalization here
set_fixed_process(true)
pass

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

View File

@ -0,0 +1,12 @@
[application]
name="Kinematic Collision"
main_scene="res://colworld.scn"
icon="res://icon.png"
[input]
move_up=[key(Up)]
move_left=[key(Left)]
move_right=[key(Right)]
move_bottom=[key(Down)]

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

View File

@ -0,0 +1,36 @@
extends KinematicBody2D
# This is a simple collision demo showing how
# the kinematic cotroller works.
# move() will allow to move the node, and will
# always move it to a non-colliding spot,
# as long as it starts from a non-colliding spot too.
#pixels / second
const MOTION_SPEED=160
func _fixed_process(delta):
var motion = Vector2()
if (Input.is_action_pressed("move_up")):
motion+=Vector2(0,-1)
if (Input.is_action_pressed("move_bottom")):
motion+=Vector2(0,1)
if (Input.is_action_pressed("move_left")):
motion+=Vector2(-1,0)
if (Input.is_action_pressed("move_right")):
motion+=Vector2(1,0)
motion = motion.normalized() * MOTION_SPEED * delta
move(motion)
func _ready():
# Initalization here
set_fixed_process(true)
pass

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.