Initial commit: Fighting_Rthythm_game project setup

This commit is contained in:
wxm
2026-07-01 06:59:12 -07:00
commit d7f118ae6e
291 changed files with 19614 additions and 0 deletions

View File

@@ -0,0 +1,114 @@
class_name Character
extends CharacterBody2D
const GRAVITY := 1200.0
@export var speed := 180.0
@export var jump_intensity := 304.056
@export var attack_duration := 0.4
@export var attack_lunge_duration := 0.18
@export var attack_lunge_speed := 220.0
@onready var animation_player: AnimationPlayer = $AnimationPlayer
@onready var character_sprite: Sprite2D = $CharacterSprite
enum State { IDLE, WALK, JUMP, LAND, ATTACK }
var anim_map := {
State.IDLE: "idle",
State.WALK: "idle",
State.JUMP: "jump",
State.LAND: "idle",
State.ATTACK: "挥砍",
}
var attack_direction := Vector2.RIGHT
var attack_lunge_time_left := 0.0
var attack_time_left := 0.0
var heading := Vector2.RIGHT
var height := 0.0
var height_speed := 0.0
var state := State.IDLE
func _physics_process(delta: float) -> void:
handle_input()
handle_air_time(delta)
handle_attack_time(delta)
handle_movement()
handle_animations()
set_sprite_height_position()
set_heading()
flip_sprites()
move_and_slide()
func handle_input() -> void:
pass
func handle_air_time(delta: float) -> void:
if state != State.JUMP:
return
height += height_speed * delta
if height <= 0.0 and height_speed < 0.0:
height = 0.0
height_speed = 0.0
state = State.LAND
else:
height_speed -= GRAVITY * delta
func handle_attack_time(delta: float) -> void:
if state != State.ATTACK:
return
velocity.y = 0.0
attack_time_left -= delta
if attack_time_left <= 0.0:
state = State.IDLE
velocity = Vector2.ZERO
return
attack_lunge_time_left -= delta
if attack_lunge_time_left <= 0.0:
velocity.x = 0.0
func handle_movement() -> void:
if state == State.JUMP or state == State.ATTACK:
return
if absf(velocity.x) > 0.0:
state = State.WALK
else:
state = State.IDLE
if state == State.LAND:
state = State.IDLE
func handle_animations() -> void:
var animation_name: String = anim_map[state]
if animation_player.has_animation(animation_name) and animation_player.current_animation != animation_name:
animation_player.play(animation_name)
func set_sprite_height_position() -> void:
character_sprite.position = Vector2.UP * height
func set_heading() -> void:
pass
func flip_sprites() -> void:
character_sprite.flip_h = heading == Vector2.LEFT
func can_jump() -> bool:
return state == State.IDLE or state == State.WALK
func can_attack() -> bool:
return state == State.IDLE or state == State.WALK
func start_jump() -> void:
state = State.JUMP
height_speed = jump_intensity
func start_attack() -> void:
start_directional_attack(heading)
func start_directional_attack(direction: Vector2) -> void:
var attack_x := -1.0 if direction.x < 0.0 else 1.0
attack_direction = Vector2(attack_x, 0.0)
heading = Vector2.RIGHT if attack_x > 0.0 else Vector2.LEFT
state = State.ATTACK
attack_time_left = attack_duration
attack_lunge_time_left = attack_lunge_duration
velocity = Vector2(attack_x * attack_lunge_speed, 0.0)

View File

@@ -0,0 +1 @@
uid://bd7rd0s5tsaln

View File

@@ -0,0 +1,31 @@
class_name Player
extends Character
func handle_input() -> void:
if Input.is_action_just_pressed("ui_left"):
judge_rhythm_action("left")
if can_attack():
start_directional_attack(Vector2.LEFT)
return
if Input.is_action_just_pressed("ui_right"):
judge_rhythm_action("right")
if can_attack():
start_directional_attack(Vector2.RIGHT)
return
if Input.is_action_just_pressed("jump"):
judge_rhythm_action("jump")
if can_jump():
start_jump()
if state == State.IDLE or state == State.WALK:
velocity.x = 0.0
func set_heading() -> void:
if velocity.x > 0.0:
heading = Vector2.RIGHT
elif velocity.x < 0.0:
heading = Vector2.LEFT
func judge_rhythm_action(action_name: String) -> void:
var conductor: Node = get_tree().get_first_node_in_group("rhythm_conductor")
if conductor != null and conductor.has_method("judge_action"):
conductor.call("judge_action", action_name)

View File

@@ -0,0 +1 @@
uid://cwp1u2srtj5ko

View File

@@ -0,0 +1,249 @@
[gd_scene load_steps=10 format=3]
[ext_resource type="Script" path="res://scenes/characters/player.gd" id="1_player_script"]
[ext_resource type="Texture2D" path="res://assets/art/characters/jump.png" id="2_jump_texture"]
[ext_resource type="Texture2D" path="res://assets/art/characters/katana_attack_sheathe.png" id="3_slash_texture"]
[ext_resource type="Texture2D" path="res://assets/art/characters/player_idle.png" id="4_idle_texture"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_player"]
size = Vector2(16, 36)
[sub_resource type="Animation" id="Animation_idle"]
resource_name = "idle"
length = 1.0
loop_mode = 1
step = 0.1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("CharacterSprite:texture")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [ExtResource("4_idle_texture")]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("CharacterSprite:hframes")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [10]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("CharacterSprite:vframes")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [1]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("CharacterSprite:offset")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [Vector2(-24, -40)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("CharacterSprite:frame")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}
[sub_resource type="Animation" id="Animation_jump"]
resource_name = "jump"
length = 0.36
loop_mode = 1
step = 0.06
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("CharacterSprite:texture")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [ExtResource("2_jump_texture")]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("CharacterSprite:hframes")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [6]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("CharacterSprite:vframes")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [1]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("CharacterSprite:offset")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [Vector2(-24, -44)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("CharacterSprite:frame")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.06, 0.12, 0.18, 0.24, 0.3),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5]
}
[sub_resource type="Animation" id="Animation_slash"]
resource_name = "挥砍"
length = 0.4
step = 0.04
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("CharacterSprite:texture")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [ExtResource("3_slash_texture")]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("CharacterSprite:hframes")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [10]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("CharacterSprite:vframes")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [1]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("CharacterSprite:offset")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [Vector2(-40, -48)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("CharacterSprite:frame")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.04, 0.08, 0.12, 0.16, 0.2, 0.24, 0.28, 0.32, 0.36),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_player"]
_data = {
"idle": SubResource("Animation_idle"),
"jump": SubResource("Animation_jump"),
"挥砍": SubResource("Animation_slash")
}
[node name="Player" type="CharacterBody2D"]
collision_layer = 2
collision_mask = 1
safe_margin = 0.001
floor_snap_length = 0.0
scale = Vector2(4, 4)
script = ExtResource("1_player_script")
speed = 180.0
jump_intensity = 304.056
attack_duration = 0.4
attack_lunge_duration = 0.18
attack_lunge_speed = 220.0
[node name="CharacterSprite" type="Sprite2D" parent="."]
texture = ExtResource("4_idle_texture")
centered = false
offset = Vector2(-24, -40)
hframes = 10
vframes = 1
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(0, -18)
shape = SubResource("RectangleShape2D_player")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_player")
}
autoplay = "idle"
[node name="Camera2D" type="Camera2D" parent="."]
position = Vector2(0, -37.5)
scale = Vector2(0.25, 0.25)
zoom = Vector2(1.5, 1.5)
enabled = true