IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Godot游戏引擎学习 第一课

    1900发表于 2020-12-19 21:17:27
    love 0

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

    alt

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

    alt

    恰好家里的显示器前段时间拿去公司当监控显示器用了,想等着双十二买个新显示器后再开始学。在这个期间又看到了另外一个游戏引擎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` 可以按比例压缩素材大小)
    alt

    一章代码部分:

    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
    	
    

    最终效果

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

    alt


沪ICP备19023445号-2号
友情链接