返回介绍

FlappyBird:5.2 无尽水管子滚滚来(二)

发布于 2025-04-26 18:34:23 字数 2741 浏览 0 评论 0 收藏

在开始本部分之前,建议大家再重温一下原版游戏。在这个章节我们将实现以下功能

  • 自动销毁
    我们想办法把已经滚出屏幕的水管子自动销毁,它们对游戏已经没有意义了
  • 随机
    滚滚而来的水管子,应该是上下参差不齐的
  • 检测加分事件
    小鸟每通过一对水管子,要加一分,这是游戏规则的核心之一,虽然积分系统还没有实现,但是我们先要检测到这个事件
  • 检测死亡事件
    小鸟撞到水管,地面,“天花板”,都要触发死亡事件

自动销毁

#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.....")

忘了安装“物理地板”和“天花板”了,补之!

测试一下,得分和死亡事件都可以顺利触发了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。