3D立体を描画するENDこのエンジンにはプレイヤー(player)というオブジェクトが定義されています。このプレイヤーはカメラとほぼ同義であり、FPSのプレイヤー・キャラクターと考えればよいでしょう。プレイヤーの位置と方向が、3次元空間での視点となります。HANDLE_BUTTONS()のデフォルトの実装では、ボタン入力で視点と角度を変えられるようになっています。左右キーで水平方向(X方向)に回転し、上下キーで前後進(Z方向移動)します。DOOMのプレイヤー移動のような感じです。この関数の中身は、作りたいものによって書き換えるべきでしょう。3Dモデルを登録するこの状態ではなにも起きないので、3Dモデルを表示しましょう。3Dモデル=オブジェクトを登録する関数は、以下になります。登録したオブジェクトこの関数こそがこのエンジンの肝です。引数が多いですが、理解すればどうということはありません。ひとつひとつ見ていきましょう。頂点リストと面リストについては、次項で説明します。本エンジンの座標系は、左方向が+x、上方向が+y、手前方向が+zです。15)です(関数INIT_PLAYER()中で定義)。0)にオブジェクトを置いたとすると、以下のような位置関係になります。回転の度合いの値は、「度」でも「ラジアン」でもなく、1.0で一回転になる数値です(1.0=360°)。これは、PICO-8のSIN()やCOS()で使う値と同じです。OBSTACLEobstacleとは障害物という意味で、この値がTRUEのとき、プレイヤーはこの物体にぶつかって通過できなくなります。Fox』でこの機能が使われているようです。COLOR_MODEこのエンジンではシェーディング、すなわち照明効果によって立体物に影を落とすことができます。この引数では、シェーディングモードを設定します。K_COLORIZE_DYNAMICの場合は、オブジェクト全体を1つの色に設定してシェーディングします。色の設定は、最後の引数で行います。それ以外のモードでは、面リスト中で面ごとに色を設定します。STATICがつくモードの場合は、シェーディング処理が一回しか行われません。そのため、オブジェクトを回転させても、各面の色が変わることはありません。DYNAMICの場合は、毎フレームごとにシェーディングが行われるため、リアリティが増しますが処理速度は遅くなります。K_COLORIZE_STATICK_COLORIZE_DYNAMICK_MULTI_COLOR_STATICとK_MULTI_COLOR_DYNAMICは、面ごとの色を使ってシェーディングをする、とソースコード中のコメントにはありますが、筆者が動かした限り、実際の挙動はそうなっていないように見受けられます。K_PRESET_COLORの場合は、シェーディング処理がまったく行われず、面ごとに決まった色で塗られるだけになります。K_PRESET_COLOR頂点リストと面リストこのエンジンでは、複数の三角形の組み合わせで立体物(の表面)を表現します。三次元空間上の三角形たちを表現するデータが、頂点リストと面リストです。頂点リストは三次元空間上の点のリストです。こんな感じ:Luaのコードにすれば、以下のとおりです。このデータは、本講座ではまだ扱っていない「テーブル」を使って表現しています。0}}さらに、これらの点がどのように三角形を構成しているか、を定義する面リストも必要です。面リストは、頂点リスト中の頂点の番号のリストになります。上記の頂点リストから、二つ三角形を定義すると、下記のようになります。Luaのテーブル要素の番号は1から始まることに注意してください。{1,2,4}}ここで、{1,2,3}ではなく{1,3,2}であることには重要な意味があります。このエンジンでは、視点から見て反時計回りに並んだ頂点が作る面は表面になり、時計回りの場合は裏面になります。表面の場合のみ描画され、裏面から見た場合は何も描画されません。以上のように、頂点リストと面リストで三角形をいくつも定義して、立体物を構成します。した3Dモデルデータを作るのに、頂点の数値をポチポチ手で入力していくのは大変です。専用ツールを使ったほうがいいですね。.obj)に書き出し、そのファイル中のデータを手で加工して頂点/面リストを作ったそうです。コメントには「誰かがOBJファイルからの変換スクリプトを書いてくれたらいいな」とも書かれていました。誰か!描いてみよう長々とLOAD_OBJECT()関数の説明をしてきましたが、そろそろ実際にモデルを登録して、画面に描画してみましょう。9}}CUBE_Vが頂点リスト、CUBE_Fが面リストです。1つの面は三角形なので、3つの頂点があれば足りますが、このデータでは一つの面要素に数値が5つあります。4、5番目の数値は面の色の情報です。ここに別々の色番号を与えると、エンジンが2つの色の中間色を作って塗ってくれます。PICO-8は16色以上出せませんから、2つの色でボーダー柄を作る擬似的な中間色になります。中間色のサンプルこのモデルを、_INIT()で読み込んでみましょう。0)に設定しています。シェーディングモードはK_COLORIZE_STATICで、オブジェクトのベースの色は2番です(結局、今回は面リストの色情報は無視されます)。これを実行したのがこちら:3Dモデルの操作LOAD_OBJECT()は、登録したオブジェクトを返り値として返します。この返り値のテーブルを操作することで、オブジェクトに変更を加えられます。_UPDATE()に、オブジェクトを移動したり回転させたりするコードを加えてみましょう。DRAW_3D()ENDこれを実行すると:各軸に対して回転させつつ、Z軸方向=奥行きの方向に行ったり来たりさせています。LOAD_OBJECT()で登録したオブジェクトは、エンジンが管理するOBJECT_LISTというテーブルに保存されています。オブジェクトを削除するには、DELETE_OBJECT()関数が使えます。削除したいオブジェクト3Dで遊ぼうLOAD_OBJECT()で3Dモデルを登録して、返り値のオブジェクトを操作して動かす、というのが基本的な使い方です。モデルデータを作るのはちょっと大変ですが、立体物を動かして遊ぶのは楽しいですよ。シューティングゲームなどを作るには、立体と立体の衝突判定の処理が必要になりますが、それもこのエンジンに実装されています。2つのオブジェクトが衝突しているかどうか(TRUE/FALSE)この関数を使って、簡単なデモを作ってみました。迫り来る立方体を避けるだけのゲームもどきです。立方体とプレイヤーが動かせる宇宙船との間で、衝突判定を行っています。手を加えれば、シューティングゲームになりそうです。コードをご参考ください。DRAW_3D()ENDまた、筆者が本記事執筆のための調査を兼ねて作成した、ショートケーキに苺をのせるゲームも、あわせてご参考ください。4版の発売が発表されました!次回からまた、PICO-8入門コースを再開します。年末年始はぜひ、PICO-8でポリゴンをグリグリしたりしてお過ごしください。2017年もよろしくお願いいたします。ビーム、撃っちゃうね。画面効果その1・パーティクル反応TweetタグPICO-8前の記事任天堂がスーパーファミコンのコントローラーを商標登録。Miharahttp://mihararyosuke.com/なかなか完成しないローグライクゲーム『Gesuido』を開発し続けている30代後半。レトロでモダンなファンタジー・コンソール『PICO-8』に魅了され、勝手に普及活動に励んでいる。PICO-8ゲーム開発入門(10)Technicalビーム、撃っちゃうね。PICO–8ゲーム開発入門(1)こちらもおすすめニュース『フォートナイト』プロゲーマーが、母親の学生ローンを「全額」肩代わりする親孝行。配信にてサプライズ報告し母は泣くWii本体の修理受付が、3月31日到着分をもって終了へ。2006年の国内発売から13年以上続いた修理サポート『サイバーパンク2077』延期理由はゲームの最適化不足だという噂報道に、『ゴッド・オブ・ウォー』開発者がツッコミ。