Day1:创建项目+背景+玩家可移动拍子
引擎:Godot Engine - 免费开源的 2D 与 3D 游戏引擎
1.新建项目pong
2.创建背景
将节点名设置为game
打开项目,先设置背景颜色
渲染 - 环境 - 设置默认背景颜色(#1a1a)
再调整页面大小
宽: 640 高: 480
拉伸 - 模式: canvas_items(按窗口比例缩放)
比例: keep(保持比例,多余区域保持黑边)
3.创建玩家拍子
新建个场景
创建CharacterBody2D
改名成player
再创建CollisionShape2D,ColorRect
设置ColorRect的颜色和形状大小
再设置CollisionShape2D(个人理解:就是碰撞体积,我们只要将它设置的和我们显示的球拍一样大就行)
shape:从 空 调整到Rectangle
size和上面的ColorRect大小一样 15 ,80
此时我们的碰撞体积和颜色区块没有吻合在一起,我们调整一下ColorRect的位置x: -7.5 y: -40
(因为颜色区块的轴心点默认是在左上角,而碰撞体积是在正中央,所以为了将我们15*80的图形移到中央,我们需要它在原来位置的基础上往左上角走size的x和y的一半,也就是往x和y的负半轴移动-7.5和-40)
4.编写移动的脚本
选中player创建脚本
extends CharacterBody2D
@export var paddle_speed:float=400
func _physics_process(delta: float) -> void:
var input_dir=Input.get_axis("ui_up","ui_down")
velocity.x=0
velocity.y=paddle_speed*input_dir
move_and_slide()
position.y=clamp(position.y,40,440)
pass
在变量前加入@export可以让变量出现在检查器中,方便后续调整
var input_dir=Input.get_axis("ui_up","ui_down")
ui_up为-1
ui_down为1
什么都不按为0
velocity.x=0
velocity.y=paddle_speed*input_dir
velocity存储的是速度,不是位置;
move_and_slide()里的内容其实是这样的(实际上就是速度×时间=移动距离)
position.y += velocity.y * delta # delta ≈ 0.016秒(60帧)
clamp这个函数当position.y小于40时返回40,大于440返回440
position.y=clamp(position.y,40,440)
最后回到game场景,将我们做好的player场景直接拖拽放到game下
最后调整球拍位置到左中间(80,240)
5.结果
点击F5测试当前页面如果能正常上下移动,并且没有超出显示范围,就成功了
6.个人错误总结:
第三步创建玩家拍子时,不要新建场景后再创建CharacterBody2D
因为我们在脚本里使用的clamp函数限制拍子高低,是通过父节点来确定这个高度范围也就是说此时的高低由node2D位置决定
可能会出现以下这种情况,上不去
主要原因就是我们多套了一层node,并且在设置位置时其实是对上面的node2D的位置进行处理,导致拍子因为clamp限制一直处于最上面的状态,只能下去。
纯新人,欢迎各位大佬评论区指点一二