因为最近在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
这次学习所踩的坑:
- 导入素材时需要注意,默认的情况下Godot会开启Filter滤镜优化图片,因为这个游戏是像素风格,所以开启Filter后像素点会模糊,所以需要关闭,并且将导入预设改为2D模式,并设置为默认状态(之前导入的时候没注意这个,每次导入都不对)
- Titlemap可以在一整块集合素材上选取特定区域的图片大小作为贴图。选好一块要点击新建图块按钮才可以重新新建图块,设置碰撞区域同理
- Godot以场景(Scene)归纳对象,不同Scene可以相互引用实力化。
- 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
最终效果
游戏视窗的问题还要去看下设置(已解决,之前用的图块素材太大,导致画到画面上太大,换成小图就和教程一样了)