基础函数
ready process physics_process的区别
我们可以做一个测试
1
2
3
4
5
6
7
8
9
10
|
func _ready():
print("ready!!!!")
func _process(delta):
print("process")
func _physics_process(delta):
print("physics process")
|
发现打印结果如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
ready!!!!
physics process
physics process
physics process
physics process
physics process
physics process
physics process
physics process
process
physics process
physics process
physics process
physics process
physics process
physics process
physics process
physics process
process
physics process
process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
|
ready
很好解释,就是在场景加载准备就绪以后调用一次
process
和physics_process
都是在一定间隔时间循环调用,至于两者的区别,我的理解是:physics_process是物理性的,就是和真实世界同步的,比如说你需要执行的方式和真实世界的时钟一致(好比1秒钟1次),所以delta
是常量就是帧率(1/每秒多少帧),而process则是很帧几乎同步, 而帧在运行的过程中不可能完全和物理同步,因为内存和渲染数量以及其他种种原因,都有可能让帧是不稳定,delta
不是常,而是处理每一帧的所需时间,所以如果想让物体运行和真实世界一致,用physics_process
获取输入
控制器
按键
1
|
Input.is_action_pressed("ui_right")
|
按键强度, 最大为1
1
|
Input.get_action_strength("ui_right")
|
根据按键强度得到某个轴的强度,最大为1
1
2
|
input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
input_vector.y = Input.get_action_strength("ui_up") - Input.get_action_strength("ui_down")
|
移动
move_and_collide
移动并自动处理碰撞
1
|
move_and_collide(velocity)
|
move_and_slide
移动并自动处理边缘滑动, 在做动作游戏的时候可以在不同的地形,比如水里, 草里,等等用不同的摩擦系数,注意这个函数的速度是 像素/秒, 所以使用此函数的时候不用再乘以delta了
Vecltor的nomalize函数
简单的解释是:为了保证在非单个轴的移动的情况下的速度限定在1范围以内,否则,对角线的长度是会大于单个轴的长度的.
移动速度和真实世界一致
为了排除帧率给移动带来的实际影响,结合physics_process的delta,可以将速度保持和真实世界一致
delta在60帧相当于1/60
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
func _physics_process(delta):
# Input.is_action_pressed("ui_right")
var input_vector = Vector2.ZERO
input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
input_vector.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
input_vector = input_vector.normalized()
if input_vector != Vector2.ZERO:
velocity = input_vector
else:
velocity = Vector2.ZERO
move_and_collide(velocity * delta * 100)
|