From bceb6c6df81d2953154303e36d7b1fd7196996b1 Mon Sep 17 00:00:00 2001 From: ShadesAndGrays Date: Wed, 20 May 2026 18:50:52 +0100 Subject: [PATCH] add character contorller and damage handling --- CharacterController/CharacterController.gd | 147 ++++++++++++++++++ .../CharacterController.gd.uid | 1 + CharacterController/EnemyController.gd | 21 +++ CharacterController/EnemyController.gd.uid | 1 + .../Resources/MovementResource.gd | 6 + .../Resources/MovementResource.gd.uid | 1 + DamageHandling/DamageType.gd | 6 + DamageHandling/DamageType.gd.uid | 1 + DamageHandling/hit_box.gd | 19 +++ DamageHandling/hit_box.gd.uid | 1 + DamageHandling/hurt_box.gd | 18 +++ DamageHandling/hurt_box.gd.uid | 1 + 12 files changed, 223 insertions(+) create mode 100644 CharacterController/CharacterController.gd create mode 100644 CharacterController/CharacterController.gd.uid create mode 100644 CharacterController/EnemyController.gd create mode 100644 CharacterController/EnemyController.gd.uid create mode 100644 CharacterController/Resources/MovementResource.gd create mode 100644 CharacterController/Resources/MovementResource.gd.uid create mode 100644 DamageHandling/DamageType.gd create mode 100644 DamageHandling/DamageType.gd.uid create mode 100644 DamageHandling/hit_box.gd create mode 100644 DamageHandling/hit_box.gd.uid create mode 100644 DamageHandling/hurt_box.gd create mode 100644 DamageHandling/hurt_box.gd.uid diff --git a/CharacterController/CharacterController.gd b/CharacterController/CharacterController.gd new file mode 100644 index 0000000..c83711d --- /dev/null +++ b/CharacterController/CharacterController.gd @@ -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. diff --git a/CharacterController/CharacterController.gd.uid b/CharacterController/CharacterController.gd.uid new file mode 100644 index 0000000..945aca1 --- /dev/null +++ b/CharacterController/CharacterController.gd.uid @@ -0,0 +1 @@ +uid://b2m0jeaewr4nl diff --git a/CharacterController/EnemyController.gd b/CharacterController/EnemyController.gd new file mode 100644 index 0000000..904f7ba --- /dev/null +++ b/CharacterController/EnemyController.gd @@ -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 diff --git a/CharacterController/EnemyController.gd.uid b/CharacterController/EnemyController.gd.uid new file mode 100644 index 0000000..16588f0 --- /dev/null +++ b/CharacterController/EnemyController.gd.uid @@ -0,0 +1 @@ +uid://lv8u2g1nxhsp diff --git a/CharacterController/Resources/MovementResource.gd b/CharacterController/Resources/MovementResource.gd new file mode 100644 index 0000000..23fa209 --- /dev/null +++ b/CharacterController/Resources/MovementResource.gd @@ -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 \ No newline at end of file diff --git a/CharacterController/Resources/MovementResource.gd.uid b/CharacterController/Resources/MovementResource.gd.uid new file mode 100644 index 0000000..a46a7a2 --- /dev/null +++ b/CharacterController/Resources/MovementResource.gd.uid @@ -0,0 +1 @@ +uid://byliu0ncggca6 diff --git a/DamageHandling/DamageType.gd b/DamageHandling/DamageType.gd new file mode 100644 index 0000000..1d46f2c --- /dev/null +++ b/DamageHandling/DamageType.gd @@ -0,0 +1,6 @@ +extends RefCounted +enum TargetType{ + PLAYER = 1 << 0, # 1 0001 + ENEMY = 1 << 1, # 2 0010 + OBJECT = 1 << 2, # 4 0100 +} diff --git a/DamageHandling/DamageType.gd.uid b/DamageHandling/DamageType.gd.uid new file mode 100644 index 0000000..6e23442 --- /dev/null +++ b/DamageHandling/DamageType.gd.uid @@ -0,0 +1 @@ +uid://bmlsp6evve20 diff --git a/DamageHandling/hit_box.gd b/DamageHandling/hit_box.gd new file mode 100644 index 0000000..acbb9d6 --- /dev/null +++ b/DamageHandling/hit_box.gd @@ -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) diff --git a/DamageHandling/hit_box.gd.uid b/DamageHandling/hit_box.gd.uid new file mode 100644 index 0000000..67ddece --- /dev/null +++ b/DamageHandling/hit_box.gd.uid @@ -0,0 +1 @@ +uid://ctbguk3d6wxli diff --git a/DamageHandling/hurt_box.gd b/DamageHandling/hurt_box.gd new file mode 100644 index 0000000..f257d65 --- /dev/null +++ b/DamageHandling/hurt_box.gd @@ -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 diff --git a/DamageHandling/hurt_box.gd.uid b/DamageHandling/hurt_box.gd.uid new file mode 100644 index 0000000..adf5d70 --- /dev/null +++ b/DamageHandling/hurt_box.gd.uid @@ -0,0 +1 @@ +uid://dg8f4mexv447m