リストアイテムのスクリプトの作成
ListItemシーンのスクリプトの作成
まずlist_item.tscnを開いて、ルートの「ListItem」ノードにスクリプトをアタッチします。
「ListItem」ノードを右クリックして「スクリプトをアタッチ」を選択します。「ノードにスクリプトをアタッチする」ダイアログが表示されますので「テンプレート」にチェックを入れて、そのまま「作成」ボタンを押します。
res://scn/list_dialog/list_item.gdと保存されたはずです。
続いて、「ListItem」(Button)ノードを選択した状態で、右側のサイドバーの「ノード」ドック>「シグナル」タブを選択します。
「BaseButton」>「pressed()」を右クリックして「接続」を選択します。「メソッドにシグナルを接続」ダイアログが表示されますので、ノードツリーから「ListItem」を選択して、「受信側メソッド」が「_on_pressed」の状態で「接続」ボタンを押します。
list_item.gdをScriptビューで開き、次のように書き換えます。
extends Button signal item_pressed(id: int) var m_id: int func set_info(id: int) -> void: m_id = id func _on_pressed() -> void: item_pressed.emit(m_id)
_on_pressed関数は、先ほど接続したボタンを押した時に呼び出される関数です。
ここではitem_pressedというシグナルと、m_idという変数を使って、リストアイテムに必要な処理を実装します。
item_pressedシグナルは、item_pressed(id: int)という形で宣言しています。このシグナルはitem_pressed.emit(int)の形で実行することで、数値を送ることができます。
変数m_idは「メンバー変数のID」の略です。リストアイテムは初期化する時に、set_info関数などの手段で各要素にIDを設定します。ボタンが押されて_on_pressed関数が呼び出されると、このm_idの値を返します。
ListItem2Rowシーンのスクリプトの作成
続いて「ListItem」シーンを継承した「ListItem2Row」シーンのスクリプトの作成です。
まずlist_item_2_row.tscnを開いて、ルートの「ListItem2Row」ノードにスクリプトをアタッチします。
「ListItem2Row」ノードを右クリックして「スクリプトをアタッチ」を選択します。「ノードにスクリプトをアタッチする」ダイアログが表示されますので「テンプレート」にチェックを入れて、そのまま「作成」ボタンを押します。
res://scn/list_dialog/list_item_2_row.gdと保存されたはずです。
list_item_2_row.gdをScriptビューで開くと、先頭の行が次のような形になっているはずです。
extends "res://scn/list_dialog/list_item.gd"
上手く継承できない場合は、次の点を見直してください。「ノードにスクリプトをアタッチする」ダイアログで、「継承元」が「Button」になっている場合は、「継承元」の右端にある「フォルダーアイコン」をクリックして「list_item.gd」を選択してから作成します。そうすれば上手くいきます。
これまでは既存のノードを継承していましたが、今回はlist_item.gdを継承しています。この行は、次のように書き換えることもできます。あとでフォルダー構造を変更する可能性を考えると、こちらの方が便利だと思います。
extends "./list_item.gd"
それではlist_item_2_row.gdを、次のように書き換えます。
extends "./list_item.gd" func set_info_ex(id: int, title: String, desc: String) -> void: set_info(id) %Title.text = title %Desc.text = desc
「ID」と「タイトル」と「説明」を登録するset_info_ex関数を定義しています。
「ID」の登録はlist_item.gdで定義したset_info関数を利用します。
「Title」ノードと「Desc」ノードには「固有名アクセス」を設定しているので%Title、%Descの形式でアクセスできます。これらの記法を使い、それぞれのtitleに、引数のテキストを設定します。
