Group通信
Group
Signalは、事前に決まった相手同士でメッセージを送る。
送信者(Node) -> 受信者(Scriptに接続された関数)
という構図であり、携帯電話やトランシーバーに例えられる
https://gyazo.com/ffad2d9b6fb0e6bb24e491e58eb801c0
Groupは、そのシグナルに関心があるもの全てに通信を送る。
電波塔、通信衛星のようなイメージ
Signal : predetermind, known only
Group : broadcast, anyone
似たような概念なので、同じタブの下から選べる
GameState Group
Nodeタブ > Group > Add
Levelを、"GameState"というグループに登録する。
もしくは、_ready()関数で、add_to_group(str)で呼び出す。
lives と hurt( ) をGameState.gdに押し上げる
Playerのライフというのは、ゲームロジックの一つ
物理エンジン、レンダリング、音声再生とは何ら関係ない
基本的に、絵や音はそれぞれのNodeで、
点数計算やライフなどのゲームロジックは、GameStateで管理したほうがいい
code: Hazards.py
extends Area2D
func _on_Spike_Top_body_entered(body):
get_tree().call_group("GameState", "hurt")
end_game( )もGameStateに押し上げる
最終的なGameState.gdはこちら
code: GameState.py
extends Node2D
export var lives = 3
func hurt():
$Player.hurt()
lives -= 1
if lives <= 0:
end_game()
func end_game():
get_tree().change_scene("res://Levels/EndGame.tscn")
PlayerのPositionがWORLD_LIMIT以下かどうかはPlayer側で判断する。
code: Player.py
func apply_gravity():
if position.y > WORLD_LIMIT:
get_tree().call_group("GameState", "end_game")
get_tree( ).call_group( )とあるように、
call_group( ) は SceneTreeのメソッド。
シーンを構成するNodeすべてを走査し、
指定されたGroup名に所属するNodeが、指定したメソッドを持っていたら実行する。
いわゆる、RPC てきな発想(戻り値はない)