スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。
ゴンザレスからゲームクリエイターへの挑戦状
2Dのマップを
手に
入れたけど、これじゃあゴンザレスがいる3D
迷宮にはたどり
着かない!
悲嘆に
暮れるピコにスクラッチキャットが
差し
出した
希望の
光り、それがペンツール!これをつかって2Dのマップを3D
化できるとスクラッチキャットは
豪語する。
果たしてその
手法とは!?
ok-scratch
u003cpu003eいよいよ、というか第二回目にしてさっそく3D化だよ。新しい変数や定義が増えるけど、僕がサポートするから一緒に進めていこう!u003c/pu003e
今回の目標「3D化する!」
なんともう3D
化しちゃうぞ。まずはオーソドックスなよくある3Dを
作る。これはスクラッチWIKIにも
乗っている
基本的なレイキャスティングという
手法になる。でもこれが
爆速3Dの
下地になるから
大事。
今回の
完成目標となる
動画を
確認しておこう。
うぉお!3Dっぽい
動きになってるよね!この
第二
回チュートリアルでここまで
実装が
進むよ。
楽しんでいこうぜ!
スプライト「レイキャスター」を作る
3Dといえばレイキャスティングという
手法と、レイトレーシングという
手法があるんだ。レイトレーシングというのはマイクラみたいな
本格的な3Dゲームで
採用されている
精緻《せいち》だけどめっちゃ
重たい
手法。スクラッチではもう1つの
レイキャスティングという手法を使っていくよ。
比較的軽いけど、
普通に
実装しただけではスクラッチで3Dゲームを
作るのは
厳しいと
感じる
重さ。とりあえず
重たいけどスクラッチWikiにも
載ってる
一般的なレイキャスティングを
実装するよ。それをのちのち
改善して
爆速にしていくからお
楽しみに。
スプライトを複製しよう
じゃ、レイキャスティングするスプライトを
作るためにスプライト「プレイヤー」を
複製しよう。
「レイキャスター」と
名付けておこう。
コードはいったんすべて
消しておこう。
コスチュームも、「プレイヤー」は
不要だから
消すよ。ヒットボックスだけ
残しておいてね。
コーディングをしよう
緑の
旗が
押されたらコスチュームを「ヒットボックス」にしておこう。
回転方法を「
回転しない」にしよう。
スペースキーが押されたら壁に向かって発射する
一時的にスペースキーが
押されたら、っていうタイミングでレイ(
光)がキャスト(
発射、
照射)されるようにするよ。まぁレイっていうか
最初はヒットボックスが
飛んでいく
感じ。
プレイヤーの向きに向ける
この2つのブロックを
見つけておいて。
「ステージの
背景」っていうドロップボックスから「プレイヤー」「
向き」っていう
選択肢を
選ぼう。
これを
組み
合わせて
置くよ。
で、プレイヤーに
行くようにする。
動きをテストする
オッケー、スペース
押したら
四角がプレイヤーに
行ってるね。
光を壁に向かって発射する
ここからループを
実装するよ。
条件式は「レベルに
触れたら」にして、
壁に
当たるまで
進むようにしていくよ。
歩数はとりあえず4
歩ずつ
動くようにしようか。
壁に向かうかテストする
よしよし、
四角いヒットボックスが
壁に
向かっていってるね。
ちなみに4歩にした理由
さっき4
歩ずつ
動くようにしたけど、これはヒットボックスのコスチュームが4 x 4だからなんだ。
壁にめり込んだら戻す
小さいから
見えにくいけど、ヒットボックスと
壁の
距離によっては、ヒットボックスが
壁にめりこんでしまうんだ。
そこで、
壁から離れるまで後ろに下がるような
実装を
作るよ。ループを
複製しよう。
条件式を
反転して、マイナス1
歩動かすようにしよう。
壁でピタッと止まっているかテストする
ミリ
単位だから
確認しづらいけど、
壁でピタッと
止まるようになったよ。
壁にあたった瞬間に「ピクッ」って下がってる様子が
見て
取れるかな?
u003cpu003e壁に向かって発射するビームの実装に成功したu003c/pu003e
ブロック定義「_シングル・レイ」を作る
この
一連の
処理をカスタムブロック
定義としてまとめていくよ。
画面を
再描画せずに
実行すればピクってなる
動きも
抑制できるはずだし、
壁までの
移動も
一瞬になるはずだ。
名前は「_シングル・レイ」にしよう!ちょっとかっこいいw
ok-scratch
u003cpu003eちなみに名前の最初にアンダーバーが付いているのは、「再描画せずに実行する」ブロック定義のマークとして使ってるんだ。こうしておくとパッと見で「再描画ありかなしか」が分かりやすい。u003c/pu003e
ブロックを移す
今作った
一連の
流れをまるっと
移動しよう。
BEFORE
AFTER
そして
移動元にはブロック
定義を
置いておこう。
一瞬で壁に到達するようになったかテストする
ふっふー♪
一瞬で
移動するようになったぜい!
u003cpu003e壁までビームが一瞬で届くようになったu003c/pu003e
ビーム発射ぁ!
ヒットボックスが
壁に
飛ぶだけじゃあ
味気ない(?)から、ペンを
使ってビームを
発射するようにするよ。
画面左下からペンを
追加しよう。
ペンっていうのをクリックする。
これでペンの
追加はOK。
ペンの初期設定をする
新しいブロックがブロックパレットに
追加されたと
思うから、その
中から「
全部消す」ブロックを
選んで、スペースキーが
押されたときに
追加しよう。
そしてペンの
太さを、ヒットボックスのサイズである4に
設定しよう。
色は
適当でいいよ。ここでは
水色(53)にしとく。
ペンで描く
次は
定義「_シングル・レイ」にブロックを
追加していこう。まず「ペンを
下ろす」だ。
定義の
最後には「ペンを
上げる」を
追加だ。
ビームがでるようになったかテストする
よぉし、ビーム
発射完成!
プレイヤーから常に発射されるようにする
いまはスペースキーを
押したらビームがでるけど、これを
常に
発射されるようにする。ビーム
垂れ
流しw
メッセージ「レイキャストする」を作る
今まで
使ってた「スペースキーが
押されたとき」を、
今作った「レイキャストするを受け取ったとき」に置き換えよう。
こうなる↓
プレイヤーからメッセージを送る
スプライト「プレイヤー」を
開こう。
緑の
旗が
押されたとき、で
使ってる
「ずっとループ」の最後でメッセージ「レイキャストする」を送ろう。
ok-scratch
u003cpu003e↑このスクショが、この先のチュートリアルのものを使ってしまったため「移動する」っていう定義があるけど、気にせず進めてください。今後のチュートリアルで一緒に実装していきます。ご指摘をくれたunagiRocketさん、ありがとうございますm(_ _)mu003c/pu003e
ビームが常に発射されるかテストする
おおぉ、ビームがずっと
発射されるようになったからプレイヤーの
動きにピッタリ
合ってるね。
最高!
u003cpu003eプレイヤから常にビームがでるようになった!これを視線として使っていく。u003c/pu003e
扇状にビームを発射する
このシングル・レイは一
本線というか
一条の
光だよね。
最終的にはこのビームを
扇状になるようにたくさん
出したいから、その
処理を
作ったあとに、
処理をまとめる
定義を
作るよ。まずは
扇状になるようにカスタマイズしていこう。
シングル・レイをたくさん発射する
ではスプライト「レイキャスター」を
開こう
10
回繰り
返すループで
定義「_シングル・レイ」を
囲む。
次に5
度右に
回そう。
これでOK!
新定義「_レイキャストする」を作ろう
スクショだとアンダーバーが
抜けてるけど、
新定義「_レイキャストする」を
再描画せずに
実行するように
作ろう。
今作った10
回繰り
返すループをまるっと
移すよ。
BEFORE
AFTER
移動元にはこの
定義を
実行するブロックを
置こう。
扇状のビームをテストする
奥義「
扇ビーム!」なんちゃって😅
ビームが広がる範囲を管理できるようにする
今は
角度を
管理しづらいけど、ゲームによっては
視野が
広かったり
狭かったりできると
楽しい
機能を
実装できそうだよね。そこで、ビームが
広がる
範囲、
角度を
管理できるようにするよ。
変数「★視野角」を作る
スクショだと★がついてないけど、すべてのスプライト
用の
変数には
名前の
前に★をつけておくと
分かりやすいからオススメだよ。
ok-scratch
u003cpu003eグリフパッチさんをはじめとして多くの海外スクラッチャーは、すべてのスプライト用の変数を大文字で書いて、このスプライトのみの変数は小文字で書く、といった工夫をしているよ。でも日本語だと大文字とかないから僕は★で見分けられるようにしてる。u003c/pu003e
初期値は60にしておこう。
変数のデバッグ
表示を
右クリックして、スライダーで
管理できるようにしよう。
もう
一度右クリックして「スライダーの
指定範囲を
変更」を
選ぼう。
30から120に
設定しておくとちょうどいいよ。
定義「レイキャストする」で視野角を使う
ループの
条件式にこの
視野角の
値を
使おう!
そして
右に
回す
角度を1
度にしたら
正しく
視野角を
実現できるぞ!
視野角の範囲にビームが広がるかテストする
やっほぃ!
視野角のスライダーを
変えるとビームの
範囲が
変わったね!これで
成功だ。あーでも、ちょっとずれてるの
分かる?
プレイヤーの右側にビームが傾いてしまっているよね。これは
直しておこうか。
ビームの傾きを直す
視野角を2で
割った
値を
用意するだけで
実現できるよ。
これを「
右に◯
度回す」ブロックにはめて、
定義「_レイキャストする」の
最初に
置こう。
ビームの傾きが直ったかテストする
おけーぃ!ちゃんとプレイヤーを
中心にしてビームが
広がっているね!よっしゃ。
u003cpu003eプレイヤーから出るビームが扇状になった。ちょうど視線が目の前に広がっていく感じ。u003c/pu003e
3D化するぞ大作戦!
3D
化する
作戦を
伝えるぞ!
下の
図を
見てほしい。
僕らはいまビームを
飛ばすことに
成功している。ビームは
扇状に
広がっているので、
扇の
左端はX
座標が-240の
地点、
右端はX
座標が240の
地点と
決めてしまう。
大切なのは、各X座標のビームの距離なんだ。
描画自体はX
座標がマイナス240からプラス240の
地点までジックリ
描いていくんだけど、そのときに
いったいどのくらいの「高さ」の壁を描けばいいのか、それを教えてくれるのが距離なんだ。
ok-scratch
u003cpu003eピンとこなくても大丈夫!いますぐ理解する必要はないよ。実装したら理解できた、なんてこともよくあるからね!u003c/pu003eu003cpu003eu003c/pu003e
変数「x座標」をつくる
ではビームの
位置を
保持するためにx
座標っていう
変数を
作ろう。もともと
青いブロックである
名前と
同じだから
混乱しないようにね。
定義「_レイキャストする」の
最初でマイナス240で
初期化しよう。
一番左端だね。
そしてループの
最後にも
置いてね。
値のところは
次に
演算をいれるよ。
演算は、「480 /
視野角」だよ。
ok-scratch
u003cpu003e480はX座標の端から端(-240から240まで)だね。視野角は60だから、実質「480 / 60 = 8」だね。8かぁ。それだといまヒットボックスのサイズが4っていうのに合わせて横に4ずつ描いてるからスキマがあいちゃいそうだけど、まぁ最初は適当でもいいよね。これでいってみよう!u003c/pu003e
変数「距離」を作る
大事大事と
言ってた
距離だ。
ペンをいったん外す
定義「_シングル・レイ」にあるペンのブロックを2つともはずそう。
そしてあまり
使わないけど、この↓ブロックを
探してみて。
選択肢から「プレイヤー」を
選ぶよ。
これをはめて
距離の
値にしよう。
距離のブロック
自体は
定義の
最後に
置くよ。
複雑な
演算は
必要ないからシンプルだね!ふぅ!
変数「高さ」を作ろう
X
座標ごとの
距離が
取れたから、
今度は
距離によってどの
高さからペンを
下ろすのかを
決めていくよ!もう
少しだ!
距離のあとに「4000 /
距離」って
演算を
入れて
設置しよう。4000っていうのは……
今は
適当な
数字を
使ってるだけなんだw
細かいところを
詰めるのは
後回し
大作戦だ(なんそれ)
その
下でX
座標とY
座標をそれぞれ
変更しよう。
これでペンを
下ろす
初期位置に
付いた。さっそくペンを
下ろそう!
ここから
動いた
分だけ
描画されるぞ。どこまで
動くかは、とりあえず
単純に
高さをマイナス
値に
反転させた
分だけ
描こう!
これでペンを
上げればOKだ!
テストの
前にマップを
見えないようにしておこう。スプライト「レベル」を
選んで。
幽霊の
効果を100にしておこうか。
3D化されたかテストする
ドドドドドッどやぁ!3Dだぁぁぁ!
\u003cp\u003e2Dマップを3D化することに成功した!\u003c/p\u003e
まぁまだプレイヤーが
見えてたりするんだけどwでもできたね。そして
予想通りスキマが
空いてるね~。まぁこのあたりは
直していきましょう。それに、これってまだ
爆速3Dではなくて、よくある
普通のレイキャスティングだから、まだまだ
満足はしないでくれよ?もちろんもっと
高みを
目指していくから、
一緒に
頑張ろう!まぁきっとピコは
喜んでることでしょう……って、あれ?なんか
困ったことが
起きてるみたいだぞ。
次回もチェックしてみてね。このチュートリアルは
世界No.1スクラッチャーとして
名高いグリフパッチさんの
動画を
参考にしているよ。ただし
手順を
一部変えているところもあるんだ。