【手把手带你Godot游戏开发】FlappyBird:5.2 无尽水管子滚滚来(二)

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

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

自动销毁

【手把手带你Godot游戏开发】FlappyBird:5.2 无尽水管子滚滚来(二)_第1张图片

#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"的脚本
【手把手带你Godot游戏开发】FlappyBird:5.2 无尽水管子滚滚来(二)_第2张图片
【手把手带你Godot游戏开发】FlappyBird:5.2 无尽水管子滚滚来(二)_第3张图片

#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"脚本中
【手把手带你Godot游戏开发】FlappyBird:5.2 无尽水管子滚滚来(二)_第4张图片

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

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

【手把手带你Godot游戏开发】FlappyBird:5.2 无尽水管子滚滚来(二)_第5张图片

测试一下,得分和死亡事件都可以顺利触发了
【手把手带你Godot游戏开发】FlappyBird:5.2 无尽水管子滚滚来(二)_第6张图片

你可能感兴趣的:(Godot笔记,老王的游戏开发教程,godot,游戏开发)