pong_day01

0 阅读3分钟

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限制一直处于最上面的状态,只能下去。

纯新人,欢迎各位大佬评论区指点一二