=追記=
iOS版のレビューが通ったのでリンクを追加。
=前置き=
ネタ自体はだいぶ前に思いついていたものの、実装方法を思いつくのに時間がかかり、実際の作業にも時間がかかったのでこのタイミングになったが、「錯視系のゲーム」をようやくUPした。
=アプリ=
Flash版(wonderflの画面比率でいける5ステージ)
wonderfl build flash online | 面白法人カヤック
Android版(縦長の比率に対応した30ステージ)
https://play.google.com/store/apps/details?id=air.showohealer.game.illusionmaze
iOS版(Android版から広告を抜いた代わりに1ドルになったもの)
https://itunes.apple.com/jp/app/id582616837
=概要=
いわゆる「不可能立体」と呼ばれる錯視のうえで、ブロックを転がしてゴールを目指すゲーム。「90度回転でのみ移動可能」という制限はあるが、壁や天井を移動させることも可能で、なにより錯視なので通常ではありえない移動経路が可能。
もともとは「錯視をゲームにしたいな」というところから始まったが、途中で「錯視でない普通の画像でも変わった移動が可能」ということが判明したので"No Illusion"という形でいくつかステージを組み込んでみたりした。
今回のゲームは下の書籍を参考・影響されてつくった。
特に「頂点辞書」の概念はステージを作るうえでとても重要な概念だった。
=設計詳細=
今回のゲームは今までに比べてもかなり面倒な部類だったので、そこら辺についてもまとめてみる。
そもそも「錯視をどうやって汎用的に設定できるようにするか」というのがまず問題となる。これは上の本に載っていたサンプルを分析し、どう分割すればよいかを色々と試した結果、「六角形を並べる形で表現」「1パネルは前後左右上下のブロックの有無で設定」とすることで錯視画像を比較的簡単な配列で表現できるようになった。
次に「不可能立体の表示」が難しかった。「不可能立体」と呼ばれるくらいなので、普通に立体として3次元で表示することはできない。しかし要所要所ではちゃんと3次元的に前後関係を調整しないといけない。ここはだいぶ試行錯誤を繰り返したが、最終的にはレイヤーを複数用意しつつ線を個別に描画し、アイソ×トリックの「面ごとにプレイヤーは独自描画して範囲外は切り捨てる」を応用して「六角形ごとに描画して範囲外は切り捨てる」という感じにした。今回は六角形でのクリッピングになるため、繋ぎ目がきちんとなるようにBitmapDataのマスクを用意した。この形式だと負荷が重くなりそうなのでさらに「今のパネル」と「一番近い隣のパネル」の2つでのみマスキングするようにした。さらに詳しくは「ネガによるマスク」とか色々とあるのだが、ひとまず表示に関してはここまでにしておく。
そしてさらに「移動経路の設定」が難しかった。こちらも3次元では設定できないので、「XY座標」「所属レイヤー」「面の向き」などを1マスごとに用意する感じにして対応した。これにより、レイヤーの変更やブロックの移動可能方向や回転の向きなどを設定できる。これらの設定をパネルごとに用意しておき、パネルを並べたあとに隣接するパネル同士の経路を接続するようにした。