SPACETUBEについて

今回も最近作ったゲームについて解説していきます。今年の4月くらいにSPACETUBE(https://nylon1919.github.io/space/)というゲームを作りました。今日(7/11)たまたま改善したいポイントを改善してみたところ5時間くらいでだいぶ良くなったので(https://nylon1919.github.io/spacev2/)今までのクソポイントとその改善についても説明します。

 

 

1.開発経緯

このゲームの大元には去年の12月くらいに開発していたPENG(https://nylon1919.github.io/peng/)が関わってます。このPENGで疑似的に3D的な奥行きを表現するため等速運動について遠近法での変換でなく直感的に次のような形で実装しました。

"最初の20フレームは止まっていて一回動いたらその次は10フレームは止まっていて徐々に間隔を毎フレームにする"

この挙動を実現するのに場合分けをあまり必要としない表現としてこのように実装しました。

if 48%(47-a.t)==0 then
    a.r+=4
    a.size+=1
  end

条件文には約数が用いられていてこの手法で上述の挙動を実現しています。

自分はあまり線形代数が得意でないのでこうして複雑な変換を避け見た目的には奥から近づいてくる障害物の実装に成功しました。

しかしPENGも同じですが直線的に来る障害物を避けるだけでは面白くないです。PENGでは難易度を上げたうえで隠し要素としてアチーブメントを解放させていくゲームにしましたがSPACETUBEでは円筒形の移動という試みで真新しさを出してみました。ただこれが最初のクソポイントになってしまいます。

 

2.クソポイント

前述の円起動によって操作感のクセが悪く出すぎてしまいました。また宇宙という設定に合わせて加速度が低く減速も遅いので余計にもっさりした動きになってしまいました。また自機を見失いやすく咄嗟の判断で思った方向に進まないなどあんまり遊び続けるのに向かないゲームになってしまいました。そのくせに他の部分は見やすくしようと配慮したので全体的に凝った背景に対しゲーム自体の登場物がシンプルでダサく浮いてました。

 

3.改善点

正直挙動に関してはゲームの根幹にかかわるので大幅なテコ入れはせず自機の拡大をしてみました。それだけでだいぶ面白くなりました。また斜め状態のスプライトを追加しより滑らかに回るようにしました。斜め状態のスプライトの反転も以前のコードがすでに拡張した場合に対応していたためスムーズに追加できました。

function pl_anime()
  local x=pl.x-64 y=-pl.y+64
  if (x+y)*(x-y)>0 then
    pl.s=1
  else
    pl.s=0
  end
  if x>0 then
    pl.xflip=true
  elseif x<0 then
    pl.xflip=false
  end
  if y>0 then
    pl.yflip=true
  elseif y<0 then
    pl.yflip=false
  end
end

修正前(高校数学の不等式と領域っぽい)

function pl_anime()
  local x=pl.x-64 y=-pl.y+64
  if (x+y)*(x-y)>0 then
    pl.s=4
  else
    pl.s=0
  end
  for i=0,3 do
    if abs(pl.theta%360-i*90-45)<15 then
      pl.s=2
    end
  end
  以下同様

修正後(最初から偏角を使えばよかったですね)

また自機の出すショットが赤くてダサいので色を変更し左右から射出できるようにしました。プレイヤーの座標からショットを出していたら左右に分けるのめんどいなって思っていましたが三か月くらい前の自分は偏角に合わせて射出していたので修正が一瞬で終わりました。偉いですね。

あとは全体的に見た目をよくして音楽をつけました。

それらのおかげでだいぶよくなったのでみんなもゲーム作るときにつまんないと思ったら自機を大きくするといいかもしれません。

 

追記(7/12)

さらに改良をしてみて自機以外を回転させてみました。(https://nylon1919.github.io/spacev3/)動かしやすいもののこれも自機以外の挙動を想像しづらくビジュアルがかっこいい以外の利点は特にないです。