Computerを作る
必要なもの
Sprite
Area2D(接触判定)
PopUp(コンピュータのモニタ)
Scene Tree
https://gyazo.com/dbf199206c232b219226a052ac56d903
NinePatchRect, TextureRect などをうまく使いつつ作る
2DNode
Sprite, Area2D などのPixel空間で動くもの。コンピューターの見た目&判定
CanvasLayer以下 : UIとして前面に表示されるもの
Themeを使い回す
NumPad scene で作った番号キーパッドのテーマを保存 > Computerの Theme に設定する。
https://gyazo.com/542f574cae317bfb2b8fba5f3566e0db
Themeを編集する
1. Add Class Item > Label
2. Label > Font Color > 黒にする
Computerの文字列LabelのMargin
上左 : 20px
下右 : 20px
Collision Layer/Mask
Computerは独自のLayerを作る
https://gyazo.com/922d6fa5aeeb63b047fbf4a07e181915
さらに、Player Layerとだけ衝突するようにMaskを設定する。
signal
body_entered()
body_exited()
input_event()
クリック、タッチ
code: Computer.py
extends Node2D
var can_click = false
func _on_Area2D_body_entered(body: PhysicsBody2D):
can_click = false
func _on_Area2D_body_exited(body):
can_click = true
func _on_Area2D_input_event(viewport, event, shape_idx):
if Input.is_mouse_button_pressed(BUTTON_LEFT) and can_click:
$CanvasLayer/ComputerPopup.popup_centered()
Player Layerとしか衝突しないので、相手の判別は不要
ComputerとLockedDoorを接続
Computerに表示されたパスコード
LockedDoorのパスコード
これらを同期する。
_onready() で、Computerのスクリプトで作成したPasscodeを
LockedDoorにsignalで送る。
これで両方同じように初期化できる。
code: computer.py
export var combination_length = 4
var combination
signal combination_gen
func _ready():
$Light2D.enabled = false
combination = CombinationGenerator.generate_combination(combination_length)
set_popup_text("Password: " + PoolStringArray(combination).join(""))
emit_signal("combination_gen", combination)
code: LockedDoor.py
func _on_Computer_combination_gen(numbers):
$CanvasLayer/NumberPad.set_combination(numbers)
他のLockedDoorとComputer の対を作る
signalは、Nodeのinstance - instance 同士の通信
複製しても、接続を切って別のNodeの関数に接続しなおせば
個別のつながりができる。
https://gyazo.com/8fd8be597526b737b0b6bb6a4e70d0d3
接続のやり方
1. signalを選択
2. 編集 or 切断->接続
3. 接続したいインスタンスを選択
4. メソッドは、そのままだと複製された_on_インスタンス名2_signalになってるので、2を消す
https://gyazo.com/6d8e776a1da29afb37d97b0c9321563b
一度ロックを解除したら、以降は入力なしにする
code: LockedDoor.py
var is_locked = true
func _on_Door_input_event(viewport, event, shape_idx):
if Input.is_mouse_button_pressed(BUTTON_LEFT) and can_click:
if not is_locked:
open()
else:
$CanvasLayer/NumberPad.popup_centered()
# 独自signal : NumberPadに入力したパスコードが正解だったら開く
func _on_NumberPad_combination_correct():
is_locked = false
open()
あと、すでにDoorがOpenアニメーションを実行していて更にクリックすると、
アニメーションが最初からになってしまうので、
is_playng() がtrueのときは再生しない
code: Door.py
func open():
if not $AnimationPlayer.is_playing():
$AnimationPlayer.play("Open")