上一篇做了一个会移动的小人。
简单回顾一下。我们要创设一个玩家角色,新建Area2D,这个包含两个子节点,一是AnimatedSprite,也就角色的动画图片,二是 CollisionShape2D,也就是角色的范围大小,用于判断是否遭受到攻击。我想,以后在设计得时候,是否可以用这个节点制作范围伤害,如暴风雪?或者制作敌人的警戒圈?现在还不知道……
继续后面的教程。
先来看写的代码
extends Area2D #拓展Area2D功能
export (int) var speed # 输出角色移动速度变量 (pixels/sec).
var screensize # 变量游戏窗口尺寸.
func _ready():
screensize = get_viewport_rect().size
#_ready() 当一个节点进入场景时调用,是我们获取屏幕尺寸的好时机。
func _process(delta):
var velocity = Vector2() #定义角色移动速度的二维向量。
# 我们用_process()函数来定义角色动作。
#_process函数每帧都调用,所以我们用来更新一些经常改变的元素。
#现在,我们要用它实现:
#一检查输入,二向给定方向移动,三角色有适当的动画。
#首先我们来检查四个默认的方向键有没有按下
if Input.is_action_pressed("ui_right"):
velocity.x += 1
if Input.is_action_pressed("ui_left"):
velocity.x -= 1
if Input.is_action_pressed("ui_down"):
velocity.y += 1
if Input.is_action_pressed("ui_up"):
velocity.y -= 1
#上面可以看到,input这个函数的一个功能用法
if velocity.length() > 0:
velocity = velocity.normalized() * speed
#速度
$AnimatedSprite.play()#顺带检查角色是否移动,移动
else:
$AnimatedSprite.stop()
#$ 是get_node()的简写,所有在这里,用$AnimatedSprite.play() 和get_node("AnimatedSprite").play()一样
position += velocity * delta
position.x = clamp(position.x, 0, screensize.x)
position.y = clamp(position.y, 0, screensize.y)
未完待续