スクラッチに挑戦している皆さん、どうも!スクラッチコーチです。
- ① まず2Dマップを動き回れるようにしよう!
- ② さっそく3D化しちゃおうぜ!
- ③ 壁にスキマがあって敵から丸見え!?やっば
- ④ 陰影をつけて立体感マシマシにしよう
- ⑤ トゲトゲやユガミを補正してハイクオリティ3Dの一歩を踏み出そう(爆速オンライン3Dゲームの作り方 #05)
- ⑥ 壁の衝突判定の基本を作ろう
- ⑦ 壁に触れてると進めない!?移動を改善しよう
- ⑧ ついに敵が現れた!距離感の計算ってどうやる?
- ⑨ 奥行きを実装して壁の後ろに隠れられるようにする
- ⑩ エンティティに陰影をつける
- ⑪ 敵がプレイヤーに向かって迫ってくるように実装する
- ⑫ スターを実装しよう!
- ⑬ 爆速3D爆誕
- ⑭ 壁に画像(テクスチャ)を貼り付けてリッチな3D空間を演出する(いまここ)
- ⑮ テクスチャの壁を洗練させて本格3D完成!
- ⑯ シメだ!モバイル & オンライン化をするぞ
- ⑰ 【おまけ】敵がプレイヤーを見つけたら追いかけるロジック
ゴンザレスからの挑戦状
![](https://scratch.coach/wp-content/uploads/2024/03/cfd287db0bb8b3a17d95d9d670facb4a.png)
ゴンザレスが迷宮のクオリティをアップグレードして、スクラッチキャットを閉じ込めようとしているぞ!こっちもテクスチャ画像を壁に貼り付けて超高品質な迷宮を実装しよう!
今回の目標「テクスチャ画像を壁に貼り付ける」
かつて、スクラッチの3Dで画像を使って装飾するなんて言うのは夢物語だと思われていた。なぜなら、画像を使った処理は重いからスクラッチではまともに動かなくなってしまうからだ。
しかし、我々の手元には爆速の描画ロジックを搭載した最強のレンダリングエンジンがある。そう、あるのだよ、諸君。
いまこそ、禁断の3D画像レンダリング処理を爆誕させるときがきたのだ!爆誕に次ぐ爆誕。もうこのチュートリアルの経済価値が計り知れないくらい高くなっていって手が震えてきたぜ……。
Scannerをバックパックしよう
グリフパッチさんが作ってくれた画像をスキャンするスクラッチプログラミング作品があるので、今回はこれを使うよ。
- この作品の「Scanner」というスプライトを画面下部の「バックパック」にドラッグアンドドロップしよう。
- 自分の作品を開いて、バックパックからScannerをスプライト一覧にドラッグアンドドロップしよう。
これでOKだ!
![](https://ok-scratch.io/wp-content/uploads/2024/03/af2c1c1aa8b71c94ced858648d4ecf0f-1024x252.png)
試しにこのスプライト「Scanner」を開いて、メッセージ「Begin Scan」を受け取ったときをクリックしてみようか。
![](https://ok-scratch.io/wp-content/uploads/2024/03/8e960dff6c827f171b5d4306a6e5996b.png)
その後、リスト「SCAN」を表示させてみて。
![](https://ok-scratch.io/wp-content/uploads/2024/03/d18a6dab94d5a1090d764a1f85a30d5f.png)
↓こんな感じで長さが172,800行の巨大なリストができてるとおもう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/6b24333a9cbbadd0968ceac6ef410fc0.png)
これはスプライト「Scanner」に含まれているコスチュームの画像を数値化したデータなんだ。
↓これがリストに格納された画像だよ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/e501699d84c4ded84b102861794dd55b.png)
ちなみにリストには↓この空白部分も数値化されて含まれているんだ。だから(ムダに)巨大……。
![](https://ok-scratch.io/wp-content/uploads/2024/03/8b67047f09d89122499b03a605673965.png)
![ok-scratch](https://scratch.coach/wp-content/uploads/2022/12/soylatte-e1717210866337.png)
空白部分を消していこう。画像のみを数値化するようにしていくよ。
変数「★テクスチャのサイズ」を作る
![ok-scratch](https://scratch.coach/wp-content/uploads/2022/12/soylatte-e1717210866337.png)
テクスチャ、というのは画像のこと。とくに模様として使う画像のことをテクスチャと呼ぶんだ。ゲーム制作では超頻出単語だよ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/ed388b3260703379937a64901d53470b.png)
値を32にして初期化しよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/1d7c883936f955b87828653436663d17.png)
定義「_Initial Scan」を探してみて。
そこのループに、「2 x ★テクスチャのサイズ」という演算をはめてみよう。2 x 32だから64だね。
![](https://ok-scratch.io/wp-content/uploads/2024/03/b3038a057fafdb052f5e95783f107c08.png)
定義「Scan」も探して、ここのループにも同じ演算をはめよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/9f4543ba10c31bbadeb6a3c8c6af657a.png)
これで再びメッセージ「Begin Scan」を受け取ったときをクリックだ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/bcf131e52902c54ea839170d706e0438.png)
↓リスト「SCAN」の長さがめっちゃ減ったぞ!
![](https://ok-scratch.io/wp-content/uploads/2024/03/1d75390fc24b0f2347a39710110d577b.png)
空白部分がなくなったから軽くなった!
画像を数値化したリストを手に入れた!
画像を使う準備をする(レイキャスティング)
さて、ここからが本題だ。
この画像を数値化したリストを使って、壁に画像を反映していく。予想している通り、けっこう複雑な計算になるから慎重に進めてくれ。
スプライト「レイキャスター」を開く
![](https://ok-scratch.io/wp-content/uploads/2024/03/0f6fd0713fb753c42d7c7d470caa0b5e.png)
定義「_シングル・レイ」を見つけて、↓この部分で切り離そう。次のブロックを挿入する位置が大切なので、わかりやすくするためだよ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/16faa584810af4fb7dafea8b3711bc4c-795x1024.png)
変数「テクスチャのズレ」を作る
![](https://ok-scratch.io/wp-content/uploads/2024/03/85bfb7204e409c4e7920ec04e6801279.png)
テクスチャのズレにx座標を割り当てよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/f9df9f498cebcd4da15d999f81ee7894.png)
これでOK。さっき切り離してあった条件ブロックを元に戻そう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/61f75416439a74bfae28e42dc12f6790.png)
ステージ「背景」を開く
![](https://ok-scratch.io/wp-content/uploads/2024/03/41ee66269b688cf8d2791f2400acaa41.png)
変数「■エンティティの上限数」を作る
この変数はゲーム開始後は絶対に変えない、という意思表示のために1文字目に■をつけておく。こういう変わらない変数を「定数」と呼ぶんだ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/3cb96557e254f5ed299a6fba7325e093.png)
![ok-scratch](https://scratch.coach/wp-content/uploads/2022/12/soylatte-e1717210866337.png)
スクショを取り忘れたけど、この変数には「10」を割り当てておいて。もし敵やアイテムを増やして10より多くしたいなら、ここに20とか100とか好きな数値を割り当てよう。
定義「_シングル・レイ」を見つけよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/2c4cf4bac2fceceadf7167776aee46a3.png)
ここで使ってる定義「_描画する」の引数であるタイプに「■エンティティの上限数 + テクスチャのズレ」っていう演算を割り当てよう。今まではペンの色を割り当ててたけど、これを画像に差し替えるためだよ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/2061a6dcbe7e90f9f2a4a5b02afb3db6-1024x382.png)
![ok-scratch](https://scratch.coach/wp-content/uploads/2022/12/soylatte-e1717210866337.png)
エンティティの上限数をプラスしている理由は、壁には画像を貼りたいけど、敵とアイテムは今まで通りスタンプを使いたいから。今でいうと1はナノ、2はフランク、3はスターだね。だからエンティティの上限である10までは画像を使わないよっていうことを意味してるんだ。
CHECK! この段階でどうなってるかテストする
面白い感じになってるよ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/a53e347f030e4c7bdccb382705111a12.png)
レインボー!ふっふー♪
↓っと、あたりを見回してるとバグってる壁も見つかるよ(^_^;)
![](https://ok-scratch.io/wp-content/uploads/2024/03/fc7de9a312637761b3867aaea4062d21.png)
テクスチャのズレを改善する
さて、準備は順調に進んでいるよ。さらに進めていこう。
引き続きスプライト「レイキャスター」の定義「_シングル・レイ」を改修していく。
テクスチャのズレに↓この演算をはめよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/ff91d4bc63d7ac1df912916d3cabae44-1024x162.png)
![ok-scratch](https://scratch.coach/wp-content/uploads/2022/12/soylatte-e1717210866337.png)
25っていう数字はなんだろう。これは壁の1面のサイズ。というか25ずつ壁を区切って扱う、というイメージ。実際には壁はコスチュームで描いたように、場所によっては長かったり短かったりするよね。長さ80の壁もあれば、長さ10の壁もある。ただ1面をある程度で区切って画像を繰り返すために、25っていう数字を使っていこうという感じだよ。このあたり深く考えると混乱するので「へー」ってスルーしてもらって大丈夫。完成してから考え直すのでも遅くはない。
この二つ下のスクショを見るとイメージをつかみやすいかも。
CHECK! 壁がどうなってるかテストする
さっきとはまた違うカラフルな壁になってるはずだよ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/4b9c06c26a02c51b94fd2f17b6db5a85.png)
25ずつ区切ったから、↓こんな感じで壁の1面がクッキリ分かるようになっているはずだ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/0967114dc862f28bfdfe260a065de920.png)
![ok-scratch](https://scratch.coach/wp-content/uploads/2022/12/soylatte-e1717210866337.png)
↑これがさっき使った25っていう区切りだよ。
あーでも、あたりを見回すと↓こんな感じでバグってる壁もあるね。
![](https://ok-scratch.io/wp-content/uploads/2024/03/ee34324bf5a5f06ed18d566472403aa9.png)
壁の面を描画する精度を高める
さらに精度を高く壁を作っていくよ。テクスチャのズレにY座標も加味した数値を割り当てよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/c20a9e22ee7ff4878a658a645bb55f7b-1024x146.png)
これであたりの壁もカラフルになったはずだ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/3e45a23c607769303f29e63bb0712851.png)
コスチュームを確認する
さて、さっきScannerの画像を見たけど、実はここに含まれる画像の大きさは1つ32なんだ。一見すると25とは相性が悪そうだよね……。
![](https://ok-scratch.io/wp-content/uploads/2024/03/3caaa44c0286bf256b83b5a1c52258d0.png)
サイズ32の画像を、1面25の壁に貼っていく、っていうチグハグな関係がのちのち有効に働くので、ここは数学の力で強引に突破していく。
↓この演算ブロックを用意しよう。矢印を参考に作ってみて。
![](https://ok-scratch.io/wp-content/uploads/2024/03/e70e5dd42e8d33862ad12dc4928580cc.png)
↓最終的にこんな感じになる。
![](https://ok-scratch.io/wp-content/uploads/2024/03/7b0b7570cce7220abb95f9d4ae32b184.png)
これをテクスチャのズレに割り当てよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/f1f1157526d463db4904636c2d33742b-1024x283.png)
さらにテクスチャのズレの精度を高くするよ。
↓この演算ブロックを作って。
![](https://ok-scratch.io/wp-content/uploads/2024/03/ccee2abb2792e3a14f06ca76cd258e3c.png)
↓こんなかんじ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/9c126568154e0c6825e56ee8a9c9880c.png)
これを再びテクスチャのズレとして割り当てよう!
![](https://ok-scratch.io/wp-content/uploads/2024/03/55662190dc53ba9f0f3bd549acbc187c-1024x368.png)
おっけい。
CHECK! 壁が壊れてないかテストする
カラフルな壁が保たれていればOK!
![](https://ok-scratch.io/wp-content/uploads/2024/03/cc983c70f8292d9e613992b7ccd2ef67.png)
スキャンリストの調整値を使う
ここでナゾの数字を使うから要注意。定義「_描画する」の引数「タイプ」に、2000001(ゼロが5個)を使いたい。
![](https://ok-scratch.io/wp-content/uploads/2024/03/aa961a01e0fbddc576c3bc886d406e18.png)
その下には1000001(ゼロが5個)を使う。
![](https://ok-scratch.io/wp-content/uploads/2024/03/46c2a4644729617feddbe878f6dae398.png)
ナゾすぎるっしょw
![ok-scratch](https://scratch.coach/wp-content/uploads/2022/12/soylatte-e1717210866337.png)
さっきリスト「SCAN」に画像を数値化したデータを入れたよね。それの長さは、場合によっては数十万行になる可能性があることも見たよね。(空白を省く前は17万行だった)
ここの「タイプ」には、とにかくリスト「SCAN」の長さよりも大きな数字を入れておきたいんだ。だから念のため超大きな数字を使って、リスト「SCAN」の長さ以上にしておきたい。だから100万とか200万とかっていう大きな数字を使ってるんだ。別に300万や600万とかでも問題ないってこと。リスト「SCAN」の長さより大きければ。
レイキャスティングの精度を高めて、画像を貼るための準備ができた
画像を使う準備をする(ペン)
画像を貼るためにレイキャスティングに加えて、ペンの描画ロジックにも手を加えていくぞ。
スプライト「ペン」を開く
![](https://ok-scratch.io/wp-content/uploads/2024/03/89d535100b6970ffbde4c0a61b8c1767.png)
定義「_行を描画する」を見つけて、↓の部分にこの定数を割り当てよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/1e40cf332380222fa84bf73bb9d40c47.png)
↓この部分で切り離そう。切り離した部分は後で使うから消さないでね。
![](https://ok-scratch.io/wp-content/uploads/2024/03/82fa124d65e18ecc8fdc2c55a114b194-1024x1014.png)
そして条件ブロックの下に↓このブロックを持ってくる。
![](https://ok-scratch.io/wp-content/uploads/2024/03/f43a9af1e3ddf8aa2789705628aff522-1024x657.png)
さらに、切り離してあったペン関連のブロックを↓この部分で切り離して。
![](https://ok-scratch.io/wp-content/uploads/2024/03/c6c5a3dadc0ff54fb4424106c55465fc.png)
ペンを下ろすブロックの下に「★テクスチャのサイズ」回繰り返すループを設置しよう。この中で1行ずつ描画をしていく。
![](https://ok-scratch.io/wp-content/uploads/2024/03/853f130cbcb378d027d7ca63c8bc0828.png)
ループの外にペンを上げるブロックを置く。
![](https://ok-scratch.io/wp-content/uploads/2024/03/06f3ba9fa45a5f045c2792a6a522714e.png)
ループの中では「y座標を◯ずつ変える」ブロックを置いておいて。
![](https://ok-scratch.io/wp-content/uploads/2024/03/4cb80b4fe45fb966a65964f0d9d812a5.png)
テクスチャの描画に必要なY座標を算出する
このy座標に加算する演算を作っていこうと思う。
![](https://ok-scratch.io/wp-content/uploads/2024/03/b64be5df59a2b8d9b2265826937aa660.png)
↓こんなかんじ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/2c4e8b342b296805c2bbc89d4f9cd1f9.png)
この演算を変数「高さ」にセットする。場所に注意だ。上にも高さをセットしているところがあるけど、エンティティをスタンプする条件ブロックよりも下でセットする必要がある。
![](https://ok-scratch.io/wp-content/uploads/2024/03/1ef0a77eb531fb46849bff1c567f5f5b-803x1024.png)
変数「テクスチャ描画Y」を作る
![](https://ok-scratch.io/wp-content/uploads/2024/03/1bc8b4bbb8723381944116522891805d.png)
この変数には少し複雑な計算を割り当てるので、↓これを参考に組み立ててほしい。
![](https://ok-scratch.io/wp-content/uploads/2024/03/7797c563f694d2357545c9283314aeb3.png)
↓こんな感じになる。
![](https://ok-scratch.io/wp-content/uploads/2024/03/2bfc3a8d3b5d5af98e18ec243d4ad0a8.png)
これをテクスチャ描画Yにセットする。
![](https://ok-scratch.io/wp-content/uploads/2024/03/576ce2eeff6c71482fc2ee8473498d81-1024x334.png)
そしてこの変数を、さっき作っておいたループの中のY座標に加算していく。
![](https://ok-scratch.io/wp-content/uploads/2024/03/136b4797a3986f82db473bb160fa8cb3.png)
さらに、このループの中でペンの色を変えていく。
![](https://ok-scratch.io/wp-content/uploads/2024/03/0adf4ce824fee8ceb1cbadacb6a8815f.png)
変数「スキャンのインデックス」を作る
![](https://ok-scratch.io/wp-content/uploads/2024/03/2c2b03aa482c94a76bd6025e14d7c73e.png)
このインデックスには、タイプを100万(ゼロが6個)で割ったあまりを割り当てる。
![](https://ok-scratch.io/wp-content/uploads/2024/03/cf07ea7112ea0235931899c83ce55cef-1024x305.png)
![ok-scratch](https://scratch.coach/wp-content/uploads/2022/12/soylatte-e1717210866337.png)
この100万っていうのは、さっき使った画像リストの調整値なんだ。あまりにもナゾいから定数化しておこうか。↓ステージでやるよ。
ステージ「背景」を開く
![](https://ok-scratch.io/wp-content/uploads/2024/03/44aff50bd12b8cfd0eb57338418690df.png)
変数「■画像スキャンリストの調整値」を作る
![](https://ok-scratch.io/wp-content/uploads/2024/03/7d911d02e66322892b0362b4625f66da.png)
この値は100万(ゼロが6個)をセットしよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/6bd2f98f9b5e14a409a5ef6e3a3ae969-1024x461.png)
スプライト「レイキャスター」を開く
![](https://ok-scratch.io/wp-content/uploads/2024/03/7a169ac000331e657cc70fd737094930.png)
定義「_シングル・レイ」を見つけて。
![](https://ok-scratch.io/wp-content/uploads/2024/03/73cd0c4176df8504f203e3d83d307721.png)
さっきのナゾい数字を定数に差し替えよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/72c1cdb4f522d784ca06a0b7754984b2-1024x380.png)
200万のほうは、2倍にしてからセットしよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/2c221acea14c091345b82c9505440c1c.png)
↓こんなかんじ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/b6ae1c2f67ad2f0e98306c5397825cd2.png)
これをセットする。
![](https://ok-scratch.io/wp-content/uploads/2024/03/3f3e5cfc26b5694485930885995b0dde-1024x354.png)
スプライト「ペン」を開く
![](https://ok-scratch.io/wp-content/uploads/2024/03/e111fcf1224037d573f7fc9fbbecbcea.png)
それではスキャンのインデックスの計算で使った100万も定数で置き換えよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/c1d93493c96b17e698993d1fef9a3117-1024x183.png)
よし、では切り離して管理してある部分だ。色にリスト「SCAN」の「スキャンのインデックス」番目、っていう値を入れよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/3ac45d5703ce0e4579379edcecb17ee9-1024x461.png)
↓こうなる。
![](https://ok-scratch.io/wp-content/uploads/2024/03/2cff48f81021a97f8e733a8d63f4ee0d-1024x125.png)
![ok-scratch](https://scratch.coach/wp-content/uploads/2022/12/soylatte-e1717210866337.png)
ここに変数ブロックが入るんだ!と驚く人もいるかもね。
この下でスキャンのインデックスを480ずつ変える。
![](https://ok-scratch.io/wp-content/uploads/2024/03/4bce431a645017d8181cb5c7fc0d1ada.png)
またまたナゾの数字だね……
この480というのは、コスチュームに答えがある。スプライト「SCAN」のコスチュームを見ると、サイズ32の画像が1行に15個ある。32 x 15 = 480、ということ。
![](https://ok-scratch.io/wp-content/uploads/2024/03/a831d87ab836ca9bc0b4409b8ccf41bd-1024x172.png)
![ok-scratch](https://scratch.coach/wp-content/uploads/2022/12/soylatte-e1717210866337.png)
ここでコスチュームの1行分の480を加算する理由は、画像を縦に1行ずつ描画していくためだよ。
![](https://scratch.coach/wp-content/uploads/2024/03/2e86b9f4b9f998bf7dade940a416bcb5.png)
最初はペンを透明にしておこう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/a718b01670515826e0f6665faf72c767.png)
これでようやくこの一連の描画処理を、大元の定義と合体させよう。
![](https://ok-scratch.io/wp-content/uploads/2024/03/c29d557e61f578d55e3d2838b21f0c8c.png)
CHECK! 画像が反映されているかテストする
![](https://ok-scratch.io/wp-content/uploads/2024/03/745d318c641e85d98cc459e14d55f265.png)
わーーー!
わーーーーーー!
壁が壁になってるぅ!!!
↓★解像度を1にしてみると……
![](https://ok-scratch.io/wp-content/uploads/2024/03/3214af177791b9a0516745eab93ba4e9-1024x614.png)
うつくしーーー!
壁に画像を貼り付けることができた
まとめ
うーん、前回のパフォーマンスチューニングも神回だったけど、今回もぶっちゃけ神回だよね!もう甲乙つけがたい。
パフォーマンスが上がったから最高にクールなテクスチャを利用できるようになった今回。みんなの3Dエンジンはスクラッチ界で最高レベルにまで進化してきているぞ!よっしゃあ!
今回は次のことができるようになったぞ。
- テクスチャを壁に貼り付けることができた
これならスクラッチキャットたちも無事に脱出できるはず……って、おいおい!まだなにか問題があるのか!?次回もチェックしてみてくれ。
グリフパッチさんの動画
このチュートリアルは世界No.1スクラッチャーとして名高いグリフパッチさんの動画を参考にしているよ。ただし手順を一部変えているところもあるんだ。
- ① まず2Dマップを動き回れるようにしよう!
- ② さっそく3D化しちゃおうぜ!
- ③ 壁にスキマがあって敵から丸見え!?やっば
- ④ 陰影をつけて立体感マシマシにしよう
- ⑤ トゲトゲやユガミを補正してハイクオリティ3Dの一歩を踏み出そう(爆速オンライン3Dゲームの作り方 #05)
- ⑥ 壁の衝突判定の基本を作ろう
- ⑦ 壁に触れてると進めない!?移動を改善しよう
- ⑧ ついに敵が現れた!距離感の計算ってどうやる?
- ⑨ 奥行きを実装して壁の後ろに隠れられるようにする
- ⑩ エンティティに陰影をつける
- ⑪ 敵がプレイヤーに向かって迫ってくるように実装する
- ⑫ スターを実装しよう!
- ⑬ 爆速3D爆誕
- ⑭ 壁に画像(テクスチャ)を貼り付けてリッチな3D空間を演出する(いまここ)
- ⑮ テクスチャの壁を洗練させて本格3D完成!
- ⑯ シメだ!モバイル & オンライン化をするぞ
- ⑰ 【おまけ】敵がプレイヤーを見つけたら追いかけるロジック