Godot游戏引擎学习 课外学习:新场景 1
2020-12-28
第九课的时候说了,UP这周没更新视频,所以也没什么可以再看的,索性准备利用这段时间自己把之前所学巩固一下,自己动脑动手搭建一个新关卡,增加一些新的怪物和机关之类的。
昨天整理了一下新关卡要增加的一些要素:
今天自己动手做起来才发现自己之前学的过程中很多东西没吃透,一个很小的问题就会卡我很久,可是被好好打击了一下,昨天一直研究到今天,好在自己重新翻看之前的代码,反复翻看文档,实时打印数据,终于得以解决。
青蛙
今天完成的是新怪物青蛙 Frog。
其实Frog和Slime的区别只有一个:一个会跳一个不会跳而已。
但是因为我对process
、physics_process
、direction
、velocity
这些东西没有真正理解而毫无头绪。
其实两个process都只是负责更新画面而已,数据没发生变动他们便按照原来的数据更新画面,数据发生了变动,这两个主更新程序便会按新的数据来更新画面。
然后你只需要在你想要更新画面的函数里,比如:输入,定时器,怪物死亡时等等逻辑函数里更新画面的数据,如:位置,状态,动画等等。因为数据发生了变化,所以主更新函数便会按新的数据绘制画面。
新建一个继承场景,添加新的精灵和一个计时器:
编写代码:
extends "res://src/enemies/Enemy.gd"
# 是不是跳跃状态
export var is_jump = true
# 跳跃高度
var jump_hight = -600
# 跳跃距离
var jump_distance = 300
func _physics_process(_delta):
velocity = move_and_slide(velocity, Vector2.UP)
# 每一个物理帧检查怪物是不是碰到墙了
var was_on_wall = is_on_wall()
# 青蛙是不是在地板上
var was_on_floor = is_on_floor()
# 如果落地了就不再移动了,并更改状态为未跳跃,等待下次跳跃
if was_on_floor:
is_jump = false
velocity.x = 0
# 如果碰到墙就转身
if is_on_wall():
direction *= -1
func _process(delta):
# 添加重力
velocity.y += gravity * delta
func _on_Timer_timeout():
# 每2秒跳跃一次
# 如果在非跳跃状态才给值
if (not is_jump):
# 这里有个概念,所有的图像更新有会在process和physics进行,
# 像怪物跳跃这种没有玩家控制的周期性操作可以在通过Timer实现
# 每一个计时器周期更新一次移动数据
velocity.y = jump_hight
# direction是物体的移动方向的向量值,之前一直没有真正搞明白
velocity.x = jump_distance * direction
# 播放跳跃动画
animation_player.play("jump")
# 如果不是在idle状态则可以进行转身
if velocity.x != 0:
# 进行转身
sprite.flip_h = velocity.x > 0
完成后还是很开心的,这些代码算是我自己真正理解后写下来的第一段代码,实现的第一个功能。算是我游戏开发正真意义上迈出的第一个小步。
加油。
加入评论