実践5:デッキ・バッグの操作

デッキやバッグは他のオブジェクトに比べて実行できる処理が少し多い。
デッキはカード、バッグは他のオブジェクトの集合体であるからだ。
これらのオブジェクトをコンテナ(Container)と呼ばれている。
本ページではContainer特有の処理を解説する。

デッキ・バッグの基礎知識

コンテナを扱う上で注意が必要なことは、コンテナに収容されたオブジェクトはスクリプトからは見えなくなるということだ。
コンテナに収容された時点でゲーム上からは一度削除された扱いになる。
具体例を挙げよう。
実践4で緑のブロックに作成した赤いブロックを動かすスクリプト、これを赤いブロックをバッグに入れた状態で動かすとエラーになる。
これは、スクリプトが赤いブロックのGUIDを探せないために起こる。

コンテナからオブジェクトを取り出すと、取り出したオブジェクトは元々のGUIDを保持している。
そのため、取り出した後なら赤いブロックを動かすスクリプトが動作するはずだ。
これはGUIDを含めた全く同じオブジェクトがゲーム上に呼び出された、という動作となっている。

しかし、Globalの onLoad() に書いていた赤いブロックのボタン表示が消えている。
GUID含めて全く同じオブジェクトではあるが、ゲームロード時に存在したブロックとは異なるためだ。
この問題を解決するには、オブジェクト自身の onLoad() でボタンを表示することだ。
(バッグから取り出したタイミングで onLoad() が実行されるため)
その証拠に青や緑のブロックをバッグに入れてもボタンは消えないはずだ。

さらに、デッキ特有の注意事項もある。
カードは2枚以上重ねるとデッキとなるが、カード単体とデッキとではGUIDがそれぞれ異なる。
デッキのGUIDはデッキになった瞬間に毎回生成されるため、山札が枯れるようなゲームでは特に注意が必要となる。
カードを配りきるような処理では、最後の1枚になるとデッキからカード扱いになるためGUIDも変わることに注意。

デッキ・バッグのシャッフル

前置きが長くなったが、それではコンテナ特有の操作を試してみよう。
まずはシャッフル。ゲームロード時に自動的にシャッフルするようにしてみよう。
シャッフルするためにはオブジェクトを指定して shuffle() を実行する。【shuffle()参考】

例:ゲームロード時にシャッフル(オブジェクト自身にスクリプト記述)
function onLoad()
    self.shuffle()
end

ハンドゾーンにオブジェクトを配る

デッキのカードやバッグのトークンなどをハンドゾーンに配ることができる。
着席している全プレイヤーに配るには deal() を実行する。【deal()参考】
deal()は引数(括弧の中)に数字を指定することで一度に配る数を指定できる。
function onLoad()
    self.shuffle()
    self.deal(2)
end

バッグも全く同じ構文で実行できる。
せっかくなのでボタンを押したら動作するようにしてみよう。
function onLoad()
    self.createButton({
        click_function = "click_func",    -- ボタンを押した時に呼び出す関数
        function_owner = self,            -- 呼び出す関数のオーナー
        label          = "Test",          -- ボタンに表示する文字列
        position       = {0, 0.5, -2},       -- オブジェクトからみたボタンの位置
        rotation       = {0, 180, 0},     -- オブジェクトからみたボタンの向き
        width          = 800,             -- ボタンの横幅
        height         = 400,             -- ボタンの縦幅
        font_size      = 340,             -- ボタンに表示するフォントの大きさ
        color          = {0.5, 0.5, 0.5}, -- ボタンの背景色
        font_color     = {1, 1, 1},       -- ボタンに表示するフォントの色
        tooltip        = "This text appears on mouseover.", -- ボタンにマウスオーバーした際に表示される文字列
    })
end

function click_func(obj, color, alt_click)
    self.shuffle()
    self.deal(2)
end

指定したカラーのプレイヤーに配りたい場合、deal()の第二引数にその色を入力する。【deal()参考】
deal()の書式:deal(number, player_color, index)
function click_func(obj, color, alt_click)
    self.shuffle()
    self.deal(2,"White")
end

指定した場所にオブジェクトを配る

バッグでランダマイズしたトークンを指定個数ゲームボードに配置したい場面などで使う。
指定した場所に配るには takeObject() を実行する。【takeObject()参考】
function onLoad()
    self.createButton({
        click_function = "click_func",    -- ボタンを押した時に呼び出す関数
        function_owner = self,            -- 呼び出す関数のオーナー
        label          = "Test",          -- ボタンに表示する文字列
        position       = {0, 0.5, -2},       -- オブジェクトからみたボタンの位置
        rotation       = {0, 180, 0},     -- オブジェクトからみたボタンの向き
        width          = 800,             -- ボタンの横幅
        height         = 400,             -- ボタンの縦幅
        font_size      = 340,             -- ボタンに表示するフォントの大きさ
        color          = {0.5, 0.5, 0.5}, -- ボタンの背景色
        font_color     = {1, 1, 1},       -- ボタンに表示するフォントの色
        tooltip        = "This text appears on mouseover.", -- ボタンにマウスオーバーした際に表示される文字列
    })
end

function click_func(obj, color, alt_click)
    self.shuffle()
    self.takeObject({position = {0, 2, 0}})
end

takeObject() はパラメータで配置する向きや先出しか後出しか、GUID指定で取り出すかなどの指定ができる。【takeObject()参考】
例えば、追加で向きを90℃変えたい場合は以下のようになる。
function click_func(obj, color, alt_click)
    self.shuffle()
    self.takeObject({position = {0, 2, 0},rotation = {0, 90, 0}})
end

タグ:

+ タグ編集
  • タグ:
最終更新:2020年10月08日 20:36