写文章时本人是在校大三学生,上周才接触到Godot,也才初学三四天,若是文章有问题的话还请大佬们不吝赐教 这是第一篇教程,面向和我同样的初学者,可能写的有点啰嗦,请勿喷,哈哈;其中,有个单词写错了,我是想写World的结果写成Word了,请原谅四级还没过的我,泪目!!!前半部分图片上的错字就不改了,你们知道就行,哈哈哈(不失礼貌的尬笑)html
若是你的菜单界面是英文,能够在新建项目的上方找到语言en改为zh_CN便可改为中文node
【编辑区的鼠标操做】:滚轮控制编辑区的放大缩小,鼠标中键按下并移动鼠标能够移动编辑区内容,鼠标左键选中编辑区节点python
Sprite表示精灵节点,能够为该节点添加一个图片Texture资源ruby
场景窗口中鼠标指向world,右键添加子节点,在节点选择框搜索Sprite,选择Sprite点击建立,就在world下面新建了一个子节点,重命名为bg 编辑器
编辑区那个红绿线交叉点为原点,第四象限的矩形框就是游戏窗口,在godot中,游戏窗口的原点(0,0)在左上角,往右为x轴正方向,往下为y轴正方向ide
由于主角须要和地面进行交互的,因此地面不能直接使用Sprite来作,咱们须要用到StaticBody2D节点,而后再给StaticBody2D添加Sprite子节点来显示图片函数
由于咱们设置的floor节点属于StaticBody2D,表示的是一个物理静态体,记住全部的物理静态体在godot里都要添加碰撞形状子节点布局
在前面咱们知道floor右边的警告三角形的信息须要添加一个形状体,形状体有两种CollisionShape2D和CollisionPolygon2D,即规则形状和多边形形状,学习
给floor添加CollisionShape2D子节点,而后选择CollisionShape2D的Shape属性,选择“新建RectangleShape2D”,放大编辑区咱们能够看到有一个浅蓝色的矩形块,这个矩形块就是碰撞区域 动画
作了这么久尚未保存过唉,记得及时保存哦,万一程序奔溃了呢,Ctrl+S保存,在弹出的窗口点击保存便可
而后咱们能够点击右上角运行按钮 ![]()
, 若是弹出一个请选择主场景点击选择便可,而后在新窗口选中咱们保存的World.tscn文件,点击打开,就能够看到弹出一个游戏窗口,就能看到咱们布置的场景啦,如图 ![]()
![]()
与第四步添加背景的流程是同样的,你们本身添加(tree.png树木, grass.png草丛),添加好以后的效果和场景节点顺序如图:
咱们的角色要会走,会跳,并且还会站到地面上,能够用KinematicBody2D节点来建立角色,而后添加子节点Sprite来给角色添加图片,因此基本操做跟制做floor相似
给world添加子节点KinematicBody2D并更名“player”,选中组合按钮防止子节点被选中,给player添加子节点Sprite(texture属性使用stand.png图片)和CollisionShape2D并设置碰撞区为图片大小,移动到游戏窗口中央,以下图所示:
godot使用内置的GDScript脚本,是一种相似python的语言,若是你不懂GDScript可是有其余高级面向对象语言(Java,python,JavaScript,ruby等)基础的话,能够参考官方文档GDScript入门 固然Godot还支持C#语言开发,你能够本身尝试学习
_ready()
函数是初始化函数,_process(delta)
函数是每一帧会运行一次,通俗的讲就是这个函数里的内容会隔一段时间就运行一次,delta
参数是相邻两次运行的间隔时间extends KinematicBody2D
# class member variables go here, for example:
# var a = 2
# var b = "textvar"
func _ready():
# Called when the node is added to the scene for the first time.
# Initialization here
pass
#func _process(delta):
# # Called every frame. Delta is time since last frame.
# # Update game logic here.
# pass
复制代码
脚本内容以下所示:
extends KinematicBody2D
var speed = 200 # 移动速度
var motion = Vector2() # 移动向量
func _process(delta): # 每帧执行一次
if Input.is_action_pressed("ui_right"): # 当按下右方向键时
motion.x = speed; # 移动向量设置x正方向的向量变化值
elif Input.is_action_pressed("ui_left"): # 当按下右方向键时
motion.x = -speed; # 移动向量设置x负方向的向量变化值
else: # 没有按键按下
motion.x = 0 # 设置x轴方向移动向量为0
move_and_slide(motion) # 按移动向量方向移动
复制代码
Vector2
是godot里面的一个数据类型,表示的是二维的向量,有x和y两个方向属性move_and_slide
方法是KinematicBody2D对象的一个移动控制方法,第一个参数是移动向量,第二个参数是地面初始化向量,具体参考:![]()
最后点击运行,按下键盘的左右方向键,有如下效果:
添加移动变量y方向加速度值,修改代码_process()
函数内以下:
func _process(delta): # 每帧执行一次
motion.y += 9.8 # 添加向下的加速度
if Input.is_action_pressed("ui_right"): # 当按下右方向键时
motion.x = speed; # 移动向量设置x正方向的向量变化值
elif Input.is_action_pressed("ui_left"): # 当按下右方向键时
motion.x = -speed; # 移动向量设置x负方向的向量变化值
else: # 没有按键按下
motion.x = 0 # 设置x轴方向移动向量为0
move_and_slide(motion) # 按移动向量方向移动
复制代码
运行后咱们会看到角色先掉到地板上,而后咱们能够控制角色左右移动
咱们发现如今的角色移动起来太搞笑了,不生动对吧,那咱们就让角色加点动画
由于咱们是直接更新类型了,因此AnimatedSprite子节点的名字仍是以前的Sprite,这里记得修改下sprite为AnimatedSprite
![]()
脚本更新以下
func _process(delta): # 每帧执行一次
motion.y += 9.8
if Input.is_action_pressed("ui_right"):
motion.x = speed;
$AnimatedSprite.play("run")
elif Input.is_action_pressed("ui_left"):
motion.x = -speed;
$AnimatedSprite.play("run")
else:
motion.x = 0
$AnimatedSprite.play("stand")
move_and_slide(motion)
复制代码
$childNodeName符号表示的是get_node(childNodeName),获取子节点的节点对象,这样就能够调用子节点的方法,如AnimatedSprite的play方法
咱们发现奇怪的一幕出现了,当角色往左行进的时候角色的朝向是右边,由于run帧动画的图片都是向右的!该如何解决这个问题呢?咱们能够设置AnimatedSprite的flip_h属性为true使其发生水平镜像改变
修改脚本以下:
func _process(delta): # 每帧执行一次
motion.y += 9.8
if Input.is_action_pressed("ui_right"):
motion.x = speed;
$AnimatedSprite.play("run")
$AnimatedSprite.flip_h = false
elif Input.is_action_pressed("ui_left"):
motion.x = -speed;
$AnimatedSprite.play("run")
$AnimatedSprite.flip_h = true
else:
motion.x = 0
$AnimatedSprite.play("stand")
move_and_slide(motion)
复制代码
主角如今能够正常的左右跑动了,如今咱们要让他跳起来;固然,主角必须在地面上才能够跳跃,因此不能只要按住上方向键就改变移动向量的y值。咱们须要先判断它是否在地板上,这个时候move_and_slide()
的第二个参数就能够用啦 设置向上初识向量为 const UP = Vector2(0,-1)
修改的代码以下:
extends KinematicBody2D
var speed = 200 # 移动速度
var motion = Vector2() # 移动向量
const UP = Vector2(0, -1)
const JUMP_HEIGHT = -380
func _process(delta): # 每帧执行一次
motion.y += 9.8
if Input.is_action_pressed("ui_right"):
motion.x = speed;
$AnimatedSprite.play("run")
$AnimatedSprite.flip_h = false
elif Input.is_action_pressed("ui_left"):
motion.x = -speed;
$AnimatedSprite.play("run")
$AnimatedSprite.flip_h = true
else:
motion.x = 0
$AnimatedSprite.play("stand")
if is_on_floor():
if Input.is_action_just_pressed("ui_up"):
motion.y = JUMP_HEIGHT
move_and_slide(motion, UP) # 修改了这里
复制代码
当整个demo运行比较久时,发现角色跳跃后降低的速度变快了!缘由就是咱们的motion.y加速度一直在增长,因此为了不这种状况,要把motion的值赋为当前motion值,修改最后一句代码就行
func _process(delta):
...
motion = move_and_slide(motion, UP)
复制代码
extends KinematicBody2D
var speed = 200 # 移动速度
var motion = Vector2() # 移动向量
const UP = Vector2(0, -1)
const JUMP_HEIGHT = -380
func _process(delta): # 每帧执行一次
motion.y += 9.8
if Input.is_action_pressed("ui_right"):
motion.x = speed;
$AnimatedSprite.play("run")
$AnimatedSprite.flip_h = false
elif Input.is_action_pressed("ui_left"):
motion.x = -speed;
$AnimatedSprite.play("run")
$AnimatedSprite.flip_h = true
else:
motion.x = 0
$AnimatedSprite.play("stand")
if is_on_floor():
if Input.is_action_just_pressed("ui_up"):
motion.y = JUMP_HEIGHT
motion = move_and_slide(motion,UP)
复制代码
你也能够给云朵添加动画,防止角色跳出屏幕等功能,如图
第一次以为写文档好累,不过感受还挺好,若是你喜欢就点个赞吧