diff options
Diffstat (limited to 'demos/2d/platformer/player.gd')
-rw-r--r-- | demos/2d/platformer/player.gd | 232 |
1 files changed, 0 insertions, 232 deletions
diff --git a/demos/2d/platformer/player.gd b/demos/2d/platformer/player.gd deleted file mode 100644 index 8cafd8b933..0000000000 --- a/demos/2d/platformer/player.gd +++ /dev/null @@ -1,232 +0,0 @@ - -extends RigidBody2D - -# Character Demo, written by Juan Linietsky. -# -# Implementation of a 2D Character controller. -# This implementation uses the physics engine for -# controlling a character, in a very similar way -# than a 3D character controller would be implemented. -# -# Using the physics engine for this has the main -# advantages: -# -Easy to write. -# -Interaction with other physics-based objects is free -# -Only have to deal with the object linear velocity, not position -# -All collision/area framework available -# -# But also has the following disadvantages: -# -# -Objects may bounce a little bit sometimes -# -Going up ramps sends the chracter flying up, small hack is needed. -# -A ray collider is needed to avoid sliding down on ramps and -# undesiderd bumps, small steps and rare numerical precision errors. -# (another alternative may be to turn on friction when the character is not moving). -# -Friction cant be used, so floor velocity must be considered -# for moving platforms. - -# Member variables -var anim = "" -var siding_left = false -var jumping = false -var stopping_jump = false -var shooting = false - -var WALK_ACCEL = 800.0 -var WALK_DEACCEL = 800.0 -var WALK_MAX_VELOCITY = 200.0 -var AIR_ACCEL = 200.0 -var AIR_DEACCEL = 200.0 -var JUMP_VELOCITY = 460 -var STOP_JUMP_FORCE = 900.0 - -var MAX_FLOOR_AIRBORNE_TIME = 0.15 - -var airborne_time = 1e20 -var shoot_time = 1e20 - -var MAX_SHOOT_POSE_TIME = 0.3 - -var bullet = preload("res://bullet.tscn") - -var floor_h_velocity = 0.0 -var enemy - - -func _integrate_forces(s): - var lv = s.get_linear_velocity() - var step = s.get_step() - - var new_anim = anim - var new_siding_left = siding_left - - # Get the controls - var move_left = Input.is_action_pressed("move_left") - var move_right = Input.is_action_pressed("move_right") - var jump = Input.is_action_pressed("jump") - var shoot = Input.is_action_pressed("shoot") - var spawn = Input.is_action_pressed("spawn") - - if spawn: - var e = enemy.instance() - var p = get_pos() - p.y = p.y - 100 - e.set_pos(p) - get_parent().add_child(e) - - # Deapply prev floor velocity - lv.x -= floor_h_velocity - floor_h_velocity = 0.0 - - # Find the floor (a contact with upwards facing collision normal) - var found_floor = false - var floor_index = -1 - - for x in range(s.get_contact_count()): - var ci = s.get_contact_local_normal(x) - if (ci.dot(Vector2(0, -1)) > 0.6): - found_floor = true - floor_index = x - - # A good idea when impementing characters of all kinds, - # compensates for physics imprecission, as well as human reaction delay. - if (shoot and not shooting): - shoot_time = 0 - var bi = bullet.instance() - var ss - if (siding_left): - ss = -1.0 - else: - ss = 1.0 - var pos = get_pos() + get_node("bullet_shoot").get_pos()*Vector2(ss, 1.0) - - bi.set_pos(pos) - get_parent().add_child(bi) - - bi.set_linear_velocity(Vector2(800.0*ss, -80)) - get_node("sprite/smoke").set_emitting(true) - get_node("sound").play("shoot") - PS2D.body_add_collision_exception(bi.get_rid(), get_rid()) # Make bullet and this not collide - else: - shoot_time += step - - if (found_floor): - airborne_time = 0.0 - else: - airborne_time += step # Time it spent in the air - - var on_floor = airborne_time < MAX_FLOOR_AIRBORNE_TIME - - # Process jump - if (jumping): - if (lv.y > 0): - # Set off the jumping flag if going down - jumping = false - elif (not jump): - stopping_jump = true - - if (stopping_jump): - lv.y += STOP_JUMP_FORCE*step - - if (on_floor): - # Process logic when character is on floor - if (move_left and not move_right): - if (lv.x > -WALK_MAX_VELOCITY): - lv.x -= WALK_ACCEL*step - elif (move_right and not move_left): - if (lv.x < WALK_MAX_VELOCITY): - lv.x += WALK_ACCEL*step - else: - var xv = abs(lv.x) - xv -= WALK_DEACCEL*step - if (xv < 0): - xv = 0 - lv.x = sign(lv.x)*xv - - # Check jump - if (not jumping and jump): - lv.y = -JUMP_VELOCITY - jumping = true - stopping_jump = false - get_node("sound").play("jump") - - # Check siding - if (lv.x < 0 and move_left): - new_siding_left = true - elif (lv.x > 0 and move_right): - new_siding_left = false - if (jumping): - new_anim = "jumping" - elif (abs(lv.x) < 0.1): - if (shoot_time < MAX_SHOOT_POSE_TIME): - new_anim = "idle_weapon" - else: - new_anim = "idle" - else: - if (shoot_time < MAX_SHOOT_POSE_TIME): - new_anim = "run_weapon" - else: - new_anim = "run" - else: - # Process logic when the character is in the air - if (move_left and not move_right): - if (lv.x > -WALK_MAX_VELOCITY): - lv.x -= AIR_ACCEL*step - elif (move_right and not move_left): - if (lv.x < WALK_MAX_VELOCITY): - lv.x += AIR_ACCEL*step - else: - var xv = abs(lv.x) - xv -= AIR_DEACCEL*step - if (xv < 0): - xv = 0 - lv.x = sign(lv.x)*xv - - if (lv.y < 0): - if (shoot_time < MAX_SHOOT_POSE_TIME): - new_anim = "jumping_weapon" - else: - new_anim = "jumping" - else: - if (shoot_time < MAX_SHOOT_POSE_TIME): - new_anim = "falling_weapon" - else: - new_anim = "falling" - - # Update siding - if (new_siding_left != siding_left): - if (new_siding_left): - get_node("sprite").set_scale(Vector2(-1, 1)) - else: - get_node("sprite").set_scale(Vector2(1, 1)) - - siding_left = new_siding_left - - # Change animation - if (new_anim != anim): - anim = new_anim - get_node("anim").play(anim) - - shooting = shoot - - # Apply floor velocity - if (found_floor): - floor_h_velocity = s.get_contact_collider_velocity_at_pos(floor_index).x - lv.x += floor_h_velocity - - # Finally, apply gravity and set back the linear velocity - lv += s.get_total_gravity()*step - s.set_linear_velocity(lv) - - -func _ready(): - enemy = ResourceLoader.load("res://enemy.tscn") - -# if !Globals.has_singleton("Facebook"): -# return -# var Facebook = Globals.get_singleton("Facebook") -# var link = Globals.get("facebook/link") -# var icon = Globals.get("facebook/icon") -# var msg = "I just sneezed on your wall! Beat my score and Stop the Running nose!" -# var title = "I just sneezed on your wall!" -# Facebook.post("feed", msg, title, link, icon) |