tapioca

こんにちは。今回も自分の作ったゲームtapioca(https://nylon1919.github.io/tapioca/)について解説していきます。

 

1.制作経緯

実はこのゲームの歴史は古く2年前に遡ります。当時のWCEの幹事長と制作したゲームが初代tapioca(https://wce.jp/works/game/?name=tapioca)です。当時自分はゲームプログラミングができなかったためグラフィックと音楽と企画で参加しました。

シンプルで面白いゲームを作る為いろいろ考えた結果、メイドインワリオの"pyoro"を参考にゲームシステムを考えていきました。pyoroの面白いところは落ち物式ですが物を拾えなかったことがゲームオーバー要因に直接はならないところです。そこを崩さずにpyoroとは違うゲームとしてtapiocaの枠組みが出来ました。pyoroにあった落ちるものによって地形が変化し移動制限がかかるという要素をブロックで実現したのがtapiocaです。ブロックの破壊にpyoroのような特殊なアクションを組み込むかは悩みましたがシンプルに放物軌道を描くものを投げることにしました。

しかしこの時点では「ブロックが落ちてきて、ものを投げて壊すゲーム」としか決まっていませんでした。そこでこのゲームに則した世界観とデザインを考えることになりましたが当初は整合性のとれた「工事現場で作業員がハンマーを投げる」ゲームにすることにしていました。しかしそこでどうしてもマリオのようなポップな作業員のデザインが描けなかったため、もっとポップで面白い見た目を重視してデザインをし直しました。また見た目で何が何で何をするのかがわかりやすいデザインにし直しました。その結果「カエルが卵を投げてブロックを壊す」ゲームになりました。全体的に緩い見た目に間の抜けた音楽は自分の技術不足ではなく敢えてです。

実際ゲームを作る、デザインする上で何かを模倣することは避けられないと思います。どうしても当たり前の記号のようにゲーム内に?マークのついた箱やパワーアップするキノコや壊せそうなレンガの箱は出てきてしまいます。それをどのように扱うかは非常に難しいです。パクりだと言われたらそうだとも思うし実際その記号によってはじめてプレイする人を誘導することも可能で便利であるとも思います。そのようなゲーム記号は国際的な市場を見ると弱いらしく完全なユニバーサルデザインとは言えないようですが世界的なインディーズゲームなどゲームを好きな人がプレイするようなゲームには頻繁に使われていてプレイして欲しいターゲット層に合わせた配慮が必要なようです。

そうして初代tapiocaはデザインされリリースされました。適度なファイアレートや得点計算など完成させることではなくプレイする側の目線での調整が丁寧にされ、また積み上がりきるとゲームオーバーになるなどアクションパズルのような要素も追加されシンプルなデザインながらなかなかに遊べるゲームに仕上がりました。それが2018年の10月くらいのことです。

時が流れて自分がPICO8を用いた開発を始めた頃どうしてもこのゲームを自分の手で完成させたくなり何回か開発を試みましたがOpenSiv3Dで開発された丁寧な物理エンジン、当たり判定などの再現にかなり苦戦しました。そして5回目の開発再開にしてようやく納得のいくクオリティで再現できました。

 

2.追加要素

初代の完成度は自信を持ってはいますが、どうしてもゲームの単調さやあまり動かないで投げ続けた方が強いなどゲーム自体の浅さは否定できないと思っていました。

そこでレベルデザインを調整しゲームがどんどん加速するようにしました。具体的には積みあがったブロック数か時間によってフェーズが三段階で進みフェーズが進むごとにブロックが降ってくるレートと卵を投げれるレートを速くしました。またフェーズごとに背景や曲調が変化するようになっています。実際pyoroではこうした手法がとられていてシンプルながら如何にゲームを盛り上げるかを突き詰めたゲームに感じます。

またアイテムを2種追加し各種バフをかけることにしました。フェーズが進むとブロックレートの方が卵レートより速いので処理が追い付かなくなるためアイテムの存在は積み上がりによるゲームオーバーを避けるために必須です。そのため積極的に回収に動き回る必要があります。

こうして初代よりも長期的に遊べるようなクオリティになったと思います。

 

3.頑張ったところ

以前自分のゲームのUI用にプリセットを作って最近のゲームはメニューなど全部同じ手法で作っていました。しかしそのデザインがだんだん気に食わなくなってきたのでtapiocaではタイトルから直接ゲームが始まり縦長なため余る右画面に必要な情報を詰めました。またなるべくシンプル過ぎず派手過ぎない見た目を心掛けました。

また操作性は凝っていて3フレームで切り替わる小ジャンプ大ジャンプや〇/zボタン長押しで切り替わるオートモードなどプレイしてみて自分が欲しいと思ったものやスマホ、PCを問わず遊びやすくてどちらでも面白いよう細かく調整しました。他にもオートモードは〇/zボタンの二回押しで解除(オートモードにすることはできない)できるようにしました。

また演出も細かく工夫していて鉄球卵による画面振動や背景の雲や星の挙動、接地した場合に起きる砂埃など邪魔になり過ぎずゲームを盛り上げるように追加しました。色味もオシャレでかっこよく見えるように配慮し60fpsであることを利用しPICO8の表現色である16色を超えて高速の点滅などで微妙な色合いも出しています。

こうしてフェーズが進むごとに背景や曲で盛り上がる一方でカエルが卵を投げるだけというシュールな絵面がこのゲームの個性を生み出しています。

 

4.頑張ったけど妥協したところ

当たり判定に関してはかなり頑張って調整しましたが手作りなので穴がありそうです。一回デバッグ中に不穏な挙動をしましたが一瞬過ぎて原因がわからずそれ以降も遭遇していません。

また初代の間抜けなカエルの見た目や動きが8×16のスプライトだと再現しきれていない感じがします。

あと音楽について自分がPICO8の仕様がちゃんとわかっておらずできるかぎり滑らかに繋がるように配慮していますがどうしてもフレームがずれて曲が流れることがあります。PICO8のspd14の曲が何フレームぴったりで再生が終わるのか知っている人がいたら教えてください。

また右画面のデザインは頑張ったけどそんな好きでもないです。もうちょいかっこよくしたい。

 

5.総評

よくできたんじゃないかな。

 

6.今回の良かったアルゴリズム

1.タイトル画面からスタートするところ


    if title<48 then
      title-=(48-title)/2
      if title<-24 then
        game=true
        title=48
      end
    elseif btn(❎) and title==48 then
      title-=2
      sfx(0)
    end

いつもゲームをスタートするボタンをゲーム中も使いたいときちょうどいい待機画面を作るのに苦戦してたけど(最初にジャンプしてしまうなどを避けたい)これはいい感じ。titleが最初中央にあればボタン入力を受け付けて加速しながら遠ざかってある程度離れるとゲームが始まる。そういえばPICO8をバージョンアップしたからbtn関数の引数に記号を入れられたりいろいろ便利になった。

 

2.オートモード周り


  if btn(🅾️) then
    btnf+=1
    btnnf=0
    if btnf==60 then
      auto=not auto
    end
  else
    if abs(btnf-3)<3 then
      if btnpp then
        btnpp=false
        if auto then
          auto=false
        end
        sfx(3)
      else
        btnpp=true
      end
    end
    btnf=0
    btnnf+=1
    if btnnf>10 then
      btnpp=false
    end
  end

意外と長いけど期待通りの挙動をしている。前は0<x<4とか表現したいとき if x>0 and x<4 thenみたいに書いてたけど長いから最近はif abs(x-2)<2 thenって書くことが多い。

 

3.振動


  if shake>0 then
    shake*=0.95
    local x,y=shake*(rnd(2)-1),shake*(rnd(2)-1)
    camera(x,y)
    if shake<0.5 then
      shake=0
    end
  end

PICO8には描画位置をずらせるカメラ関数がありそれがあるので簡単。大元は何かのゲームを真似たけどどんなだったか忘れた。これで振動させたいところでshake=1とかshake=2とかすれば勝手に振動するし強さも変えれる。

 

4.得点


  n.n=0
  local k=2
  for i=1,5 do
    if b.y<k*10 then
      n.n+=10
    end
    k*=1.75
  end
  if b.f then
    n.n-=10
  end

nは得点を取った時に出てくる数字のテーブルである。上の方で高得点で下の方で得点が低いという構図を少ない場合分けと適度な分布によって実現している。