前回からの続きです。
今回はテトリスのフィールドを作っていきます。
処理に必要な変数の追加と初期化処理、それに必要なマクロも併せて作ります。
フィールド表示も Tetris が管理するため、まずは Tetris を作りましょう。
レベル編集画面で、Contents Browser → Add New → Blueprint Class → Actor を選択し、Actor クラスを追加。ここでは名前を Tetris としました。
フィールドの大きさは変更しやすいように、インスタンスで作成する仕様にします。
Tetris をダブルクリックで開き、MyBlueprints → Variables の「+」ボタンをクリックし、以下の変数を追加。
YNum-1 と ZNum-1 の数値を変えればフィールドの大きさが変わります。なので手入力でも値を変更できるように、この二つの変数は Instance Dditable にチェックを入れておきましょう。
この縦横変数、なぜマイナス1かと言うと、ループ計算の際にいちいち引き算をするのが面倒だったからなのですが、今度はわざわざプラス1する必要のある機会も増え、本当に効率が良いのかは環境次第で変わってきます。
BoardLayout はフィールドのブロック配置を記録しておくため、操作するブロックの移動判定からラインを消す処理まですべての判定、処理に関わってくる配列です。
次に壁のメッシュを追加しましょう。
Components → Add Component → Instanced Static Mesh でインスタンスメッシュを追加し、名前を Wall とします。
Details → Static Mesh に BlockStaticMesh を指定し、Materials に M_Brick_Hewn_Stone を指定。
この M_Brick_Hewn_Stone はスターターコンテンツに収録されているものですが、別に壁っぽくあれば他のものでも良いし、事前に作った BlockMaterial でも良いです。
しかし Unreal Engine 4 には標準で二次元配列が用意されていないため、通常の配列を疑似的に二次元として扱うようにします。
考え方としては、まず下の図を見てください。
9マスが一列に並んでいるのが一次元配列、3x3マスが二次元配列です。マスの数字は1から始まっていますが、座標やインデックスの始点はゼロなのを忘れないようにしましょう。
そうすると、一次元から二次元、また二次元から一次元への変換は、変数がすべて Integer であれば以下の計算で実現できることが分かります。
一次元から二次元
y座標 = index % 横軸の長さ
z座標 = index / 横軸の長さ
二次元から一次元
index = z座標 x 横軸の長さ + y座標
というわけで、値を変換するマクロを作成します。
MyBlueprint → Macros の「+」ボタンをクリックしマクロを追加、名前を YZToIndex とします。
YZToIndex をダブルクリックで開き、Details の Inputs に YZ という名前の Vector 変数を追加、Outputs に Index という名前の Integer 変数を追加します(それぞれ「+」をクリックすれば追加できる)。
グラフ上で以下の処理を組みます。
インプットが Vector なのは、今回の処理で二次元の座標を扱う際に Vector を使用しているからです。
これで二次元から一次元への変換マクロが完成しました。
同様に、IndexToYZ というマクロを作成し、以下の処理を組みます。
まず BoardLayout を初期化しますが、その際に壁か空間かの情報を入れる処理を追加し、壁の配置を確定させてしまいましょう。
入れる値は、壁の場合は 1、空間は 0 です。
MyBlueprint → Functions → ConstructionScript をダブルクリックで開き、以下の処理を組みます。
ConstructionScript はアクタを配置したときに呼ばれるメソッドなので、今回の初期化に適しています。
これで縦ZNum、横YNum の二次元配列(本当は一次元だが)BoardLayout ができました。
次は表示処理ですが、今組んだ処理の最初のループ(ZNum-1 がくっついている方)の Completed から繋げて、以下の処理を組みます。
これは単純に、BoardLayout の値が空間でない(ゼロでない)場合、その座標に壁を追加する処理となっています。
それではレベル編集画面に戻り、Tetris ブループリントをレベル上、Location をすべてゼロにして配置してみましょう。
配置する時にはすでに壁が表示されていると思います。
Tetris を選択し、Details → Default の YNum-1 や ZNum-1 の値を変えると、即座にフィールドの大きさが変わるので試してみましょう。
処理に必要な変数の追加と初期化処理、それに必要なマクロも併せて作ります。
1.Actor クラス Tetris の作成
テトリスのゲームシステムは Actor クラスの Tetris を作成し、そこで管理します。フィールド表示も Tetris が管理するため、まずは Tetris を作りましょう。
レベル編集画面で、Contents Browser → Add New → Blueprint Class → Actor を選択し、Actor クラスを追加。ここでは名前を Tetris としました。
2.Tetris に変数とメッシュを追加
フィールドを表示させるために必要な変数とメッシュを追加します。フィールドの大きさは変更しやすいように、インスタンスで作成する仕様にします。
Tetris をダブルクリックで開き、MyBlueprints → Variables の「+」ボタンをクリックし、以下の変数を追加。
変数名 | 型 | 初期値 | 説明 |
BlockSize | float | 100.0 | ブロックの大きさ。配置の際の計算に必要 |
YNum-1 | Integer | 11 | y軸(横軸)の長さ、引く1 |
ZNum-1 | Integer | 21 | z軸(縦軸)の長さ、引く1 |
BoardLayout | Integer(配列) | フィールド上のブロックや壁の配置を記録しておく配列 |
YNum-1 と ZNum-1 の数値を変えればフィールドの大きさが変わります。なので手入力でも値を変更できるように、この二つの変数は Instance Dditable にチェックを入れておきましょう。
この縦横変数、なぜマイナス1かと言うと、ループ計算の際にいちいち引き算をするのが面倒だったからなのですが、今度はわざわざプラス1する必要のある機会も増え、本当に効率が良いのかは環境次第で変わってきます。
BoardLayout はフィールドのブロック配置を記録しておくため、操作するブロックの移動判定からラインを消す処理まですべての判定、処理に関わってくる配列です。
次に壁のメッシュを追加しましょう。
Components → Add Component → Instanced Static Mesh でインスタンスメッシュを追加し、名前を Wall とします。
Details → Static Mesh に BlockStaticMesh を指定し、Materials に M_Brick_Hewn_Stone を指定。
この M_Brick_Hewn_Stone はスターターコンテンツに収録されているものですが、別に壁っぽくあれば他のものでも良いし、事前に作った BlockMaterial でも良いです。
3.疑似二次元配列化のためのマクロを作成
テトリスは縦横二次元のレイアウトなので、本来であればフィールドの管理は二次元配列で行いたいところです。しかし Unreal Engine 4 には標準で二次元配列が用意されていないため、通常の配列を疑似的に二次元として扱うようにします。
考え方としては、まず下の図を見てください。
9マスが一列に並んでいるのが一次元配列、3x3マスが二次元配列です。マスの数字は1から始まっていますが、座標やインデックスの始点はゼロなのを忘れないようにしましょう。
そうすると、一次元から二次元、また二次元から一次元への変換は、変数がすべて Integer であれば以下の計算で実現できることが分かります。
一次元から二次元
y座標 = index % 横軸の長さ
z座標 = index / 横軸の長さ
二次元から一次元
index = z座標 x 横軸の長さ + y座標
というわけで、値を変換するマクロを作成します。
MyBlueprint → Macros の「+」ボタンをクリックしマクロを追加、名前を YZToIndex とします。
YZToIndex をダブルクリックで開き、Details の Inputs に YZ という名前の Vector 変数を追加、Outputs に Index という名前の Integer 変数を追加します(それぞれ「+」をクリックすれば追加できる)。
グラフ上で以下の処理を組みます。
インプットが Vector なのは、今回の処理で二次元の座標を扱う際に Vector を使用しているからです。
これで二次元から一次元への変換マクロが完成しました。
同様に、IndexToYZ というマクロを作成し、以下の処理を組みます。
4.フィールドの初期化と壁表示
Tetris のフィールド、すなわち BoardLayout 配列を初期化し、壁を表示させていきます。まず BoardLayout を初期化しますが、その際に壁か空間かの情報を入れる処理を追加し、壁の配置を確定させてしまいましょう。
入れる値は、壁の場合は 1、空間は 0 です。
MyBlueprint → Functions → ConstructionScript をダブルクリックで開き、以下の処理を組みます。
ConstructionScript はアクタを配置したときに呼ばれるメソッドなので、今回の初期化に適しています。
これで縦ZNum、横YNum の二次元配列(本当は一次元だが)BoardLayout ができました。
次は表示処理ですが、今組んだ処理の最初のループ(ZNum-1 がくっついている方)の Completed から繋げて、以下の処理を組みます。
これは単純に、BoardLayout の値が空間でない(ゼロでない)場合、その座標に壁を追加する処理となっています。
それではレベル編集画面に戻り、Tetris ブループリントをレベル上、Location をすべてゼロにして配置してみましょう。
配置する時にはすでに壁が表示されていると思います。
Tetris を選択し、Details → Default の YNum-1 や ZNum-1 の値を変えると、即座にフィールドの大きさが変わるので試してみましょう。
-目次-
Part.00.説明
Part.01.キューブの作成
Part.02.フィールドの作成
Part.03.様々な形のブロックの作成
Part.04.カメラとブロックの配置
Part.05.ブロックの移動処理
Part.06.ブロックの接地処理
Part.07.ライン消去処理
Part.08.自動落下とゲームオーバー処理
Part.01.キューブの作成
Part.02.フィールドの作成
Part.03.様々な形のブロックの作成
Part.04.カメラとブロックの配置
Part.05.ブロックの移動処理
Part.06.ブロックの接地処理
Part.07.ライン消去処理
Part.08.自動落下とゲームオーバー処理
0 件のコメント:
コメントを投稿