パズルスクリプトでパズルゲームを作成する

パズルスクリプトは、HTML5のパズルを作成するための最小限のゲームエンジンであり、オープンソースを備えています。 既製のゲームの例はこちらにあります



パート1.パズルスクリプトで最初のゲームを作成します。



パズルスクリプトは、パズルゲームを作成するために使用される無料のオンラインプログラムです。 彼女は私の「The Nodus」のようなプッシュパズルを作成することで最もよく知られています。 このパートでは、パズルスクリプトの基本機能を学習したゲームを作成し、次にプログラミングを開始します。









エンジンのWebサイトにアクセスします。 [ ゲームを作成]をクリックして、 パズルスクリプトエディターを開きます。



サンプルのダウンロード



最初に、いくつかの例を見てみましょう。 画面の上部で、「Load Example」リストを開き、「Basic」と呼ばれる最初の例を選択します。 「実行」をクリックします。















ゲーム画面が表示されます。 ウィンドウ内をクリックして、キーボードのEnterキーを押します。









ゲームをプレイしてみてください。 あなたの目標は、オレンジ色のボックスを黒いターゲットの正方形に押し込むことです。 各ターゲットにボックスがある場合、レベルが渡されます。 Zを押して移動をキャンセルするか、Rを押してレベルを再開できます。



最初のゲームを作る



次に、いくつかのレベルを作成します。 私はあなたと一緒にそれを作成します、そして私は他の人に私自身のものを思い付くようアドバイスします。 トップメニューの「レベルエディター」をクリックします。









レベルエディター画面が表示されない場合は、[実行]をクリックしてゲームを開始します。 レベルに到達したら、「レベルエディタ」ボタンをもう一度クリックします。 これにより、あなたがちょうどいたレベルを編集することができます。



新しいレベルを作成する



上部にはゲームオブジェクトがあります。 左クリックすると、選択したオブジェクトが描画されます。 右クリックすると、「背景」オブジェクトが描画されます。 マップの端を左クリックするとサイズが大きくなり、右クリックするとサイズが小さくなります。









レベルを渡すには、各目標にボックスを配置する必要があります。したがって、各レベルには最小値が必要です。





右クリックしてすべてを草に変えます。 次に、レベルの端を左クリックして大きくし、最終的に次のようなレベルを描画します。









レベルのリストに追加します。



レベルの作成が完了したら、それをレベルのリストに追加します。 レベルエディターで、ゲームオブジェクトのリストの横にある白い文字Sをクリックして、作成したレベルを保存します。









以下に示すように、コンパイルの成功に関するメッセージと面白いキャラクターのグリッドがレベルエディターの下に表示されます。









これらの面白いキャラクターは、作成したばかりのレベルを示しています。 各文字は個別のオブジェクトを表します。 画面の左側で、下に移動してLEGENDを見つけます。 凡例は、各キャラクターの説明を提供します:



=背景

#=壁

P =プレーヤー

* =木枠

@ =クレートとターゲット

O =ターゲット


画面の左側にあるのはゲームコードのみで、OBJECTSやLEGENDなどのさまざまな部分に分割されています。 LEVELSに移動します。 ここでは、例で使用されているレベルを確認します。









新しいレベルを追加するには、レベルセクションの下部に新しい空の行を作成します。 次に、レベル用に生成された文字をコピーして、そこに貼り付けます。 すべてのレベルが追加されました。









テストします。 新しいレベルを作成した後、新しいレベルでゲームを再起動するには、画面上部の「実行」ボタンをもう一度押す必要があります。 これが機能しない場合があるため、[再構築]ボタンをクリックしてから、もう一度[実行]をクリックする必要があります。



ゲームの保存と読み込み



さらにいくつかの新しいレベルを作成してみてください。 ゲームを保存する準備ができたら、コードの先頭に移動して、自分の名前、作成者の名前、およびホームページを入力し、[保存]ボタンをクリックします。















限られた数の保存がコンピューターの「ロード」メニューに保存されます。 ただし、画面上部に「共有」ボタンがあります。 クリックすると、2つのWebリンクを含むメッセージが生成されます。









リンクの1つは、プロジェクトのソースコードです。 2つ目は、友人と共有できるゲームのプレイ可能なバージョンへのリンクです。 プロジェクトの永続的なバージョンを保存できるように、ソースコードへの新しいリンクを定期的に作成し、テキストドキュメントに保存することをお勧めします。



ゲームのエクスポート



ゲームをhtml5ファイルとしてエクスポートして、 itch.ioKongregate、 Newgroundsなどのゲームポータルにアップロードすることもできます。 [エクスポート]をクリックして、ダウンロードしたhtmlファイルをゲームポータルにアップロードします。



サンプルプロジェクトはこちらにあります



パート2.パズルスクリプト入門



このパートでは、 パズルスクリプトでプログラミングを開始する方法を学びます。









コード



サンプルプロジェクトを開きます。 プログラムコードは画面の左側にあり、オブジェクト、凡例、サウンドなどの部分に分かれています。 [ルール]セクションでは、オブジェクトの相互作用のルールが設定されます。 それに行きます。 コードは1行だけにする必要があります。



[ > Player | Crate ] -> [ > Player | > Crate ]





この行は、プレイヤーがボックスの近くにいて自分の方向に移動する場合、ゲームがプレイヤーを移動してボックスを押すことを意味します。 これがどのように機能するかを説明するには、パズルスクリプトコードが次の構造に従うことを理解する必要があります。



[ ] -> [ ]





これは次のことを意味します。



[ ] -> [ ]





パズルスクリプトは、矢印の左側の条件、たとえば、プレーヤーのオブジェクトがボックスオブジェクトの隣にあるかどうかをチェックします。 条件が真の場合、たとえば、ボックスをプッシュするなどの処理を行います。



条件の例



条件の例を次に示します。



[ object1 | object2 ]





このイベントは、object1がobject2の隣にあるかどうかを確認します。 |



配置することにより、2つのオブジェクトが隣り合っているかどうかを確認できます |



shift + \を押して入力した |



。 条件は常に [ ]



囲まれ [ ]







[ crate | crate ]





上記のコードは、2つのボックスが隣り合っているかどうかを確認します。



[ crate | crate | crate ]





この条件は、3つのボックスが近くにあるかどうかを確認します。



[ crate target ]





この条件は、ボックスがターゲットの上にあるかどうかを確認します |



2つのオブジェクトの間に |



。 オブジェクトが異なる衝突層にある場合、オブジェクトは互いに重なり合うことができます。これについては、チュートリアルの次の部分で説明します。



平等を保つ



ルールはバランスが取れていなければなりません。 条件チェックとそれに続くイベントの両方を同じ方法で説明する必要があります。 その意味を示します。



[ player | crate ] -> [ player | ]





プレーヤーが隣にいる場合、このコード行はボックスを破壊します。 あなたは書くことができません:



[ player | crate ] -> [ player ]





左側の条件では、2つの別々のグリッドスペースに隣接するオブジェクトが存在するかどうかをチェックしますが、イベントはプレーヤーが占有するグリッドスペースを1つだけ記述するためです。 パズルスクリプトは、チェックするスペースをどうするかを知る必要があります。 ボックスを破壊するための正しいコードは次を報告するはずです:



[ | ] -> [ | ]





[ player | crate ] -> [ player | ]





つまり、コード内の空のスペースも重要です。 ただし、次のエントリは有効です。



[ player target ] -> [ player ]





条件では1つのグリッドスペースのみについて話しているため、イベントは同じグリッドスペースを表します。



ボックスを移動する方法



元のコード行に戻りましょう。



[ > Player | Crate ] -> [ > Player | > Crate ]





言い換えれば:



[ | ] -> [ | ]





矢印>は動きを強調します。



コードが何をするのかを覚えておくためにコメントを書く必要がある場合があります。 パズルスクリプトはコメントを無視します-コメントはユーザー専用です。 コメントを書くには、テキストを角かっこで囲む必要があります。 ルールについて、それが何をするのかを説明するコメントを書きます。



( )

[ > Player | Crate ] -> [ > Player | > Crate ]






ここで、ボックスプッシュコードの下で、次のように記述します。



( )

[ < Player | Crate ] -> [ < Player | < Crate ]






逆向きの矢印は、プレイヤーがボックスから離れると、ボックスを引っ張ることを意味します。 「実行」をクリックして、このアクションをテストします。 ボックスを押してドラッグできるはずです。 プログラミングでは、1文字のタイプミスがあっても、コンピューターはコードを理解できない可能性があるため、すべてのエラーを取り除きます。 コードを変更する場合は、もう一度「実行」をクリックして変更をダウンロードします。 ゲームが正常に動作しない場合は、「再構築」をクリックしてプログラムのメモリをクリアし、「実行」をクリックします。



コードの行を非アクティブにする必要がある場合があります。 将来のために保存するためにコメントに変えてください。 プレーヤーがボックスのみを持ち運べるように、ボックスのプッシュコードをコメントアウトしましょう。



( )

([ > Player | Crate ] -> [ > Player | > Crate ])

( )

[ < Player | Crate ] -> [ < Player | < Crate ]






これがうまくいった場合は、ボックスを引っ張るためのコードをコメントアウトして、次を試してください:



[ < Player | Crate ] -> [ < Player | > Crate ]





プレイヤーがボックスから離れると、プレイヤーとボックスは反対方向に移動します。 矢印は、オブジェクトが移動する方向または移動する方向を決定します。 これをコメントアウトして、次を試してください。



[ > Player | Crate ] -> [ Player | > Crate ]





ボックスは移動しますが、プレーヤーはそのままです。 ^およびv(文字v)を試して、オブジェクトがどのように移動するかを確認します。



間違い



意図的に間違ったルールを書き、何が起こるか見てみましょう。 次の行を入力します。



[ < Player | Crate ] -> [ < Player ]





プログラムを実行してみてください。 次のようなメッセージが表示されるはずです。



81行目:ルールでは、左側で一致する各パターンは、右側に同じ長さ(セルの数)の対応するパターンを持っている必要があります。


通常、パズルスクリプトはエラーを非常によく説明します。 ただし、パズルスクリプト自体が誤っている場合があります。 そのような場合、自分でコードを調べて、エラーの場所を特定する必要があります。



さらにいくつかの実験



実験してみて、自分でルールを書いてください。 以下に例を示します。



[ > Player | … | Crate ] -> [ > Player | … | > Crate ]





上記の例では、プレイヤーがレベルの同じラインのどこかにいる場合、プレイヤーはボックスをプッシュし、プレイヤーはボックスに移動します。



[ > Player | Crate ] -> [ Crate | Player ]





このコードは、プレーヤーとボックスを交換します。



[ > Player | Crate ] -> [ Player | Target ]





このコードでは、プレイヤーがボックスの近くにいて、それに向かって移動すると、プレイヤーは移動を停止しますが、ボックスはターゲットに変わります。 パズルスクリプトの最大の利点は、新しいものを簡単に作成できることと実験の可能性です。



パート3.オブジェクトの作成



パズルスクリプト上のゲームのすべてのグラフィックフラグメントは、オブジェクトを示します。 Puzzle Scriptでゲームを作成するには、独自のオブジェクトを作成する必要があります。 このパートでは、それらを作成してコードに追加する方法を説明します。









一般的な情報



サンプルプロジェクトを開きます。 オブジェクトを作成するプロセスは、次の手順で構成されます。





これらのすべての手順を完了すると、オブジェクトの使用を開始できます。



オブジェクト作成



いくつかのオブジェクトが既に存在します。 各ゲームには背景オブジェクトが必要です。 すべてのオブジェクトは、5 x 5ピクセルグリッドから作成され、少なくとも1つの色を持ちます。 背景オブジェクトを以下に示します。



Background

LIGHTGREEN GREEN

11111

01111

11101

11111

10111






数字は画像のピクセルを示します。 各番号はその色に対応しています。 最初の色の番号は0、2番目の色は1、というように9までです。最大10個の色を指定できます。 この場合、各1はピクセルを明るい緑(明るい緑)で色付けし、0-緑(緑)で色付けします。 結果は次のようになります。









オブジェクトは常に次のように作成されます。





名前は常に一番上の行にあります。 色は常に2行目にあり、画像は次の5行、1行に5文字を取り、5 x 5のグリッドを形成します。



Background

LIGHTGREEN






このコードは、「Background」と呼ばれるオブジェクトを作成します。これは、薄緑色の5 x 5ピクセルのグリッドです。 画像グリッドを説明しない場合、単色のブロックが表示されます。これは便利な場合があります。



オブジェクトに名前を付ける



オブジェクトは好きなように呼び出すことができますが、名前は記号で始めることはできず、スペースを含まない1つの単語である必要があります。 オブジェクトに明確な名前を付けますが、行き過ぎないでください。 PlayerStillは良い名前です; PlayerThatIsStandingStillは長すぎて冗長です。





オブジェクトに使用する色を宣言し、スペースで区切る必要があります。 パズルスクリプトには定義済みの色があります。





16進数で色を指定することもできます。これにより、はるかに広い範囲の色が得られます。 このようなWebサイトを使用して、16進数の色を選択できます。 必要な色を選択してから、画像の上にある色コードを書き換えます。 16進カラーコードは、パズルスクリプトで次のように記述されます。





#51A2BD #ff0000 #ffffff






カラーコードの前には常に#文字が付きます。



凡例にオブジェクトを追加します



オブジェクトを作成したら、それを凡例に追加する必要があります。 凡例は次のようになります。



. = Background

# = Wall

P = Player

* = Crate

@ = Crate and Target

O = Target






各シンボルは、レベル内のオブジェクトを表します。 つまり、このような文字のグリッドが表示される場合:



#p.*.##

#.**.##

#..#..#

##....#

##...o#

#######






それは実際に私たちのレベルを説明しています:









作成された各オブジェクトには、レベルでこのオブジェクトを指定する文字、記号、または番号を割り当てる必要があります。 このように:



P = player





凡例内のオブジェクトのグループ化



凡例にオブジェクトのグループを作成することもできます。 たとえば、複数の色付きのボックスがある場合、これを行うことができます。



O = OrangeCrate

B = BlueCrate

G = GreenCrate






これにより、エディターレベルでボックスを使用できるようになります。 ただし、コードを作成するには、次のようにそれらをLegendでグループ化できます。



Crates = OrangeCrate or GreenCrate or BlueCrate





そして、全体としては次のようになります。



=======

LEGEND

=======

O = OrangeCrate

B = BlueCrate

G = GreenCrate



Crates = OrangeCrate or GreenCrate or BlueCrate






これはなぜですか? そのようなルールを作成する代わりに:



[ > Player | OrangeCrate ] -> [ > Player | > OrangeCrate ]

[ > Player | BlueCrate] -> [ > Player | > BlueCrate ]

[ > Player | GreenCrate] -> [ > Player | > GreenCrate]






あなたは単に書くことができます:



[ > Player | Crates ] -> [ > Player | > Crates ]





そして、このコードはオブジェクトのグループ全体に対して機能します。



さらに、 コリジョンレイヤーセクションでは、個々のオブジェクトを入力するのではなく、グループが配置されているレイヤーを参照できます。



衝突層



デフォルトでは、コリジョンレイヤーセクションは次のとおりです。



Background

Target

Player, Wall, Crate






各行は、独自のレイヤー内のオブジェクトを選択します。 オブジェクトのレイヤーの順序により、どのオブジェクトが他のオブジェクトの上に配置されるかが決まります。 一番上の行のオブジェクトは一番下のレイヤーに、次の行はその上のレイヤーに、というように続きます。 背景は、常に一番下のレイヤーになるように一番上の行にある必要があります。 1つのレイヤー内のオブジェクトを互いに重ねることはできません。 つまり、次のことはできません。



[ player wall ] -> [ player wall ]





異なるレイヤーのオブジェクトを相互作用させることができます。 たとえば、次のように記述できます。



[ > Player | Target ] -> [ > Player | > Target ]





実験



いくつかの新しいオブジェクトを作成します。 プッシュのみが可能なタイプのボックスを作成します。 ドラッグのみが可能な別のボックスを作成します。 タッチすると消えるボックスを作成します。 実験を続けると、すべてがどのように行われたかをよりよく覚えることができます。



パート4.勝利条件



誰もが勝つのが大好きです。 プレイヤーとして、私たちは勝ちたいと思っています。 このパートでは、ゲームに勝つための条件をプログラムする方法を学びます。



勝利条件



サンプルプロジェクトをダウンロードし、Win Conditionsコードセクションに移動します。 以下が表示されるはずです。



All Target on Crate





各ゴールにボックスがある場合、ゲームに勝ちます。 3つのボックスと2つのゴールがある場合、ゴールに2つのボックスのみを設定することで勝ちます。 スワップする場合:



All crate on target





その後、各ボックスをターゲットに配置する必要があります。



1つまたは複数の条件があります。 複数の条件の場合、それらはすべて満たされる必要があります。 たとえば、次のようになります。



All Target on Crate

All Target2 on Crate2






レベルにtargetとtarget2がある場合、それぞれにcrateとcrate2があります。 レベルに特定の勝利条件を満たすために必要なオブジェクトが1つもない場合、たとえばtarget2がない場合、この条件は自動的に満たされます。



さまざまな種類の勝利条件



勝利条件にはいくつかの異なるタイプがあります。



No Object





この場合、レベルにそのようなオブジェクトが1つもないときに勝利が得られます。



Some Object





レベルに指定されたタイプのオブジェクトが少なくとも1つある場合に勝ちます。



Some Object1 on Object2





Object1のオブジェクトの少なくとも1つはObject2上になければなりません。



No Object1 On Object2





この状態は、 All Target on Crate



All Target on Crate



の反対です。 この場合、これらのオブジェクトはすべて、互いの上ではなく、互いに分離する必要があります。 また、異なる勝利条件を互いに組み合わせることができます。



実験



さまざまな勝利条件で実験します。 すべてのボックスがターゲット上にない場合に勝つゲームを作成してみてください。 または、特定のタイプのすべてのボックスを破壊する必要があるゲームを作成しますが、他のプッシュされたボックスがあなたの方法であります。



私の完成したプロジェクト例はこちらでご覧いただけます



パート5.遅いコマンド



PuzzleScriptには、「late」という非常に便利なコマンドがあります。 ゲーム内のイベントの発生順序は重要であり、必要な結果を得るために後で実行されるコードが必要になる場合があります。 このパートでは、 lateコマンドの使用について説明します。



なぜ必要なのか



サンプルプロジェクトを開き次のコードをゲームに貼り付けて実行します。



[ player | target ] -> [ player | ]





プレーヤーがゴールの隣に立つとすぐにゴールが破壊されることが予想されますが、これは起こりません。 代わりに、プレイヤーがコースの隣に立つと、ターゲットはコースから消えます。 別のコードを試してください:



late [ player | target ] -> [ player | ]





ゴールの隣に立つとすぐに消えます。 これは、残りのコードがすべて実行された後に、 遅延として指定されたすべてが発生するために発生しました。 時々これが必要です。



イベントの順序



パズルスクリプトのコードは、移動するたびに実行されます。



  1. パズルスクリプトは、プレイヤーが移動したいことを発見します
  2. 可能な限り、ルールは上から下に読み取られて実行されます。
  3. 可能であればプレイヤーが移動する
  4. 遅いルールが適用されます


コンピューターはコードの最初の行から開始し、1行ずつ読み取ります。 すべての条件をチェックします。 したがって、動き回ろうとすると、パズルスクリプトはすべてのルールを読み取り、条件が真であるかどうかを確認します。真である場合は、何かを実行します。 たとえば、最初の行は次のようになります。



[ player | spikeTrap ] -> [ | spikeTrap ]





プレーヤーがステークトラップの隣にいない場合、コードは実行を続けます。 これは、コードの行を書く順序が重要であることを意味します。 場合によっては、lateコマンドを使用できますが、実際には時間の経過とともに学習します。



Lateを実際に使用する方法



私の経験では、オブジェクトが互いに重なり合っているか、隣り合っているかを確認するときにlateコマンドを使用するのが最善ですが、他の場合もあります。 あるオブジェクトが別のオブジェクト上にあるかどうかを確認すると、lateコマンドを使用しない限り、次のターンまでイベントは登録されません。



[ player spikeTrap ] -> [ spikeTrap ]





上記の場合、プレイヤーは、trapに移動した後の次のターンまで、杭のあるbyによって殺されません。 プレイヤーを即座に死なせるには、レイトコマンドを追加するだけです。



late [ player spikeTrap ] -> [ spikeTrap ]





キャラクターが死亡したときにレベル全体を再起動するには、次の操作を実行できます。



late [ player spikeTrap ] -> restart





そして、プレイヤーがステークスでトラップされたときにレベルが再起動します。



ここで完成したプロジェクトの例を見ることができます



パート6.効果音を操作します。



Puzzle Scriptで素晴らしいゲームを作成しましたが、ここでサウンドを追加する必要があります。 どうやってやるの? 今、私はあなたに教えます!



サウンド生成



サンプルプロジェクトを開きます。 サウンドを追加します。 ゲーム画面の下に、白いシンボルの付いた黒い正方形が表示されます。 それらは音を生成するために使用されます。 各キャラクターはユニークなタイプのサウンドを生成し、クロスは作成されたサウンドを削除します。 四角をクリックしてみて、音を聞いてください。









黄色の数字は、音が必要なコード内の場所にコピーして貼り付ける必要がある一意のコードです。



サウンドの使用方法



適切なサウンドを見つけたら、それをゲームコードのサウンドセクションに挿入する必要があります。









サウンドはいくつかの方法で使用できます。 最も簡単なのは、新しい効果音(sfx)を作成することです。 番号を付ける必要があります。 新しいsfxを作成し、数値のサウンドIDを挿入するときに0〜10の番号を割り当てます。 [サウンド]リストで、sfx0という新しいsfxを作成し、生成されたサウンドを割り当てます。



sfx0 36301705





サウンドを使用するには、イベントの後にルールに挿入する必要があります。 新しく作成されたsfx0をボックス破壊イベントにアタッチしましょう(イベントはプロジェクトの例に既に存在します):



(The player destroys a crate)

[ > Player | CrateVanish ] -> [ Player | ] sfx0






サウンドは、次のような特定のイベントで再生するように宣言することもできます。



Crate MOVE 36772507





この場合、クレートを移動するとサウンドが再生されます。 CratePullオブジェクトをドラッグアンドドロップするための新しいサウンドエフェクトを生成し、CratePullを移動したときに再生するようにします。



CratePull MOVE 12735307





イベントのサウンドは、サウンドセクションでのみ宣言する必要があります。ルールで言及する必要はありません。



音声再生方法のリスト



以下は、パズルスクリプトのドキュメントから取得した、使用できるさまざまなイベントサウンドのリストです。



オブジェクトアクション541566-移動中にオブジェクトがアクションにさらされたときに再生されます。



オブジェクト作成641667-特定のオブジェクトを作成するときに再生されます。



EndGame 5416789-ゲームの終了時に再生されます。



EndLevel 6417822-レベルの完了後に再生されます。



Object CantMove 781673-オブジェクトが任意の方向への移動に失敗したときに再生されます。



プレーヤーCantMove Down Left 464674-オブジェクトが下または左に移動しようとして失敗したときに再生されます。



CloseMessage 344456-プレーヤーがメッセージボックスを閉じると再生されます。



Object Destroy 187975-オブジェクトが破壊されると再生されます。



オブジェクトの移動264567-オブジェクトが任意の方向に正常に移動したときに再生されます。



オブジェクトの左下への移動765432-オブジェクトが正常に下または左に移動したときに再生されます。



Object Move Horizo​​ntal 345367-オブジェクトが水平に正常に移動したときに再生されます。 垂直を使用することもできます。



再起動7865435-プレーヤーが再起動ボタンRを押すと再生されます。



SFX0 765743 - SFX0からSFX10までの任意の値を指定できます。 これらは、ルールから実行できる特別なサウンドイベントです。



ShowMessage 478483-メッセージが表示されたときに再生します。



StartGame 234626-新しいゲームの開始時にプレイします。



開始レベル765436-各レベルの開始時に再生されます。



TitleScreen 876543-スクリーンセーバーを読み込んだ後に再生します。



元に戻す436234-プレーヤーがキャンセルキー(Z)を押すと再生されます。



moveおよびcantmoveの方向を指定して、異なる方向に移動するときに異なるサウンドが再生されるようにすることができます。



プロジェクトの完成例はこちらです。



パート7.音楽を再生する



パズルスクリプトでゲームを作成する方法を学びましたが、音楽を追加するのは素晴らしいことではないでしょうか。 それは可能であり、今私はそれを行う方法をお教えします。



注:現時点では、パズルスクリプトのこの機能が壊れているようですので、次のパートに進んでください。


どうする



プロジェクトの空白を開きます 。 パズルスクリプトでは次のように音楽が機能します:Youtubeから1つのビデオへのリンクをゲームに挿入すると、PuzzleScriptはこのビデオのすべてのサウンドを自動的に再生します。 Youtubeを開いて任意のビデオを選択するか、次を使用します。



youtube.com/watch?v= CKAc3nYEatw



ビデオから音楽を再生するには、一意のビデオIDを取得する必要があります。 上記の行の緑の部分は一意のIDです。









プロジェクトの冒頭にある著者のホームページの下に、youtubeラベルを追加し、その後に次のような一意のビデオIDを追加します。



youtube CKAc3nYEatw



正しく機能することを確認するには、「共有」をクリックし、ゲームのリンク(ソースコードのリンクではありません)をクリックします。 エディター内でのテスト中、パズルスクリプトの音楽は再生できません。 ゲームに音楽を追加したい場合は、YouTubeにビデオとしてアップロードし、プロジェクトに一意のIDを挿入する必要があります。 各プロジェクトに含めることができるYouTubeビデオは1つだけです。



プロジェクト例



パズルスクリプトプロジェクトの例はこちらにあります



パート8.アクションコマンドの使用方法



ブロックの移動、プッシュ、ドラッグの方法はすでに知っていますが、 スペースなどの特定のキーを押して何かをする必要がある場合はどうでしょうか?



PuzzleScriptでの入力の可能性は非常に限られており、主に矢印キー、キャンセルするZ、再起動するRであり、それらを変更することはできません。しかし、エンジンは私たちのための余分なキー与えアクション押す- スペースバーを、または押すXをアクション



チームとの連携は、上記の形式に従います。基本的なPuzzleScriptコード形式を使用しました。



[ ] -> [ ]





条件が真の場合、イベントを実行します。actionコマンドも同じ方法で使用されますが、独自のルールがあります。次のようになります。



[ Action ] -> [ ]





Actionコマンドの使用例を次に示します。



[ Action Player ] -> [ Crate ]





まず、アクションは常に条件の最初の単語です。



次に、ゲーム内の特定のオブジェクトに影響を与えたい場合、条件とイベントの両方でこのオブジェクトに言及する必要があります(別のオブジェクトに言及する場合、プログラムは元のオブジェクトを削除し、新しいオブジェクトに置き換えます。オブジェクトを指定しない場合、彼はただ引退します)。



最後に、単語Action条件のみ使用する必要がありますが、条件とイベントの両方で使用する価値がある場合もあります。これについては以下で説明します。



ゲームプロジェクトに表示されているコードを確認します。この例から始めることができます。スペースバーまたはXを押すと、プレーヤーがボックスになります。



条件は、[ アクションキーを押し、 レベルにプレーヤーオブジェクトがある場合 ]-> [ プレーヤーオブジェクトをボックスに置き換える ]の場合です



。では、プロジェクト例で次のコードを試してみましょう。



[ Action Player | Crate ] -> [ Player | > Crate ]













上の画像のように、四方が箱で囲まれていることを確認してください。アクションは一度に1つのボックスのみに影響することに気付くでしょう。理由は正確にはわかりませんが、Actionコマンドを使用して複数のオブジェクトに影響を与えたい場合は、条件とイベントの両方でオブジェクト指定する必要があります。



コードを更新されたバージョンに置き換えます。



[ Action Player | Crate ] -> [ Action Player | > Crate ]











これで、すべてのボックスを一度にプッシュできます。アクションを複数のオブジェクトに適用する必要がある場合は、Actionを条件とイベントの両方に配置します。



パート9.複数の条件の確認



爆弾と破壊可能なブロックの存在など、いくつかの条件を確認する方法を学びましょう。









サンプルプロジェクトを開きます。次に、次のコードを追加します。



late [Player Switch][DoorClosed] -> [Player Switch][DoorOpen]





コードは次の形式に従います。



[ 1 ] [ 2 ] -> [ 1 ] [ 2 ]





条件1がtrueで条件2がtrueの場合、ステップ1とステップ2が満たされますこの場合、条件1はプレイヤーがスイッチをオンにしているかどうかをチェックします。「はい」の場合、条件2がチェックされます。つまり、閉じたドアのレベルでの存在ですか。条件が真の場合、DoorClosedオブジェクトはDoorOpenオブジェクトに変わり、ドアを開きます。









ヒーローがスイッチを離れるときにドアを閉じる必要があるとします。これは、プレイヤーがボックスをスイッチに押してドアを開くようにするためです。このようなものを書くことができます:



late [Player | Switch][DoorOpen] -> [Player | Switch][DoorClosed]





プレイヤーがスイッチの隣に立っており、レベルのどこかにドアが開いている場合、ドアを閉じます。最後に、ボックスをスイッチに押し込む場合、ドアを開いたままにしておく必要があります。



late [Crate Switch][DoorClosed] -> [Crate Switch][DoorOpen]





引き出しがスイッチにある間、ドアは開いたままになります。ここで



完成したプロジェクトの例を見ることができます



パート10.ブレークポイントの作成



パズルスクリプトをプレイするための良いアイデアをお持ちかもしれませんが、死亡した場合にプレーヤーが回復するためにコントロールポイント(チェックポイント)が必要です。 どうやってやるの? とても簡単です。今からその方法を説明します。









ブレークポイントを作成する



サンプルプロジェクトを開きます。ここで、ブレークポイントをプログラムする必要があります。これには1行のコードで十分です。



late [ Player FlagRed ] -> CHECKPOINT





FlagRedはチェックポイントです。プレーヤーが旗の上にあるとき、このコードはチェックポイント(CHECKPOINT)を作成します。遅延を使用しない場合、チェックポイント機能は機能しません。



ゲームをテストします。コントロールポイントを通過し、さらに少し進んでRを押します。コントロールポイントから開始する必要があります。



複数の制御点



複数のコントロールポイントがある場合、ゲームはプレイヤーが最後にアクティブにしたものを使用します。



以前に使用したコントロールポイントの再アクティブ化を回避するには、別のオブジェクトに変更する必要があります。これを行うには、赤いフラグの下にあるコードのOBJECTSセクションに白いコピーを作成します。



FlagWhite

White Orange

.1…

.00..

.000.

.1…

.1…






次に、凡例のこの行を書き換えます。



Flag = FlagRed or FlagWhite





オブジェクトのグループを作成できます。この場合、FlagはFlagRedまたはFlagWhiteのいずれかになります。グループ化されたオブジェクトの少なくとも1つにシンボルが割り当てられている限り(FlagRedシンボルFを割り当てました)、グループの他のオブジェクトにシンボルを割り当てる必要はありません。コードでのみアクセスでき、レベルエディターではアクセスできません。その後、グループにコリジョンレイヤーを割り当てることができます。フラグなどのオブジェクトのグループへのアクセスは、グループ全体を指します。したがって:



[ > Player | Flag ] -> [ > Player | ]





このコードは、赤と白の両方のフラグに影響します。



フラグオブジェクトの変更



FlagRedをFlagWhiteに変更する方法は次のとおりです。



late [ Player FlagRed ] -> [ Player FlagWhite ]





ターンの終わりにプレーヤーが赤旗になっている場合、それを白に変えます。ただし、ブレークポイント作成した後にフラグのグラフィックを変更する必要があります。コードは上から下に読み取られるためです。プログラムをテストします。



2番目のフラグを変更する



プロジェクトには2つのフラグがあります。2番目のフラグがアクティブになったときに、古い白いフラグが黒に変わり、再び使用できないことを確認しましょう。以下を記述します。



late [ Player FlagRed ][ FlagWhite] -> [ Player FlagRed ][FlagBlack]





コードでは、プレーヤーが赤旗の上にあり、ゲーム内のどこかに白旗がある場合、白旗を黒にする必要があります。コードは上から下に読み取られるため、次の順序でこれを行う必要があります。



late [ Player FlagRed ] -> CHECKPOINT

late [ Player FlagRed ][ FlagWhite] -> [ Player FlagRed ][FlagBlack]

late [ Player FlagRed ] -> [ Player FlagWhite ]






コードがこの順序である理由がわからない場合は、行の順序を変更してプログラムをテストしてください。独自の問題を解決するには、一歩後退してコードが何をするかを熟考することを学ぶ必要があります。しかし、ヒントを示します-あなたがプレイするとき、次の誤った例のコードの最後の行で赤い旗はどこにありますか?



[ > Player | Crate ] -> [ > Player | > Crate ]

[ > Crate | Flag ] -> [ Crate | Flag ]

late [ Player FlagRed ] -> CHECKPOINT

late [ Player FlagRed ] -> [ Player FlagWhite ]

late [ Player FlagRed ][ FlagWhite] -> [ Player FlagRed ][FlagBlack]






完成したサンプルプロジェクトはこちらからご覧くださいさらに、アニメーションを作成する最も簡単な方法を示しました。次のパートでは、爆発などのより複雑なアニメーションの作成について説明します。



パート11.アニメーション



PuzzleScriptでアニメーションを作成するには2つの方法があります。そのうちの1つはリアルタイムを使用しますが、この部分では説明しません。もう1つは、爆発やキャラクターが垂直梯子を下るなど、1回限りの簡単なアニメーションに使用されます。サンプルプロジェクトを



開きます。爆弾と爆発の一連のショットを作成し、それらをアニメーション化します。



オブジェクトアニメーション



2Dアニメーションの場合、たとえばマリオを実行するスプライトなど、ある状態から別の状態に移動するオブジェクトの複数の図面が必要です。4フレームのアニメーションが含まれています。









アニメーションのあるフレームから別のフレームへの移行をシミュレートするために、PuzzleScriptでアニメーションのフレームになる複数のオブジェクトを作成し、コードを使用してそれらを切り替えます。



爆弾



そのような爆弾オブジェクトを作成します。



Bomb

black yellow grey

..1..

..1..

.000.

00020

.000.






レイヤーと凡例に忘れずに追加してください。



爆発をアニメーション化するには、アニメーションの各フレームを個別のオブジェクトとして作成し、コード内でそれらを切り替える必要があります。爆発オブジェクトを作成しましょう。



Explosion1

black yellow grey red

..1..

..1..

.000.

00320

.000.



Explosion2

black yellow grey red

..1..

..1..

.333.

03330

.333.



Explosion3

black yellow grey red

..1..

.333.

33333

33333

.333.



Explosion4

black yellow grey red

.333.

33333

33333

33333

.333.



Explosion5

black yellow grey red

.333.

33333

33.33

33333

.333.



Explosion6

black yellow grey red

.333.

3...3

3...3

3...3

.333.



Explosion7

black yellow grey red

.....

.....

.....

.....

.....






必要なアニメーションのフレームを知るために、オブジェクトに正しく番号を付けます。それらをレイヤーと凡例に追加したら、数行のコードを追加できます。



[Explosion7] -> []

[Explosion6] -> [Explosion7]

[Explosion5] -> [Explosion6]

[Explosion4] -> [Explosion5]

[Explosion3] -> [Explosion4]

[Explosion2] -> [Explosion3]

[Explosion1] -> [Explosion2]

[Bomb] -> [Explosion1]






このコードを追加して、レベルに爆弾を配置してゲームを開始してください。動きごとに爆弾のアニメーションが1フレームずつ変化することに気付くでしょう。オブジェクトを切り替えて、アニメーションを作成します。



アニメーションを切り替える順序は重要です。最後のフレームは上に、最初のフレームは下にあるはずです。コードは上から下へと読まれることを忘れないでください。アニメーションのフレームの順序が異なる場合、変更は表示されません。最後のフレームのみが表示され、この場合、爆弾は単純に消えます。グラフィックが表示される前でも、1つのフレームで最初のフレームに、次に2番目のフレームに、というように変化します。最後のフレームを先頭に配置することにより、各ターンで次の変更が表示されます。



再び使用する



すべてを一緒にアニメーション化するには、再びチームが必要です。ここでも、すべてのコードを読み取った後、PuzzleScriptが一時停止し、すべてのコマンドを再度実行してコードを再度読み取ります重力、氷上での滑り、そして私たちの場合はアニメーションに使用できます。必要なのは、コードを次のように書き換えることだけです。



[Explosion7] -> []

[Explosion6] -> [Explosion7] again

[Explosion5] -> [Explosion6] again

[Explosion4] -> [Explosion5] again

[Explosion3] -> [Explosion4] again

[Explosion2] -> [Explosion3] again

[Explosion1] -> [Explosion2] again

[Bomb] -> [Explosion1] again






ゲームをテストします。爆弾アニメーション全体がすぐに再生されることがわかります。あなたの意見ではそれが遅すぎるか速い場合は、速度を変更することができます。プログラムテキストの冒頭で、ホームページのに次のコードを記述します。



again_interval 0.1





これは、PuzzleScriptがpreludeと呼ぶものの一部ですこれは、残りのコードの前に、ゲームの動作を決定する追加のルールを設定できる場所です。これで、アニメーションがより速く再生されるはずです。again_intervalの後に数値を変更してみて、変更されたことを確認してください。ここで



完成したプロジェクトの例を見ることができます



パート12.重力



通常、PuzzleScriptはトップダウンでゲームを作成するために使用されますが、実際には、PuzzleScriptルールが制限されているにもかかわらず、一部のサイドスクローラー要素をシミュレートできます。このパートでは、重力を実装する方法を説明します。



プロジェクト例



サンプルプロジェクトを開きます。単純なレベルを作成しました。プレーヤー、棚の上のボックス、下のドアがあります。プレイヤーが棚から箱を押したときに、地面に落ちるようにします。また、プレーヤーがエッジを離れるときに地面に落ちるようにします。



秋のステージ1



使用するコードの最初の部分は次のとおりです。



down [ Player | no Object ] -> [ | Player ]

down [ Crate | no Object no Player ] -> [ | Crate ]






ボックスを端から押してみてください。箱を動かすと空中にぶら下がることに気づくでしょうが、別の動きをすると地面に落ちます。ここでいくつかのことが起こります。



まず、downキーワードについて説明しましょうdown追加することにより、下方向にのみ適用されるという事実にルールを制限します。それがボックスが下に移動する理由です。downright置き換えると、反重力のゲームのように、ボックスが右の壁に引っかかっていることがわかります。そうしてみてください。



次に、何か異常なことをします。プレイヤーが特定のオブジェクト(たとえば、ボックス)の隣にいるかどうかを確認する代わりに、一般化されたオブジェクトの隣にいるかどうかを確認します。サンプルコードの凡例を見ると、オブジェクトをオブジェクトのグループとして定義していることがわかります。つまり、オブジェクトという単語を使用するたびに、オブジェクトのグループを意味します。つまり、これらのオブジェクトがプレーヤーの下にあるかどうかを確認します。そうでない場合は、プレーヤーにこの空きスペースを占有するように命令し、単語がダウンしているために前のスペースを残して、下方向に進みます。



しかし、棚と衝突した後、ボックスは次の動きまで落下せず、すぐに地面に到達することにも気付くことができます。この遅延クラッシュを排除するには、lateキーワードを使用できます。



late down [ Player | no Object ] -> [ | Player ]

late down [ Crate | no Object no Player ] -> [ | Crate ]






しかし、フレームごとに徐々に低下させる方法は?



秋のステージ2



次に、ランダムキーワードを使用します。コードを次のように書き直します。



random down [ Player | no Object ] -> [ | Player ]

random down [ Crate | no Object no Player ] -> [ | Crate ]






コードを実行します。以前のコードと非常によく似ていますが、1つの重要な違いがあります。ボックスは空中でフリーズしますが、プレーヤーが移動するたびに、1つのセルに落ちます。これは、単語randomによるものです。厳密に言えば、randomはランダムな要素を持つゲームを作成するように設計されていますが、ここでは便利です。対応するコード行が1ターンに1回実行されるようにします。PuzzleScriptは、1回の動作で各ルールを可能な限り何度も実行します。その後、プレーヤーにグラフィックの変更が表示されます。それが、箱が即座に地面に落ちたように見える理由です。ただし、「ランダム」という単語を使用する場合、一度に1つのセルにしか該当しません。



秋のステージ3



次に、キーワードを再度追加ます。



random down [ Player | no Object ] -> [ | Player ] again

random down [ Crate | no Object no Player ] -> [ | Crate ] again






ゲームを起動します。すべてがほぼ完璧です。箱は空中でしばらく凍結しますが、再び移動すると、徐々に地面に落ちます。我々はすでにキーワードに精通している再び実際には、それは当然の終わりにPuzzleScriptが再びコードを読み取ることを意味し、すべてのチームを満たすためにしようと、再び彼ができるよう、その後何回も再びそれを繰り返し、別のコースとして、その後、一時停止します。ここで重要なことは、彼が再び動きと動きの間で一時停止することです。



最終ステージ



そして最後の仕上げ。ボックスが端から押し出された直後に地面に落ちるようにするには、作成したコードの上に別のコード行を追加する必要があります。



[moving Player] -> [moving Player] again

random down [ Player | no Object ] -> [ | Player ] again

random down [ Crate | no Object no Player ] -> [ | Crate ] again






プレーヤーの前の角括弧[]で使用される移動キーワードは、プレーヤーが動いているかどうかを確認していることを意味します。これは、プレイヤーが移動した場合、移動を続行し、チームを再び実行するように命じることを意味します。その後すぐに、キーワードを再び使用するすべてが機能します。私たちの場合、それは落下する箱のアニメーションです。ここで完成したプロジェクトの例を見ることができます







パート13.進行方向の確認



方向指示



何かを一方向だけで確認する必要がある場合があります。たとえば、水平方向にのみ押し込めるブロックを作成したり、左にしか歩けないアヒルを作成したりする必要があります。



場合によっては、特定の方向でのみイベントが発生することを示すことができます。



PuzzleScriptを開き、基本的な例に基づいてゲームを作成し、次のコードルールに置き換えます。



[ Left Player ] -> [ Crate ]





ゲームを起動して、何が起こるかを見てください。



左に行こうとすると、プレーヤーはボックスに変わります。これは、方向付けの仕組みの良い例です。



私たちはすでにPuzzleScriptコードを説明した形式に慣れています。



[ ] -> [ ]





イベントがtrueの場合、イベントが発生します。



しかし、今、方向を確認する必要があるとき、彼は新しい規則に従います:



[ Movement Direction Object Affected ] -> [ New State of Object ]





これが以前のコードです:



[ Left Player ] -> [ Crate ]





プレーヤーが左(Left)に移動しているかどうかを確認しますその場合は、プレーヤーをボックスオブジェクトに置き換えます。



目的地の種類



次のタイプの宛先から選択できます。







パート14.カスタム移動の作成



何らかの理由で、ゲームにカスタムの移動が必要になる場合があります。アヒルは左にしか歩くことができず、箱は水平にしか押すことができません。とても簡単です。基本的なPuzzleScriptコード形式をもう一度見てみましょう。



[ ] -> [ ]





条件が真の場合、イベントが発生します。カスタム移動を作成するには、次の手順を実行します。



[ Condition ] -> [ Movement Direction Object To Move ]





以下に例を示します。



[ Player | Crate ] -> [ Player | Left Crate ]





PuzzleScriptをダウンロードし基本例を開き、このコードを貼り付けて、何が起こるかを確認します。壁のないボックスに移動します。



プレイヤーがボックスの近くにいると、ボックスが左に押されていることがわかります。ただし、Lateキーワードがないため、これは最初の一歩を踏み出したのコースで発生します。



参照する場合、イベントはまだオブジェクトとを除いて動きの方向、例えば、PuzzleScriptは言った方向にオブジェクトを移動しようとします。そのため、プレーヤーではなくボックスが左に移動します。Crateのです。



前の部分のこのコードを覚えていますか?



[ ] -> [ ]





オブジェクトの隣状態で移動方向を指定すると、このオブジェクトがこの方向に移動しているかどうかがチェックされます。これは重要な違いです。 次のように書き換えることができます。



[ ] -> [ ]





許容されるカスタム移動



次のいずれかの単語を使用して、カスタムの動きを作成できます。





水平または垂直を使用することはできません。PuzzleScriptは、オブジェクトをどの方向に移動したいかを理解できないため、これを行うには多くの回避策が必要になります。特定の方向を示す必要があります。



パート15.オブジェクトの横にあるセルの確認



オブジェクトの隣にあるものを確認する必要がある場合があります。これは非常に簡単です。別のPuzzleScriptコード形式を見てみましょう。



[ ] -> [ ]





それは



[ ] -> [ ]





オブジェクトの側面を確認するには、1つの要素を追加する必要があります。形式は次のとおりです。



[ object1 | object2 ] -> [ object1 | object2 ]





条件の前に、オブジェクトのどちら側でチェックを実行するかをチェックします。



条件内では、少なくとも2つのセルが必要であると想定しています。セルは、実際には、1つのスペースに配置され、互いに隣接していないオブジェクトです。



[ ]



[ | | ]






最初のセルは、辺を確認するオブジェクトです。2番目のセルは、存在を確認するオブジェクトです。次の例を試してください。



Left [ Player | Crate ] -> [ Player | ]





上記のコードは、プレーヤーの左側の正方形にあるボックスを削除します。



Left [ Crate | Crate ] -> [ Player | Crate ]





このコードは、ボックスが別のボックスの左側にあるかどうかを確認します。その場合、側面がチェックされているボックスがプレイヤーの新しいオブジェクトになります。



Left [ Crate | Crate ] -> [ Crate | Player ]





上記のコードにも同じチェックがありますが、左側のボックスがプレーヤーのオブジェクトになります。



Left [ Crate | Crate | Crate ] -> [ Crate | Player | Crate ]





このコードも同様のパターンを使用しています。チェックボックスのすぐ左にあるボックスは、3つのボックスが横に並んでいる場合にプレーヤーになります。



Left [ Crate | Crate | Crate ] -> [ Crate | Crate | Player ]





3つのボックスが横に並んでいる場合、左端のボックスがプレイヤーになります。



これらの例をそれぞれテストすると、パターンの理解が始まります。最初のセルは、次のものを確認するためにチェックするオブジェクトです。次のセルは、最も近いものから最も遠いものまで、チェック対象のオブジェクトです。



キーワード





画像






画像






画像






画像







All Articles