My first 3D game with Godot 4.4
This commit is contained in:
83
player/player.gd
Normal file
83
player/player.gd
Normal file
@@ -0,0 +1,83 @@
|
||||
extends CharacterBody3D
|
||||
|
||||
const SPEED: float = 7
|
||||
const HEALTH_MAX: float = 100.0
|
||||
const MOUSE_SENSE: float = 0.35
|
||||
|
||||
var health: float = 50.0
|
||||
|
||||
func _ready() -> void:
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if (Input.mouse_mode == Input.MOUSE_MODE_CAPTURED):
|
||||
if (event is InputEventMouseMotion):
|
||||
rotation_degrees.y -= event.relative.x * MOUSE_SENSE
|
||||
$Camera3D.rotation_degrees.x -= event.relative.y * MOUSE_SENSE
|
||||
$Camera3D.rotation_degrees.x = clamp(
|
||||
$Camera3D.rotation_degrees.x, -85.0, 85.0
|
||||
)
|
||||
elif (event is InputEventMouseButton):
|
||||
match event.button_index:
|
||||
MOUSE_BUTTON_LEFT:
|
||||
var timer: Timer = $Camera3D/gun_model/ShootTimer
|
||||
if (event.is_pressed()):
|
||||
print("left MB pressed")
|
||||
$Camera3D/gun_model.recoil()
|
||||
shoot()
|
||||
timer.start()
|
||||
else:
|
||||
print("left MB released")
|
||||
timer.stop()
|
||||
_:
|
||||
# unhandled mouse events
|
||||
pass
|
||||
else:
|
||||
# other unhandled input
|
||||
pass
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
if event.is_action_pressed("ui_cancel"):
|
||||
if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
|
||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||
else:
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
%HealthBar.set("value", health)
|
||||
|
||||
# Player model camera is -Z aligned
|
||||
var input_direction_2D = Input.get_vector(
|
||||
"move_left", "move_right", "move_forward", "move_back"
|
||||
)
|
||||
|
||||
var direction = transform.basis * Vector3(
|
||||
input_direction_2D.x, 0.0, input_direction_2D.y
|
||||
)
|
||||
|
||||
velocity.x = direction.x * SPEED
|
||||
velocity.z = direction.z * SPEED
|
||||
|
||||
velocity.y -= 9.80665 * delta
|
||||
if Input.is_action_just_pressed("jump") and is_on_floor():
|
||||
velocity.y = 3.5
|
||||
move_and_slide()
|
||||
|
||||
func shoot() -> void:
|
||||
const BULLET_3D = preload("res://player/bullet_3d.tscn")
|
||||
var new_bullet = BULLET_3D.instantiate()
|
||||
%Marker3D.add_child(new_bullet)
|
||||
new_bullet.global_transform = %Marker3D.global_transform
|
||||
%AudioStreamPlayer.play()
|
||||
|
||||
func _on_shoot_timer_timeout() -> void:
|
||||
$Camera3D/gun_model.recoil()
|
||||
shoot()
|
||||
|
||||
func heal(amount: float = 35.0) -> void:
|
||||
# TODO: add values and other fancy healing stuff, for now this works
|
||||
health = clampf((health + amount), 0.0, HEALTH_MAX)
|
||||
|
||||
func hurt(amount: float) -> void:
|
||||
health = clampf((health - amount), 0.0, HEALTH_MAX)
|
||||
|
||||
Reference in New Issue
Block a user