Browse Source

Change player to use KinematicBody

This gives greater flexibility and stops some of those especially
annoying bugs
master
Luna 7 years ago
parent
commit
22cf954991
4 changed files with 46 additions and 109 deletions
  1. +10
    -15
      hero_0.gd
  2. +3
    -17
      hero_0.tscn
  3. +30
    -60
      player.gd
  4. +3
    -17
      player.tscn

+ 10
- 15
hero_0.gd View File

@ -1,28 +1,23 @@
extends "res://player.gd"
const wallride_speed = 2
const wallride_speed = 0.5
const wallride_speed_necessary = 15
master func _integrate_forces(state):
._integrate_forces(state)
wallride(state)
func control_player(delta):
wallride(delta)
.control_player(delta)
func wallride(state):
var ray = get_node("Ray")
func wallride(delta):
# If our feet aren't touching, but we are colliding, we are wall-riding
if !ray.is_colliding() and get_colliding_bodies():
print("riding")
if is_on_wall() and velocity.length() > wallride_speed_necessary:
var aim = get_node("Yaw").get_global_transform().basis
var direction = Vector3()
if Input.is_action_pressed("move_forwards"):
direction -= aim[2]
if Input.is_action_pressed("move_backwards"):
direction += aim[2]
#var n = -1 * (state.get_transform() * state.get_contact_local_normal(0))
#direction = n.slide(direction) * wallride_speed
direction *= 0.1
set_gravity_scale(-0.1)
apply_impulse(Vector3(), direction)
state.integrate_forces()
velocity += direction * wallride_speed
velocity.y = -gravity # So it's undone in super
else:
pass
# We need to return to falling (we aren't riding anymore)
set_gravity_scale(1)

+ 3
- 17
hero_0.tscn View File

@ -20,33 +20,19 @@ radial_segments = 64
rings = 8
_sections_unfolded = [ "Resource" ]
[node name="RigidBody" type="RigidBody" index="0"]
[node name="RigidBody" type="KinematicBody"]
input_ray_pickable = true
input_capture_on_drag = false
collision_layer = 1
collision_mask = 1
mode = 2
mass = 1.0
friction = 0.0
bounce = 0.0
gravity_scale = 1.0
custom_integrator = true
continuous_cd = true
contacts_reported = 8
contact_monitor = true
sleeping = false
can_sleep = false
axis_lock_linear_x = false
axis_lock_linear_y = false
axis_lock_linear_z = false
axis_lock_angular_x = false
axis_lock_angular_y = false
axis_lock_angular_z = false
linear_velocity = Vector3( 0, 0, 0 )
linear_damp = -1.0
angular_velocity = Vector3( 0, 0, 0 )
angular_damp = -1.0
collision/safe_margin = 0.001
script = ExtResource( 1 )
_sections_unfolded = [ "Angular", "Collision", "Linear", "Transform", "Visibility" ]
@ -87,7 +73,7 @@ h_offset = 0.0
v_offset = 0.0
doppler_tracking = 0
projection = 0
current = false
current = true
fov = 70.0
size = 1.0
near = 0.05


+ 30
- 60
player.gd View File

@ -2,28 +2,28 @@
# This source code form is governed by the MIT license.
# Original: https://raw.githubusercontent.com/Calinou/fps-test/master/scripts/player.gd
extends RigidBody
extends KinematicBody
var view_sensitivity = 0.25
var yaw = 0
var pitch = 0
const max_accel = 0.005
const air_accel = 0.02
var gravity = -1
var tf = Basis()
var velocity = Vector3()
var timer = 0
# Walking speed and jumping height are defined later.
var walk_speed
var jump_speed
var walk_speed = 3
var jump_speed = 15
var health = 100
var stamina = 10000
var ray_length = 10
slave var slave_transform = Basis()
slave var slave_lin_v = Vector3()
slave var slave_ang_v = Vector3()
func _ready():
set_process_input(true)
@ -60,21 +60,16 @@ func _input(event):
quit()
master func _integrate_forces(state):
control_player(state)
rpc_unreliable("set_status", get_transform(), get_linear_velocity(), get_angular_velocity())
func _physics_process(delta):
if is_network_master():
control_player(delta)
rset_unreliable("tf", get_transform())
rset_unreliable("velocity", velocity)
else:
set_transform(tf)
move_and_slide(velocity)
slave func set_status(tf, lv, av):
set_transform(tf)
set_linear_velocity(lv)
set_angular_velocity(av)
func control_player(state):
# Default walk speed:
walk_speed = 5
# Default jump height:
jump_speed = 3
func control_player(delta):
var aim = get_node("Yaw").get_global_transform().basis
@ -92,52 +87,27 @@ func control_player(state):
direction = direction.normalized()
var ray = get_node("Ray")
#print("---")
if ray.is_colliding():
var up = state.get_total_gravity().normalized()
var normal = ray.get_collision_normal()
var floor_velocity = Vector3()
var object = ray.get_collider()
if object is RigidBody or object is StaticBody:
var point = ray.get_collision_point() - object.get_translation()
var floor_angular_vel = Vector3()
if object is RigidBody:
floor_velocity = object.get_linear_velocity()
floor_angular_vel = object.get_angular_velocity()
elif object is StaticBody:
floor_velocity = object.get_constant_linear_velocity()
floor_angular_vel = object.get_constant_angular_velocity()
# Surely there should be a function to convert Euler angles to a 3x3 matrix
var tf = Basis(Vector3(1, 0, 0), floor_angular_vel.x)
tf = tf.rotated(Vector3(0, 1, 0), floor_angular_vel.y)
tf = tf.rotated(Vector3(0, 0, 1), floor_angular_vel.z)
floor_velocity += tf.xform_inv(point) - point
yaw = fmod(yaw + rad2deg(floor_angular_vel.y) * state.get_step(), 360)
get_node("Yaw").set_rotation(Vector3(0, deg2rad(yaw), 0))
print("isRB||isSB")
var friction
var diff = floor_velocity + direction * walk_speed - state.get_linear_velocity()
var vertdiff = aim[1] * diff.dot(aim[1])
print("VD: " + str(vertdiff))
diff -= vertdiff
diff = diff.normalized() * clamp(diff.length(), 0, max_accel / state.get_step())
diff += vertdiff
if is_on_floor():
print("D: " + str(diff))
apply_impulse(Vector3(), diff * get_mass())
friction = 1 - 0.16
velocity.x *= friction
velocity.z *= friction
velocity.y = 0
velocity += direction * walk_speed
if Input.is_action_pressed("jump"):
apply_impulse(Vector3(), normal * jump_speed * get_mass())
velocity.y += jump_speed
else:
apply_impulse(Vector3(), direction * air_accel * get_mass())
print(get_translation())
print(state.get_linear_velocity())
friction = 1 - 0.01
velocity.x *= friction
velocity.z *= friction
velocity.y += gravity
velocity += direction * air_accel
state.integrate_forces()
move_and_slide(velocity, Vector3(0, 1, 0))
func _exit_scene():
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)


+ 3
- 17
player.tscn View File

@ -20,33 +20,19 @@ radial_segments = 64
rings = 8
_sections_unfolded = [ "Resource" ]
[node name="RigidBody" type="RigidBody" index="0"]
[node name="RigidBody" type="KinematicBody"]
input_ray_pickable = true
input_capture_on_drag = false
collision_layer = 1
collision_mask = 1
mode = 2
mass = 1.0
friction = 0.0
bounce = 0.0
gravity_scale = 1.0
custom_integrator = true
continuous_cd = true
contacts_reported = 8
contact_monitor = true
sleeping = false
can_sleep = false
axis_lock_linear_x = false
axis_lock_linear_y = false
axis_lock_linear_z = false
axis_lock_angular_x = false
axis_lock_angular_y = false
axis_lock_angular_z = false
linear_velocity = Vector3( 0, 0, 0 )
linear_damp = -1.0
angular_velocity = Vector3( 0, 0, 0 )
angular_damp = -1.0
collision/safe_margin = 0.001
script = ExtResource( 1 )
_sections_unfolded = [ "Angular", "Collision", "Linear", "Transform", "Visibility" ]
@ -87,7 +73,7 @@ h_offset = 0.0
v_offset = 0.0
doppler_tracking = 0
projection = 0
current = false
current = true
fov = 70.0
size = 1.0
near = 0.05


Loading…
Cancel
Save