Explorar o código

Some changes to kinematic character 3D

Aaron Franke %!s(int64=5) %!d(string=hai) anos
pai
achega
5caa78ef58
Modificáronse 2 ficheiros con 53 adicións e 34 borrados
  1. 36 33
      3d/kinematic_character/cubio.gd
  2. 17 1
      3d/kinematic_character/project.godot

+ 36 - 33
3d/kinematic_character/cubio.gd

@@ -1,55 +1,58 @@
-
 extends KinematicBody
 
-# Member variables
-var g = -9.8
-var vel: Vector3
 const MAX_SPEED = 5
 const JUMP_SPEED = 7
-const ACCEL= 2
-const DEACCEL= 4
+const ACCELERATION = 2
+const DECELERATION = 4
 const MAX_SLOPE_ANGLE = 30
 
+onready var gravity = -ProjectSettings.get_setting("physics/3d/default_gravity")
+var velocity: Vector3
 
 func _physics_process(delta):
+	if Input.is_action_just_pressed("exit"):
+		get_tree().quit()
 	if Input.is_action_just_pressed("reset_position"):
 		translation = Vector3(-3, 4, 8)
-	var dir = Vector3() # Where does the player intend to walk to
-	var cam_xform = $Target/Camera.get_global_transform()
-
-	if Input.is_action_pressed("move_forward"):
-		dir += -cam_xform.basis[2]
-	if Input.is_action_pressed("move_backwards"):
-		dir += cam_xform.basis[2]
-	if Input.is_action_pressed("move_left"):
-		dir += -cam_xform.basis[0]
-	if Input.is_action_pressed("move_right"):
-		dir += cam_xform.basis[0]
-
-	dir.y = 0
-	dir = dir.normalized()
-
-	vel.y += delta * g
-
-	var hvel = vel
+	
+	var dir = Vector3()
+	dir.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
+	dir.z = Input.get_action_strength("move_back") - Input.get_action_strength("move_forward")
+	
+	# Get the camera's transform basis, but remove the X rotation such
+	# that the Y axis is up and Z is horizontal.
+	var cam_basis = $Target/Camera.global_transform.basis
+	var basis = cam_basis.rotated(cam_basis.x, -cam_basis.get_euler().x)
+	dir = basis.xform(dir)
+	
+	# Limit the input to a length of 1. length_squared is faster to check.
+	if dir.length_squared() > 1:
+		dir /= dir.length()
+
+	# Apply gravity.
+	velocity.y += delta * gravity
+
+	# Using only the horizontal velocity, interpolate towards the input.
+	var hvel = velocity
 	hvel.y = 0
 
 	var target = dir * MAX_SPEED
-	var accel
+	var acceleration
 	if dir.dot(hvel) > 0:
-		accel = ACCEL
+		acceleration = ACCELERATION
 	else:
-		accel = DEACCEL
-
-	hvel = hvel.linear_interpolate(target, accel * delta)
+		acceleration = DECELERATION
 
-	vel.x = hvel.x
-	vel.z = hvel.z
+	hvel = hvel.linear_interpolate(target, acceleration * delta)
 
-	vel = move_and_slide(vel, Vector3.UP)
+	# Assign hvel's values back to velocity, and then move.
+	velocity.x = hvel.x
+	velocity.z = hvel.z
+	velocity = move_and_slide(velocity, Vector3.UP)
 
+	# Jumping code. is_on_floor() must come after move_and_slide().
 	if is_on_floor() and Input.is_action_pressed("jump"):
-		vel.y = JUMP_SPEED
+		velocity.y = JUMP_SPEED
 
 
 func _on_tcube_body_entered(body):

+ 17 - 1
3d/kinematic_character/project.godot

@@ -28,35 +28,51 @@ singletons=[  ]
 jump={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
  ]
 }
-move_backwards={
+move_back={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null)
 , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
  ]
 }
 move_forward={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null)
 , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
  ]
 }
 move_left={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null)
 , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
  ]
 }
 move_right={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null)
 , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
  ]
 }
 reset_position={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":2,"pressure":0.0,"pressed":false,"script":null)
+ ]
+}
+exit={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null)
  ]
 }