diff --git a/Manual/contents/Additional_Information/Additional_Information.htm b/Manual/contents/Additional_Information/Additional_Information.htm index e718f4569..b682744e2 100644 --- a/Manual/contents/Additional_Information/Additional_Information.htm +++ b/Manual/contents/Additional_Information/Additional_Information.htm @@ -1,6 +1,7 @@ + 追加情報 @@ -12,10 +13,12 @@ +

追加情報

-

このセクションでは、プログラミングとGameMaker Language の動作に関連する雑多な記事を集めています。以下の記事は、GameMaker の仕組みと、さまざまな言語機能を最大限に活用する方法について、理解を深めるための関連記事として作成されています。

+

このセクションでは、プログラミングとGameMaker Language の動作に関連する雑多な記事を集めています。以下の記事は、GameMaker の仕組みと、さまざまな言語機能を最大限に活用する方法について、理解を深めるための関連記事として作成されています。

@@ -38,11 +42,13 @@

追加情報

+ \ No newline at end of file diff --git a/Manual/contents/Additional_Information/Best_Practices_When_Programming.htm b/Manual/contents/Additional_Information/Best_Practices_When_Programming.htm index f1c0a5d3a..8335d1cca 100644 --- a/Manual/contents/Additional_Information/Best_Practices_When_Programming.htm +++ b/Manual/contents/Additional_Information/Best_Practices_When_Programming.htm @@ -1,6 +1,7 @@ + プログラミングのベストプラクティス @@ -12,43 +13,71 @@ +

プログラミングのベストプラクティス

-

このページでは、ゲームをプログラミングする際の「ベストプラクティス」をいくつか紹介し、同時にGameMakerの内部動作についても少し説明します。ただし、その前に2つの重要なポイントを押さえておきましょう。

+

このページでは、ゲームをプログラミングする際の「ベストプラクティス」をいくつか紹介し、同時にGameMakerの内部動作についても少し説明します。ただし、その前に2つの重要なポイントを押さえておきましょう。

ということで、次に、いつでも適用できる、良いGML コードを書くための一般的なヒントをいくつか見てみましょう...

プログラミングスタイル

-

コードを書くとなると、誰にでもスタイルがあります。そのスタイルとは、括弧の付け方、行のインデントの仕方、変数の宣言や名前の付け方などであり、あなたのコードを他の人に(そして、他のことに時間をかけた後にこのプロジェクトに戻ってくることになった将来の自分にも)明確で読みやすいものにするために不可欠なものです。

-

プログラミングのスタイルはたくさんあり、自分のスタイルがベストだと主張する人もいますが、実際には、一貫性を持って 使用し、すべてのものが何であり、何をしているかが明確 であれば、ほぼすべてのスタイルで問題ありません。

-

上の画像は、上記の点を説明するためのscript の関数宣言の例です。JSDoc スタイルのコメントを使って、何をするのかが明確に説明されていることがわかります。また、4 スペースでのインデント、ローカル変数に使用するアンダースコア、ログ出力など、コーディングスタイルが一貫していることもわかります。

-

また、script エディターでは、開閉ブラケットごとにコードを折りたたむことができますが、 #region#endregion タグを使ってコードの一部を区切り、特に複数の関数を含む大きなscripts を処理するときに、可読性を大幅に高めることができることに注意してください。リージョンはコメントも可能です。マニュアルのこのページの編集のセクションを参照してください)。

-

コードを書くときに注意しなければならないのは、GameMakerはコンパイル時にコメントを削除し、不要な改行や空白を取り除き、定数/マクロ/enum値を代入し、一般的にコードを圧縮していることです。つまり、コードの周りに必要なだけ空白を追加することができ、コメントを短くしたり、控えめにしたりすることを気にする必要がないのです。

+

+ コードを書くとなると、誰にでもスタイルがあります。そのスタイルとは、括弧の付け方、行のインデントの仕方、変数の宣言や名前の付け方などであり、あなたのコードを他の人に(そして、他のことに時間をかけた後にこのプロジェクトに戻ってくることになった将来の自分にも)明確で読みやすいものにするために不可欠なものです。 +

+

プログラミングのスタイルはたくさんあり、自分のスタイルがベストだと主張する人もいますが、実際には、一貫性を持って + 使用し、すべてのものが何であり、何をしているかが明確 であれば、ほぼすべてのスタイルで問題ありません。

+

上の画像は、上記の点を説明するためのscript の関数宣言の例です。JSDoc + スタイルのコメントを使って、何をするのかが明確に説明されていることがわかります。また、4 スペースでのインデント、ローカル変数に使用するアンダースコア、ログ出力など、コーディングスタイルが一貫していることもわかります。

+

また、script エディタでは、開閉ブラケットごとにコードを折りたたむことができますが、 #region#endregion タグを使ってコードの一部を区切り、特に複数の関数を含む大きなscripts + を処理するときに、可読性を大幅に高めることができることに注意してください。リージョンはコメントも可能です。マニュアルのこのページの編集のセクションを参照してください)。

+

コードを書くときに注意しなければならないのは、GameMakerはコンパイル時にコメントを削除し、不要な改行や空白を取り除き、定数/マクロ/enum値を代入し、一般的にコードを圧縮していることです。つまり、コードの周りに必要なだけ空白を追加することができ、コメントを短くしたり、控えめにしたりすることを気にする必要がないのです。 +

ローカル変数の使用

続けて、プログラミングのスタイルについてですが、多くの初心者がやってしまうことの一つに、1行のコードにできるだけ多くのことを詰め込むということがあります。例えば

-

draw_sprite(sprite_index, image_index, x + lengthdir_x(100, point_direction(x, y, mouse_x, mouse_y)), y + lengthdir_y(100, point_direction(x, y, mouse_x, mouse_y)));

-

全く読めないわけではありませんが、非効率的であり(例えば point_direction() 関数が2回呼び出されています)、見た目もゴチャゴチャしていますし、厄介です。次のように表現した方がはるかに良いだろう。

+

draw_sprite(sprite_index, image_index, x + lengthdir_x(100, point_direction(x, y, mouse_x, + mouse_y)), y + lengthdir_y(100, point_direction(x, y, mouse_x, mouse_y)));

+

全く読めないわけではありませんが、非効率的であり(例えば point_direction() + 関数が2回呼び出されています)、見た目もゴチャゴチャしていますし、厄介です。次のように表現した方がはるかに良いだろう。

var p_dir = point_direction(x, y, mouse_x, mouse_y);
var local_x = x + lengthdir_x(100, p_dir);
var local_y = y + lengthdir_y(100, p_dir);
draw_sprite(sprite_index, image_index, local_x, local_y);

-

ローカル変数を作成するために必要なメモリやリソースはごくわずかであり、その明快さによってあなた(あるいは後でコードを読む人)が即座に得られる利益よりもはるかに大きいのです。関数でも同じことが言えます。入力変数に適切な名前を付け、必要な箇所には明確な書式設定と局所変数を使用して、可能な限り読みやすいコードにする必要があります。

-

ローカル変数はゲーム内の処理が速いので、有効に活用しましょう。また、コードブロックやscript 、ある式が2回以上登場する場合は、その式のローカル変数を作成することを考えましょう。YoYo Compiler (YYC)ターゲットを使用する場合、関数やコードブロックの中で global やインスタンス変数を何度も参照する場合は、コードの先頭でローカル変数に代入し、そのローカル変数を参照すると、特にパフォーマンスが良くなります。

+

+ ローカル変数を作成するために必要なメモリやリソースはごくわずかであり、その明快さによってあなた(あるいは後でコードを読む人)が即座に得られる利益よりもはるかに大きいのです。関数でも同じことが言えます。入力変数に適切な名前を付け、必要な箇所には明確な書式設定と局所変数を使用して、可能な限り読みやすいコードにする必要があります。 +

+

ローカル変数はゲーム内の処理が速いので、有効に活用しましょう。また、コードブロックやscript + 、ある式が2回以上登場する場合は、その式のローカル変数を作成することを考えましょう。YoYo + Compiler (YYC)ターゲットを使用する場合、関数やコードブロックの中で global + やインスタンス変数を何度も参照する場合は、コードの先頭でローカル変数に代入し、そのローカル変数を参照すると、特にパフォーマンスが良くなります。

アレイ(配列

-

配列はデータ構造よりも高速で、必要なメモリ量も少なくて済みますが、さらに最適化することも可能です。配列を作成すると、そのサイズに応じてメモリが割り当てられます。したがって、たとえ後で値を入れる予定がなくても、まずは最大サイズまで配列を初期化するようにしましょう。たとえば、最大 100 個の値を格納する配列が必要だとわかっている場合は、すぐに 100 スロットに初期化します。 array_create()関数で初期化します。

+

配列はデータ構造よりも高速で、必要なメモリ量も少なくて済みますが、さらに最適化することも可能です。配列を作成すると、そのサイズに応じてメモリが割り当てられます。したがって、たとえ後で値を入れる予定がなくても、まずは最大サイズまで配列を初期化するようにしましょう。たとえば、最大 + 100 個の値を格納する配列が必要だとわかっている場合は、すぐに 100 スロットに初期化します。 array_create()関数で初期化します。

array = array_create(100, 0);

そうしないと、配列に新しい値を追加するたびに、メモリ全体を再割り当てしなければならないからです。

-

注意HTML5ターゲットでは、このような配列の代入は適用されず、配列は0から初期化される必要があります。例えば、os_browser変数をチェックすることで、簡単に処理することができます。

+

注意HTML5ターゲットでは、このような配列の代入は適用されず、配列は0から初期化される必要があります。例えば、os_browser変数をチェックすることで、簡単に処理することができます。 +

if (os_browser == browser_not_a_browser)
{
    array_create(100, 0);
@@ -62,8 +91,11 @@

プログラミングのベストプラクティス

}

また、配列に関連するメモリを解放するには、使用する変数に0を設定します。したがって、上記のコード例で配列をクリアするには、単に

array = 0;

-

また、配列は参照渡しですが、変更があったときに全体をコピーすることに注意してください(この動作をcopy on write と呼びます)。つまり、配列を関数に渡す場合は元の配列への参照を 渡すことになり、そこから読み込まれる値はすべて元の配列から取得されることになります。しかし、配列の値を変更する必要がある場合は、 書き込みの時点で配列が複製されてしまうので、関数から値を返さなければ変更した内容が失われてしまいます。そのため、関数内での配列の使用には注意が必要です。

-

しかし、特殊な配列アクセッサ @ を使用することで、書き込み時のコピー動作を回避することができます。例えば

+

また、配列は参照渡しですが、変更があったときに全体をコピーすることに注意してください(この動作をcopy on write + と呼びます)。つまり、配列を関数に渡す場合は元の配列への参照を 渡すことになり、そこから読み込まれる値はすべて元の配列から取得されることになります。しかし、配列の値を変更する必要がある場合は、 + 書き込みの時点で配列が複製されてしまうので、関数から値を返さなければ変更した内容が失われてしまいます。そのため、関数内での配列の使用には注意が必要です。

+

しかし、特殊な配列アクセッサ @ を使用することで、書き込み時のコピー動作を回避することができます。例えば

// Call a function, passing our array
my_function(my_array);

// The function looks like this:
@@ -83,30 +115,68 @@

プログラミングのベストプラクティス

データ構造

-

GameMakerの データ構造は、以前のバージョン(GameMaker )よりもずっと高速になるように最適化されています。しかし、データ構造の使いやすさと、データを扱うための追加機能は、最小限の速度差に勝ることが多いので、恐れずにゲームに使ってください。

+

GameMakerの データ構造は、以前のバージョン(GameMaker + )よりもずっと高速になるように最適化されています。しかし、データ構造の使いやすさと、データを扱うための追加機能は、最小限の速度差に勝ることが多いので、恐れずにゲームに使ってください。

すべてのデータ構造の中で、特にDS Mapsは読み込みも書き込みも高速で、あらゆるタイプのタスクに最適な選択肢となることに注目すべきだろう。

-

前回は配列に対するアクセサを紹介しましたが、データ構造に対しても利用可能で、コードをすっきりさせて読みやすくすることができます。

+

前回は配列に対するアクセサを紹介しましたが、データ構造に対しても利用可能で、コードをすっきりさせて読みやすくすることができます。 +

衝突

-

GameMaker には衝突を処理する方法が複数ありますが、そのほとんどは CPU のオー バーヘッドを少し余分に必要とします。 collision_point_ 関数、 place_ 関数、 instance_ 関数はすべて、room 内の与えられたタイプのすべてのインスタンスとのバウンディングボックスチェックに依存しています。これらのチェックを制限するために、エンジンにいくつかの最適化が組み込まれていますが、衝突は決して最も効率的に処理されるものではあり ません。正確なコリジョンを使用し始めると、パフォーマンスが著しく悪化します。バウンディングボックスチェックだけでなく、ピクセル単位のチェックも行うことになり、これは実に遅いのです。

+

GameMaker には衝突を処理する方法が複数ありますが、そのほとんどは + CPU のオー バーヘッドを少し余分に必要とします。 collision_point_ 関数、 place_ 関数、 instance_ 関数はすべて、room 内の与えられたタイプのすべてのインスタンスとのバウンディングボックスチェックに依存しています。これらのチェックを制限するために、エンジンにいくつかの最適化が組み込まれていますが、衝突は決して最も効率的に処理されるものではあり + ません。正確なコリジョンを使用し始めると、パフォーマンスが著しく悪化します。バウンディングボックスチェックだけでなく、ピクセル単位のチェックも行うことになり、これは実に遅いのです。

-

これらの機能はとても便利なので、使ってはいけないというわけではありません。しかし、どの関数をいつ使うかは知っておく必要があります。というのも、これらの関数はそれぞれ微妙に動作が異なり、速度も異なるからです。大まかな目安としては、 place_ 関数は instance_ 関数より速く、 collision_ および point_ 関数より速くなります。マニュアルのそれぞれのタイプの関数のページを読み、あらゆる状況に最も適したものを選択するようにしてください。

-

タイル ベースのコリジョンシステムはタイルマップ関数やカスタム2D配列、DSグリッドを使用して作成することも可能です。これらは非常に高速で、ゲームの速度を向上させるのに役立ちます。ただし、不規則な地形や壁、objects を使用していて、グリッドに整列していない場合は、適切でない可能性があります。タイルマップの衝突に関する非常に簡単なチュートリアルは、次のビデオリンクから参照できます。

+

+ これらの関数はとても便利なので、使ってはいけないというわけではありません。しかし、どの関数をいつ使うかは知っておく必要があります。というのも、これらの関数はそれぞれ微妙に動作が異なり、速度も異なるからです。大まかな目安としては、 + place_ 関数は instance_ 関数より速く、 collision_ および point_ + 関数より速くなります。マニュアルのそれぞれのタイプの関数のページを読み、あらゆる状況に最も適したものを選択するようにしてください。 +

+

タイル ベースのコリジョンシステムはタイルマップ関数やカスタム2D配列、DSグリッドを使用して作成することも可能です。これらは非常に高速で、ゲームの速度を向上させるのに役立ちます。ただし、不規則な地形や壁、objects + を使用していて、グリッドに整列していない場合は、適切でない可能性があります。タイルマップの衝突に関する非常に簡単なチュートリアルは、次のビデオリンクから参照できます。

テクスチャスワップとバーテックスバッチ

-

switchデバッグオーバーレイをクリックすると、テスト時に画面の上部に括弧で囲まれた2つの数値が表示されるのがわかると思います。1 つは実行中のテクスチャスワップの 数で、もう 1 つは頂点バッチの数です。これらの数値にはさまざまな要因が影響し、エンジンはすべてのステップでそれぞれ1つか2つを必要とするので、これらを (0) (0) にすることはできませんが、これらの値をできる限り低くすることを目指す必要があります。

-

texture のスワップでは、 と背景が ページに保存される方法を最適化するのが、最も効率的な方法です。これはsprites texture スプライトプロパティから行います。また、テクスチャグループエディタで texture ページを作成することができます。例えば、メインメニューにしか使わない画像が多数ある場合、それらを別のテクスチャページにまとめます。レベル固有の画像や、プレイヤーと敵などの画像がある場合も同じです。基本的には用途別にまとめて、なるべくスワップを減らしたいところです。さらに、VRAM を最適化するために、異なるプリフェッチとフラッシュ機能 を使って、必要に応じてメモリから をロードしたり、 削除したりすることができます。textures

-

注意このページの冒頭で述べたように、ゲームが適切な FPS で問題なく動作するのであれば、texture の交換についてあまり気にする必要はありません... 特にデスクトップターゲットでプロジェクトを作成する場合は。これらの最適化は、大規模なゲームやローエンドモバイルデバイスで使用する場合に最適で、間違った使い方をすると、実際にパフォーマンスに悪影響を与える可能性があります。

-

頂点情報は描画のために GPU に「バッチ」で送られ、一般にバッチは大き い方が良い。したがって、描画時にバッチを「壊す」ことは避けるべきで、そうす ると GPU に送られる頂点のバッチの数が増えるからです。バッチを壊すものはいくつかあり、主なものは、ブレンドモードシェー ダの変更、何かを描く前にshader のユニフォームを変更する、内蔵のシェイプ とプリミティブを使用して描く、などです。

-

ですから、例えば、 bm_add のブレンドモードを使って描画する弾丸インスタンスが多数ある場合、それぞれの弾丸に対して新しいvertex batch を作成することになり、これは間違いなく悪いことです!代わりに、ゲーム内で、すべての弾丸を描画するコントローラobject を、次のように用意します。

+

switchデバッグオーバーレイをクリックすると、テスト時に画面の上部に括弧で囲まれた2つの数値が表示されるのがわかると思います。1 + つは実行中のテクスチャスワップの 数で、もう 1 + つは頂点バッチの数です。これらの数値にはさまざまな要因が影響し、エンジンはすべてのステップでそれぞれ1つか2つを必要とするので、これらを (0) (0) + にすることはできませんが、これらの値をできる限り低くすることを目指す必要があります。

+

texture のスワップでは、 と背景が + ページに保存される方法を最適化するのが、最も効率的な方法です。これはsprites texture スプライトプロパティから行います。また、テクスチャグループエディタで texture + ページを作成することができます。例えば、メインメニューにしか使わない画像が多数ある場合、それらを別のテクスチャページにまとめます。レベル固有の画像や、プレイヤーと敵などの画像がある場合も同じです。基本的には用途別にまとめて、なるべくスワップを減らしたいところです。さらに、VRAM を最適化するために、異なるプリフェッチとフラッシュ機能 を使って、必要に応じてメモリから + をロードしたり、 削除したりすることができます。textures

+

注意このページの冒頭で述べたように、ゲームが適切な FPS で問題なく動作するのであれば、texture の交換についてあまり気にする必要はありません... + 特にデスクトップターゲットでプロジェクトを作成する場合は。これらの最適化は、大規模なゲームやローエンドモバイルデバイスで使用する場合に最適で、間違った使い方をすると、実際にパフォーマンスに悪影響を与える可能性があります。

+

頂点情報は描画のために GPU に「バッチ」で送られ、一般にバッチは大き い方が良い。したがって、描画時にバッチを「壊す」ことは避けるべきで、そうす ると GPU + に送られる頂点のバッチの数が増えるからです。バッチを壊すものはいくつかあり、主なものは、ブレンドモードシェー ダの変更、何かを描く前にshader のユニフォームを変更する、内蔵のシェイプ とプリミティブを使用して描く、などです。

+

ですから、例えば、 bm_add のブレンドモードを使って描画する弾丸インスタンスが多数ある場合、それぞれの弾丸に対して新しいvertex batch を作成することになり、これは間違いなく悪いことです!代わりに、ゲーム内で、すべての弾丸を描画するコントローラobject を、次のように用意します。

gpu_set_blendmode(bm_add);

with (obj_BULLET)
@@ -116,25 +186,60 @@

プログラミングのベストプラクティス


gpu_set_blendmode(bm_normal);

-

:これはbm_addを使用する場合にのみ適用されるわけではありません - ブレンドを変更するとバッチが壊れ、パフォーマンスが低下します。

-

こうすることで、すべての弾が一括で描画されるようになります。関数をうまく使う gpu_set_blendenable(), gpu_set_alphatestref()gpu_set_alphatestenable()をうまく使えば、パフォーマンスが大幅に向上し、プロジェクトコード全体で必要に応じて有効/無効を切り替えることができます。ただし、すべての種類のグラフィックスやプロジェクトに適しているわけではありません。

-

注意この方法でコントローラを使用する際に、インスタンス自体の描画を必要としない場合は、単に描画イベントにコメントを追加してデフォルトの描画を抑制するか、インスタンスを不可視にします (ただし、これによりすべての描画イベントでインスタンスに対して実行されるすべてのコードが無効になります)。

-

これらの数を減らすもう一つの方法は、絶対に必要でない限り、Texture の「Separatesprites Page」オプションを無効にすることです。この方法で保存された各画像は独自のtexture ページに送られ、異なるバッチ処理が行われるため、これらの画像を通常のtexture ページに置く方がよいのです。次に、UVS 座標を sprite_get_uvs()関数を使って UVS 座標を取得し、変数に保存して後で使用することができます。わずかな追加コードかもしれませんが、得られるブーストはそれに見合うものです。この方法はtexture の繰り返しを許可しないことに注意してください!

+

:これはbm_addを使用する場合にのみ適用されるわけではありません - ブレンドを変更するとバッチが壊れ、パフォーマンスが低下します。

+

こうすることで、すべての弾が一括で描画されるようになります。関数をうまく使う gpu_set_blendenable(), gpu_set_alphatestref()gpu_set_alphatestenable()をうまく使えば、パフォーマンスが大幅に向上し、プロジェクトコード全体で必要に応じて有効/無効を切り替えることができます。ただし、すべての種類のグラフィックスやプロジェクトに適しているわけではありません。 +

+

注意この方法でコントローラを使用する際に、インスタンス自体の描画を必要としない場合は、単に描画イベントにコメントを追加してデフォルトの描画を抑制するか、インスタンスを不可視にします + (ただし、これによりすべての描画イベントでインスタンスに対して実行されるすべてのコードが無効になります)。

+

これらの数を減らすもう一つの方法は、絶対に必要でない限り、Texture の「Separatesprites Page」オプションを無効にすることです。この方法で保存された各画像は独自のtexture ページに送られ、異なるバッチ処理が行われるため、これらの画像を通常のtexture + ページに置く方がよいのです。次に、UVS 座標を sprite_get_uvs()関数を使って UVS + 座標を取得し、変数に保存して後で使用することができます。わずかな追加コードかもしれませんが、得られるブーストはそれに見合うものです。この方法はtexture + の繰り返しを許可しないことに注意してください!

これらのヒントと同様に、変更することで生活が苦しくなり、ゲームが正常に動作するのであれば、あまり気にする必要はありません...。

-

粒子

+

パーティクル

-

パーティクルは、ゲーム内でダイナミックなエフェクトを作成するための非常に迅速かつ効率的な方法を提供し、一般的に良好なパフォーマンスを発揮します。しかし、パーティクル上で加算ブレンディング、アルファブレンディング、カラーブレンディングを使用すると、特にモバイルターゲットではパフォーマンスが低下することがあるので、必要ない場合は使用しないでください。特に、アディティブブレンディングは、頂点バッチを大幅に増加させる可能性があるので、注意して使用する必要があります。

-

非 WebGL の HTML5 ターゲットでは、マルチカラーでフェードするパーティクルを使用すると、多くの画像キャッシュが必要となり、非常に遅くなることに注意してください。しかし、パーティクルsprites はアニメーションさせることができるので、色が変化するサブ画像を持つアニメーションsprite を作成し、それをパーティクルに使用することができます。この場合でも、色が徐々に変化するように見えますが、cache の画像を常に作成する必要はありません。

-

パーティクルについては、Guide To Using Particlesのページで詳しく説明されています。

+

パーティクルは、ゲーム内でダイナミックなエフェクトを作成するための非常に迅速かつ効率的な方法を提供し、一般的に良好なパフォーマンスを発揮します。しかし、パーティクル上で加算ブレンディング、アルファブレンディング、カラーブレンディングを使用すると、特にモバイルターゲットではパフォーマンスが低下することがあるので、必要ない場合は使用しないでください。特に、アディティブブレンディングは、頂点バッチを大幅に増加させる可能性があるので、注意して使用する必要があります。 +

+

非 WebGL の HTML5 + ターゲットでは、マルチカラーでフェードするパーティクルを使用すると、多くの画像キャッシュが必要となり、非常に遅くなることに注意してください。しかし、パーティクルsprites はアニメーションさせることができるので、色が変化するサブ画像を持つアニメーションsprite を作成し、それをパーティクルに使用することができます。この場合でも、色が徐々に変化するように見えますが、cache の画像を常に作成する必要はありません。

+

パーティクルについては、Guide To Using Particlesのページで詳しく説明されています。 +

サーフェス

-

最後に、サーフェスの使用について簡単に触れます。GameMakerでは、サーフェスをゲームに使用する際にかなり重要な最適化が行われています。switch 深度バッファのオンとオフが可能です。

-

サーフェスを普通に使うと、GameMakerはサーフェスとそれに付随する深度buffer を実際に作成し、3D で何かを描くときに適切な深度ソートを確保します。しかし、ほとんどの2Dゲームでは、この余分な深度buffer は必要ないため、他のことに使えるはずのメモリスペースと処理時間を余計に消費しています。そこで、この関数 surface_depth_disable()が登場するのです...

-

この関数は、サーフェスを作成する前に呼び出すと、深度buffer の生成を無効にすることができ、その後に作成されたすべてのサーフェスには、深度buffer が作成されません。この関数は必要に応じて有効/無効にでき、ゲームの開始時に一度だけ呼び出して、それ以降のすべてのサーフェス呼び出しで深度buffers を無効にすることもできます(そしてほとんどの2Dゲームではこれで問題ありません)。この機能によってパフォーマンスが大幅に向上することはありませんが、サーフェスを多用するゲームでは覚えておくとよいでしょう。また、低スペックのデバイスでゲームがメモリ不足になるのを防ぐことができるかもしれません。

+

最後に、サーフェスの使用について簡単に触れます。GameMakerでは、サーフェスをゲームに使用する際にかなり重要な最適化が行われています。switch 深度バッファのオンとオフが可能です。

+

サーフェスを普通に使うと、GameMakerはサーフェスとそれに付随する深度buffer を実際に作成し、3D で何かを描くときに適切な深度ソートを確保します。しかし、ほとんどの2Dゲームでは、この余分な深度buffer は必要ないため、他のことに使えるはずのメモリスペースと処理時間を余計に消費しています。そこで、この関数 surface_depth_disable()が登場するのです...

+

この関数は、サーフェスを作成する前に呼び出すと、深度buffer + の生成を無効にすることができ、その後に作成されたすべてのサーフェスには、深度buffer + が作成されません。この関数は必要に応じて有効/無効にでき、ゲームの開始時に一度だけ呼び出して、それ以降のすべてのサーフェス呼び出しで深度buffers + を無効にすることもできます(そしてほとんどの2Dゲームではこれで問題ありません)。この機能によってパフォーマンスが大幅に向上することはありませんが、サーフェスを多用するゲームでは覚えておくとよいでしょう。また、低スペックのデバイスでゲームがメモリ不足になるのを防ぐことができるかもしれません。 +

上記の主なものとは別に、パフォーマンスを向上させる、より一般的なものもあり、それも「グッドプラクティス」とされています。

@@ -143,18 +248,20 @@

プログラミングのベストプラクティス

  • Drawイベントに描画以外のコードを書かない
  • アラームを使用して、毎ステップ呼び出される必要のないコードを呼び出す(むしろ、これをステップイベントに追加する)。
  • -

    しかし、このページの冒頭で述べたように、これらの最適化はすべてオプションであり、もしあなたのゲームが60頂点バッチ、80texture スワップ、加算ブレンディングなどでうまく動くなら、あまり気にする必要はありません!次のゲームをプログラミングするときに、これらのことを心に留めておいてください...

    +

    しかし、このページの冒頭で述べたように、これらの最適化はすべてオプションであり、もしあなたのゲームが60頂点バッチ、80texture + スワップ、加算ブレンディングなどでうまく動くなら、あまり気にする必要はありません!次のゲームをプログラミングするときに、これらのことを心に留めておいてください...

    + \ No newline at end of file diff --git a/Manual/contents/Additional_Information/Bitwise_Operators.htm b/Manual/contents/Additional_Information/Bitwise_Operators.htm index 3fb650158..3300e57ac 100644 --- a/Manual/contents/Additional_Information/Bitwise_Operators.htm +++ b/Manual/contents/Additional_Information/Bitwise_Operators.htm @@ -1,6 +1,7 @@ + ビット演算子 @@ -12,18 +13,26 @@ +

    ビット演算子と二項演算子

    -

    コンピュータ時代の初期には、2進数や 16進数(hexadecimal)が主流であった。おそらく、高レベル言語(BASICなど)の実行速度が単に遅かったからであろう。例えば、32×32の掛け算は、BASICではCPUサイクルを何回もかけて実現していたかもしれないが、2進数では1CPUサイクルで1つの演算として行われる。

    -

    なぜなら、マシンのスピードと、より複雑なCPU構造が、このアプローチの欠点を補ってくれるからです。もちろん、これはあなたが書くコードのすべての行を最適化する必要がないことを意味するので、素晴らしいニュースですが、これが事実であれば - あなたは本当に全くバイナリについて気にする必要がありますか?

    -

    答えは間違いなく「イエス、そうすべき」です。バイナリやヘックスを使うことで、CPUがどのように動作しているかをより深く理解することができ、より良いコードを書いたり、データをうまくパックしたり、いくつかの作業をよりシンプルにしたりすることができます。このページでは、バイナリとは何か、そしてゲームを作るときにどのように使うことができるのかについて、少し説明します。

    +

    コンピュータ時代の初期には、2進数や + 16進数(hexadecimal)が主流であった。おそらく、高レベル言語(BASICなど)の実行速度が単に遅かったからであろう。例えば、32×32の掛け算は、BASICではCPUサイクルを何回もかけて実現していたかもしれないが、2進数では1CPUサイクルで1つの演算として行われる。 +

    +

    なぜなら、マシンのスピードと、より複雑なCPU構造が、このアプローチの欠点を補ってくれるからです。もちろん、これはあなたが書くコードのすべての行を最適化する必要がないことを意味するので、素晴らしいニュースですが、これが事実であれば + - あなたは本当に全くバイナリについて気にする必要がありますか?

    +

    + 答えは間違いなく「イエス、そうすべき」です。バイナリやヘックスを使うことで、CPUがどのように動作しているかをより深く理解することができ、より良いコードを書いたり、データをうまくパックしたり、いくつかの作業をよりシンプルにしたりすることができます。このページでは、バイナリとは何か、そしてゲームを作るときにどのように使うことができるのかについて、少し説明します。 +

    そこで、まず最も基本的な二進法の理論、つまり数字がどのように作られるかを見てみましょう。この表を見てください。

    000 = 0
    001 = 1
    010 = 2
    100 = 4

    -

    それぞれの1または0はデータの1ビットを表し、これはご覧の通り、2進数では10が2に相当することを意味します!(※1)。つまり、ビット2=2、ビット3=4、ビット4=8といった具合です(このバイト表は下図に示すとおり)。

    +

    それぞれの1または0はデータの1ビットを表し、これはご覧の通り、2進数では10が2に相当することを意味します!(※1)。つまり、ビット2=2、ビット3=4、ビット4=8といった具合です(このバイト表は下図に示すとおり)。

    00000001 = 1
    00000010 = 2
    00000100 = 4
    @@ -32,18 +41,34 @@

    ビット演算子と二項演算子

    00100000 = 32
    01000000 = 64
    10000000 = 128

    -

    2の累乗の数字ならそれでもいいが、もっと複雑な数字を作るにはどうしたらいいのだろう。2進数には0か1しか格納できないので、より複雑な数を作るには、ビットを足し合わせる必要があります。例えば6を作りたい場合、4と2を足すとこうなります。

    +

    + 2の累乗の数字ならそれでもいいが、もっと複雑な数字を作るにはどうしたらいいのだろう。2進数には0か1しか格納できないので、より複雑な数を作るには、ビットを足し合わせる必要があります。例えば6を作りたい場合、4と2を足すとこうなります。 +

    00000010 = 2
    00000100 = 4
    00000110 = 6

    -

    これは、すべての 2進数について言えることで、コンピュータが内部でどのように数字を構成しているかということである。もう少し複雑な数字、23を例にとってみよう。23という数字は、実際には、 1+2+4+16 または 00010111 で構成されています。もっと複雑な例として、196はどうでしょうか?これは、 128+64+4 または 11000100 で構成されています。

    -

    しかし、1バイトの範囲外の値(0から255までの数値を格納可能)を扱うようになると、追跡が少し難しくなってきます。例えば、217,361は2進数で 110101000100010001 。あるいは、 1+16+256+etc... どのような値を表現する場合でもルールは同じで、各数値は複数のビットを加算して作られます。

    -

    さて、これらの値に対して、どのように数学的な演算を行うのでしょうか。例えば、 true または false を値として格納したいとします。通常、コンパイラは INT ( INT は通常符号付き 32 ビット数として定義されます。符号付きとは正負の値を取れるということで、符号なしとは正しか取れないということです) を使って、単純に 0 または 1 に代入します。2つの状態しか持たない true / false の値はビットに格納するのに最適です。そうすれば INT それぞれに対して 1 ビットだけではなく 32 true / false ビットを格納できます。これは、1 INT が 32 ビットからできていることと同じです。

    +

    これは、すべての 2進数について言えることで、コンピュータが内部でどのように数字を構成しているかということである。もう少し複雑な数字、23を例にとってみよう。23という数字は、実際には、 + 1+2+4+16 または 00010111 で構成されています。もっと複雑な例として、196はどうでしょうか?これは、 + 128+64+4 または 11000100 で構成されています。 +

    +

    しかし、1バイトの範囲外の値(0から255までの数値を格納可能)を扱うようになると、追跡が少し難しくなってきます。例えば、217,361は2進数で 110101000100010001 。あるいは、 1+16+256+etc... + どのような値を表現する場合でもルールは同じで、各数値は複数のビットを加算して作られます。

    +

    さて、これらの値に対して、どのように数学的な演算を行うのでしょうか。例えば、 true または false + を値として格納したいとします。通常、コンパイラは INT ( INT は通常符号付き 32 + ビット数として定義されます。符号付きとは正負の値を取れるということで、符号なしとは正しか取れないということです) を使って、単純に 0 または 1 に代入します。2つの状態しか持たない true / false + の値はビットに格納するのに最適です。そうすれば INT それぞれに対して 1 ビットだけではなく 32 true / + false ビットを格納できます。これは、1 INT が 32 ビットからできていることと同じです。 +

    どうすればいいのか?それは、とても簡単なことです。

    flags = flags | 1;

    -

    |" 演算子はビット演算です。 OR 、これは上記の命令 ORs 1 を変数 flags に保持されている値に変換することを意味します。先ほどから覚えているように、1を使うと最初のビットが設定されます。もし2番目のビットを設定したい場合は、次のようにします。

    +

    |" 演算子はビット演算です。 OR 、これは上記の命令 ORs 1 を変数 flags + に保持されている値に変換することを意味します。先ほどから覚えているように、1を使うと最初のビットが設定されます。もし2番目のビットを設定したい場合は、次のようにします。

    flags = flags | 2;

    -

    ビットパターン 00000010 は 2 に等しいので、2 で OR となります。では、二項演算子 OR はいったい何をするのでしょうか?このように、すべてのビットを1つの値に統合するのです。

    +

    ビットパターン 00000010 は 2 に等しいので、2 で OR となります。では、二項演算子 OR はいったい何をするのでしょうか?このように、すべてのビットを1つの値に統合するのです。

    010110100 // Value 1
    110011001 // value 2
    110111101 // Value 1 OR Value 2

    @@ -52,10 +77,15 @@

    ビット演算子と二項演算子

    00 | 01 = 01
    01 | 01 = 01
    01 | 00 = 01

    -

    つまり、ゼロが2つある値では、ゼロのままです。このようなビットを true/false の状態として使用する利点は、一度の操作で複数のビットを「フラグ」として設定できることです。例えば、ビット1が「active」flag で、ビット3が「visible」flag であるとする。このようにすることで、両方を設定することができます。

    +

    つまり、ゼロが2つある値では、ゼロのままです。このようなビットを true/false + の状態として使用する利点は、一度の操作で複数のビットを「フラグ」として設定できることです。例えば、ビット1が「active」flag + で、ビット3が「visible」flag であるとする。このようにすることで、両方を設定することができます。

    flags = flags | 5;

    -

    これは、5が2進数で 00000101 、上記のルールに従って、変数 "flags "はこれら2つのビットを自分のものと統合されるからです。したがって、ビット1がすでにセットされていたとしても、この操作は有効で、ビット3もセットされることになる。

    -

    flags をクリアするのは?ここで、ビット単位の "&"AND オペレーションが登場するわけです。 AND の場合、マスクで設定されたビットは保持され、マスクでクリアされたビットは削除されます - このように。

    +

    これは、5が2進数で 00000101 、上記のルールに従って、変数 "flags + "はこれら2つのビットを自分のものと統合されるからです。したがって、ビット1がすでにセットされていたとしても、この操作は有効で、ビット3もセットされることになる。

    +

    flags をクリアするのは?ここで、ビット単位の "&"AND オペレーションが登場するわけです。 AND + の場合、マスクで設定されたビットは保持され、マスクでクリアされたビットは削除されます - このように。

    01110010101 // Value 1
    00110000100 // Value 2
    00110000100 // Value 1 AND value 2

    @@ -64,42 +94,70 @@

    ビット演算子と二項演算子

    01 & 00 = 00
    00 & 01 = 00
    01 & 01 = 01

    -

    だから、それぞれの場所にビットがあるときだけ、キープされる。これはどういうことかというと、複数のflags を一度に設定できるのと同じように、複数のflags を一度にクリアすることもできるのです。例えば、上のようなケースで、今度はクリアしてみましょう。ビット1と3をクリア(値5を与える)したいのですが、上の真理値表を思い出すと、やりたいことは、他のビットを全部残して、ビット1と3をクリアすることです。これは1111111111111111111111010(32ビット)のバイナリ「マスク」になります。このマスクは、現在設定されているすべてのビットを保持し、実際にクリアしたい2つのビットをクリアします。つまり、1000111011という値があって、上記のマスクを使ってビット1と3をクリアしたい場合、以下のようになります。

    +

    だから、それぞれの場所にビットがあるときだけ、キープされる。これはどういうことかというと、複数のflags を一度に設定できるのと同じように、複数のflags + を一度にクリアすることもできるのです。例えば、上のようなケースで、今度はクリアしてみましょう。ビット1と3をクリア(値5を与える)したいのですが、上の真理値表を思い出すと、やりたいことは、他のビットを全部残して、ビット1と3をクリアすることです。これは1111111111111111111111010(32ビット)のバイナリ「マスク」になります。このマスクは、現在設定されているすべてのビットを保持し、実際にクリアしたい2つのビットをクリアします。つまり、1000111011という値があって、上記のマスクを使ってビット1と3をクリアしたい場合、以下のようになります。 +

    00000000000000000000001000111011 // Value
    11111111111111111111111111111010 // Mask
    00000000000000000000001000111010 // Value AND Mask

    -

    これは素晴らしいことですが、flags をクリアする必要があるたびにこの作業をしなければならないとしたら、うんざりしてしまうでしょう。必要なのは、ビットを簡単に(できればCPUコストをかけずに)反転させる方法です。幸いなことに、" ~" NOT 演算子を使えば、簡単にこれを行う方法がある。

    -

    NOT 演算子はその名の通り、これらのビットではありません。以下は、 NOT の真理値表です。

    +

    これは素晴らしいことですが、flags + をクリアする必要があるたびにこの作業をしなければならないとしたら、うんざりしてしまうでしょう。必要なのは、ビットを簡単に(できればCPUコストをかけずに)反転させる方法です。幸いなことに、" ~" NOT 演算子を使えば、簡単にこれを行う方法がある。

    +

    NOT 演算子はその名の通り、これらのビットではありません。以下は、 NOT の真理値表です。 +

    ~00 = 11
    ~01 = 10
    ~10 = 01
    ~11 = 00

    -

    この演算子を使うと、flags の削除が非常に簡単になります。さらに、通常はコンパイル時の最適化で、定数(つまり変数ではない)を使っている場合は、コンパイラが自動的にビットを反転させるようになっているのです。この例では、ビット1と3を再びクリアします。

    +

    この演算子を使うと、flags + の削除が非常に簡単になります。さらに、通常はコンパイル時の最適化で、定数(つまり変数ではない)を使っている場合は、コンパイラが自動的にビットを反転させるようになっているのです。この例では、ビット1と3を再びクリアします。

    a = a & ~5;

    -

    この場合、実際には"a & 11111111111111111111111111111010"だけにコンパイルされます。これによって、flags をクリアするという点では、かなりシンプルになります。

    -

    最後に見ておきたい演算子は "^" EOR (Exclusive OR, 時には XOR) です。この演算子は両方の値に設定されているビットを反転させます。以下は、 EOR の真理値表です。

    +

    この場合、実際には"a & 11111111111111111111111111111010"だけにコンパイルされます。これによって、flags をクリアするという点では、かなりシンプルになります。

    +

    最後に見ておきたい演算子は "^" EOR (Exclusive OR, 時には XOR) です。この演算子は両方の値に設定されているビットを反転させます。以下は、 + EOR の真理値表です。 +

    0 ^ 0 = 0
    0 ^ 1 = 1
    1 ^ 0 = 1
    1 ^ 1 = 0

    -

    これは不思議なことですが、信じられないほど便利です。例えば、単純に0から1にカウントして0に戻る(0と1の間をトグルする)カウンターが欲しいとします。1つ追加して、 IF 、2になったかどうかを確認し、リセットして1に戻すということができます。あるいは...1個追加して、1個で AND ( 01+01 = 10, and 10 & 01 = 0 以降)、あるいはこうすることもできますね。

    +

    これは不思議なことですが、信じられないほど便利です。例えば、単純に0から1にカウントして0に戻る(0と1の間をトグルする)カウンターが欲しいとします。1つ追加して、 IF + 、2になったかどうかを確認し、リセットして1に戻すということができます。あるいは...1個追加して、1個で AND ( 01+01 = + 10, and 10 & 01 = 0 以降)、あるいはこうすることもできますね。

    a = a ^ 1;

    -

    これは、1回目の実行時に 0 ^ 1 = 1 、2回目に 1 ^ 1 = 0 、それによって0から1へトグルで切り替わります。

    -

    OR (|)、 AND(&)、 NOT(~)、 EOR(^) では、比較的簡単にビットを操作でき、最も単純なレベルでは、複数のビットを一度に制御することが可能です。sprites のマスク、 MOD の整数演算( AND を使用)、ループカウンタなど、ゲームを開発する際にこれらの演算を使用できることは明らかです。

    -

    では、単純なビット演算はできるのですが、もっと複雑なものを見てみましょう。まず、「コンピュータの足し算はどうなっているのか」という疑問からです。非常に簡単な例を見てみましょう。 1+1.

    +

    これは、1回目の実行時に 0 ^ 1 = 1 、2回目に 1 ^ 1 = 0 + 、それによって0から1へトグルで切り替わります。

    +

    OR (|)、 AND(&)、 NOT(~)、 EOR(^) では、比較的簡単にビットを操作でき、最も単純なレベルでは、複数のビットを一度に制御することが可能です。sprites のマスク、 MOD の整数演算( AND + を使用)、ループカウンタなど、ゲームを開発する際にこれらの演算を使用できることは明らかです。

    +

    では、単純なビット演算はできるのですが、もっと複雑なものを見てみましょう。まず、「コンピュータの足し算はどうなっているのか」という疑問からです。非常に簡単な例を見てみましょう。 1+1.

    00000001
    00000001
    00000010

    -

    普通の足し算と同じように、数字を足し合わせて、次の列にオーバーフローさせるのですが、普通の10進数の足し算と違って、0から1までしかできず、0から9まではできないのです。つまり、 1+1 を足すと、オーバーフローして 10 になります。では、もっと複雑な例を見てみましょう。

    +

    普通の足し算と同じように、数字を足し合わせて、次の列にオーバーフローさせるのですが、普通の10進数の足し算と違って、0から1までしかできず、0から9まではできないのです。つまり、 1+1 を足すと、オーバーフローして 10 になります。では、もっと複雑な例を見てみましょう。

    01011011 = 91
    00101101 = 45
    10001000 = 136

    -

    ここでは明らかに見づらいですが、オーバーフローは列の中に1がなくなるまで波及します。注目すべきは、コンピュータは一度に2つの数しか加算(または減算、乗算、除算)できないことです。例えば 19 + 19 + 19 。人間であれば、9を全部足して、2を足し、さらに続けることができます。しかし、コンピュータにはそれができません。コンピュータにできるのは、次のようなことです: (19 + 19) + 19.だから、コンピュータは2つのブロックに分かれて計算をするのです。

    -

    プログラマーとして最も関心のある2進数の計算は、掛け算と割り算です。コンピュータは2進数の掛け算しかしませんし、それ以上のことをするには、数字をバラバラにして、その結果をすべて足し算します。まず、非常に簡単な例を挙げてみよう。 4 * 2 = 8.さて、2進数で2を掛けるには、すべてのビットを1つ左にシフト します。こんな感じです。

    +

    ここでは明らかに見づらいですが、オーバーフローは列の中に1がなくなるまで波及します。注目すべきは、コンピュータは一度に2つの数しか加算(または減算、乗算、除算)できないことです。例えば 19 + 19 + 19 + 。人間であれば、9を全部足して、2を足し、さらに続けることができます。しかし、コンピュータにはそれができません。コンピュータにできるのは、次のようなことです: (19 + 19) + + 19.だから、コンピュータは2つのブロックに分かれて計算をするのです。

    +

    プログラマーとして最も関心のある2進数の計算は、掛け算と割り算です。コンピュータは2進数の掛け算しかしませんし、それ以上のことをするには、数字をバラバラにして、その結果をすべて足し算します。まず、非常に簡単な例を挙げてみよう。 + 4 * 2 = 8.さて、2進数で2を掛けるには、すべてのビットを1つ左にシフト します。こんな感じです。 +

    00000100 * 2 = 00001000 = 8

    この場合、すべてのビットが1つ左に移動し、3ビット目から4ビット目に移動し、値が4から8に変化しているのです。もっと大きな数字ではどうでしょう?

    101 = 01100101 * 2 = 11001010 = 202

    -

    ここでも、すべてのビットが1つずつ移動し、2の倍数になります。では、4の倍数はどうでしょうか。簡単です。すべてのビットを1つずつではなく、2つずつ左に移動させるのです。では、16倍、つまり128倍はどうでしょう?この場合、それぞれ4ビット、7ビットの左シフトが必要です。これは非常に便利なことで、ビットを移動させるだけで簡単な乗算ができるようになります。これを実現するために、左シフト演算子 << を使用します。以下はその例です。

    +

    + ここでも、すべてのビットが1つずつ移動し、2の倍数になります。では、4の倍数はどうでしょうか。簡単です。すべてのビットを1つずつではなく、2つずつ左に移動させるのです。では、16倍、つまり128倍はどうでしょう?この場合、それぞれ4ビット、7ビットの左シフトが必要です。これは非常に便利なことで、ビットを移動させるだけで簡単な乗算ができるようになります。これを実現するために、左シフト演算子 + << を使用します。以下はその例です。 +

    00000001 << 1 = 000000010 = 2
    00000001 << 2 = 000000100 = 4
    00000001 << 3 = 000001000 = 8
    @@ -108,10 +166,15 @@

    ビット演算子と二項演算子

    00000001 << 6 = 001000000 = 64
    00000001 << 7 = 010000000 = 128
    00000001 << 8 = 100000000 = 256

    -

    さて、高速・単純な乗算に非常に便利なのはもちろんですが、ビット値を把握することなく、特定のビットを設定するのにも非常に便利です。例えば、ビット27を設定したい場合、それは何番でしょうか?(ちなみに67108864です!)。上の構文を使って、flags を簡単に設定することができます。

    +

    + さて、高速・単純な乗算に非常に便利なのはもちろんですが、ビット値を把握することなく、特定のビットを設定するのにも非常に便利です。例えば、ビット27を設定したい場合、それは何番でしょうか?(ちなみに67108864です!)。上の構文を使って、flags を簡単に設定することができます。

    a = a | (1 << 27)

    -

    なるほど...今までの説明では(ビットが1から始まっているので)これはビット26になりますが、実は...ビットはビット1からではなく、ビット0から始まり、上に向かっていきます。つまり、INTEGERには32ビットがありますが、ビットの範囲は0から31までで、1から32までではありません。これは、ビット数に対する定数を設定することができるため、実際にはかなり便利です。

    -

    そこで、Bit27がactiveflag 、bit0がexplodingflag だとします。どうすれば両方を設定できるのでしょうか?

    +

    + なるほど...今までの説明では(ビットが1から始まっているので)これはビット26になりますが、実は...ビットはビット1からではなく、ビット0から始まり、上に向かっていきます。つまり、INTEGERには32ビットがありますが、ビットの範囲は0から31までで、1から32までではありません。これは、ビット数に対する定数を設定することができるため、実際にはかなり便利です。 +

    +

    そこで、Bit27がactiveflag 、bit0がexplodingflag + だとします。どうすれば両方を設定できるのでしょうか?

    ACTIVE = 27;
    BOOM = 0;
    A = A | (1 << ACTIVE) | (1 << BOOM);

    @@ -119,44 +182,70 @@

    ビット演算子と二項演算子

    A = A | 13421772;

    これらのビットをクリアするには(上で見たように)、次のようにNOT修飾子を使えばよいのです。

    A = A & ~((1 << ACTIVE) | (1 << BOOM));

    -

    このように、ビットの設定やクリアを自由に行えるので、データ構造を大幅に圧縮することができます。データ構造を圧縮することは良いことです。なぜなら、使用するメモリが少なければ、cache のミスが減り、コードの実行速度が速くなるからです。32MBのデータをコピーするのと、4MBのデータをコピーするのと、どちらが速いでしょうか?明らかに4MBの方が速いですよね。ですから、もしあなたがflags をすべて1回のメモリアクセスにまとめることができれば、これは良いことです!

    -

    では、除算をどのように行うのか、なぜ除算が便利になるのか、簡単に説明しましょう。除算は、右シフト演算子( >> )を使ってビットを右にシフトすることで行われます。64という単純な数を32で割ってみましょう。

    +

    このように、ビットの設定やクリアを自由に行えるので、データ構造を大幅に圧縮することができます。データ構造を圧縮することは良いことです。なぜなら、使用するメモリが少なければ、cache + のミスが減り、コードの実行速度が速くなるからです。32MBのデータをコピーするのと、4MBのデータをコピーするのと、どちらが速いでしょうか?明らかに4MBの方が速いですよね。ですから、もしあなたがflags をすべて1回のメモリアクセスにまとめることができれば、これは良いことです!

    +

    では、除算をどのように行うのか、なぜ除算が便利になるのか、簡単に説明しましょう。除算は、右シフト演算子( >> + )を使ってビットを右にシフトすることで行われます。64という単純な数を32で割ってみましょう。

    64 / 32 = 01000000 >> 5 = 00000010

    そこで、1ビットを5だけシフトダウンして(これは32に必要なシフト数です - 上記を参照)、2を得ます。しかし、そこに他のビットがあるとどうなるでしょうか?さて、見てみましょう。

    68 / 32 = 01000100 >> 5 = 00000010

    -

    そうそう...。まったく同じです。シフトダウンしたビットは単に失われるだけです。これは実に便利なことです。なぜなら、割り算をするときに余りが必要なら、もっと簡単に余りを求める方法があるからです。その前に、実際の例を見てみましょう。XとYの位置があり、これが32x32の大きさのグリッドのどのセルに入るかを取得したい。この方法によって、objects 、衝突、flags など、あらゆるものを保存し、素早くアクセスすることができます。それでは、ご覧ください。

    +

    + そうそう...。まったく同じです。シフトダウンしたビットは単に失われるだけです。これは実に便利なことです。なぜなら、割り算をするときに余りが必要なら、もっと簡単に余りを求める方法があるからです。その前に、実際の例を見てみましょう。XとYの位置があり、これが32x32の大きさのグリッドのどのセルに入るかを取得したい。この方法によって、objects 、衝突、flags + など、あらゆるものを保存し、素早くアクセスすることができます。それでは、ご覧ください。

    var X_index = x >> 5;
    var Y_index = y >> 5;
    cell_data = mygrid[# X_index,Y_index];

    -

    では、余りを求めるとしたらどうだろう。もしかしたら、この余りは、ある種のオーダーflag として使われるのかもしれない。どんな理由であれ、余りを得るのは AND を実行するのと同じくらい簡単です。

    +

    では、余りを求めるとしたらどうだろう。もしかしたら、この余りは、ある種のオーダーflag として使われるのかもしれない。どんな理由であれ、余りを得るのは AND を実行するのと同じくらい簡単です。

    var remainder = x & 31
    var X_Index = x >> 5;

    -

    さて、ここで何行ものコードを使ったことにお気づきかもしれませんが(よくあることです)、これはまだ非常に高速な命令を2つ並べただけなのです。しかし、なぜ31なのでしょうか?ビット5が32なので、その下のビットはすべて31になり、これが最大の余りなので、 AND 。( (1 << 5) - 1 も使えるので、 32 - 1 = 31 になります)。さて、もし私が2進法を理解せずにこれをやるとしたら、次のようになります。

    +

    + さて、ここで何行ものコードを使ったことにお気づきかもしれませんが(よくあることです)、これはまだ非常に高速な命令を2つ並べただけなのです。しかし、なぜ31なのでしょうか?ビット5が32なので、その下のビットはすべて31になり、これが最大の余りなので、 + AND 。( (1 << 5) - 1 も使えるので、 32 - + 1 = 31 になります)。さて、もし私が2進法を理解せずにこれをやるとしたら、次のようになります。 +

    var r = x mod 32;
    var X_Index = floor(x / 32);

    -

    では、なぜこれほどまでに悪いのだろうか。32で割るためには、浮動小数点数の除算を実行しなければなりません。これは明らかに時間がかかりますが、 mod 32 を実行するために、実際にはもう1回実行しなければならないのですアセンブラでこれを行う場合、実際には1回の除算で2つの値が得られますが、高級言語ではこれができないので(まあ、あまりないことですが)、すべての作業を2回行わなければならないのです。特に、このような計算がたくさんあるタイトなloop を行っている場合は、これが積み重なります。上記のようなビットシフトを使った整数の割り算は、ゲームの最適化にとても役立ちます。

    -

    この概念は、実際のプログラミングに適用するにはかなり複雑なため、以下にGameMakerで作成したゲームに適用できる短い例をいくつか示します。

    +

    では、なぜこれほどまでに悪いのだろうか。32で割るためには、浮動小数点数の除算を実行しなければなりません。これは明らかに時間がかかりますが、 mod 32 + を実行するために、実際にはもう1回実行しなければならないのですアセンブラでこれを行う場合、実際には1回の除算で2つの値が得られますが、高級言語ではこれができないので(まあ、あまりないことですが)、すべての作業を2回行わなければならないのです。特に、このような計算がたくさんあるタイトなloop を行っている場合は、これが積み重なります。上記のようなビットシフトを使った整数の割り算は、ゲームの最適化にとても役立ちます。

    +

    この概念は、実際のプログラミングに適用するにはかなり複雑なため、以下にGameMakerで作成したゲームに適用できる短い例をいくつか示します。 +

    タイルアライメント

    -

    GameMakerの開発者は、よく関数 place_free() を使い、衝突が見つかったら、その関数を実行し続けながら xy の位置をループするか、関数 move_outside_all() を使ってobject をゆっくりと移動させようとします。

    -

    では、より高速に行うにはどうしたらよいのでしょうか。さて、適切なpower-of-2tiles を使えば、非常にシンプルな方法で、しかも電光石火の速さで処理することができます。右方向に動いていて、衝突ブロックに移動した場合、ご存知のようにすべてが 32 に整列されているので、sprite も 32 ピクセルの境界線(できれば左側の境界線)に整列する必要があり、sprite は衝突の外に移動します。これは本当に簡単で、上で余りを求めるのに使ったルールと、ビットの逆数を求める方法を知っていれば、単にこうすればいいのです。

    +

    GameMakerの開発者は、よく関数 place_free() を使い、衝突が見つかったら、その関数を実行し続けながら xy の位置をループするか、関数 move_outside_all() を使ってobject をゆっくりと移動させようとします。

    +

    では、より高速に行うにはどうしたらよいのでしょうか。さて、適切なpower-of-2tiles + を使えば、非常にシンプルな方法で、しかも電光石火の速さで処理することができます。右方向に動いていて、衝突ブロックに移動した場合、ご存知のようにすべてが 32 に整列されているので、sprite も 32 ピクセルの境界線(できれば左側の境界線)に整列する必要があり、sprite + は衝突の外に移動します。これは本当に簡単で、上で余りを求めるのに使ったルールと、ビットの逆数を求める方法を知っていれば、単にこうすればいいのです。

    x = x & ~31;

    -

    そうです、これだけで、32ピクセルの境界線にアライメントすることができるのです。31を変更することで、2の累乗であれば、どのような位置にも合わせることができます(これは、32で割ってから32を掛けることで、下位ビットを削除することに相当します)。

    -

    もし、右寄せにしたいのであれば、上記のようにしますが、次のtile に移動するために32を追加します。簡単ですね。このようにすることで、コリジョンコード全体が非常に速くなり、CPU時間を本当に必要なところに使うことができるようになります。

    +

    + そうです、これだけで、32ピクセルの境界線にアライメントすることができるのです。31を変更することで、2の累乗であれば、どのような位置にも合わせることができます(これは、32で割ってから32を掛けることで、下位ビットを削除することに相当します)。 +

    +

    もし、右寄せにしたいのであれば、上記のようにしますが、次のtile + に移動するために32を追加します。簡単ですね。このようにすることで、コリジョンコード全体が非常に速くなり、CPU時間を本当に必要なところに使うことができるようになります。

    キーとドア

    -

    例えば、いくつかのドアがあり、それぞれに鍵があるレベルがあるとします。特定のドアのためのキーを簡単にマークするにはどうしたらいいでしょうか?通常、キーとドアにIDを割り当てるでしょう。では、1つのキーで2つ、3つのドアを開けたい場合はどうすればいいでしょうか?簡単です。MASKを使えばいいのです。ドアには、このように1ビットを割り当てます。
    -

    +

    + 例えば、いくつかのドアがあり、それぞれに鍵があるレベルがあるとします。特定のドアのためのキーを簡単にマークするにはどうしたらいいでしょうか?通常、キーとドアにIDを割り当てるでしょう。では、1つのキーで2つ、3つのドアを開けたい場合はどうすればいいでしょうか?簡単です。MASKを使えばいいのです。ドアには、このように1ビットを割り当てます。
    +

    door_id = 1; // 0001

    他はこんな感じでしょうか。
    -

    +

    door_id=2; // 0010
    door_id=4; // 0100
    door_id=8; // 1000
    etc...

    -

    1と3の扉を開ける鍵にしたい場合、鍵のMASK値は5(2進数で101)です。これを AND 、「0でない」と出れば、その鍵はドアを開けられることが分かります。MASKが0であれば、何も開かない鍵もあります。実際のチェックは以下のコードを見てください。

    +

    1と3の扉を開ける鍵にしたい場合、鍵のMASK値は5(2進数で101)です。これを AND + 、「0でない」と出れば、その鍵はドアを開けられることが分かります。MASKが0であれば、何も開かない鍵もあります。実際のチェックは以下のコードを見てください。

    if ((key_id & door_id) ! = 0)
    {
        opendoor();
    @@ -165,24 +254,34 @@

    ビット演算子と二項演算子

    ループするカウンタ

    -

    例えば、0から15までの単純なアニメーションカウンターを作りたいとします(16フレームのアニメーションがあるため)。通常は、インクリメントを行い、 if チェックを行い、数値を折り返しますが、この例では、 AND(&) 演算子を使用してみましょう。

    +

    例えば、0から15までの単純なアニメーションカウンターを作りたいとします(16フレームのアニメーションがあるため)。通常は、インクリメントを行い、 if チェックを行い、数値を折り返しますが、この例では、 AND(&) 演算子を使用してみましょう。

    counter = (counter + 1) & 15;

    -

    16は2の累乗なので、その数を1減らしてマスクとし、それを使ってカウンタ値をラップすることができるのです。カウンタが15から16に上がると、ビットパターン 10000 、それを15(ビットパターン 01111 )で AND00000 (単に0)で終わります。つまり、上記のコードは2のべき乗の範囲内で値をラップするのに有効です。

    +

    16は2の累乗なので、その数を1減らしてマスクとし、それを使ってカウンタ値をラップすることができるのです。カウンタが15から16に上がると、ビットパターン 10000 、それを15(ビットパターン 01111 )で AND + 、 00000 (単に0)で終わります。つまり、上記のコードは2のべき乗の範囲内で値をラップするのに有効です。

    Power Of 2 チェック

    -

    何かが2のべき乗であるかどうかを確認したい場合はどうすればよいのでしょうか。ここでちょっとしたトリックを紹介しよう。これは、与えられた値が2のべき乗であれば、 true を返します。

    +

    何かが2のべき乗であるかどうかを確認したい場合はどうすればよいのでしょうか。ここでちょっとしたトリックを紹介しよう。これは、与えられた値が2のべき乗であれば、 true を返します。

    function is_pow2(_val)
    {
        return _val & (_val - 1)) == 0;
    }

    -

    では、51という数字があったとしたら(110011 )、これはどうなるのでしょうか。さて、こうなります。 110011 & 110010これは明らかに、 AND の後にたくさんのビットが残っているので、 false となります。 64 (1000000) なら、こうなります... 1000000 & 0111111 これは0を残しているので、 true となります。

    +

    では、51という数字があったとしたら(110011 )、これはどうなるのでしょうか。さて、こうなります。 110011 & 110010これは明らかに、 AND の後にたくさんのビットが残っているので、 false となります。 64 (1000000) なら、こうなります... 1000000 & 0111111 これは0を残しているので、 true となります。

    インデックスアライメント

    -

    2の累乗に揃えるための簡単なコードを紹介します。(1,2,4,8,16など)です。これは、メモリの割り当てや、データを適切な境界に書き込むことを確認するのに非常に便利です。この例では、 _val1_val2 バイトにアラインする必要があり、 _val2 は 2 の累乗の数字です。この小さな関数は、希望する数値の次の境界に丸めるのです。

    +

    2の累乗に揃えるための簡単なコードを紹介します。(1,2,4,8,16など)です。これは、メモリの割り当てや、データを適切な境界に書き込むことを確認するのに非常に便利です。この例では、 + _val1_val2 バイトにアラインする必要があり、 _val2 は 2 の累乗の数字です。この小さな関数は、希望する数値の次の境界に丸めるのです。 +

    function align_pow2(_val1, _val2)
    {
        return _val1 + (_val2 - 1)) & ~(_val2 - 1);
    @@ -196,11 +295,12 @@

    ビット演算子と二項演算子

    + \ No newline at end of file diff --git a/Manual/contents/Additional_Information/Compatibility_Functions.htm b/Manual/contents/Additional_Information/Compatibility_Functions.htm index ed5c705ba..862eb6607 100644 --- a/Manual/contents/Additional_Information/Compatibility_Functions.htm +++ b/Manual/contents/Additional_Information/Compatibility_Functions.htm @@ -1,9 +1,10 @@ + - 互換機能 + 互換関数 @@ -12,12 +13,18 @@ + -

    互換機能

    -

    GameMaker の以前のバージョンからプロジェクトをインポートする際、プロジェクトに互換性のあるスクリプトが追加されているのを見かけることがあります。一般に、これらのscripts は、更新されたGameMaker Language (GML) 関数を使用します。 - は、古い機能を新しい方法に変換するもので、GameMakerでどのように物事を行うべきかを学ぶには最適な方法です。しかし、いくつかの関数は互換性のために使われているもので、決して使ってはいけないものです。 - また、あなた自身のプロジェクトにも使用しないでください。これらの互換性関数を識別するために、ここにリストアップされていますが、互換性スクリプト以外では決して使用しないようにしなければならないことを強調しておきます。

    +

    互換関数

    +

    GameMaker の以前のバージョンからプロジェクトをインポートする際、プロジェクトに互換性のあるスクリプトが追加されているのを見かけることがあります。一般に、これらのscripts は、更新されたGameMaker Language (GML) 関数を使用します。 + は、古い関数を新しい方法に変換するもので、GameMakerでどのように物事を行うべきかを学ぶには最適な方法です。しかし、いくつかの関数は互換性のために使われているもので、決して使ってはいけないものです。 + また、あなた自身のプロジェクトにも使用しないでください。これらの互換性関数を識別するために、ここにリストアップされていますが、互換性スクリプト以外では決して使用しないようにしなければならないことを強調しておきます。 +

    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Destroy_Time_Source.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Destroy_Time_Source.htm index c90ec19b5..587a0eb26 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Destroy_Time_Source.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Destroy_Time_Source.htm @@ -1,6 +1,7 @@ + @@ -13,30 +14,38 @@ +

    デストロイタイムソース

    この操作は、与えられたタイムソースを破壊するものです。

    -

    タイムソースに既存の子がある場合、そのタイムソースを破棄することはできません。親を破壊する前に、まず子のタイムソースを破壊してください(例)。

    +

    タイムソースに既存の子がある場合、そのタイムソースを破棄することはできません。親を破壊する前に、まず子のタイムソースを破壊してください(例)。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    - - + + - +
    論証商品説明引数説明
    Time Sourceその タイムソースIDを破壊するその タイムソースIDを破壊する


    - タイムソースが存在するかどうかを確認し、存在する場合は破棄します。

    + タイムソースが存在するかどうかを確認し、存在する場合は破棄します。 +

    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Children.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Children.htm index 8cbcfb4ad..0237a7459 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Children.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Children.htm @@ -1,6 +1,7 @@ + @@ -13,23 +14,29 @@ +

    ゲットチルドレン

    -

    このアクションは、指定されたタイムソースのすべての子タイムソースを含むアレイを返します。

    +

    このアクションは、指定されたタイムソースのすべての子タイムソースを含むアレイを返します。

    得られた配列は変数Targetに格納される。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    - - + + - + @@ -44,7 +51,8 @@

    論拠となる。


    - これは、あるTime Sourceの子を取得し、loops 、配列を介して各子Time Sourceを破棄します。

    + これは、あるTime Sourceの子を取得し、loops + 、配列を介して各子Time Sourceを破棄します。

    最後には親となるタイムソースを破壊する。

    @@ -55,7 +63,8 @@

    次へ親を得る
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Parent.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Parent.htm index 043cec600..65135b0ae 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Parent.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Parent.htm @@ -1,6 +1,7 @@ + @@ -13,23 +14,32 @@ +

    ゲットペアレント

    -

    このアクションは、指定されたタイムソースの 親タイムソースを取得します。

    -

    返される値は、タイムソースの 作成方法に応じて、カスタムタイムソースのID、またはビルトインタイムソースの1つです。

    +

    このアクションは、指定されたタイムソースの 親タイムソースを取得します。

    +

    返される値は、タイムソースの 作成方法に応じて、カスタムタイムソースのID、またはビルトインタイムソースの1つです。

    アクションのシンタックス。

    -

    +

    論拠となる。

    論証商品説明引数説明
    Time SourceタイムソースIDの子を取得する。タイムソースIDの子を取得する。
    Target
    - - + + - + @@ -51,7 +61,8 @@

    論拠となる。

    次へ周期を知る
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Period.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Period.htm index 982a804fd..c8b9f1a99 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Period.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Period.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,27 @@ +

    取得期間

    このアクションは、指定されたタイムソースの期間の長さを取得します。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    論証商品説明引数説明
    Time SourceタイムソースIDの親を取得する。タイムソースIDの親を取得する。
    Target
    - - + + - + @@ -50,7 +56,8 @@

    論拠となる。

    次へゲットレップス完了
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Reps_Completed.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Reps_Completed.htm index 91401f0d6..e3a7dfcfc 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Reps_Completed.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Reps_Completed.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,28 @@ +

    レップス取得完了

    -

    このアクションは、指定されたタイムソースが最後にリセットされてから完了した繰り返しの回数を取得します。

    +

    このアクションは、指定されたタイムソースが最後にリセットされてから完了した繰り返しの回数を取得します。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    論証商品説明引数説明
    Time SourceタイムソースIDの期間を取得します。タイムソースIDの期間を取得します。
    Target
    - - + + - + @@ -50,7 +57,8 @@

    論拠となる。

    次へ残りレップ数を取得する
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Reps_Remaining.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Reps_Remaining.htm index 79834a64e..6ee0948b8 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Reps_Remaining.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Reps_Remaining.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,27 @@ +

    残りレップ数を取得

    このアクションは、与えられたTime Sourceが完全に停止するまで、残っている繰り返し回数を取得します。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    論証商品説明引数説明
    Time SourceタイムソースIDの完了したレップを取得します。タイムソースIDの完了したレップを取得します。
    Target
    - - + + - + @@ -50,7 +56,8 @@

    論拠となる。

    次へゲットステート
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_State.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_State.htm index 145e60dd0..a009c5531 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_State.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_State.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,28 @@ +

    ゲットステート

    -

    このアクションは、指定されたタイムソースの 状態を取得します。

    +

    このアクションは、指定されたタイムソースの 状態を取得します。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    論証商品説明引数説明
    Time SourceタイムソースIDの残りのレップを取得する。タイムソースIDの残りのレップを取得する。
    Target
    - - + + - + @@ -50,7 +57,8 @@

    論拠となる。

    次へ残り時間の取得
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Time_Remaining.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Time_Remaining.htm index f9ce8fc20..ce258116d 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Time_Remaining.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Time_Remaining.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,28 @@ +

    残り時間取得

    -

    このアクションは、指定されたTime Sourceが期限切れとなるまでの残り時間を取得します。この値は、Time Sourceに使用されている単位で表示されます。

    +

    このアクションは、指定されたTime Sourceが期限切れとなるまでの残り時間を取得します。この値は、Time Sourceに使用されている単位で表示されます。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    論証商品説明引数説明
    Time SourceタイムソースIDの状態を取得する。タイムソースIDの状態を取得する。
    Target
    - - + + - + @@ -50,7 +57,8 @@

    論拠となる。

    次へ単位を取得する
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Units.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Units.htm index a7528c5ae..18322999a 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Units.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Get_Units.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,28 @@ +

    単位取得

    -

    このアクションは、指定されたタイムソースに使用される単位の種類を取得します。

    +

    このアクションは、指定されたタイムソースに使用される単位の種類を取得します。

    アクションのシンタックス。

    -

    +

    論拠となる。

    論証商品説明引数説明
    Time Sourceが表示されます。 タイムソースIDの残り時間を取得します。が表示されます。 タイムソースIDの残り時間を取得します。
    Target
    - - + + - + @@ -50,7 +57,8 @@

    論拠となる。

    次へタイムソースが存在する場合
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Exists.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Exists.htm index 56d4872ef..d640ff525 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Exists.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Exists.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,27 @@ +

    タイムソースが存在する場合

    このアクションでは、指定されたタイムソースが存在するかどうかに基づいて、他のアクションを制御することができます。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    論証商品説明引数説明
    Time SourceタイムソースIDの単位を取得します。タイムソースIDの単位を取得します。
    Target
    - - + + - + @@ -39,7 +45,8 @@

    論拠となる。


    - タイムソースが存在するかどうかを確認し、存在する場合は破棄します。

    + タイムソースが存在するかどうかを確認し、存在する場合は破棄します。 +

    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Parent.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Parent.htm index 1925c6c64..f8202c6a0 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Parent.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Parent.htm @@ -1,6 +1,7 @@ + @@ -13,23 +14,29 @@ +

    タイムソース]親の場合

    このアクションでは、指定されたタイムソースの親に基づいて他のアクションを制御することができます。

    -

    Parent "で指定されたTime Sourceが"Time Source "で指定されたTime Sourceの親であるか(または親でないか)をチェックする。

    +

    Parent "で指定されたTime Sourceが"Time Source + "で指定されたTime Sourceの親であるか(または親でないか)をチェックする。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    論証商品説明引数説明
    Time SourceタイムソースIDを確認するタイムソースIDを確認する
    Not
    - - + + - + @@ -37,7 +44,10 @@

    論拠となる。

    - +
    論証商品説明引数説明
    Time SourceタイムソースIDの親を確認する。タイムソースIDの親を確認する。
    Not
    ParentタイムソースIDは、前に与えられたタイムソースの親と比較するためにタイムソースIDは、前に与えられたタイムソースの親と比較するために
    @@ -51,7 +61,8 @@

    論拠となる。

    次へタイムソース状態なら
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_State.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_State.htm index 132f740b8..1293162ee 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_State.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_State.htm @@ -1,6 +1,7 @@ + @@ -13,23 +14,31 @@ +

    If [タイムソース] 状態

    このアクションでは、指定されたタイムソースの状態に基づいて他のアクションを制御することができます。

    -

    この定数は タイムソース状態定数State "で与えられたものが "Time Source "で与えられたタイムソースの状態であるか(またはそうでないか)をチェックします。

    +

    この定数は タイムソース状態定数State "で与えられたものが "Time Source "で与えられたタイムソースの状態であるか(またはそうでないか)をチェックします。

    アクションのシンタックス。

    -

    Assign Variable Icon

    +

    Assign Variable Icon +

    論拠となる。

    - - + + - + @@ -37,7 +46,9 @@

    論拠となる。

    - +
    論証商品説明引数説明
    Time Sourceが表示されます。 タイムソースIDの状態を確認するためにが表示されます。 タイムソースIDの状態を確認するために
    Not
    Stateタイムソース状態定数をチェックするためにタイムソース状態定数をチェックするために
    @@ -45,7 +56,8 @@

    論拠となる。


    このコードブロックは、Key Pressイベントの中で実行されるのが理想的です。

    -

    タイムソースの状態が「アクティブ」であるかどうかをチェックし、その場合、そのタイムソースを一時停止する。

    +

    タイムソースの状態が「アクティブ」であるかどうかをチェックし、その場合、そのタイムソースを一時停止する。

    ただし、状態が「一時停止」の場合は、再びTime Sourceを開始します。

    @@ -56,7 +68,8 @@

    次へタイムソース単位なら
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Units.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Units.htm index 82bfb4fa7..d40f11457 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Units.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/If_Time_Source_Units.htm @@ -1,6 +1,7 @@ + @@ -13,23 +14,31 @@ +

    タイムソース] 単位の場合

    このアクションでは、指定されたタイムソースのユニットタイプに基づいて、他のアクションを制御することができます。

    -

    この定数は タイムソース単位定数Units "で指定されたものが "Time Source "で指定されたTime Sourceのユニットタイプであるか(またはそうでないか)をチェックします。

    +

    この定数は タイムソース単位定数Units "で指定されたものが "Time Source "で指定されたTime Sourceのユニットタイプであるか(またはそうでないか)をチェックします。

    アクションのシンタックス。

    -

    Assign Variable Icon

    +

    Assign Variable Icon +

    論拠となる。

    - - + + - + @@ -37,7 +46,9 @@

    論拠となる。

    - +
    論証商品説明引数説明
    Time Sourceが表示されます。 タイムソースIDの状態を確認するためにが表示されます。 タイムソースIDの状態を確認するために
    Not
    Units時間源単位定数と照合する。時間源単位定数と照合する。
    @@ -51,7 +62,8 @@

    論拠となる。

    次へBPMを秒単位に
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Pause_Time_Source.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Pause_Time_Source.htm index 7ff75c0b0..5ac32974a 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Pause_Time_Source.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Pause_Time_Source.htm @@ -1,6 +1,7 @@ + @@ -13,23 +14,28 @@ +

    ポーズタイム・ソース

    指定されたタイムソースを一時停止するアクションです。

    Start Time Sourceを使って後で再開することができます。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    - - + + - +
    論証商品説明引数説明
    Time SourceタイムソースIDを一時停止するタイムソースIDを一時停止する
    @@ -37,7 +43,8 @@

    論拠となる。


    このコードブロックは、Key Pressイベントの中で実行されるのが理想的です。

    -

    タイムソースの状態が「アクティブ」であるかどうかをチェックし、その場合はそのタイムソースを一時停止する。

    +

    タイムソースの状態が「アクティブ」であるかどうかをチェックし、その場合はそのタイムソースを一時停止する。

    ただし、状態が「一時停止」の場合は、タイムソースを再開する。

    @@ -48,7 +55,8 @@

    次へレジュームタイムソース
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Reconfigure_Time_Source.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Reconfigure_Time_Source.htm index d1986a426..71ccdee9f 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Reconfigure_Time_Source.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Reconfigure_Time_Source.htm @@ -1,6 +1,7 @@ + @@ -13,6 +14,7 @@ +

    タイムソースの再設定

    このアクションでは、「タイムソース」フィールドで指定された既存のタイムソースの設定を変更することができます。

    @@ -20,17 +22,21 @@

    タイムソースの再設定

    タイムソースがリセットされ、無効になるので、再度起動する必要があります。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    - - + + - + @@ -38,23 +44,29 @@

    論拠となる。

    - + - + - + - + - +
    論証商品説明引数説明
    Time SourceタイムソースIDを再設定するタイムソースIDを再設定する
    Period
    Units周期を表す単位(秒またはフレーム)周期を表す単位(秒またはフレーム) +
    Callbackmethodは、タイムソースの有効期限が切れたときに呼び出すmethodは、タイムソースの有効期限が切れたときに呼び出す
    ArgumentsOPTIONALコールバック関数に渡す引数を含む配列OPTIONALコールバック関数に渡す引数を含む配列
    RepetitionsOPTIONAL タイムソースを合計で何回実行するか。OPTIONAL タイムソースを合計で何回実行するか。
    Expiry TypeOPTIONAL タイムソースの有効期限タイプOPTIONAL タイムソースの有効期限タイプ
    @@ -68,7 +80,8 @@

    論拠となる。

    次へタイムソースのリセット
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Reset_Time_Source.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Reset_Time_Source.htm index fa54111fc..911fa1325 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Reset_Time_Source.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Reset_Time_Source.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,28 @@ +

    リセット時間ソース

    -

    このアクションは、指定されたタイムソースをリセットします。後で手動で再スタートすることができます。

    +

    このアクションは、指定されたタイムソースをリセットします。後で手動で再スタートすることができます。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    - - + + - +
    論証商品説明引数説明
    Time SourceタイムソースIDをリセットするタイムソースIDをリセットする
    @@ -42,7 +49,8 @@

    論拠となる。

    次へ子どもたちを守ろう
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Resume_Time_Source.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Resume_Time_Source.htm index 7534fc792..f1741c2d6 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Resume_Time_Source.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Resume_Time_Source.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,28 @@ +

    レジュームタイムソース

    -

    このアクションは、指定されたタイムソースとその子を再開します。タイムソースは、以前にPause Time Sourceを使って一時停止されている必要があります。

    +

    このアクションは、指定されたタイムソースとその子を再開します。タイムソースは、以前にPause Time Sourceを使って一時停止されている必要があります。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    - - + + - +
    論証商品説明引数説明
    Time SourceタイムソースIDを一時停止するタイムソースIDを一時停止する
    @@ -36,7 +43,8 @@

    論拠となる。


    このコードブロックは、Key Pressイベントの中で実行されるのが理想的です。

    -

    タイムソースの状態が「アクティブ」であるかどうかをチェックし、その場合はそのタイムソースを一時停止する。

    +

    タイムソースの状態が「アクティブ」であるかどうかをチェックし、その場合はそのタイムソースを一時停止する。

    ただし、状態が「一時停止」の場合は、タイムソースを再開する。

    @@ -47,7 +55,8 @@

    次へタイムソースの再設定
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Seconds_to_BPM.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Seconds_to_BPM.htm index 298cf0a82..25bcf159d 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Seconds_to_BPM.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Seconds_to_BPM.htm @@ -1,6 +1,7 @@ + @@ -13,18 +14,21 @@ +

    秒からBPM

    このアクションは、1拍の長さを秒単位で取り、1分あたりの拍数を返します。

    アクションのシンタックス。

    -

    Assign Variable Icon

    +

    Assign Variable Icon +

    論拠となる。

    - - + + @@ -50,7 +54,8 @@

    論拠となる。

    次へタイムソースの作成
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Start_Time_Source.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Start_Time_Source.htm index 29d86272e..e2a6844b7 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Start_Time_Source.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Start_Time_Source.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,27 @@ +

    開始時間 ソース

    このアクションは、タイムソースが作成、一時停止、または停止された後に開始するために使用されます。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    論証商品説明引数説明
    Value
    - - + + - +
    論証商品説明引数説明
    Time SourceタイムソースIDを開始します。タイムソースIDを開始します。
    @@ -43,7 +49,8 @@

    論拠となる。

    次へストップタイムソース
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Stop_Time_Source.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Stop_Time_Source.htm index 31afdf7d3..6d9be4aeb 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Stop_Time_Source.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Time_Sources/Stop_Time_Source.htm @@ -1,6 +1,7 @@ + @@ -13,22 +14,28 @@ +

    ストップタイムソース

    -

    このアクションは、指定されたタイムソースを停止します。後で手動で再スタートさせることができます。

    +

    このアクションは、指定されたタイムソースを停止します。後で手動で再スタートさせることができます。

    アクションのシンタックス。

    -

    +

    +

    論拠となる。

    - - + + - +
    論証商品説明引数説明
    Time SourceタイムソースIDを停止するタイムソースIDを停止する
    @@ -42,7 +49,8 @@

    論拠となる。

    次へポーズタイムソース
    -
    © CopyrightYoYo Games Ltd. 2022 All Rights Reserved
    +
    © CopyrightYoYo Games Ltd. 2022 All Rights + Reserved
    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Instance_Timeline.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Instance_Timeline.htm index 3993628c5..a3eef9d43 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Instance_Timeline.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Instance_Timeline.htm @@ -1,6 +1,7 @@ + インスタンスのタイムラインを設定する @@ -12,21 +13,29 @@ +

    インスタンスのタイムラインを設定する

    -

    このアクションは、timeline Browser からAsset をインスタンスに割り当てます。割り当てるtimeline を指定し、最後の瞬間にtimeline loop を選択します(最後の瞬間が実行された次のフレームでは、loop に戻ります)。 - timeline の最初の瞬間に戻る)、また、timeline をすぐに開始するかどうか。timeline をすぐに開始しない場合は、アクションSetTimeline Stateを使用して、後で別の - イベントまたはscript

    +

    このアクションは、timeline Browser からAsset + をインスタンスに割り当てます。割り当てるtimeline を指定し、最後の瞬間にtimeline + loop を選択します(最後の瞬間が実行された次のフレームでは、loop に戻ります)。 + timeline の最初の瞬間に戻る)、また、timeline をすぐに開始するかどうか。timeline をすぐに開始しない場合は、アクションSetTimeline Stateを使用して、後で別の + イベントまたはscript 。 +

    アクションのシンタックス。

    -

    Set Instance Timeline Icon

    +

    Set Instance Timeline Icon +

    論拠となる。

    - - + + @@ -34,7 +43,8 @@

    論拠となる。

    - + @@ -52,11 +62,14 @@

    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_Moment.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_Moment.htm index cdb7114e5..980bdccee 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_Moment.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_Moment.htm @@ -1,6 +1,7 @@ + タイムライン・モーメントを設定する @@ -12,31 +13,41 @@ +

    設定 モーメントTimeline

    -

    このアクションは、timeline を現在の瞬間から新しい瞬間にスキップするために使用します。Timelines はさまざまな「瞬間」を経て前進し、各瞬間は通常1ゲームフレームを占めます(object のステップイベントのようなものです)。timeline がスタートすると - loop timeline の最初の瞬間に戻るか、完全に停止します。しかし、このtimelines への直線的なアプローチは、このアクションを使うことで、別のモーメントを設定することができます。 - 独自のtimeline loops を作成したり、特定の状況下でtimeline のセクションをスキップしたりすることができるようになります。このアクションでは、timeline の中でジャンプする瞬間を設定するだけで、次のゲームフレームが実行されます。 - インスタンスのタイムラインを設定するアクションを使用してインスタンスにtimeline を割り当てている必要があることに注意してください)。

    +

    このアクションは、timeline を現在の瞬間から新しい瞬間にスキップするために使用します。Timelines はさまざまな「瞬間」を経て前進し、各瞬間は通常1ゲームフレームを占めます(object + のステップイベントのようなものです)。timeline がスタートすると + loop timeline の最初の瞬間に戻るか、完全に停止します。しかし、このtimelines への直線的なアプローチは、このアクションを使うことで、別のモーメントを設定することができます。 + 独自のtimeline loops を作成したり、特定の状況下でtimeline のセクションをスキップしたりすることができるようになります。このアクションでは、timeline の中でジャンプする瞬間を設定するだけで、次のゲームフレームが実行されます。 + インスタンスのタイムラインを設定するアクションを使用してインスタンスにtimeline + を割り当てている必要があることに注意してください)。 +

    アクションのシンタックス。

    -

    Set Timeline Moment Icon

    +

    Set Timeline Moment Icon

    論拠となる。

    - -
    論証商品説明引数説明
    Timeline
    Loop最後の瞬間以降にtimeline loop を持つようにするフラグ (デフォルトはフラグ付き)最後の瞬間以降にtimeline loop を持つようにするフラグ + (デフォルトはフラグ付き)
    Start Timeline
    - - - - - - - - - - -
    論証商品説明
    Moment割り当てられたtimeline を設定する瞬間
    - + + + + + + + + + + + + +
    引数説明
    Moment割り当てられたtimeline を設定する瞬間
    +

    上記のアクションブロックのコードは、タイムラインを割り当てます。 @@ -47,11 +58,13 @@

    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_Speed.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_Speed.htm index c4f1f621b..07c3c2ba1 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_Speed.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_Speed.htm @@ -1,6 +1,7 @@ + タイムラインの速度を設定する @@ -12,33 +13,41 @@ +

    設定 速度Timeline

    -

    このアクションは、timeline が含むモーメントを移動する速度を設定するために使用できます。通常、各ゲームフレームでtimeline の位置を 1 つずつ増やしますが、このアクションを設定することで、この量を変更することができます。 - アクションに別の値を設定します。選択した値は乗数として扱われ、例えば値を2にすると、timeline は2倍の速度で走り、0.5にすると半分の速度で走ることになります。 +

    このアクションは、timeline が含むモーメントを移動する速度を設定するために使用できます。通常、各ゲームフレームでtimeline の位置を 1 つずつ増やしますが、このアクションを設定することで、この量を変更することができます。 + アクションに別の値を設定します。選択した値は乗数として扱われ、例えば値を2にすると、timeline + は2倍の速度で走り、0.5にすると半分の速度で走ることになります。 これが意味するところは、値が1より大きい場合、同じゲームフレーム内に複数の瞬間が発生する可能性があり(瞬間が飛ぶことはない)、速度が1より小さい場合、瞬間が走った後に、フレーム - 例えば、timeline の速度を 0.1 に設定すると、1 ゲームフレームでモーメントが発生し、9 ゲームフレームでモーメントが発生せず、10 ゲームフレーム目で次のモーメントが実行されることになります。

    -

    インスタンスのタイムラインを設定する、または timeline の状態を設定するアクションを使用してTimeline を開始するように設定した場合、次のように設定しません。 + 例えば、timeline の速度を 0.1 に設定すると、1 ゲームフレームでモーメントが発生し、9 ゲームフレームでモーメントが発生せず、10 + ゲームフレーム目で次のモーメントが実行されることになります。

    +

    インスタンスのタイムラインを設定する、または timeline の状態を設定するアクションを使用してTimeline + を開始するように設定した場合、次のように設定しません。 の場合、timeline のデフォルトは1ゲームフレームあたり1モーメントになります。

    アクションのシンタックス。

    -

    Set Timeline Speed Icon

    +

    Set Timeline Speed Icon +

    論拠となる。

    - - - - - - - - - - - - -
    論証商品説明
    Speedtimeline で実行する速度(乗数)(デフォルトは 1
    - + + + + + + + + + + + + +
    引数説明
    Speedtimeline で実行する速度(乗数)(デフォルトは 1
    +

    上記のアクションブロックのコードは、タイムラインを割り当てます。 @@ -49,11 +58,13 @@

    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_State.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_State.htm index 5d35bfd6e..2cf0a38a4 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_State.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Set_Timeline_State.htm @@ -1,6 +1,7 @@ + タイムラインの状態を設定する @@ -12,28 +13,34 @@ +

    設定 状態Timeline

    -

    このアクションは、timeline を開始、停止、一時停止、再開するために使用できます。timeline は、最初にアクションSet Instance Timeline を使用してインスタンスに設定されている必要があります。 +

    このアクションは、timeline を開始、停止、一時停止、再開するために使用できます。timeline は、最初にアクションSet Instance Timeline + を使用してインスタンスに設定されている必要があります。 実行状態を次のオプションから変更します。

    - + - + - + - + @@ -42,15 +49,17 @@

    設定 状態Timeline

    オプション商品説明説明
    スタートインスタンスに割り当てられたtimeline を開始します(timeline が一時停止していた場合、開始位置が再び 0 に設定されます)。インスタンスに割り当てられたtimeline を開始します(timeline + が一時停止していた場合、開始位置が再び 0 に設定されます)。
    レジュメ一時停止したtimeline を再開します(timeline が停止していて一時停止していない場合、これは何もしません)。一時停止したtimeline を再開します(timeline + が停止していて一時停止していない場合、これは何もしません)。
    ポーズインスタンスに割り当てられたtimeline を一時停止します(一時停止中は、timeline のモーメントはゲームフレームと一緒に進みません)。インスタンスに割り当てられたtimeline を一時停止します(一時停止中は、timeline のモーメントはゲームフレームと一緒に進みません)。
    停止

    -

    構文です。

    -

    Set Timeline State Icon

    +

    構文

    +

    Set Timeline State Icon

    論拠となる。

    - - + + @@ -60,18 +69,20 @@

    論拠となる。

    論証商品説明引数説明
    State

    上記のアクションブロックのコードでは、グローバル変数に保持されている値をチェックし - が true であればtimeline を一時停止し、 false であればtimeline を再開します。

    + が true であればtimeline を一時停止し、 false であればtimeline を再開します。

    + \ No newline at end of file diff --git a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Timeline_Actions.htm b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Timeline_Actions.htm index a965a5b6d..4d3d0ebd9 100644 --- a/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Timeline_Actions.htm +++ b/Manual/contents/Drag_And_Drop/Drag_And_Drop_Reference/Timelines/Timeline_Actions.htm @@ -1,6 +1,7 @@ + タイムラインアクション @@ -12,11 +13,14 @@ +

    タイムラインアクションライブラリ

    タイムラインは、ゲーム内のイベントを制御するための強力なメカニズムであり、そのベースとなるのが - "モーメント "とは、単純に1つのゲーム・ステップのことです。timelines Assetobject と同じようにtimeline Browser から作成します。 + "モーメント "とは、単純に1つのゲーム・ステップのことです。timelines Assetobject と同じようにtimeline Browser から作成します。 そして、アクションを実行する必要がある各瞬間に、実行するためのコードまたはGML ビジュアルアクションを追加します。

    timeline リソースを作成すると、以下の操作で停止、起動、操作することができます。

    @@ -24,20 +28,30 @@

    タイムラインアクションライブラリ

    - + - - + + - - + + - - + +
    Timeline Action LibraryTimeline Action Library インスタンスのタイムラインを設定する
    Set Instance Timeline Icon設定Timeline モーメントSet Instance Timeline Icon設定Timeline モーメント +
    Set Timeline Moment Icon設定Timeline 速度Set Timeline Moment Icon + 設定Timeline 速度 +
    Set Timeline Speed Icon設定Timeline 状態Set Timeline Speed Icon + 設定Timeline 状態 +
    @@ -53,11 +67,12 @@

    タイムラインアクションライブラリ

    + \ No newline at end of file diff --git a/Manual/contents/GameMaker_Language/GML_Overview/Accessors.htm b/Manual/contents/GameMaker_Language/GML_Overview/Accessors.htm index 8c82e7232..d485b38a9 100644 --- a/Manual/contents/GameMaker_Language/GML_Overview/Accessors.htm +++ b/Manual/contents/GameMaker_Language/GML_Overview/Accessors.htm @@ -1,6 +1,7 @@ + アクセサー @@ -10,35 +11,47 @@ - + +

    アクセサー

    -

    GameMaker Language (GML) では、アクセッサと呼ばれる論理式を使って、特定のデータ構造や配列にアクセスすることもできます。これは通常の配列を扱うときと同じような構造になっていますが、最初の引数の前に識別子記号を使い、GameMakerに(以前に作成した)データ構造または配列リテラルを扱っていることを知らせます。

    +

    GameMaker Language (GML) + では、アクセッサと呼ばれる論理式を使って、特定のデータ構造や配列にアクセスすることもできます。これは通常の配列を扱うときと同じような構造になっていますが、最初の引数の前に識別子記号を使い、GameMakerに(以前に作成した)データ構造または配列リテラルを扱っていることを知らせます。

    DSリスト [| ]です。

    DSリストの構文は以下の通りです。

    list_index[| index]

    -

    そこで、ds_list_create() を使ってリストを作成した場合、(変数に格納した)リストのインデックスを使って参照することになります。「インデックス」の値は、リスト内で設定または追加する位置を表します。例えば、次のコードは、リストを作成し、10個のエントリーを追加し、各エントリーに0から9までの乱数を設定します。

    +

    そこで、ds_list_create() + を使ってリストを作成した場合、(変数に格納した)リストのインデックスを使って参照することになります。「インデックス」の値は、リスト内で設定または追加する位置を表します。例えば、次のコードは、リストを作成し、10個のエントリーを追加し、各エントリーに0から9までの乱数を設定します。 +

    ds = ds_list_create();
    var _index = 0;
    repeat(10)
    {
        ds[| _index++] = irandom(9);
    }

    -

    すでに値を持つインデックスに式を使用して参照を追加する場合、リストにさらにインデックスを追加するのではなく、前の値が置き換えられることに注意してください。さらにエントリーを追加するには、ds_listのサイズを知っていて、最後に追加する必要があります。また、参照されているリストのサイズよりも大きなリストインデックスを設定することができ、これはその値を設定すると同時にリストを拡張し、与えられたインデックスまでのリスト内のすべての位置を0として初期化することは注目に値します。

    +

    + すでに値を持つインデックスに式を使用して参照を追加する場合、リストにさらにインデックスを追加するのではなく、前の値が置き換えられることに注意してください。さらにエントリーを追加するには、ds_listのサイズを知っていて、最後に追加する必要があります。また、参照されているリストのサイズよりも大きなリストインデックスを設定することができ、これはその値を設定すると同時にリストを拡張し、与えられたインデックスまでのリスト内のすべての位置を0として初期化することは注目に値します。 +

    リスト構造を作り、そこにデータを入れたら、リストから値を取り出すには次のようにします。

    value = ds[| 5];

    -

    上記はポジション5(リストは0から始まるので、6番目のインデックス)から値を取得し、変数に格納します。もし、リストのサイズ以外の位置を指定した場合は、 undefined という値が返されますが、これは関数 is_undefined().

    +

    上記はポジション5(リストは0から始まるので、6番目のインデックス)から値を取得し、変数に格納します。もし、リストのサイズ以外の位置を指定した場合は、 undefined という値が返されますが、これは関数 is_undefined().

    DS Maps [?]

    DSマップの構文は以下の通りです。

    map_index[? key]

    -

    ds_map_create() でマップを作成した後、変数に格納したマップインデックスを使用して参照する。"key" の値は、設定または取得するマップキーである。たとえば、次のコードはマップを作成し、この構文を使っていくつかの項目を追加しています。

    +

    ds_map_create() でマップを作成した後、変数に格納したマップインデックスを使用して参照する。"key" + の値は、設定または取得するマップキーである。たとえば、次のコードはマップを作成し、この構文を使っていくつかの項目を追加しています。

    ds = ds_map_create();
    ds[? "Name"] = "Hamish";
    ds[? "Company"] = "MacSeweeny Games";
    @@ -46,14 +59,18 @@

    アクセサー

    なお、追加しようとするキーと同じ値がすでにマップに含まれている場合は、新しい値で重複したキーは作成されず、以前の値が置き換えられることになります。

    マップ構造を作成し、データを入れたら、特定のマップキーから値を取得するために、次のようなコードを作成します。

    value = ds[? "Name"];

    -

    上記は、キー "Name" から値を取得して変数に格納しますが、与えられたキーがDSマップに存在しない場合、返される値は undefined となることに注意してください。これは、以下の関数で確認できる。 is_undefined().

    +

    上記は、キー "Name" から値を取得して変数に格納しますが、与えられたキーがDSマップに存在しない場合、返される値は undefined となることに注意してください。これは、以下の関数で確認できる。 is_undefined().

    DSグリッド[# ]について

    DSグリッドの構文は以下の通りです。

    grid_index[# xpos, ypos]

    -

    ds_grid_create() 関数でグリッドを作成したら、変数に格納したグリッドのインデックスを使って、「xpos」「ypos」をグリッド内の位置にして、値を取得したり設定したりすることになります。たとえば、次のコードは、グリッドを作成し、0にクリアしてから、いくつかの項目を追加しています。

    +

    ds_grid_create() + 関数でグリッドを作成したら、変数に格納したグリッドのインデックスを使って、「xpos」「ypos」をグリッド内の位置にして、値を取得したり設定したりすることになります。たとえば、次のコードは、グリッドを作成し、0にクリアしてから、いくつかの項目を追加しています。 +

    ds = ds_grid_create();
    ds_grid_clear(ds, 0);
    var _gw = ds_grid_width(ds) - 1;
    @@ -69,16 +86,25 @@

    アクセサー

    }

    グリッド構造を作り、データを入れたら、特定のグリッドの位置から値を取得するために、次のような操作を行います。

    value = ds[# mouse_x div 16, mouse_y div 16];

    -

    上記は、与えられたds_gridからマウス位置を元に値を取得します(正しい位置を得るためにroom の「セル」幅で割ります)。もしグリッドの境界の外側の位置を指定した場合は、 undefined という値が返されます。これは関数 is_undefined().

    +

    上記は、与えられたds_gridからマウス位置を元に値を取得します(正しい位置を得るためにroom + の「セル」幅で割ります)。もしグリッドの境界の外側の位置を指定した場合は、 undefined という値が返されます。これは関数 is_undefined().

    配列[@]の場合

    このアクセサは、Copy on Write オプションが有効な場合にのみ使用されます。

    -

    配列にも独自のアクセサがあり、上記のデータ構造のアクセサと同様の働きをします。しかし、配列のアクセサには興味深い性質があり、スクリプト関数methodをコピーする必要はありません。つまり、配列自体はscript渡されるのではなく、単にデータを取得するために参照されるだけなのです。通常、配列を変更する必要がある場合は、その配列をscriptコピー し、コピーした配列を元の配列に戻す(return)必要があります。これは処理のオーバーヘッドが大きくなるため、代わりにアクセサを使用します。アクセサを使用すると、元の配列をコピーすることなく直接 変更することができます。以下の例で、その動作を確認することができます。

    +

    配列にも独自のアクセサがあり、上記のデータ構造のアクセサと同様の働きをします。しかし、配列のアクセサには興味深い性質があり、スクリプト関数methodをコピーする必要はありません。つまり、配列自体はscript + に渡されるのではなく、単にデータを取得するために参照されるだけなのです。通常、配列を変更する必要がある場合は、その配列をscriptコピー + し、コピーした配列を元の配列に戻す(return)必要があります。これは処理のオーバーヘッドが大きくなるため、代わりにアクセサを使用します。アクセサを使用すると、元の配列をコピーすることなく直接 + 変更することができます。以下の例で、その動作を確認することができます。

    配列の構文は、 @ のアクセサーを使用します。

    array[@ i]

    -

    配列をインスタンスで作成した後、それを参照でscript に渡し、アクセサ@ を使って直接変更することができます。たとえば、次のように配列を作成して、ファンクションを呼び出すことができます。

    +

    配列をインスタンスで作成した後、それを参照でscript に渡し、アクセサ@ を使って直接変更することができます。たとえば、次のように配列を作成して、ファンクションを呼び出すことができます。

    array[99] = 0;
    array_populate(array);

    関数そのものは、こんな感じでしょうか。

    @@ -97,7 +123,8 @@

    アクセサー

    }

    この関数が行っていることは、配列の25の位置をランダムに選び、選ばれた配列の位置の値を100に設定することだけです。

    もちろん、Copy on Writeが無効の場合は、 @ のアクセ サは必要ありません。

    -

    :スクリプト関数でargument[n] 配列を扱う場合、配列アクセッサ @ は使用できません。

    +

    :スクリプト関数でargument[n] 配列を扱う場合、配列アクセッサ @ は使用できません。

    @@ -105,16 +132,24 @@

    アクセサー

    構造体の構文は次のとおりです。

    struct[$ "name"]

    -

    このアクセサは基本的に関数variable_struct_get()variable_struct_set()のラッパーであり、DSマップのアクセサと同じように使用します。例えば、struct を作成し、"my_health" という変数から値を取得したい場合、次のようにします。

    +

    このアクセサは基本的に関数variable_struct_get()variable_struct_set()のラッパーであり、DSマップのアクセサと同じように使用します。例えば、struct を作成し、"my_health" という変数から値を取得したい場合、次のようにします。

    var _hp = struct[$ "my_health"];

    -

    見ての通り、変数そのものを供給するのではなく、変数と一緒に文字列を供給するのです。もしstruct に指定された名前の変数がなければ、アクセサは値として undefined を返すことに注意してください。

    +

    見ての通り、変数そのものを供給するのではなく、変数と一緒に文字列を供給するのです。もしstruct + に指定された名前の変数がなければ、アクセサは値として undefined を返すことに注意してください。

    struct で変数を設定するには、次のようにします。

    struct[$ "my_score"] = 100;

    -

    値の取得と同様に、設定する変数名をstring として与えると、その変数に与えられた値が設定される。使用した変数名がstruct に存在しない場合、その変数が作成され、指定された値に設定されます。

    +

    値の取得と同様に、設定する変数名をstring として与えると、その変数に与えられた値が設定される。使用した変数名がstruct に存在しない場合、その変数が作成され、指定された値に設定されます。

    -

    アクセッサの重要な特徴として、アクセッサは連結して使用できることが挙げられます。つまり、いくつかのデータ構造や配列が入れ子になっている場合、入れ子構造の奥にある値にアクセスするために、様々な関数を使う必要がなくなります。例えば、配列があり、その配列の各項目が以下のようなDSリストであるとする。

    +

    + アクセッサの重要な特徴として、アクセッサは連結して使用できることが挙げられます。つまり、いくつかのデータ構造や配列が入れ子になっている場合、入れ子構造の奥にある値にアクセスするために、様々な関数を使う必要がなくなります。例えば、配列があり、その配列の各項目が以下のようなDSリストであるとする。 +

    array = array_create(3);
    for (var i = 0; i < 3; ++i)
    {
    @@ -135,7 +170,8 @@

    アクセサー

        }
    }

    -

    上記のコードでは、3つのアイテムの配列を作成し、それぞれにDSリストを割り当てました。そして、異なるリストに、ゲーム内のさまざまなobjects のインスタンスIDを入力しました。さて、リストの1つのIDにアクセスするには、次のようにします。

    +

    上記のコードでは、3つのアイテムの配列を作成し、それぞれにDSリストを割り当てました。そして、異なるリストに、ゲーム内のさまざまなobjects + のインスタンスIDを入力しました。さて、リストの1つのIDにアクセスするには、次のようにします。

    var _list = array[0];
    var _id = ds_list_find_value(_list, 0);

    しかし、連鎖したアクセサを使うことで、より少ないコードで、よりクリーンな方法で同じことができます。

    @@ -150,8 +186,11 @@

    アクセサー

    // Access a map nested in a grid nested in a list nested in an array:
    data[0][| 10][# 3, 4][? "key"] = "hello world";

    -

    連鎖したアクセサを使うことで、よりコンパクトなコードが書けるだけでなく、イテレーション(例) forループ)などを用いて、よりすっきりと直感的にデータにアクセスすることができます。

    -

    このようにアクセサを使用する場合、配列には常に @ アクセサを使用する必要があります。そうしないと、実行中のアクションに余分なオーバーヘッドを追加することになるからです。上述したように、デフォルトでは配列は関数に参照渡しされ、変更時には「コピーオンライト」動作が使用されます。しかし、配列がチェーンの一部である場合は、チェーンの前の項目がコピーされた配列で更新され、「元の」配列は削除されます。例えば、次のようなことをします。

    +

    連鎖したアクセサを使うことで、よりコンパクトなコードが書けるだけでなく、イテレーション(例) forループ)などを用いて、よりすっきりと直感的にデータにアクセスすることができます。

    +

    このようにアクセサを使用する場合、配列には常に @ + アクセサを使用する必要があります。そうしないと、実行中のアクションに余分なオーバーヘッドを追加することになるからです。上述したように、デフォルトでは配列は関数に参照渡しされ、変更時には「コピーオンライト」動作が使用されます。しかし、配列がチェーンの一部である場合は、チェーンの前の項目がコピーされた配列で更新され、「元の」配列は削除されます。例えば、次のようなことをします。 +

    // In an object event
    data[| 0][0] = 100;

    @@ -172,11 +211,12 @@

    アクセサー

    + \ No newline at end of file diff --git a/Manual/contents/GameMaker_Language/GML_Overview/Addressing_Variables_In_Other_Instances.htm b/Manual/contents/GameMaker_Language/GML_Overview/Addressing_Variables_In_Other_Instances.htm index a6f0367e5..707299ec2 100644 --- a/Manual/contents/GameMaker_Language/GML_Overview/Addressing_Variables_In_Other_Instances.htm +++ b/Manual/contents/GameMaker_Language/GML_Overview/Addressing_Variables_In_Other_Instances.htm @@ -1,6 +1,7 @@ + 他のインスタンスでの変数のアドレス指定 @@ -12,16 +13,34 @@ +

    他のインスタンスでの変数のアドレス指定

    -

    変数のセクションでは、単一のインスタンスやグローバルスコープで変数を作成し使用する方法を説明しましたが、あるインスタンスが別のインスタンスの変数にアクセスする場合はどうなるのでしょうか?例えば、弾丸と衝突したときobject 、弾丸の変数にアクセスして弾丸のダメージを調べたり、パズルですべてのボールの動きを止めたり、メインキャラクターを特定の位置に移動させたり、ゲームでは様々な場面でこのようなことが必要になります。ありがたいことに、GameMaker Language には、これを実現するためのメカニズムが搭載されています。

    -

    他の インスタンスの変数にアクセスしたり変更したりする最も一般的な方法のひとつは、そのobject 名を識別子として使用し、ポイント "." を使って、参照する変数がその特定のオブジェクトのインスタンス内で代入または変更されるべきことをGameMakerに伝える方法です。これは「ドット記法」と呼ばれるもので、その構文は以下の通りです。

    +

    変数のセクションでは、単一のインスタンスやグローバルスコープで変数を作成し使用する方法を説明しましたが、あるインスタンスが別のインスタンスの変数にアクセスする場合はどうなるのでしょうか?例えば、弾丸と衝突したときobject + 、弾丸の変数にアクセスして弾丸のダメージを調べたり、パズルですべてのボールの動きを止めたり、メインキャラクターを特定の位置に移動させたり、ゲームでは様々な場面でこのようなことが必要になります。ありがたいことに、GameMaker Language には、これを実現するためのメカニズムが搭載されています。

    +

    他の インスタンスの変数にアクセスしたり変更したりする最も一般的な方法のひとつは、そのobject 名を識別子として使用し、ポイント + "." を使って、参照する変数がその特定のオブジェクトのインスタンス内で代入または変更されるべきことをGameMakerに伝える方法です。これは「ドット記法」と呼ばれるもので、その構文は以下の通りです。

    <object_id>.<variable> = <value>; 

    実際にはこのような形になります。

    obj_ball.speed = 0;

    -

    上記のコードでは、"obj_ball"のインスタンスの速度を設定しています。しかし、object に指定されたroom のインスタンスが複数ある場合、それらのすべてに等しく適用されます。HTML5 を使用している場合を除き、その場合は1 つだけに影響しますが、どれに影響するかを知る方法はありません。したがって、object のインスタンスすべてにアクセスする必要がある場合、次のコードを使用する必要があります。 with()これは100%クロスプラットフォーム互換です。一般的に、このフォーマットはobject のインスタンスがroom の中に1つだけある場合、または (次のパートで説明するように) 特定のインスタンスID を持っている場合にのみ使用する必要があります。

    -

    また、object のインスタンスがroom の中に複数ある場合、一意のインスタンス名を使って、どのインスタンスにアクセスしたいかをGameMakerに正確に伝えることができる。インスタンス名定数は、ゲーム内のroom に追加された各インスタンスに付与される一意の識別定数です。この定数は、ルームエディターでインスタンスをダブルクリックすることで見つけることができます。

    +

    上記のコードでは、"obj_ball"のインスタンスの速度を設定しています。しかし、object に指定されたroom + のインスタンスが複数ある場合、それらのすべてに等しく適用されます。HTML5 を使用している場合を除き、その場合は1 + つだけに影響しますが、どれに影響するかを知る方法はありません。したがって、object + のインスタンスすべてにアクセスする必要がある場合、次のコードを使用する必要があります。 with()これは100%クロスプラットフォーム互換です。一般的に、このフォーマットはobject + のインスタンスがroom の中に1つだけある場合、または (次のパートで説明するように) 特定のインスタンスID + を持っている場合にのみ使用する必要があります。

    +

    また、object のインスタンスがroom + の中に複数ある場合、一意のインスタンス名を使って、どのインスタンスにアクセスしたいかをGameMakerに正確に伝えることができる。インスタンス名定数は、ゲーム内のroom に追加された各インスタンスに付与される一意の識別定数です。この定数は、ルームエディタでインスタンスをダブルクリックすることで見つけることができます。

    なお、この名前は編集してよりわかりやすい名前をつけることができます-ただし、ゲーム全体でユニークな名前である必要があります-そして、ポイントの左側として使用することができます。

    inst_4DB70D2.speed = 0;

    しかし、最も一般的かつ実用的な方法は、ポイントの左側にある変数を使用することです。ただし、当該変数に 有効なインスタンスIDが格納されている場合に限ります。次の例で説明する。

    @@ -37,8 +56,16 @@

    他のインスタンスでの変数のアドレス指定

    _inst.direction = point_direction(_inst.x, _inst.y, x, y);
    _inst.target = id;

    -

    上記の例1のコードにおいて instance_exists()の呼び出しは、コードブロックの中にあります。これは、pointメソッドを使って他のインスタンスの値にアクセスしたり変更したりすると、そのインスタンスが存在しない場合にエラーが発生してゲームがクラッシュするためで、この例ではその可能性があります。しかし、例2と3では、例2ではインスタンスを作成し、例3では衝突イベントで他のインスタンスと衝突しているので、インスタンスが存在することが分かっているので、このチェックは必要ではありません。しかし、このメソッドを使用している間に、インスタンスが破壊されたり、無効化されたり、あるいはroom から削除される可能性がある場合は、必ず事前に instance_exists() 関数または instance_number()関数を使用します。

    -

    このメソッドでは、すべてのインスタンスを対象とする特別なキーワード"all" を使用できないことに注意してください (例: all.val = 10 はエラーになります)。しかし、キーワード "other" と "self" は問題なく使用できます。例えば、衝突イベントで other を使用する場合。

    +

    上記の例1のコードにおいて instance_exists()の呼び出しは、コードブロックの中にあります。これは、pointメソッドを使って他のインスタンスの値にアクセスしたり変更したりすると、そのインスタンスが存在しない場合にエラーが発生してゲームがクラッシュするためで、この例ではその可能性があります。しかし、例2と3では、例2ではインスタンスを作成し、例3では衝突イベントで他のインスタンスと衝突しているので、インスタンスが存在することが分かっているので、このチェックは必要ではありません。しかし、このメソッドを使用している間に、インスタンスが破壊されたり、無効化されたり、あるいはroom から削除される可能性がある場合は、必ず事前に instance_exists() + 関数または instance_number()関数を使用します。

    +

    このメソッドでは、すべてのインスタンスを対象とする特別なキーワード"all" + を使用できないことに注意してください (例: all.val = 10 はエラーになります)。しかし、キーワード "other" と "self" は問題なく使用できます。例えば、衝突イベントで other + を使用する場合。

    // Example 3 other.hp -= 10;
    if (other.hp <= 0)
    {
    @@ -46,7 +73,8 @@

    他のインスタンスでの変数のアドレス指定

    }

    また、どのような関数もそれ自体を代入の左辺として使用することはできないことにも注意が必要です。例えば、次のようなコードはエラーになります。

    instance_nearest(x, y, obj).speed = 0;

    -

    そのコード例の式の戻り値は整数値(最も近いインスタンスのユニークなID値)であるため、この方法で使用し、必要なインスタンスを適切にアドレス指定するには、 () で囲む必要があります。上記のコードは、正しく次のように記述されます。

    +

    そのコード例の式の戻り値は整数値(最も近いインスタンスのユニークなID値)であるため、この方法で使用し、必要なインスタンスを適切にアドレス指定するには、 () + で囲む必要があります。上記のコードは、正しく次のように記述されます。

    (instance_nearest(x, y, obj)).speed = 0;

    //or
    @@ -54,8 +82,12 @@

    他のインスタンスでの変数のアドレス指定

    var _inst = instance_nearest(x, y, obj);
    _inst.speed = 0;

    -

    これらはすべて、他のインスタンスの変数を読み、変更し、設定するための完全に有効な方法であり、ポイントが実際には演算子であるために機能します。これは、左オペランドに値、右オペランドに変数を取り、指定されたobject またはインスタンス内のこの特定の変数のアドレスを返します。object の名前、定数、ID などはすべて単に値を表すもので、これらは他の値と同様に扱うことができます。

    -

    他のインスタンスの変数を参照する方法としては、GameMaker Language 関数 with() を使用する方法がありますが、これについてはこちらで詳しく説明します。

    +

    これらはすべて、他のインスタンスの変数を読み、変更し、設定するための完全に有効な方法であり、ポイントが実際には演算子であるために機能します。これは、左オペランドに値、右オペランドに変数を取り、指定されたobject + またはインスタンス内のこの特定の変数のアドレスを返します。object の名前、定数、ID などはすべて単に値を表すもので、これらは他の値と同様に扱うことができます。 +

    +

    他のインスタンスの変数を参照する方法としては、GameMaker Language 関数 with() + を使用する方法がありますが、これについてはこちらで詳しく説明します。

    // This will affect all instances of the object "obj_Enemy"
    with (obj_Enemy)
    {
    @@ -79,11 +111,12 @@

    他のインスタンスでの変数のアドレス指定

    + \ No newline at end of file diff --git a/Manual/contents/GameMaker_Language/GML_Overview/Arrays.htm b/Manual/contents/GameMaker_Language/GML_Overview/Arrays.htm index 0dcebfe50..90db7258a 100644 --- a/Manual/contents/GameMaker_Language/GML_Overview/Arrays.htm +++ b/Manual/contents/GameMaker_Language/GML_Overview/Arrays.htm @@ -1,6 +1,7 @@ + アレイ(配列 @@ -12,6 +13,7 @@ +

    アレイ(配列

    @@ -20,44 +22,61 @@

    アレイ(配列


    fruits = [ "Apples", "Oranges", "Mangoes" ];

    -

    item, item, item] の構文で、変数に格納される配列を作成しています。配列に格納された項目は、後でその変数を通して 0 から始まる整数値でアクセスすることができます。この整数値は[]ブラケットで囲まれています。

    +

    item, item, item] の構文で、変数に格納される配列を作成しています。配列に格納された項目は、後でその変数を通して 0 から始まる整数値でアクセスすることができます。この整数値は[]ブラケットで囲まれています。

    first_fruit = fruits[ 0 ];
    second_fruit = fruits[ 1 ];
    // ...and so on.

    1次元配列

    -

    その前に、配列とは何か、どのような構造になっているかを明らかにしておきましょう。配列とは、変数に代入されるデータ型のことで、1つの値だけでなく、複数の値を格納することができます。下の図は、基本的な配列の模式図です。

    -

    -

    これは1D(1次元)配列と呼ばれ、ご覧のように変数"a"に格納され、複数の値が格納されています。この配列にアクセスするには、次のような操作を行います。

    +

    その前に、配列とは何か、どのような構造になっているかを明らかにしておきましょう。配列とは、変数に代入されるデータ型のことで、1つの値だけでなく、複数の値を格納することができます。下の図は、基本的な配列の模式図です。

    +

    +

    これは1D(1次元)配列と呼ばれ、ご覧のように変数"a"に格納され、複数の値が格納されています。この配列にアクセスするには、次のような操作を行います。

    var _val = a[0];
    show_debug_message(_val);

    -

    上記のコードでは、配列 "a" の位置 0 から値を取得し、コンソールに出力しています。上の画像に示されている配列の内容からすると、125 と出力されることになります。もし、次のようにしたら

    +

    上記のコードでは、配列 "a" の位置 0 + から値を取得し、コンソールに出力しています。上の画像に示されている配列の内容からすると、125 と出力されることになります。もし、次のようにしたら

    var _val = a[3];
    show_debug_message(_val);

    出力には、「Hi!

    -

    ご覧のように、配列に変数名を与え、さらに角括弧内に値を与えています。 [] 、値は配列の中でデータを取得する位置です。つまり、配列とは値を格納するスロットをいくつも持つ容器であり、容器内の各位置にはそれを識別するための特定の番号があり、それを [] に記述しています。配列の内容は常に 0 から始まり決して負にはならないことに注意してください!

    -

    配列の作成

    -

    配列のデータをチェックする方法は紹介しましたが、そもそも配列はどのように作成するのでしょうか。まず、配列を使う前に初期化しないとGameMakerはエラーになります。配列の初期化とは、配列の各スロットに初期値を与えて、プロジェクトコードの他の場所で使用するための準備をすることです。このことは、配列を使う前にある程度の計画を立てる必要があることを意味し、重要なことです。しかし、このようにloop を繰り返すことで、配列を初期化することはとても簡単です。

    +

    ご覧のように、配列に変数名を与え、さらに角括弧内に値を与えています。 [] + 、値は配列の中でデータを取得する位置です。つまり、配列とは値を格納するスロットをいくつも持つ容器であり、容器内の各位置にはそれを識別するための特定の番号があり、それを [] + に記述しています。配列の内容は常に 0 から始まり決して負にはならないことに注意してください!

    +

    配列の作成

    +

    配列のデータをチェックする方法は紹介しましたが、そもそも配列はどのように作成するのでしょうか。まず、配列を使う前に初期化しないとGameMakerはエラーになります。配列の初期化とは、配列の各スロットに初期値を与えて、プロジェクトコードの他の場所で使用するための準備をすることです。このことは、配列を使う前にある程度の計画を立てる必要があることを意味し、重要なことです。しかし、このようにloop を繰り返すことで、配列を初期化することはとても簡単です。

    var i = 9;

    repeat(10)
    {
        array[i] = 0;
        i -= 1;
    }

    -

    この単純なコードは、0から9までの10スロットの配列を0に初期化します。配列は逆に初期化され、最後の値が最初に定義されていることにお気づきでしょう。0 から順に初期化すると、値を追加するたびにメモリを再割り当てしなければなりません(つまり、10 スロットの配列をloop で初期化すると、メモリ割り当てが 10 回変更されることになります)。小さな配列であれば速度の差は無視できますが、大きな配列ではこの方法で可能な限り最適化することが望まれます。

    +

    この単純なコードは、0から9までの10スロットの配列を0に初期化します。配列は逆に初期化され、最後の値が最初に定義されていることにお気づきでしょう。0 + から順に初期化すると、値を追加するたびにメモリを再割り当てしなければなりません(つまり、10 スロットの配列をloop + で初期化すると、メモリ割り当てが 10 回変更されることになります)。小さな配列であれば速度の差は無視できますが、大きな配列ではこの方法で可能な限り最適化することが望まれます。

    :HTML5へのエクスポートは上記のルールの例外であり、ターゲットとする場合は、0から上の連続した順序で配列を初期化する必要があります。

    -

    また、GML 関数 array_create()を使えば、固定サイズの配列を初期化することができますし、例えば、値を持たない「空の」配列を作ることもできます。

    +

    また、GML 関数 array_create()を使えば、固定サイズの配列を初期化することができますし、例えば、値を持たない「空の」配列を作ることもできます。

    my_array = [];

    -

    これにより、GameMaker は、変数 "my_array" が配列であることを伝え、今後いつでも値を追加することができます。ただし、空の配列にある値にアクセスしようとすると、エラーが発生します。

    +

    これにより、GameMaker は、変数 "my_array" が配列であることを伝え、今後いつでも値を追加することができます。ただし、空の配列にある値にアクセスしようとすると、エラーが発生します。
    +

    どの項目を配列に入れるかが既に決まっている場合は、配列を宣言する際に大括弧の間にカンマで区切った値を追加することができます。

    my_array = ["Steve", 36, "ST-3V3 - Steve Street"];

    -

    配列の境界

    +

    配列の境界

    配列の外側の値にアクセスしようとするとエラーになるので、常に有効な配列の位置にのみアクセスするように注意する必要があります。例えば、これを実行すると、プロジェクトはクラッシュします。

    my_array = array_create(5, 0);
    var _val = my_array[6];

    -

    配列は5つの位置で初期化されただけですが、位置7を取得しようとしました。配列は0から番号が振られるので、 array[6] は位置7です。したがって、ゲームはエラーを発生しクラッシュします。

    -

    配列の使用

    +

    配列は5つの位置で初期化されただけですが、位置7を取得しようとしました。配列は0から番号が振られるので、 array[6] + は位置7です。したがって、ゲームはエラーを発生しクラッシュします。

    +

    配列の使用

    さて、配列は実際どのように使うのでしょうか?次の例に示すように、通常の変数の使い方と全く同じです。

    // Add two array values together
    total = array[0] + array[5];
    @@ -83,8 +102,9 @@

    配列の使用

    draw_text(32, 32 + (i * 32), _total);

    上記のコードは、配列にあるすべての値を合計し、それぞれを描画して、最後に合計値を描画します。

    -

    アレイの削除

    -

    配列について最後に述べておくと、配列を定義している変数に1つの値を「再代入」するだけで、配列を削除することができます。これにより、その配列のすべての位置と値に関連するメモリが解放されます。例えば

    +

    アレイの削除

    +

    + 配列について最後に述べておくと、配列を定義している変数に1つの値を「再代入」するだけで、配列を削除することができます。これにより、その配列のすべての位置と値に関連するメモリが解放されます。例えば

    // Create an array
    for (var i = 9; i > -1; --i)
    {
        a[i] = i;
    @@ -93,14 +113,20 @@

    アレイの削除

    // Delete the array
    a = undefined;

    -

    Room インスタンスに配列を作成した場合、インスタンスがゲームから削除されたときに、これらの配列はクリーンアップされる必要はありません。ただし、配列の位置がパーティクルシステム、buffers 、データ構造などの動的アセットへの参照を保持している場合は、配列の削除、インスタンスの破棄、またはroom の終了前にこれらを破棄する必要があります。

    +

    Room + インスタンスに配列を作成した場合、インスタンスがゲームから削除されたときに、これらの配列はクリーンアップされる必要はありません。ただし、配列の位置がパーティクルシステム、buffers 、データ構造などの動的アセットへの参照を保持している場合は、配列の削除、インスタンスの破棄、またはroom の終了前にこれらを破棄する必要があります。

    多次元配列

    -

    1次元の配列がどういうものかはわかりましたが、GameMakerでは多次元の配列が可能で、基本的には配列の中に配列がある...という構造になっています。例えば、以下は2D(2次元)配列です。

    +

    1次元の配列がどういうものかはわかりましたが、GameMakerでは多次元の配列が可能で、基本的には配列の中に配列がある...という構造になっています。例えば、以下は2D(2次元)配列です。 +

    array[0][0] = 5;

    -

    これは、本質的に、配列が実際には様々な1次元配列で構成されていることをGameMaker に伝えているのです。以下はその拡張例です。

    +

    これは、本質的に、配列が実際には様々な1次元配列で構成されていることをGameMaker + に伝えているのです。以下はその拡張例です。

    array[0][0] = 0;
    array[0][1] = 1;
    array[0][2] = 2;
    @@ -109,8 +135,11 @@

    アレイの削除

    array[1][1] = 4;
    array[1][2] = 5;

    -

    上記のコードでは, array[0] が別の配列を保持しており,array[1] も同様です.

    -

    多次元配列は、1次元の配列と同じように使用前に初期化する必要があり、実数、strings 、その他のデータ型を変数と同じように保持できます。大量のデータを簡単にアクセスできる方法で保存する必要があるゲームにとって、理想的な候補です(忘れずに、配列を通して簡単にloop できるのです)。

    +

    上記のコードでは, array[0] が別の配列を保持しており,array[1] + も同様です.

    +

    多次元配列は、1次元の配列と同じように使用前に初期化する必要があり、実数、strings 、その他のデータ型を変数と同じように保持できます。大量のデータを簡単にアクセスできる方法で保存する必要があるゲームにとって、理想的な候補です(忘れずに、配列を通して簡単にloop できるのです)。

    また、1次元配列を入れ子にすることで、1つの文の中で多次元配列を初期化することができます。

    two_dimensional_array = 
    [
    @@ -119,7 +148,8 @@

    アレイの削除

        ["Mango", 15, 4],
        // ...and so on.
    ]

    -

    また、多次元配列は2次元に 限らず、 [n] のような引数を追加するだけで、コードの必要に応じて3次元、4次元、それ以上の次元の配列を持つことができます。

    +

    また、多次元配列は2次元に 限らず、 [n] + のような引数を追加するだけで、コードの必要に応じて3次元、4次元、それ以上の次元の配列を持つことができます。

    array[0][0][0] = 1;     // A three dimensional array
    array[0][0][0][0] = 1;  // A four dimensional array
    // etc...

    @@ -136,10 +166,13 @@

    アレイの削除

    array[0][1] = 2;
    array[0][0] = 1;

    -

    上記のコードでは、 array[0] が 2 スロット、 array[1] が 4 スロット、 array[2] が 3 スロットになります。

    -

    拡張例

    -

    最後に、実際のゲームでの使い方の例を一つご紹介します。例えば、ゲーム中の4つの地点で、ランダムな値によって4種類の敵を出現させたいとします。この場合、2次元の配列を使用することで、コードを書く手間を省くことができます。

    -

    まず、"controller"object の Create イベントで使用する配列を初期化します (各配列のエントリが何を行うかを示すコメントを使用していることに注意しましょう)。

    +

    上記のコードでは、 array[0] が 2 スロット、 array[1] が + 4 スロット、 array[2] が 3 スロットになります。

    +

    拡張例

    +

    + 最後に、実際のゲームでの使い方の例を一つご紹介します。例えば、ゲーム中の4つの地点で、ランダムな値によって4種類の敵を出現させたいとします。この場合、2次元の配列を使用することで、コードを書く手間を省くことができます。

    +

    まず、"controller"object の Create イベントで使用する配列を初期化します + (各配列のエントリが何を行うかを示すコメントを使用していることに注意しましょう)。

    enemy[3][2] = 448;       //y position
    enemy[3][1] = 32;        //x position
    enemy[3][0] = obj_Slime; //Object
    @@ -152,18 +185,24 @@

    拡張例

    enemy[0][2] = 32;
    enemy[0][1] = 32;
    enemy[0][0] = obj_Ogre;

    -

    これで、インスタンスを生成するobjects と、それに対応するroom 内の x および y スポーン座標が、すべて配列に格納されました。これは、コントローラobject の別のイベント(たとえば、アラームやキー押下イベント)で、次のように使用することができます。

    +

    これで、インスタンスを生成するobjects と、それに対応するroom 内の x および y スポーン座標が、すべて配列に格納されました。これは、コントローラobject の別のイベント(たとえば、アラームやキー押下イベント)で、次のように使用することができます。

    //get a random number from 0 to 3, inclusive
    var i = irandom(3);

    //Use the array to create the object
    instance_create_layer(enemy[i][1], enemy[i][2], "Enemy_Layer", enemy[i][0]);

    -

    この短いコードで、ゲーム内のランダムな敵を生成します。room 、これは "if / then / else" 構造体や "switch" よりもはるかに少ないコードで、配列はすべて create イベントで初期化されるので、プロジェクトの残りのコードにハードコードされていないこれらの値を編集して変更することが非常に簡単になります。

    +

    この短いコードで、ゲーム内のランダムな敵を生成します。room 、これは "if / then / else" 構造体や "switch" + よりもはるかに少ないコードで、配列はすべて create イベントで初期化されるので、プロジェクトの残りのコードにハードコードされていないこれらの値を編集して変更することが非常に簡単になります。

    関数の引数としての配列

    -

    スクリプト関数や メソッド変数に引数として配列を渡し、関数内の任意の場所でそれらの配列を変更することができます。この場合、元の配列も同様に変更されます。

    +

    スクリプト関数や メソッド変数に引数として配列を渡し、関数内の任意の場所でそれらの配列を変更することができます。この場合、元の配列も同様に変更されます。

    例えば、この関数は、渡された配列の最初の3つの要素を変更するだけです。

    modify_array = function (array)
    {
    @@ -178,22 +217,28 @@

    関数の引数としての配列


    show_debug_message(my_array); // Prints [2, 4, 6];

    -

    以前のバージョン(GameMaker )では、関数内で配列を変更すると、代わりにコピーが作成されたため、このようなことはありませんでした。この非推奨の動作は、必要ならまだ有効にすることができます。 詳細は、以下の "書き込み時のコピー" のセクションを参照ください。

    +

    以前のバージョン(GameMaker + )では、関数内で配列を変更すると、代わりにコピーが作成されたため、このようなことはありませんでした。この非推奨の動作は、必要ならまだ有効にすることができます。 詳細は、以下の + "書き込み時のコピー" のセクションを参照ください。

    コピーオンライト

    -

    Copy on Writeの動作は非推奨で、General Game OptionsのEnable Copy on Write behaviour for Arrays」が有効なときのみ使用されます。このセクションでは、このオプションが有効になっているときの配列の動作について説明します。

    -

    前節で説明したように、配列は引数として関数に渡すことができる。そのためには、単に配列変数を指定すればよく(個々の位置や、 [] の括弧は不要)、配列全体が関数に参照渡しされます。

    +

    Copy on Writeの動作は非推奨で、General Game OptionsのEnable Copy on + Write behaviour for Arrays」が有効なときのみ使用されます。このセクションでは、このオプションが有効になっているときの配列の動作について説明します。

    +

    前節で説明したように、配列は引数として関数に渡すことができる。そのためには、単に配列変数を指定すればよく(個々の位置や、 [] + の括弧は不要)、配列全体が関数に参照渡しされます。

    my_array = [1, 2, 4, 8, 16];

    do_something(my_array);

    -

    しかし、Copy on Writeが有効な場合、関数内で配列の値を変更すると、変更内容を含む一時的なコピーが作成されます。元の配列は変更されません。この挙動をCopy on Writeと呼びます。

    +

    しかし、Copy on Writeが有効な場合、関数内で配列の値を変更すると、変更内容を含む一時的なコピーが作成されます。元の配列は変更されません。この挙動をCopy on Writeと呼びます。 +

    関数に渡された元の配列を実際に変更するには、それを返すか、 @ アクセスキーを使用する必要があります。

    例えば、上で呼ばれたdo_something()という関数は、次のような簡単なことをすることがあります。

    do_something = function(array)
    {
        array[1] = 200;
    }

    -

    このとき、my_arrayには 1, 200, 4などの値が格納されるはずで、通常は正しいのですが、Copy on Writeを有効にすると、元の配列は影響を受けないままです。

    +

    このとき、my_arrayには 1, 200, + 4などの値が格納されるはずで、通常は正しいのですが、Copy on Writeを有効にすると、元の配列は影響を受けないままです。

    これを回避するには、関数が変更した配列のコピーを返し、それを元の変数に適用すればよいのです。

    my_array = [1, 2, 4, 8, 16];

    @@ -207,13 +252,16 @@

    コピーオンライト

        return array;
    }

    -

    注意 配列の値を変更するのではなく、参照するのであれば、上記のコードは必要ありません。配列を参照することで、配列はコピーされず、パースも高速になります。

    -

    2つ目の解決策は、@ アクセサを使用して配列の値を直接変更することです。これにより、一時的なコピーを作成しなければならないという CPU オーバーヘッドを節約することができます。つまり、関数から配列を返す必要がなく、直接編集することができるのです。

    +

    注意 + 配列の値を変更するのではなく、参照するのであれば、上記のコードは必要ありません。配列を参照することで、配列はコピーされず、パースも高速になります。

    +

    2つ目の解決策は、@ アクセサを使用して配列の値を直接変更することです。これにより、一時的なコピーを作成しなければならないという CPU + オーバーヘッドを節約することができます。つまり、関数から配列を返す必要がなく、直接編集することができるのです。

    do_something = function(array)
    {
        array[@ 1] = 200;
    }

    -

    このアクセサを使用すると、Copy on Write の動作をバイパスして、 参照されている配列を直接変更することができます。これは、オプションを有効にしたまま、特定のステートメントに対して選択的にCopy on Writeを無効にするために使用することができます。

    +

    このアクセサを使用すると、Copy on Write の動作をバイパスして、 参照されている配列を直接変更することができます。これは、オプションを有効にしたまま、特定のステートメントに対して選択的にCopy on + Writeを無効にするために使用することができます。

    繰り返しますが、コピーオンライトが 無効になっている場合(デフォルトおよび推奨オプション)、これらのすべては必要ありません。

    アクセッサの詳細とその動作、配列の例については、次のページを参照してください。