Godot学习笔记(5)—— 简单2D项目(1)

0. 项目准备

  0.1 下载项目资源文件

dodge_assets.zip (godotengine.org)

  0.2 调整项目分辨率

  菜单——项目——项目设置——Width:480——Height:720——Mode:2D——Aspect:Keep

  这将把项目屏幕设置为竖屏,并在画面缩放时保持比例。

  0.3 组织项目

  规划文件夹。项目资源文件中自带了art和fonts文件夹。为了存放节点和脚本,还可以再建立scene和script文件夹。也可以按场景规划文件夹。

  0.4 命名规则

  类名、节点名使用大驼峰(XxxXxx)

  变量和函数使用蛇形命名(xxx_xxx)

  常量使用全大写(XXX)

1. 创建玩家场景(Scenes)

  1.1 选择根节点。

  场景根节点的选择通常与对象的功能向匹配。

  此项目使用Area2D节点,以处理碰撞与重叠。

  选中根节点并重命名为Player,使用工具栏上的按钮,使子节点不可被选中,以在功能完成前保护子节点。

  1.2 为精灵(Sprite)添加动画

  点击Player节点,添加AnimatedSprite节点。

  检查器标签页中,在Frames里选择新建SpriteFrames。然后再次点击选择项,打开“动画帧”面板。

  将默认动画重命名为walk,然后新建动画帧,命名为up。

  在之前导入的资源文件中查找playerGrey_walk1和2图片文件,拖放到walk动画帧中。

  在之前导入的资源文件中查找playerGrey_up1和2图片文件,拖放到up动画帧中。

  点选AnimatedSprite节点,在检查器中点击Node2D下的Transform项,修改Scale(缩放)的x和y都为0.5(一半长度宽度)

  1.3 添加碰撞检查

  点击Player节点,添加CollisionShape2D节点为子节点,调整大小覆盖整个精灵,这个节点将作为碰撞检测节点。

  保存。

2. 添加玩家脚本

  2.1 创建脚本

  选中Player场景,点击添加脚本。

  语言:GDScript

  继承:Area2D(默认)

  模板:默认

  路径:~/script/Player.gd

  2.2 声明成员变量

extends Area2D

export var speed = 400 # How fast the player will move (pixels/sec).
var screen_size # Size of the game window.

  关键字export让变量可以在检查器中查看并修改,不必每次都在脚本中查看。

  2.3 _ready()函数

  _ready()函数会在每次节点进入场景的时候调用。

func _ready():
    screen_size = get_viewport_rect().size

  这个函数可以查看窗口的尺寸。

  2.4 _process()函数

  _process()函数每帧都会被调用,经常用来读取玩家输入。

  也可以处理其他经常变化的元素。

  2.5 按键绑定

  选择菜单项目——项目设置——键位映射。

  在顶端的动作对话框里输入move_right,敲回车完成添加。

  在页面底端找到move_right,点击右侧的加号,选择“按键”,按方向键“右”,按确定,完成按键绑定。

  每个按键只能绑定一个动作,但是每个动作可以绑定多个按键,比如将move_right同时绑定给右方向键、D字母键和手柄上的右方向键。

  2.6 检测按键

  使用布尔型函数“Input.is_action_pressed()”检测按键状态。

复制代码
func _process(delta):
    var velocity = Vector2.ZERO # The player's movement vector.
    if Input.is_action_pressed("move_right"):
        velocity.x += 1
    if Input.is_action_pressed("move_left"):
        velocity.x -= 1
    if Input.is_action_pressed("move_down"):
        velocity.y += 1
    if Input.is_action_pressed("move_up"):
        velocity.y -= 1

    if velocity.length() > 0:
        velocity = velocity.normalized() * speed
        $AnimatedSprite.play()
    else:
        $AnimatedSprite.stop()
复制代码

  同时按下两个垂直方向的按键会得到一个(1,1)的向量,此时斜向速度将大于1.

  normalized() 将向量归一化,保持斜向速度为1

  由于对向量的长度进行除法,不能对长度为 0 的向量进行归一化

  "$"是“get_node()”的缩写,返回当前节点的状态值。

  如果节点不存在于当前节点,将返回Null

  AnimatedSprite是Player的子节点,因此可以使用$AnimatedSprite

  2.7 更新玩家位置

position += velocity * delta
position.x = clamp(position.x, 0, screen_size.x)
position.y = clamp(position.y, 0, screen_size.y)

  clamp() 函数将数值限制在给定的两个参数之间,可以限制玩家的位置不会离开屏幕。

  2.8 播放精灵动画

  精灵的动画包含停止和移动两种,因此要对动画进行处理,根据移动的方向改变动画的方向。

  

if velocity.x != 0:
    $AnimatedSprite.animation = "walk"
    $AnimatedSprite.flip_v = false
    $AnimatedSprite.flip_h = velocity.x < 0
elif velocity.y != 0:
    $AnimatedSprite.animation = "up"
    $AnimatedSprite.flip_v = velocity.y > 0

  当 X 轴存在移动(向量不为0),则播放walk动画,纵向不翻转动画。

  当X轴向量小于 0 的时候,翻转动画的X轴。

  仅当Y轴存在移动的时候,播放up动画。

  当Y轴向量大于0(向下走)的时候,翻转动画Y轴。

  这里“x=y>0”的形式,是一种简化的布尔型运算,逻辑上等同于 if (y>0, x, 0)。要当心滥用导致的查错困难。

  2.9 碰撞检测

  教程里使用信号进行碰撞检测

signal hit

  首先声明一个名为 hit 的信号

  在节点面板中选择body_entered() 函数判断碰撞。

  点击“连接”,确定,这将生成一个接收信号的函数。

  将这个函数修改为

func _on_Player_body_entered(body):
    hide() # Player disappears after being hit.
    emit_signal("hit")
    $CollisionShape2D.set_deferred("disabled", true)

  hide() 函数在玩家被击中后将玩家隐藏,emit_signal() 函数发送一个“hit”信号,set_deferred() 函数将在玩家的碰撞处理结束后禁用玩家的受攻击判断,防止玩家被重复击中,多次触发 hit 信号。

  2.10 重制玩家位置和状态

func start(pos):
    position = pos
    show()
    $CollisionShape2D.disabled = false

  重制玩家位置、可见性和碰撞。

posted @   羅生門  阅读(649)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示