我有一个用Python编写的战斗游戏,有移动、帧数据、攻击(不起作用(,但没有重力。我正试图用Godot重写它,但我真的迷路了。
我有一个在攻击中实现帧数据的系统,这样我就可以很容易地从空闲过渡到攻击,反之亦然。现在,我的问题是我想攻击并播放那个动画,但它一直在播放空闲的动画。在我开始做命中框和碰撞之前,我想先把这件事做好。这是我的代码:
extends KinematicBody2D
export var walking_speed = 100
export var falling_speed = 0
var time = 0
onready var anim = $Sprite
var state = "Idle"
func _ready():
set_physics_process(true)
set_process(true)
$AnimationTree.active = true
func gravity():
pass
func _physics_process(delta):
time += delta
print(time)
# If you press both A and D, you will stop entirely
if Input.is_action_pressed("ui_left") and Input.is_action_pressed("ui_right"):
walking_speed == 0
$AnimationTree.set("parameters/Neutral/current", 0)
#if you press A or D, you will move left or right accordingly
elif Input.is_action_pressed("ui_left"):
move_and_collide(Vector2(-walking_speed * delta, 0))
anim.flip_h = true
$AnimationTree.set("parameters/Neutral/current", 1)
elif Input.is_action_pressed("ui_right"):
move_and_collide(Vector2(walking_speed * delta, 0))
anim.flip_h = false
$AnimationTree.set("parameters/Neutral/current", 1)
else:
walking_speed = walking_speed
if Input.is_action_just_pressed("Horizontal"):
$AnimationTree.set("parameters/Neutral/current", 2)
这段代码基本上只是我被告知要做的一堆教程的混合体(比如,我被告知不要使用AnimatedSprite
,而是使用AnimationTree
,但这段代码似乎要复杂得多,给我带来了与上次相同的问题(。如果你需要我,我也可以发布我的Python代码,但这是一个巨大的混乱,根本没有评论。
您可以使用AnimatedSprite
制作动画。我祝福你。CCD_ 4在那里被使用。并且";有人告诉我;不是不这样做的好理由。
此外,AnimatedSprite
与AnimationPlayer
和AnimationTree
不是非此即彼。是的,有些东西你需要AnimationPlayer
和AnimationTree
,但你总是可以让AnimationPlayer
触发AnimatedSprite
动画。事实上,AnimationPlayer
可以调用任何方法(并且AnimationTree
将控制AnimationPlayer
(。因此,使用AnimatedSprite
所做的任何工作都不会被浪费。
调用set_physics_process
将启用或禁用_physics_process
。类似地,CCD_ 18启用或禁用CCD_ 19。但是,如果您有一个the方法,那么它在默认情况下是启用的。因此,您只需要在禁用它们时启用它们。
我们可以压缩您的许多_physics_process
代码:
func _physics_process(_delta:float) -> void:
var walking_speed := (
Input.get_action_strength("ui_right") -
Input.get_action_strength("ui_left")
)
anim.flip_h = walking_speed < 0
var velocity := Vector2(walking_speed, 0)
move_and_collide(velocity * delta)
当walking_speed
为负时,线anim.flip_h = walking_speed < 0
将设置flip_h
到true
,否则设置为false
。
我们在get_action_strength
的基础上设置walking_speed
,它将返回一个介于0
和1
之间的数字,表示动作被按下的力度。这也意味着,如果它们被映射到操纵杆或类似的东西,这将为您提供灵敏度支持。
如果你不喜欢这种灵敏度,sign
可以:
var walking_speed := sign(
Input.get_action_strength("ui_right") -
Input.get_action_strength("ui_left")
)
使用KinematicBody2D
,您必须处理重力。基本上给它一些向下的速度。
var gravitational_acceleration := 100 # pixels per second squared
var falling_speed := 0
func _physics_process(_delta:float) -> void:
falling_speed += gravitational_acceleration * delta
var walking_speed := (
Input.get_action_strength("ui_right") -
Input.get_action_strength("ui_left")
)
anim.flip_h = walking_speed < 0
var velocity := Vector2(walking_speed, falling_speed)
move_and_collide(velocity * delta)
然而,最好使用move_and_slide
:实现重力
var gravitational_acceleration := 100 # pixels per second squared
var falling_speed := 0
func _physics_process(_delta:float) -> void:
falling_speed += gravitational_acceleration * delta
var walking_speed := (
Input.get_action_strength("ui_right") -
Input.get_action_strength("ui_left")
)
anim.flip_h = walking_speed < 0
var velocity := Vector2(walking_speed, falling_speed)
velocity = move_and_slide(velocity)
falling_speed = velocity.y
我已经删除了最后与delta
的乘法,因为move_and_slide
在内部这样做。也就是说,它需要一个速度而不是位移
这样一来,CCD_ 35就不会一直生长失控。
您还可以添加一个向上向量(这样Godot就知道什么是天花板、什么是地板、什么是墙(,然后可以检查is_on_ceiling
、is_on_floor
和is_on_wall
。
此外,您可以告诉move_and_slide
AnimatedSprite
0是0
,因此它不会滑动(没有什么算斜坡,只有完全水平的楼层才是楼层(,如果这是您想要的
当然还有动画。
如果要使用AnimationTree
,我建议将根设置为AnimationNodeStateMachine
。然后,从代码中,您可以获得状态机播放对象,如下所示:
var state_machine = $AnimationTree.get("parameters/playback")
你可以告诉它你希望它进入一个不同的状态,比如:
state_machine.travel("name_of_some_state")
你可以问它当前的状态是什么:
var state:String = state_machine.get_current_node()
例如,你可以有一个";空闲";状态机中的状态;攻击";状态机中的状态;空闲";至";"攻击";,以及从";攻击";至";"空闲";,但那一个被设置为转换";在末尾"<当然,你也可以有其他的状态>然后使用当前状态(来自get_current_node
(来计算玩家可以做什么。
使用AnimationPlayer
,您可以检查什么是current_animation
和is_playing
;您也可以连接"animation_finished"
信号。使用AnimatedSrite
可以检查当前的animation
是什么,是否为playing
;您也可以连接"animation_finished"
信号