1.创建Ball场景
创建一个新场景后再创造characterbody2D节点

命名Ball

再创建colorrect

命名为BallSprite

设置大小为12*12的方块,调整位置到正中央

再创建小球的碰撞体积

设置碰撞体积的大小和刚才的方块大小一样12*12

2.写球的脚本

bash
extends CharacterBody2D
# 球的速度
@export var ball_speed:float = 300
# 函数_ready(),每次游戏开始运行一次
func _ready() -> void:
reset_ball()
func _physics_process(delta: float) -> void:
# 函数move_and_collide用于检测这次移动是否有碰撞
# 若没有,则直接移动,并返回null
# 若有,则移动到碰撞的位置,并返回碰撞信息
var collision = move_and_collide(velocity * delta)
if collision:
# 函数get_normal用于返回碰撞面的法线向量
# bounce根据返回的法线向量求出,碰撞后的反射方向
velocity= velocity.bounce(collision.get_normal())
# 每次碰撞略微加速
velocity*=1.02
# 函数reset_ball确定每次游戏开始时球移动的方向和位置
func reset_ball():
# 球初始位置位于中央
position=Vector2(320,240)
var random_x
var random_y = randf_range(-0.5,0.5)
# 让球随机往左(-1)或往右(1)
if randi() % 2 == 0 :
random_x = 1
else :
random_x = -1
# normalized()是将(random_x,random_y)的向量值进行归一化,保证了初速度的稳定
var direction=Vector2(random_x,random_y).normalized()
velocity = direction * ball_speed
如果想深入了解一下bounce可以看一下下面的公式和图(第一次画,画的不是很好看凑合着看吧)
3.设置球的碰撞层
layer代表在第几层
mask表示可以和哪几层进行碰撞

4.创建上下墙壁
返回game场景,在game节点下创建staticbody2D

改名成topwall

创建碰撞体积

设置shape为worldboundaryshape2D
normal.x : 0
normal.y : 1
distance : 0

和上面同样的步骤做一个bottomwall
normal.x : 0
normal.y : -1
distance : -480

另一种方法:也可以分别放一上一下两个长方形,一样可以
5.结果

6.个人总结+一点碎碎念(纯新手)
已经学了godot几天了,大概摸清了一点窍门
1.大部分当我们需要创建一个角色时,我们要创建一个父节点characterbody2d,并且给他添加子节点colorrect(外形)和collisionshape2d(碰撞层)
2.我们写脚本时用到的velocity(速度)是我们移动一个物体时最重要的参数,move_and_collide()和move_and_slide()就是根据velocity的参数进行相应的移动。
我个人之前只学过c语言和python的一点皮毛,对游戏引擎一直是想要了解并且去实践,但碍于学业和各种事情到现在才有时间和精力去搞这些,实际体验下来也确实非常有意思,自己也开始对接下来要做的项目有点想法了
