diff options
Diffstat (limited to 'demos/2d/kinematic_char')
-rw-r--r-- | demos/2d/kinematic_char/colworld.gd | 16 | ||||
-rw-r--r-- | demos/2d/kinematic_char/engine.cfg | 2 | ||||
-rw-r--r-- | demos/2d/kinematic_char/player.gd | 167 |
3 files changed, 81 insertions, 104 deletions
diff --git a/demos/2d/kinematic_char/colworld.gd b/demos/2d/kinematic_char/colworld.gd index fe2dc30bb6..7926ef9d54 100644 --- a/demos/2d/kinematic_char/colworld.gd +++ b/demos/2d/kinematic_char/colworld.gd @@ -1,18 +1,8 @@ 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 - if (body.get_name()=="player"): +func _on_princess_body_enter(body): + # The name of this editor-generated callback is unfortunate + if (body.get_name() == "player"): get_node("youwin").show() diff --git a/demos/2d/kinematic_char/engine.cfg b/demos/2d/kinematic_char/engine.cfg index 4ce8f836ae..8bdd5e2fc5 100644 --- a/demos/2d/kinematic_char/engine.cfg +++ b/demos/2d/kinematic_char/engine.cfg @@ -1,6 +1,6 @@ [application] -name="Kinematic Collision" +name="Kinematic Character" main_scene="res://colworld.scn" icon="res://icon.png" diff --git a/demos/2d/kinematic_char/player.gd b/demos/2d/kinematic_char/player.gd index 329382408b..a5c64a303a 100644 --- a/demos/2d/kinematic_char/player.gd +++ b/demos/2d/kinematic_char/player.gd @@ -1,137 +1,124 @@ 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. +# This is a simple collision demo showing how +# the kinematic controller 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. +# Member variables +const GRAVITY = 500.0 # Pixels/second -#pixels / second -const GRAVITY = 500.0 - -#Angle in degrees towards either side that the player can -#consider "floor". +# Angle in degrees towards either side that the player can consider "floor" const FLOOR_ANGLE_TOLERANCE = 40 const WALK_FORCE = 600 -const WALK_MIN_SPEED=10 +const WALK_MIN_SPEED = 10 const WALK_MAX_SPEED = 200 const STOP_FORCE = 1300 const JUMP_SPEED = 200 -const JUMP_MAX_AIRBORNE_TIME=0.2 +const JUMP_MAX_AIRBORNE_TIME = 0.2 -const SLIDE_STOP_VELOCITY=1.0 #one pixel per second -const SLIDE_STOP_MIN_TRAVEL=1.0 #one pixel +const SLIDE_STOP_VELOCITY = 1.0 # One pixel per second +const SLIDE_STOP_MIN_TRAVEL = 1.0 # One pixel var velocity = Vector2() -var on_air_time=100 -var jumping=false +var on_air_time = 100 +var jumping = false -var prev_jump_pressed=false +var prev_jump_pressed = false -func _fixed_process(delta): - #create forces - var force = Vector2(0,GRAVITY) +func _fixed_process(delta): + # Create forces + var force = Vector2(0, GRAVITY) 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 + + var stop = true if (walk_left): - if (velocity.x<=WALK_MIN_SPEED and velocity.x > -WALK_MAX_SPEED): - force.x-=WALK_FORCE - stop=false - + if (velocity.x <= WALK_MIN_SPEED and velocity.x > -WALK_MAX_SPEED): + force.x -= WALK_FORCE + stop = false elif (walk_right): - if (velocity.x>=-WALK_MIN_SPEED and velocity.x < WALK_MAX_SPEED): - force.x+=WALK_FORCE - stop=false + if (velocity.x >= -WALK_MIN_SPEED 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 + vlen -= STOP_FORCE*delta + if (vlen < 0): + vlen = 0 - - - #integrate forces to velocity - velocity += force * delta + velocity.x = vlen*vsign - #integrate velocity into motion and move - var motion = velocity * delta - - #move and consume motion + # 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() - + + var floor_velocity = Vector2() + if (is_colliding()): - # you can check which tile was collision against with this + # You can check which tile was collision against with this # print(get_collider_metadata()) - - #ran against something, is it the floor? get normal + + # 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() - - - if (on_air_time==0 and force.x==0 and get_travel().length() < SLIDE_STOP_MIN_TRAVEL and abs(velocity.x) < SLIDE_STOP_VELOCITY and get_collider_velocity()==Vector2()): - #Since this formula will always slide the character around, - #a special case must be considered to to stop it from moving - #if standing on an inclined floor. Conditions are: - # 1) Standing on floor (on_air_time==0) + + 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() + + if (on_air_time == 0 and force.x == 0 and get_travel().length() < SLIDE_STOP_MIN_TRAVEL and abs(velocity.x) < SLIDE_STOP_VELOCITY and get_collider_velocity() == Vector2()): + # Since this formula will always slide the character around, + # a special case must be considered to to stop it from moving + # if standing on an inclined floor. Conditions are: + # 1) Standing on floor (on_air_time == 0) # 2) Did not move more than one pixel (get_travel().length() < SLIDE_STOP_MIN_TRAVEL) # 3) Not moving horizontally (abs(velocity.x) < SLIDE_STOP_VELOCITY) # 4) Collider is not moving - + revert_motion() - velocity.y=0.0 - + velocity.y = 0.0 else: - #For every other case of motion,our motion was interrupted. - #Try to complete the motion by "sliding" - #by the normal - + # For every other case of motion, our motion was interrupted. + # Try to complete the motion by "sliding" by the normal motion = n.slide(motion) - velocity = n.slide(velocity) - #then move again + velocity = n.slide(velocity) + # Then move again move(motion) - - if (floor_velocity!=Vector2()): - #if floor moves, move with floor + + if (floor_velocity != Vector2()): + # If floor moves, move with floor move(floor_velocity*delta) - - if (jumping and velocity.y>0): - #if falling, no longer jumping - jumping=false - - if (on_air_time<JUMP_MAX_AIRBORNE_TIME and jump and not prev_jump_pressed and not jumping): - # Jump must also be allowed to happen if the - # character left the floor a little bit ago. + + if (jumping and velocity.y > 0): + # If falling, no longer jumping + jumping = false + + if (on_air_time < JUMP_MAX_AIRBORNE_TIME and jump and not prev_jump_pressed and not jumping): + # Jump must also be allowed to happen if the character left the floor a little bit ago. # Makes controls more snappy. - velocity.y=-JUMP_SPEED - jumping=true - - on_air_time+=delta - prev_jump_pressed=jump + velocity.y = -JUMP_SPEED + jumping = true + + on_air_time += delta + prev_jump_pressed = jump + func _ready(): #Initalization here set_fixed_process(true) - pass - - |