add character contorller and damage handling
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
class_name CharacterController extends Node
|
||||
|
||||
|
||||
@export_category("Movement Setting")
|
||||
@export var body: CharacterBody2D
|
||||
@export var move_res:MovementResouce = MovementResouce.new()
|
||||
# @export var SPEED = 500.0
|
||||
# @export var JUMP_VELOCITY = -900.0
|
||||
# @export var gravity = 1900
|
||||
var gravity_multiplier = 1
|
||||
|
||||
@export_category("Buffer Settings")
|
||||
var buffer_timer:Timer
|
||||
@export var buffer_delay:float = 0.2
|
||||
|
||||
@export_category("Cayote Settings")
|
||||
var cayote_timer:Timer
|
||||
@export var cayote_delay:float = 0.1
|
||||
|
||||
@export_category("Debug")
|
||||
@export var label:Label
|
||||
|
||||
var jump_loaded:bool = false
|
||||
|
||||
enum FloorState{
|
||||
ON_FLOOR,
|
||||
JUST_LEFT_FLOOR,
|
||||
IN_AIR,
|
||||
}
|
||||
var current_floor_state:FloorState = FloorState.IN_AIR
|
||||
# var has_released_jump:bool = true
|
||||
|
||||
func _ready() -> void:
|
||||
create_timers()
|
||||
if body == null:
|
||||
if get_parent() is CharacterBody2D:
|
||||
body = get_parent()
|
||||
|
||||
func set_movment_resource(movement_resource:MovementResouce):
|
||||
move_res = movement_resource
|
||||
|
||||
func create_timers():
|
||||
cayote_timer = Timer.new()
|
||||
cayote_timer.wait_time = cayote_delay
|
||||
cayote_timer.one_shot = true
|
||||
add_child(cayote_timer)
|
||||
|
||||
buffer_timer = Timer.new()
|
||||
buffer_timer.wait_time = buffer_delay
|
||||
buffer_timer.one_shot = true
|
||||
add_child(buffer_timer)
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
if label:
|
||||
label.text = "Buff TimeLeft: {buff_timeleft}\nCayote TimeLeft: {cayote_timeleft} \nFloor State: {floor_state}".format({
|
||||
"buff_timeleft": "%0.2f" % buffer_timer.time_left,
|
||||
"cayote_timeleft": "%0.2f" % cayote_timer.time_left,
|
||||
"floor_state": FloorState.keys()[current_floor_state]
|
||||
})
|
||||
pass
|
||||
|
||||
func handle_gravity(delta: float):
|
||||
match current_floor_state:
|
||||
FloorState.ON_FLOOR:
|
||||
if not body.is_on_floor():
|
||||
current_floor_state = FloorState.JUST_LEFT_FLOOR
|
||||
cayote_timer.start()
|
||||
FloorState.JUST_LEFT_FLOOR:
|
||||
if cayote_timer.is_stopped():
|
||||
current_floor_state = FloorState.IN_AIR
|
||||
body.velocity.y += move_res.gravity * delta * gravity_multiplier
|
||||
FloorState.IN_AIR:
|
||||
if not cayote_timer.is_stopped():
|
||||
cayote_timer.stop()
|
||||
body.velocity.y += move_res.gravity * delta * gravity_multiplier
|
||||
if body.is_on_floor():
|
||||
current_floor_state = FloorState.ON_FLOOR
|
||||
pass
|
||||
|
||||
# if left_floor_flag:
|
||||
# else:
|
||||
# left_floor_flag = true
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
# Add the gravity.
|
||||
|
||||
handle_gravity(delta)
|
||||
handle_jump()
|
||||
|
||||
# Handle jump.
|
||||
# if Input.is_action_pressed("up") and has_released_jump:
|
||||
# if Input.is_action_pressed("up"):
|
||||
# gravity_multiplier = 1
|
||||
# if body.is_on_floor():
|
||||
# jump()
|
||||
# else:
|
||||
# if buffer_timer.is_stopped():
|
||||
# buffer_timer.start()
|
||||
|
||||
# if Input.is_action_just_released("up"):
|
||||
# has_released_jump = true
|
||||
# gravity_multiplier = 2
|
||||
|
||||
|
||||
var direction := Input.get_axis("left", "right")
|
||||
if direction:
|
||||
body.velocity.x = direction * move_res.speed
|
||||
else:
|
||||
body.velocity.x = move_toward(body.velocity.x, 0, move_res.speed)
|
||||
|
||||
# if jump_loaded:
|
||||
# jump_loaded = false
|
||||
# has_released_jump = false
|
||||
# body.velocity.y = JUMP_VELOCITY
|
||||
# move_and_slide()
|
||||
|
||||
# func jump():
|
||||
# jump_loaded = true
|
||||
|
||||
# func handle_buffer_jump():
|
||||
# if not buffer_timer.is_stopped() and Input.is_action_pressed("up"):
|
||||
# jump()
|
||||
# buffer_timer.stop()
|
||||
|
||||
func handle_jump():
|
||||
if Input.is_action_just_pressed("up"):
|
||||
# Body is on floor
|
||||
if current_floor_state != FloorState.IN_AIR :
|
||||
jump_loaded = true
|
||||
else:
|
||||
buffer_timer.start()
|
||||
|
||||
if not buffer_timer.is_stopped() and body.is_on_floor():
|
||||
buffer_timer.stop()
|
||||
jump_loaded = true
|
||||
|
||||
|
||||
if jump_loaded:
|
||||
body.velocity.y = move_res.jump_velocity
|
||||
current_floor_state = FloorState.IN_AIR
|
||||
jump_loaded = false
|
||||
|
||||
func _on_buffer_timer_timeout() -> void:
|
||||
pass
|
||||
|
||||
func _on_cayote_timer_timeout() -> void:
|
||||
pass # Replace with function body.
|
||||
@@ -0,0 +1 @@
|
||||
uid://b2m0jeaewr4nl
|
||||
@@ -0,0 +1,21 @@
|
||||
class_name SimpleEnemycontroller extends Node
|
||||
|
||||
|
||||
@export var body: CharacterBody2D
|
||||
@export var move_res:MovementResouce = MovementResouce.new()
|
||||
@export var direction:float = 0
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
if body == null:
|
||||
if get_parent() is CharacterBody2D:
|
||||
body = get_parent()
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
if direction:
|
||||
body.velocity.x = direction * move_res.speed
|
||||
else:
|
||||
body.velocity.x = move_toward(body.velocity.x, 0, move_res.speed)
|
||||
if not body.is_on_floor():
|
||||
body.velocity.y += move_res.gravity * delta
|
||||
@@ -0,0 +1 @@
|
||||
uid://lv8u2g1nxhsp
|
||||
@@ -0,0 +1,6 @@
|
||||
class_name MovementResouce extends Resource
|
||||
|
||||
@export_category("Base")
|
||||
@export var speed = 500.0
|
||||
@export var jump_velocity = -900.0
|
||||
@export var gravity = 1900
|
||||
@@ -0,0 +1 @@
|
||||
uid://byliu0ncggca6
|
||||
@@ -0,0 +1,6 @@
|
||||
extends RefCounted
|
||||
enum TargetType{
|
||||
PLAYER = 1 << 0, # 1 0001
|
||||
ENEMY = 1 << 1, # 2 0010
|
||||
OBJECT = 1 << 2, # 4 0100
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://bmlsp6evve20
|
||||
@@ -0,0 +1,19 @@
|
||||
class_name HitBox extends Area2D
|
||||
|
||||
@export var damage:float = 10
|
||||
@export_flags("player","enemy") var affect:int = 0
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
print(affect)
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
#func _process(delta: float) -> void:
|
||||
# pass
|
||||
|
||||
func hit():
|
||||
for i in get_overlapping_areas():
|
||||
if i is HurtBox:
|
||||
i.on_damage_receieved(self)
|
||||
@@ -0,0 +1 @@
|
||||
uid://ctbguk3d6wxli
|
||||
@@ -0,0 +1,18 @@
|
||||
class_name HurtBox extends Area2D
|
||||
|
||||
signal damage_recieved(damage:float)
|
||||
@export_flags("player","enemy") var type
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
pass
|
||||
|
||||
func on_damage_receieved(hitbox:HitBox):
|
||||
if hitbox.affect & type:
|
||||
damage_recieved.emit(hitbox.damage)
|
||||
#if type
|
||||
@@ -0,0 +1 @@
|
||||
uid://dg8f4mexv447m
|
||||
Reference in New Issue
Block a user