NumberPadのスクリプトを書く
全てのボタンは別のものとして扱う
Displayは、数字ボタンを押すとupdateする
入力値の取り扱いは、Arrayで行う
GDScriptのArrayは可変長(どっちかというとList)
array.size()で、入力された数を取得
決めておいた桁数に過不足ないかチェック
DisplayLabelを取得
Label -> Display にリネーム
Inspector > Control > SizeFlag > Expand にチェック
スクリプトのグローバル変数に登録しておく
code: numberpad.py
extends Popup
var guess: PoolIntArray = []
onready var display = $VBoxContainer/DisplayContainer/Display
onready var status_light = $VBoxContainer/ButtonContainer/GridContainer/StatusLight
独自シグナル
signal combination_correct を定義しておき、Popup -> LoockedDoorに接続
Popup側でcombination_correctをemit()したら、LoockedDoorが開く
code: LoockedDoor.py
# 独自signal : NumberPadに入力したパスコードが正解だったら開く
func _on_NumberPad_combination_correct():
open()
Buttonsの接続
下のようなコードはまっことに無駄(同じような記述の繰り返し)
code: py
func _on_Button1_button_down():
func _on_Button2_button_down():
func _on_Button3_button_down():
...
$VBoxContainer/ButtonContainer/GridContainer.get_children() で、GridContainer以下のNodeを全て
取得できる。
そこに、.connect("signal", obj, "obj_method_name", args) を使って
スクリプトによる signal -> method 接続を行う
for文で button.connect( )
Nodeが持っているsignalに関数を登録できる。
code: connect.py
func _ready():
connect_buttons()
func connect_buttons():
for child in $VBoxContainer/ButtonContainer/GridContainer.get_children():
if child is Button:
child.connect("pressed", self, "Button_pressed", child.text)
func Button_pressed(text):
pass
for文で配列を回しつつやるので、繰り返しが少ない(DRY)
パスコードの管理
int型Array で管理する。
PoolIntArray を使うと、intしか入れられなくなるので便利
ただし、表示するときにPoolStringArray を使って文字列に変換したいが
コンストラクタにArrayしか取れないので、
PoolIntArray -> Array(PoolIntArray) -> PoolStringArray(Array)
のように段階を踏んで変換する
PoolStringArray
文字列の配列(not charArray)
.join()メソッドで全部結合できたり、便利。
code: update_display.py
func update_display():
display.text = PoolStringArray(Array(guess)).join("")
if guess.size() == combination.size():
check_guess()
入力音/正解音を鳴らす
code: streampalyer.py
func check_guess():
if guess == combination:
$AudioStreamPlayer.stream = load("res://Heist-Meisters-Assets/SFX/threeTone1.ogg")
$AudioStreamPlayer.play()
emit_signal("combination_correct")
reset_lock()
hide()
else:
reset_lock()
func enter(num):
$AudioStreamPlayer.stream = load("res://Heist-Meisters-Assets/SFX/twoTone1.ogg")
$AudioStreamPlayer.play()
guess.append(num)
update_display()
Status Light を、正解時に緑色にする
Timerを使う
AnimationPlayerを使う
今回は後者でやってみた
Node2D.modulate のアニメーション
白いLight Textureを使うのが理想的
Orange -> Black -> Greeen
finished signal か、 Callback Trackで終わり際に
NumberPadを初期化・隠す処理を入れる
https://gyazo.com/1dc2dbd63197dc7e71a9bc7fdbf0aa44
まとめ
番号ボタンのリストを、for ... in Parent.get_children() と button.connect(signal)で一気に関数を登録
DRY
パスコード管理
Array
PoolIntArray
PoolStringArray
相互変換(コンストラクタで)
AudioStreamPlayer
AnimationPlayerで演出&後処理callback実行
Timerでもできる