Godot 游戏引擎学习 第一课

Godot 游戏引擎学习 第一课

December 19, 2020
设计 ,

因为最近在 B 站都喜欢看一些独立游戏开发的视频,导致大数据知道我的喜好一直给我推相关视频,经常能刷到一些游戏开发者的开发录像和直播。那段时间经常看 Carotaa666 的直播,那几天几乎每天晚上都会上去看下他的进度。当时还问过他那个是什么引擎,因为直播间人少他每次也都和我做了互动。

看了一段时间后知道他用的 Game Maker stuido2 做的开发,以前也了解过这家公司的 RPG Maker,是一家公司的产品,不过 GMS2 定制性更强,能做出什么游戏完全看程序员水平,不过只能开发 2D 游戏。但是这个引擎是收费的,不过也不贵,300 块左右就能在 steam 上买到了。当时也看过一些这个引擎的学习资料,当时给我的感觉是没有以前开发 C# 的时候那种可拖放式的组件,很多功能都能要自己实现(纯个人感受吧)。

恰好家里的显示器前段时间拿去公司当监控显示器用了,想等着双十二买个新显示器后再开始学。在这个期间又看到了另外一个游戏引擎 Godot,一款开源的 2d、3d 游戏引擎,也看过很多程序员的评测视频,感觉还不错,他们的目标是要成为和 unity 那样的游戏引擎,而且 B 站的教学视频也还不错,而且因为是开源的,所以也没有任何费用,游戏的盈利也完全可以归自己所有。

前几天显示器也到了,该做的准备工作也做好了,所以今天就开始学习第一章吧。


选了很多教程,最后选了 B 站 timothyqiu 前辈的一个平台游戏制作视频为入门,

本文及后续系列文章只是我学习中个人理解的记录,并不能作为学习参考,我也是个小菜鸡。如果有路过本博客的前辈发现有不对的地方希望指正。

Godot 使用的是类似 Python 的一种语言,且思路类似以前自己学的 C# 那种面向对象开发的思维,整体难度不算太高,以前自己学过 C#,还算比较好上手。

游戏引擎: https://godotengine.org

图片素材: https://www.kenney.nl/assets/simplified-platformer-pack

这次学习所踩的坑:

  1. 导入素材时需要注意,默认的情况下 Godot 会开启 Filter 滤镜优化图片,因为这个游戏是像素风格,所以开启 Filter 后像素点会模糊,所以需要关闭,并且将导入预设改为 2D 模式,并设置为默认状态 (之前导入的时候没注意这个,每次导入都不对)
  2. Titlemap 可以在一整块集合素材上选取特定区域的图片大小作为贴图。选好一块要点击新建图块按钮才可以重新新建图块,设置碰撞区域同理
  3. Godot 以场景(Scene)归纳对象,不同 Scene 可以相互引用实力化。
  4. Titlemap 的砖块大小是根据素材尺寸来的,素材越大,尺寸越大(应该是可以压缩的,目前没找到资料)(2020 年 12 月 20 日:使用 `scale` 可以按比例压缩素材大小)

一章代码部分:

extends KinematicBody2D

# 设置人物重力
const gravity = 2000 
# 设置人物移动速度
const speed = 350
# 设置人物跳跃高度
const jump_force = 800

# 速度
var velocity = Vector2.ZERO
# 是否处于跳跃状态
var is_jumping = false

onready var animation_palyer = $AnimationPlayer
onready var sprite = $Sprite

# 物理帧处理,delta参数忘记是啥意思了,好像是同步画面的。
func _physics_process(delta):
	# move_and_slide为父类函数,用于sprite移动,第二个参数指定天花板是那个方向
	velocity = move_and_slide(velocity, Vector2.UP)
	# is_on_floor父类函数,如果主体在地板上,则返回true。仅在调用move_and_slide()时更新。
	if is_on_floor():
		# 如果人物在地板上则允许进行跳操作
		is_jumping = false

# 检测玩家输入(这个函数只在玩家有按下按键时才进行调用)
func _input(event):
	# 如果玩家按下了跳按钮,并且处于可跳状态则让精灵腾空
	if event.is_action_pressed("move_jump") and not is_jumping:
		velocity.y = -jump_force
		# 设置跳跃状态,避免可以进行连跳操作
		is_jumping = true

# 每一帧都会执行这个函数
func _process(delta):
	# 检测用户按钮,get_action_strength返回按下状态,按下为1,没按则0,如果按下right则返回复数,按下left返回正数
	var direction = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
	# 利用获取到的方向值进行人物左右移动。
	# 移动
	velocity.x = direction * speed
	# 跳跃
	velocity.y += gravity * delta
	
	# 控制sprite动画
	# 如果处于可跳跃状态,则播放跳跃动画
	if is_jumping:
		animation_palyer.play("jump")
	# 空闲状态播放空闲动画
	elif direction == 0:
		animation_palyer.play("idle")
	# 移动状态则播放移动动画
	else:
		animation_palyer.play("walk")
		sprite.flip_h = direction < 0
	

最终效果

游戏视窗的问题还要去看下设置(已解决,之前用的图块素材太大,导致画到画面上太大,换成小图就和教程一样了)

加入评论