Initial commit: Fighting_Rthythm_game project setup
This commit is contained in:
114
scenes/characters/character.gd
Normal file
114
scenes/characters/character.gd
Normal 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)
|
||||
1
scenes/characters/character.gd.uid
Normal file
1
scenes/characters/character.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bd7rd0s5tsaln
|
||||
31
scenes/characters/player.gd
Normal file
31
scenes/characters/player.gd
Normal 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)
|
||||
1
scenes/characters/player.gd.uid
Normal file
1
scenes/characters/player.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cwp1u2srtj5ko
|
||||
249
scenes/characters/player.tscn
Normal file
249
scenes/characters/player.tscn
Normal 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
|
||||
Reference in New Issue
Block a user