ステップ6 - メッセージを送信する

このステップでは、Luaスクリプトからメッセージを送信する方法を学びます。

最初に、パズルが解かれたかどうかを確認する関数を作成し、次にパズルが解かれたときにメッセージを表示する機能を追加します。

パズルが解決されたことを検出する

パズルが解決されたことを検出するには:

  1. パズルが解決されているかどうかを確認する関数を、movePieceMessageHandler を定義する前に定義します。

    -- Declare a function that checks for the victory condition.
    local function checkForVictory()
        -- Count the number of pieces in a wrong position.
        local misplacedCount = 0
        for i = 0,PieceCount-1 do
            local piece = grid:getChild(i)
            local row = piece:getProperty(GridLayout2D.RowProperty)
            local column = piece:getProperty(GridLayout2D.ColumnProperty)
            local expectedRow = i // ColumnCount
            local expectedColumn = i % ColumnCount
            if row ~= expectedRow or column ~= expectedColumn then
                misplacedCount = misplacedCount + 1
            end
        end
    
        if misplacedCount == 0 then
            print("Victory!")
        end
    end
    
  2. movePieceMessageHandler メッセージハンドラーの最後で関数を呼び出します。

    local function movePieceMessageHandler(args)
    
        ...
    
        checkForVictory()
    end
    

パズルを解くと、スクリプトは Victory! を ログ に出力します。メッセージを送信する--------------

メッセージを送信するには:

  1. Kanzi Studio プロジェクトで定義されている VictoryMessage メッセージタイプを使用します。

    スクリプト内で、他の変数の隣に変数を初期化します。

    ../../_images/library-victorymessage.png ../../_images/node-components-grid-victory-message.png
    -- Find the "fifteen_puzzle.VictoryMessage" custom message type.
    local VictoryMessage = MessageType:new("fifteen_puzzle.VictoryMessage")
    
  2. checkForVictory 関数を修正して、メッセージを ログ に出力した後、関数が VictoryMessage を グリッド ノードに送信するようにします。

    Grid ノードは VictoryMessage トリガーを使用して、Victory Overlay State Manager を勝利メッセージを表示する Visible ステートに設定します。

    VictoryMessage:newMessageArguments() を使用してメッセージ引数を作成し、dispatchMessage メンバー関数を持つノードにメッセージを送信します。

    local function checkForVictory()
    
    ...
    
        if misplacedCount == 0 then
            print("Victory!")
    
            -- Send a VictoryMessage to the grid node.
            local args = VictoryMessage:newMessageArguments()
            grid:dispatchMessage(VictoryMessage, args)
        end
    end
    

Luaスクリプトには、次の完全なゲームロジックが含まれています:

  • グリッドをランダムな順序でピースで埋めます。

  • パズルのロジックに従ってピースを動かすことで、入力メッセージに反応します。

  • パズルが解かれたことを検出し、アプリケーション内に勝利メッセージを表示するメッセージを送信して反応します。

../../_images/step6-result.png

次の作業

このチュートリアルでは、Kanzi でLuaを使用してアプリケーションロジックをプログラミングする基本を学びました。

詳細については、