スクラッチに挑戦している皆さん、どうも!スクラッチコーチです。
- ① まず2Dマップを動き回れるようにしよう!
- ② さっそく3D化しちゃおうぜ!
- ③ 壁にスキマがあって敵から丸見え!?やっば
- ④ 陰影をつけて立体感マシマシにしよう
- ⑤ トゲトゲやユガミを補正してハイクオリティ3Dの一歩を踏み出そう(爆速オンライン3Dゲームの作り方 #05)
- ⑥ 壁の衝突判定の基本を作ろう
- ⑦ 壁に触れてると進めない!?移動を改善しよう
- ⑧ ついに敵が現れた!距離感の計算ってどうやる? (いまここ)
- ⑨ 奥行きを実装して壁の後ろに隠れられるようにする
- ⑩ エンティティに陰影をつける
- ⑪ 敵がプレイヤーに向かって迫ってくるように実装する
- ⑫ スターを実装しよう!
- ⑬ 爆速3D爆誕
- ⑭ 壁に画像(テクスチャ)を貼り付けてリッチな3D空間を演出する
- ⑮ テクスチャの壁を洗練させて本格3D完成!
- ⑯ シメだ!モバイル & オンライン化をするぞ
- ⑰ 【おまけ】敵がプレイヤーを見つけたら追いかけるロジック
- ⑱ 【特別編】マウスに合わせて視線を上下させる方法
- ⑲ 【特別編】マウスでターンするスピードを調整する
- ⑳ 【特別編】敵をジャンプで乗り越える
ゴンザレスからの挑戦状
どこを探しても何も無い!それもそのはず、そもそもこの3D空間には何も出現するような実装がされてない。なんてこった!これじゃあただ散歩してるだけじゃないか。でもアイテムを出現させるには、その前に敵も出現させないといけないらしい。背に腹は変えられない!いっちょやってみっか!
今回の目標「敵を描画する」
今までは3D空間の描画やそこを自由に動き回ることだけに集中してきた。ここからはいよいよ敵やアイテムを出現させることに注力していく!
今回は次のことに取り組むぞ。
- 3D空間でどうやってプレイヤーと相手の距離を測るか
- 距離に合わせて敵を遠近感を反映させて描画する方法
どっちもワクワクする課題だよね!3Dゲームの至上命題と言っても過言ではないマスターしがいのある挑戦になるぜ!
メインループに「エンティティの計算をする」を追加する
スプライト「プレイヤー」を開こう。
メインループ(ゲームループともいう)のずっとブロックに、新しいメッセージを追加しよう。
メッセージ名は「エンティティを計算する」にしておこうか。
スプライト「エンティティ」を作る
新スプライトを作るよ!
スプライト名は「エンティティ」だよ。
エンティティというのは、アイテムもエネミーも含めた名前なんだけど、ぶっちゃけグリフパッチさんが「これエンティティじゃなくてエネミーで良かったかも」って言ってるので、エンティティという名前だけど敵のスプライトとして使っていく。まぁとりあえず名前はエンティティにしておこう。今後自分のオリジナル3D作品を作るときはエネミーにしてもいいかも。
プレイヤーのヒットボックスをコピーしておく
スプライト「プレイヤー」を開こう。
プレイヤーのコスチュームからヒットボックスをドラッグアンドドロップして、エンティティにコピーしておこう。
プレイヤーを開いたついでに、プレイヤーの幽霊効果をいったんゼロにして見えるようにしておこう。そのほうがこの後の処理が分かりやすいよ。
エンティティのコスチュームを調整する
スプライト「エンティティ」を開こう。
ヒットボックスがあるはずだから、デフォルトのコスチュームは消してしまおう。
コーディング
コーディングに移るよ。
緑の旗が押されたときを置く。
まず回転方法を回転しないにしてから、大きさを225%くらいに調整しようか。
次は適当。座標をプレイヤーから見える位置にしよう。単純に、プレイしたら見えるほうがデバッグしやすいからだよ。
敵との距離を測る
敵との距離を3D空間上で計算する必要がある。理屈はカンタンなんだ。計算が複雑なだけで。。。💦
いったん3Dではなくて2Dで考えてみようか。平面にしてからプレイヤーの目線上に来るように回転させる。そしたらあとはお互いの相対距離を測るだけでOK。
うん、どうやって?w
大丈夫、一緒に見ていこうぜ!
変数「相対距離X」「相対距離Y」を作る
まずはメッセージ「エンティティの計算をする」を受け取ったとき、を置くよ。
変数を作るよ。
まずはXから計算していこう。↓こんなブロックを用意して矢印を参考に当てはめて。
これを相対距離Xにセットしよう。
これを複製しよう。
相対距離Yも同じような感じで整える。3か所ともX座標のところがY座標に変わってるから注意。
定義「_画面を回転させる」を作る
この定義の名前はもっと正確に言うなら「_画面を回転させるのに必要な値を用意する」って感じ。実際に回転させるわけではないので混乱しないように。
エンティティの計算をするところで実行しよう!
ここのスクショ掲載し忘れていました。ご指摘をくれたmaple_tayamaさん、ありがとう!!
相対距離Xの算出
まずは相対距離Xだ。
X方向の回転
回転みたいな曲線の動きの計算によく使われるのは三角関数だ。ここでも「X * ★カメラの角度のcos 」という演算を作る。
↓こんなかんじ。
Y方向の回転
今度はsinを使ってY方向の回転を導いていく。
↓こんな感じ。
X方向の回転と、Y方向の回転を組み合わせる
引き算ブロックに各演算をはめよう。
これを変数「相対距離X」にセットする。
相対距離Yの算出
今度は足し算ブロックを相対距離Yにセットするところから始めよう。
この足し算にまた三角関数を使った回転の計算を入れていくよ。
X方向の回転
さっき作った↓この掛け算のあたりを右クリックして複製を押そう。
そしてcosのところをsinに変えて足し算の左側にはめよう。
Y方向の回転
次はYで作った掛け算のあたりを右クリックして複製しよう。
sinのところをcosに変えてから足し算の右側にはめよう。
↓こんな感じに仕上がる。
よぉし、ちょっとヘビーな操作が続いたね。この定義はいったんここまでにして、別のスプライトに取り掛かろう。
相手との距離を測るために必要な相対距離を確保した!
スプライト「ペン」を作る
新しいスプライトを作るよ。
コスチュームを選ぶ。
どれがいい?ここでは怒ってるナノを選んでみたよ。
スプライト名は「ペン」だ。
このペンというスプライトは、さっきのエンティティと密接に関係するスプライトなんだ。ペンは見た目を描画するスプライトで、エンティティは動き方を管理するスプライトになる。
コスチュームを3D空間用にリサイズする
このまま3D空間に描画すると、ナノが浮遊してるみたいに地面が足についてない感じになっちゃう。
そこで一定の法則でナノを調整していく。
ナノをグループ化する
まずは全選択して、
グループ化しておこう。
正方形を描く
四角形ツールを選ぶ。
200 x 200の正方形を描こう。コスのサムネを見るとサイズが分かるよ。
正方形が描けたら、最背面にレイヤーを下げよう。ナノが見えるはず。
↓こんな感じ。
選択ツールを選ぶ。
ナノをクリックすれば、グループ化してあるからナノだけ選択できるはずだ。
ナノだけ正方形の下辺に足が着くようにドラッグしよう。
↑ちなみにこの正方形は、天井と床の位置を擬似的に表現してる。
十字を描く
直線ツールを選ぼう。
正方形の真ん中で横線を引く。
真ん中で縦線も引いておこう。
正方形と十字は、このあとで透明にしちゃうよ。いまは調整するときに便利だから描いた。
選択ツールを選ぶ。
ナノを選択する。角の点をドラッグして、ナノのサイズを小さくしよう。ちょうど頭が横線になるくらいまで小さくして、ナノの眉間が縦線あたりにくるように調整して。
ガイドラインを透明にする
まずナノを含めないように気をつけながら、正方形と十字線を選択する。
グループ化する。
塗りつぶしを選んで、透明化ボタンをクリックする。
枠線を選んで、透明化ボタンをクリックする。
スッキリ!
コスチューム1は消しとく。
よし!これでコスチュームの作業は完了だ。
3D空間に最適化されたサイズのコスチュームを用意することができた!
敵を3D空間に描画する
ここまでに、相対距離XYの算出と、描画するコスチュームの用意を進めてきた。
ここからいよいよ直線距離を算出して3D空間にプレイヤー以外の存在を作り出す具体的なステップに入る。
メッセージ「ペイントする」
新しいメッセージ「ペイントする」を作る。
変数「距離」を作る
新しい変数「距離」を作る。
メッセージを受け取ったところで、距離に「エンティティの相対距離Y」をセットする。さっき計算した値だ。
変数「高さ」を作る
高さの計算は少し複雑だ。以前計算してあった★DVを使うぞ。
↓これらのブロックを用意して矢印を参考に組み立ててみて。
高さにセットしよう。
さらに、大きさを「高さ」%にするぞ。
距離を加味した高さを大きさに反映することで、縦方向の遠近感が正しく調整できた。
高さに使った演算の掛け算あたりを右クリックして複製しよう。
10のところに、エンティティの相対距離Xをはめよう。
↑この演算ブロックを↓X座標に割り当てよう。Y座標には、ゼロを入れておいて。
横方向の距離も正しく反映することができた。
メインループに「ペイントする」を追加する
ペイントするというメッセージも、ゲームのメインメッセージを集約してあるプレイヤー(のずっとループ)から送ろう。
メッセージ「ペイントする」を送ろう。
CHECK! ナノが見えるかテストする
3D空間に、ナノが、
来たぁーーー!
まとめ
今回はすっごいスキルを詰め込んだ。キーになったのは相対距離の算出と、それを使った描画処理だったね。距離から高さを導き出すところで遠近感を実現できたところは感動的スクラッチだった。
学びをまとめておこう。
- 3D空間でどうやってプレイヤーと相手の距離を測るのに、相対距離を計算することがわかった
- 相対距離を使って距離を導き出し、さらに高さを計算することで遠近感を出すことができた
よしよし!これでピコの盗まれた家宝「スター」も描画する準備が整ったかな!?っとアレ?なんだか大変なことになってるぞ!スクラッチキャットが大ピンチに陥ってしまったみたいだ!次回もチェックしてみてね!
グリフパッチさんの動画を参考にしています
今回のチュートリアルは世界No.1スクラッチャーとして名高いグリフパッチさんの動画を参考にしているよ。ただし手順を一部変えているところもあるんだ。
- ① まず2Dマップを動き回れるようにしよう!
- ② さっそく3D化しちゃおうぜ!
- ③ 壁にスキマがあって敵から丸見え!?やっば
- ④ 陰影をつけて立体感マシマシにしよう
- ⑤ トゲトゲやユガミを補正してハイクオリティ3Dの一歩を踏み出そう(爆速オンライン3Dゲームの作り方 #05)
- ⑥ 壁の衝突判定の基本を作ろう
- ⑦ 壁に触れてると進めない!?移動を改善しよう
- ⑧ ついに敵が現れた!距離感の計算ってどうやる? (いまここ)
- ⑨ 奥行きを実装して壁の後ろに隠れられるようにする
- ⑩ エンティティに陰影をつける
- ⑪ 敵がプレイヤーに向かって迫ってくるように実装する
- ⑫ スターを実装しよう!
- ⑬ 爆速3D爆誕
- ⑭ 壁に画像(テクスチャ)を貼り付けてリッチな3D空間を演出する
- ⑮ テクスチャの壁を洗練させて本格3D完成!
- ⑯ シメだ!モバイル & オンライン化をするぞ
- ⑰ 【おまけ】敵がプレイヤーを見つけたら追いかけるロジック
- ⑱ 【特別編】マウスに合わせて視線を上下させる方法
- ⑲ 【特別編】マウスでターンするスピードを調整する
- ⑳ 【特別編】敵をジャンプで乗り越える