[手把手帶你Godot遊戲開發]FlappyBird:9.1 天下沒有不OVER的GAME(上)

本章節效果圖

在這裏插入圖片描述

小鳥撞上水管標誌着一局遊戲的結束,我們會用兩個章節爲它做一些收尾工作:

1.小鳥“失控”墜落

失控指的是發生碰撞以後,小鳥將無法再次受用戶控制飛起來

# Bird.gd
extends RigidBody2D

func _ready():
	connect("body_entered",self,"on_body_entered")

func _physics_process(delta):
	if Input.is_mouse_button_pressed(1):
		AudioManager.play("sfx_swooshing")
		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:#碰撞以後
		call_deferred("set_physics_process",false)#停用_physics_process(delta)
		call_deferred("set_contact_monitor",false)#關閉碰撞檢測
		AudioManager.play("sfx_hit")#播放碰撞音效
		$AnimationPlayer.play("die")#動畫切換到死亡狀態
		GameData.update_record()#更新最好成績記錄
		get_tree().call_group("GAME_STATE","on_game_over")#調用GAME_STATE的on_game_over方法

2.停止製造新的水管

#PipeManager.gd
extends Timer

var pipe_scn = preload("res://Objects/Pipe.tscn")

func _ready():
	add_to_group("GAME_STATE")#加入GAME_STATE組
	connect("timeout",self,"on_timeout")
	
func on_timeout():
	var pipe = pipe_scn.instance()
	add_child(pipe)

func on_game_over():
	paused = true#停止計時

3.現存水管停止運動

#Pipe.gd
extends Node2D

func _ready():
	add_to_group("GAME_STATE") #加入GAME_STATE組
	position.y += randf()*300-150

func _process(delta):
	position += Vector2.LEFT*200.0*delta
	if position.x < 0:
		queue_free()

func on_game_over():
	set_process(false) #停用_process(delta)

4.得分區域停止觸發

這個部分主要是防止某些時候,小鳥已經死亡,但是依然滾出得分區,從而觸發得分。當然如果你設定的遊戲規則允許這種情況發生,那麼這一步可以不處理

#ScoreArea.gd

extends Area2D

func _ready():
	add_to_group("GAME_STATE")
	connect("body_exited",self,"_on_body_exited")
func _on_body_exited(_body):
	if _body.name == "Bird":
		AudioManager.play("sfx_point")
		GameData.score += 1
		#加分以後通過SceenTree把新的分數更新給所有想接受這個消息的節點
		get_tree().call_group("SCORE","on_score_updated",GameData.score)

func on_game_over():
	call_deferred("set_monitoring",false)#得分區域停止觸發

5.地面停止滾動

還記得嗎?地面無限滾動我們使用了3種方法實現,本節採用的是“文藝青年版”。如果你使用的是其它版本,就把本部分作爲一個思考問題吧!

在這裏插入圖片描述

#Floor.gd
extends Sprite

func _ready():
	add_to_group("GAME_STATE")

func on_game_over():
	material.set_shader_param("speed",0)

6. 遊戲結束的UI彈出

本部分內容較多,將在下節繼續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章