在开始本部分之前,建议大家再重温一下原版游戏。在这个章节我们将实现以下功能
- 自动销毁
我们想办法把已经滚出屏幕的水管子自动销毁,它们对游戏已经没有意义了- 随机
滚滚而来的水管子,应该是上下参差不齐的- 检测加分事件
小鸟每通过一对水管子,要加一分,这是游戏规则的核心之一,虽然积分系统还没有实现,但是我们先要检测到这个事件- 检测死亡事件
小鸟撞到水管,地面,“天花板”,都要触发死亡事件
自动销毁
#Pipe.gd
extends Node2D
func _process(delta):
position += Vector2.LEFT*200.0*delta
if position.x < 0:
queue_free()
随机Y轴位置
同样是在Pipe.gd中实现随机Y轴位置的功能
#Pipe.gd
extends Node2D
func _ready():
position.y += randf()*300-150 #Y轴随机偏移量的范围(-150,150)
func _process(delta):
position += Vector2.LEFT*200.0*delta
if position.x < 0:
queue_free()
触发得分
打开Pipe场景(“Pipe.tscn”),为其中的"Area2D_ScoreArea"节点添加一个名为"ScoreArea.gd"的脚本
#ScoreArea.gd
extends Area2D
func _ready():
connect("body_exited",self,"_on_body_exited")
func _on_body_exited(_body):
if _body.name == "Bird":#先通过body的名字判断一下所撞之物是否为"Bird"
print("得分!!!!")
触发死亡
在"Bird.gd"脚本中
# Bird.gd
extends RigidBody2D
func _ready():
connect("body_entered",self,"on_body_entered")
func _physics_process(delta):
if Input.is_mouse_button_pressed(1):
linear_velocity = Vector2.UP*500
angular_velocity = -3.0
if rotation_degrees < -30:
rotation_degrees = -30
angular_velocity = 0
if linear_velocity.y > 0.0:
angular_velocity = 1.5
func on_body_entered(_body):
if _body is StaticBody2D:#先通过body的类型判断一下所撞之物是否为一个"StaticBody2D"
print("Die.....")
忘了安装“物理地板”和“天花板”了,补之!
测试一下,得分和死亡事件都可以顺利触发了