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

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

    1900发表于 2020-12-28 22:18:27
    love 0

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

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

    image-20201228213843227

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

    青蛙

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

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

    但是因为我对process、physics_process、direction、velocity这些东西没有真正理解而毫无头绪。

    其实两个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



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