Basic platformer with rope
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
class_name Player
|
||||
extends CharacterBody3D
|
||||
|
||||
@export var player_id := 1
|
||||
@export var gravity_vector := Vector3(0, -20, 0)
|
||||
@export var move_speed := 8.0
|
||||
@export var accel := 50.0
|
||||
@export var friction := 16.0
|
||||
@export var jump_speed := 12.0
|
||||
@export var air_control := 0.65
|
||||
@export var coyote := 0.1
|
||||
@export var buffer := 0.1
|
||||
@export var col1 := Color(0.3, 0.6, 1)
|
||||
@export var col2 := Color(1, 0.47, 0.35)
|
||||
|
||||
var ct := 0.0
|
||||
var bt := 0.0
|
||||
|
||||
func _ready():
|
||||
add_to_group("players")
|
||||
# $Body.color = col1 if player_id == 1 else col2
|
||||
|
||||
func _physics_process(d):
|
||||
var up = Vector3.UP if gravity_vector.length_squared() < 0.0001 else -gravity_vector.normalized()
|
||||
up_direction = up
|
||||
velocity += gravity_vector * d
|
||||
ct = coyote if is_on_floor() else max(ct - d, 0.0)
|
||||
bt = max(bt - d, 0.0)
|
||||
if Input.is_action_just_pressed("p%d_jump" % player_id):
|
||||
bt = buffer
|
||||
var ix = Input.get_axis("p%d_left" % player_id, "p%d_right" % player_id)
|
||||
var a = accel if is_on_floor() else accel * air_control
|
||||
if abs(ix) > 0.01:
|
||||
velocity.x = move_toward(velocity.x, ix * move_speed, a * d)
|
||||
else:
|
||||
velocity.x = move_toward(velocity.x, 0.0, friction * d)
|
||||
if bt > 0.0 and ct > 0.0:
|
||||
velocity = velocity.slide(up) + up * jump_speed
|
||||
bt = 0.0
|
||||
ct = 0.0
|
||||
# plane lock: 2D platformer physics in a 3D scene. Sliding along an angled
|
||||
# collision normal can otherwise walk the player off the Z=0 plane.
|
||||
velocity.z = 0.0
|
||||
move_and_slide()
|
||||
global_position.z = 0.0
|
||||
Reference in New Issue
Block a user