Godot游戏引擎学习 课外学习:新场景 1

Godot游戏引擎学习 课外学习:新场景 1

2020-12-28

第九课的时候说了,UP这周没更新视频,所以也没什么可以再看的,索性准备利用这段时间自己把之前所学巩固一下,自己动脑动手搭建一个新关卡,增加一些新的怪物和机关之类的。

昨天整理了一下新关卡要增加的一些要素:

image-20201228213843227

今天自己动手做起来才发现自己之前学的过程中很多东西没吃透,一个很小的问题就会卡我很久,可是被好好打击了一下,昨天一直研究到今天,好在自己重新翻看之前的代码,反复翻看文档,实时打印数据,终于得以解决。

青蛙

今天完成的是新怪物青蛙 Frog。

其实Frog和Slime的区别只有一个:一个会跳一个不会跳而已。

但是因为我对processphysics_processdirectionvelocity这些东西没有真正理解而毫无头绪。

其实两个process都只是负责更新画面而已,数据没发生变动他们便按照原来的数据更新画面,数据发生了变动,这两个主更新程序便会按新的数据来更新画面。

然后你只需要在你想要更新画面的函数里,比如:输入,定时器,怪物死亡时等等逻辑函数里更新画面的数据,如:位置,状态,动画等等。因为数据发生了变化,所以主更新函数便会按新的数据绘制画面。

新建一个继承场景,添加新的精灵和一个计时器:

image-20201228220744188

编写代码:

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

完成后还是很开心的,这些代码算是我自己真正理解后写下来的第一段代码,实现的第一个功能。算是我游戏开发正真意义上迈出的第一个小步。

加油。

最终效果

学习巩固_frog

加入评论