3D空間に敵を描画する方法…遠近感もバッチリ!(爆速オンライン3Dゲームの作り方 #08)

3D空間に敵を描画する方法…遠近感もバッチリ!(爆速オンライン3Dゲームの作り方 #08)
グリフパッチ(動画)
ok-scratch(執筆)

和訳解説は動画作者のグリフパッチさんご本人から許可をいただいて掲載しております。
チャンネルはYOUTUBE ( by griffpatch )からどうぞ。

ついに敵が現れた!距離も遠近感も正確に描画していく
スターター
プロジェクト
リミックス用プロジェクトへ
難しさ

任意)自分の作業中のスクラッチ作品URLを記録しておこう!再開するときに便利だよ。

LOADING...

※ この記録は今使ってるPCに保存されます。別のPCで作業するときは表示されません。

スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。

ゴンザレスからゲームクリエイターへの挑戦(ちょうせん)(じょう)

どこを(さが)しても(なに)()い!それもそのはず、そもそもこの3D空間(くうかん)には(なに)出現(しゅつげん)するような実装(じっそう)がされてない。なんてこった!これじゃあただ散歩(さんぽ)してるだけじゃないか。でもアイテムを出現(しゅつげん)させるには、その(まえ)(てき)出現(しゅつげん)させないといけないらしい。()(はら)()えられない!いっちょやってみっか!

今回(こんかい)目標(もくひょう)(てき)描画(びょうが)する」

(いま)までは3D空間(くうかん)描画(びょうが)やそこを自由(じゆう)(うご)(まわ)ることだけに集中(しゅうちゅう)してきた。ここからはいよいよ(てき)やアイテムを出現(しゅつげん)させることに注力(ちゅうりょく)していく!今回(こんかい)(つぎ)のことに()()()ぞ。
  • 3D空間(くうかん)でどうやってプレイヤーと相手(あいて)距離(きょり)(はか)るか
  • 距離(きょり)()わせて(てき)遠近感(えんきんかん)反映(はんえい)させて描画(びょうが)する方法(ほうほう)
どっちもワクワクする課題(かだい)だよね!3Dゲームの至上(しじょう)命題(めいだい)()っても過言(かごん)ではないマスターしがいのある挑戦(ちょうせん)になるぜ!

メインループに「エンティティの計算(けいさん)をする」を追加(ついか)する

スプライト「プレイヤー」を(ひら)こう。
メインループ(ゲームループともいう)のずっとブロックに、(あたら)しいメッセージを追加(ついか)しよう。メッセージ(めい)は「エンティティを計算(けいさん)する」にしておこうか。

スプライト「エンティティ」を(つく)

(しん)スプライトを(つく)るよ!
スプライト(めい)は「エンティティ」だよ。
3D空間に敵を描画する方法…遠近感もバッチリ!(爆速オンライン3Dゲームの作り方 #08)を語るok-scratch ok-scratch

u003cpu003eエンティティというのは、アイテムもエネミーも(ふく)めた名前(なまえ)なんだけど、ぶっちゃけグリフパッチさんが「これエンティティじゃなくてエネミーで()かったかも」って()ってるので、エンティティという名前(なまえ)だけど(てき)のスプライトとして使(つか)っていく。まぁとりあえず名前(なまえ)はエンティティにしておこう。今後(こんご)自分(じぶん)のオリジナル3D作品(さくひん)(つく)るときはエネミーにしてもいいかも。u003c/pu003e

プレイヤーのヒットボックスをコピーしておく

スプライト「プレイヤー」を(ひら)こう。プレイヤーのコスチュームからヒットボックスをドラッグアンドドロップして、エンティティにコピーしておこう。
プレイヤーを(ひら)いたついでに、プレイヤーの幽霊(ゆうれい)効果(こうか)をいったんゼロにして()えるようにしておこう。そのほうがこの(あと)処理(しょり)()かりやすいよ。

エンティティのコスチュームを調整(ちょうせい)する

スプライト「エンティティ」を(ひら)こう。
ヒットボックスがあるはずだから、デフォルトのコスチュームは()してしまおう。

コーディング

コーディングに(うつ)るよ。(みどり)(はた)()されたときを()く。
まず回転(かいてん)方法(ほうほう)回転(かいてん)しないにしてから、(おお)きさを225%くらいに調整(ちょうせい)しようか。
(つぎ)適当(てきとう)座標(ざひょう)をプレイヤーから()える位置(いち)にしよう。単純(たんじゅん)に、プレイしたら()えるほうがデバッグしやすいからだよ。

(てき)との距離(きょり)(はか)

(てき)との距離(きょり)を3D空間(くうかん)(じょう)計算(けいさん)する必要(ひつよう)がある。理屈(りくつ)はカンタンなんだ。計算(けいさん)複雑(ふくざつ)なだけで。。。💦いったん3Dではなくて2Dで(かんが)えてみようか。平面(へいめん)にしてからプレイヤーの目線(めせん)(じょう)()るように回転(かいてん)させる。そしたらあとはお(たが)いの相対(そうたい)距離(きょり)(はか)るだけでOK。
うん、どうやって?w大丈夫(だいじょうぶ)一緒(いっしょ)()ていこうぜ!

変数(へんすう)相対(そうたい)距離(きょり)X」「相対(そうたい)距離(きょり)Y」を(つく)

まずはメッセージ「エンティティの計算(けいさん)をする」を()()ったとき、を()くよ。
変数(へんすう)(つく)るよ。
まずはXから計算(けいさん)していこう。↓こんなブロックを用意(ようい)して矢印(やじるし)参考(さんこう)()てはめて。
これを相対(そうたい)距離(きょり)Xにセットしよう。
これを複製(ふくせい)しよう。
相対(そうたい)距離(きょり)Yも(おな)じような(かん)じで(ととの)える。3か(しょ)ともX座標(ざひょう)のところがY座標(ざひょう)()わってるから注意(ちゅうい)

定義(ていぎ)「_画面(がめん)回転(かいてん)させる」を(つく)

定義(ていぎ)「_画面(がめん)回転(かいてん)させる」を(つく)ろう!この定義(ていぎ)名前(なまえ)はもっと正確(せいかく)()うなら「_画面(がめん)回転(かいてん)させるのに必要(ひつよう)()用意(ようい)する」って(かん)じ。実際(じっさい)回転(かいてん)させるわけではないので混乱(こんらん)しないように。で、ブロック定義(ていぎ)(つく)るところのスクショ()(わす)れた(笑)この下方(かほう)のスクショにあるハットブロックを参考(さんこう)(つく)ってほしい!画面(がめん)(さい)描画(びょうが)せずに実行(じっこう)するにチェックして、引数(ひきすう)としてXとYをもたせてる。

相対(そうたい)距離(きょり)Xの算出(さんしゅつ)

まずは相対(そうたい)距離(きょり)Xだ。
X方向(ほうこう)回転(かいてん)
回転(かいてん)みたいな曲線(きょくせん)(うご)きの計算(けいさん)によく使(つか)われるのは三角(さんかく)関数(かんすう)だ。ここでも「X * ★カメラの角度(かくど)cosコサイン 」という演算(えんざん)(つく)る。
↓こんなかんじ。
Y方向(ほうこう)回転(かいてん)
今度(こんど)sinサイン使(つか)ってY方向(ほうこう)回転(かいてん)(みちび)いていく。
↓こんな(かん)じ。
X方向(ほうこう)回転(かいてん)と、Y方向(ほうこう)回転(かいてん)()()わせる
()(ざん)ブロックに(かく)演算(えんざん)をはめよう。
これを変数(へんすう)相対(そうたい)距離(きょり)X」にセットする。

相対(そうたい)距離(きょり)Yの算出(さんしゅつ)

今度(こんど)()(ざん)ブロックを相対(そうたい)距離(きょり)Yにセットするところから(はじ)めよう。
この()(ざん)にまた三角(さんかく)関数(かんすう)使(つか)った回転(かいてん)計算(けいさん)()れていくよ。
X方向(ほうこう)回転(かいてん)
さっき(つく)った↓この()(ざん)のあたりを(みぎ)クリックして複製(ふくせい)()そう。
そしてcosコサインのところをsinサイン()えて()(ざん)左側(ひだりがわ)にはめよう。
Y方向(ほうこう)回転(かいてん)
(つぎ)はYで(つく)った()(ざん)のあたりを(みぎ)クリックして複製(ふくせい)しよう。
sinサインのところをcosコサイン()えてから()(ざん)右側(みぎがわ)にはめよう。
↓こんな(かん)じに仕上(しあ)がる。
よぉし、ちょっとヘビーな操作(そうさ)(つづ)いたね。この定義(ていぎ)はいったんここまでにして、(べつ)のスプライトに()()かろう。

u003cpu003e相手(あいて)との距離(きょり)(はか)るために必要(ひつよう)相対(そうたい)距離(きょり)確保(かくほ)した!u003c/pu003e

スプライト「ペン」を(つく)

(あたら)しいスプライトを(つく)るよ。
コスチュームを(えら)ぶ。
どれがいい?ここでは(いか)ってるナノを(えら)んでみたよ。
スプライト(めい)は「ペン」だ。
3D空間に敵を描画する方法…遠近感もバッチリ!(爆速オンライン3Dゲームの作り方 #08)を語るok-scratch ok-scratch

u003cpu003eこのペンというスプライトは、さっきのエンティティと密接(みっせつ)関係(かんけい)するスプライトなんだ。ペンは()()描画(びょうが)するスプライトで、エンティティは(うご)(かた)管理(かんり)するスプライトになる。u003c/pu003e

コスチュームを3D空間(くうかん)(よう)にリサイズする

このまま3D空間(くうかん)描画(びょうが)すると、ナノが浮遊(ふゆう)してるみたいに地面(じめん)(あし)についてない(かん)じになっちゃう。そこで一定(いってい)法則(ほうそく)でナノを調整(ちょうせい)《リサイズ》していく。

ナノをグループ()する

まずは(ぜん)選択(せんたく)して、
グループ()しておこう。

正方形(せいほうけい)(えが)

四角形(しかくけい)ツールを(えら)ぶ。
200 x 200の正方形(せいほうけい)(えが)こう。コスのサムネを()るとサイズが()かるよ。
正方形(せいほうけい)(えが)けたら、(さい)背面(はいめん)にレイヤーを()げよう。ナノが()えるはず。
↓こんな(かん)じ。
選択(せんたく)ツールを(えら)ぶ。
ナノをクリックすれば、グループ()してあるからナノだけ選択(せんたく)できるはずだ。ナノだけ正方形(せいほうけい)下辺(かへん)(あし)()くようにドラッグしよう。
3D空間に敵を描画する方法…遠近感もバッチリ!(爆速オンライン3Dゲームの作り方 #08)を語るok-scratch ok-scratch

u003cpu003e↑ちなみにこの正方形(せいほうけい)は、天井(てんじょう)(ゆか)位置(いち)擬似的(ぎじてき)表現(ひょうげん)してる。u003c/pu003e

十字(じゅうじ)(えが)

直線(ちょくせん)ツールを(えら)ぼう。
正方形(せいほうけい)()(なか)(よこ)(せん)()く。
()(なか)縦線(じゅうせん)()いておこう。
3D空間に敵を描画する方法…遠近感もバッチリ!(爆速オンライン3Dゲームの作り方 #08)を語るok-scratch ok-scratch

u003cpu003e正方形(せいほうけい)十字(じゅうじ)は、このあとで透明(とうめい)にしちゃうよ。いまは調整(ちょうせい)《リサイズ》するときに便利(べんり)だから(えが)いた。u003c/pu003e

選択(せんたく)ツールを(えら)ぶ。
ナノを選択(せんたく)する。(かく)(てん)をドラッグして、ナノのサイズを(ちい)さくしよう。ちょうど(あたま)横線(おうせん)になるくらいまで(ちい)さくして、ナノの眉間(みけん)《みけん》が縦線(じゅうせん)あたりにくるように調整(ちょうせい)して。

ガイドラインを透明(とうめい)にする

まずナノを(ふく)めないように()をつけながら、正方形(せいほうけい)十字(じゅうじ)(せん)選択(せんたく)する。
グループ()する。
()りつぶしを(えら)んで、透明(とうめい)()ボタンをクリックする。
枠線(わくせん)(えら)んで、透明(とうめい)()ボタンをクリックする。
スッキリ!
コスチューム1は()しとく。
よし!これでコスチュームの作業(さぎょう)完了(かんりょう)だ。

u003cpu003e3D空間(くうかん)最適化(さいてきか)されたサイズのコスチュームを用意(ようい)することができた!u003c/pu003e

(てき)を3D空間(くうかん)描画(びょうが)する

ここまでに、相対(そうたい)距離(きょり)XYの算出(さんしゅつ)と、描画(びょうが)するコスチュームの用意(ようい)(すす)めてきた。ここからいよいよ直線距離(ちょくせんきょり)算出(さんしゅつ)して3D空間(くうかん)にプレイヤー以外(いがい)存在(そんざい)(つく)()具体的(ぐたいてき)なステップに(はい)る。

メッセージ「ペイントする」

(あたら)しいメッセージ「ペイントする」を(つく)る。

変数(へんすう)距離(きょり)」を(つく)

(あたら)しい変数(へんすう)距離(きょり)」を(つく)る。
メッセージを()()ったところで、距離(きょり)に「エンティティの相対(そうたい)距離(きょり)Y」をセットする。さっき計算(けいさん)した()だ。

変数(へんすう)(たか)さ」を(つく)

(たか)さの計算(けいさん)(すこ)複雑(ふくざつ)だ。以前(いぜん)計算(けいさん)してあった★DVを使(つか)うぞ。↓これらのブロックを用意(ようい)して矢印(やじるし)参考(さんこう)()()ててみて。
(たか)さにセットしよう。
さらに、(おお)きさを「(たか)さ」%にするぞ。

u003cpu003e距離(きょり)加味(かみ)した(たか)さを(おお)きさに反映(はんえい)することで、縦方向(たてほうこう)遠近感(えんきんかん)(ただ)しく調整(ちょうせい)できた。u003c/pu003e

(たか)さに使(つか)った演算(えんざん)()(ざん)あたりを(みぎ)クリックして複製(ふくせい)しよう。
10のところに、エンティティの相対(そうたい)距離(きょり)Xをはめよう。
↑この演算(えんざん)ブロックを↓X座標(ざひょう)()()てよう。Y座標(ざひょう)には、ゼロを()れておいて。

u003cpu003e横方向(よこほうこう)距離(きょり)(ただ)しく反映(はんえい)することができた。u003c/pu003e

メインループに「ペイントする」を追加(ついか)する

ペイントするというメッセージも、ゲームのメインメッセージを集約(しゅうやく)してあるプレイヤー(のずっとループ)から(おく)ろう。
メッセージ「ペイントする」を(おく)ろう。

CHECK! ナノが()えるかテストする

3D空間(くうかん)に、ナノが、
()たぁーーー!

まとめ

今回(こんかい)はすっごいスキルを()()んだ。キーになったのは相対(そうたい)距離(きょり)算出(さんしゅつ)と、それを使(つか)った描画(びょうが)処理(しょり)だったね。距離(きょり)から(たか)さを(みちび)()すところで遠近感(えんきんかん)実現(じつげん)できたところは感動的(かんどうてき)スクラッチだった。(まな)びをまとめておこう。
  • 3D空間(くうかん)でどうやってプレイヤーと相手(あいて)距離(きょり)(はか)るのに、相対(そうたい)距離(きょり)計算(けいさん)することがわかった
  • 相対(そうたい)距離(きょり)使(つか)って距離(きょり)(みちび)()し、さらに(たか)さを計算(けいさん)することで遠近感(えんきんかん)()すことができた
よしよし!これでピコの(ぬす)まれた家宝(かほう)「スター」も描画(びょうが)する準備(じゅんび)(ととの)ったかな!?っとアレ?なんだか大変(たいへん)なことになってるぞ!スクラッチキャットが(だい)ピンチに(おちい)ってしまったみたいだ!次回(じかい)もチェックしてみてね!

グリフパッチさんの動画(どうが)参考(さんこう)にしています

今回(こんかい)のチュートリアルは世界(せかい)No.1スクラッチャーとして名高(なだか)いグリフパッチさんの動画(どうが)参考(さんこう)にしているよ。ただし手順(てじゅん)一部(いちぶ)()えているところもあるんだ。
ブクマよろしくお願いします! ブクマよろしくお願いします!
どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!

スクラッチプログラミングのゲーム攻略

スクラッチプログラミングのゲーム

    • 厳選されたスクラッチ人気作品リストがレビュー付きで楽しめます
      趣味に関するスクラッチ作品例
      勉強になるスクラッチ作品