-added kinematic body
-added kinematic body demos
17
demos/2d/kinematic_char/colworld.gd
Normal 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()
|
||||
BIN
demos/2d/kinematic_char/colworld.scn
Normal file
13
demos/2d/kinematic_char/engine.cfg
Normal 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)]
|
||||
BIN
demos/2d/kinematic_char/icon.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
demos/2d/kinematic_char/obstacle.png
Normal file
|
After Width: | Height: | Size: 490 B |
116
demos/2d/kinematic_char/player.gd
Normal 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
|
||||
|
||||
|
||||
BIN
demos/2d/kinematic_char/player.png
Normal file
|
After Width: | Height: | Size: 502 B |
BIN
demos/2d/kinematic_char/player.scn
Normal file
BIN
demos/2d/kinematic_char/princess.png
Normal file
|
After Width: | Height: | Size: 504 B |
BIN
demos/2d/kinematic_col/colworld.scn
Normal file
12
demos/2d/kinematic_col/engine.cfg
Normal 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)]
|
||||
BIN
demos/2d/kinematic_col/icon.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
demos/2d/kinematic_col/obstacle.png
Normal file
|
After Width: | Height: | Size: 453 B |
36
demos/2d/kinematic_col/player.gd
Normal 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
|
||||
|
||||
|
||||
BIN
demos/2d/kinematic_col/player.png
Normal file
|
After Width: | Height: | Size: 502 B |