Luccica the Witch

こんにちは、NYLONです。今日もゲーム(https://nylon1919.github.io/luccica/)(https://www.lexaloffle.com/bbs/?pid=84939#p)が完成したので記事を書こうと思います。

 

 

1.Luccica the Witchについて

まずこのゲームについてですが企画自体は2年前から構想がありました。当時は他のサークル員と共同で制作していましたが結局アイディアがうまくまとまらず、制作を中止してしまいました。当初から自分は魔法を覚えて唱えるという要素を入れたくて開発初期は上、上、下のように今よりも長いコマンドで大技が発動するというゲームにしたかったのですが、技のレパートリーやバランスの関係でうまくいきませんでした。

そんなこんなで二年くらい経って久しぶりに作ってみることにしました。PICO8で作るので相変わらず制約は厳しいですが必殺技の数を5個に抑えることで8192使えるtakenのうち8188を使って今回完成までこぎつけました。今のところ致命的なバグなどは無いと思いますがシンプルに最終ステージが難しくボスの挙動にも粗があるので気が向いたらtakenをなんとか確保して改良します。

 

2.全体的なデザイン

自分は普通のオタク君なのでアニメが大好きですがデザインとしては魔法少女より魔女の方が好きなのでそういうデザインを心掛けました。またポップでかっこいいあっさりしたデザインを心掛けました。あんまりエモかったり風情があったりするデザインよりもそういうさっぱりとした感じの方が誰にでも好かれるデザインになるかなーって思ったのですがよくわからないです。まあ全体的にスプライトとかもうまく作れたと思うし曲もポップでかっこいい仕上がりになったんじゃないかな。やる気があったら道中とボスで曲を分けたりしたいですね。

f:id:himawarifurutani1919:20201202220931p:plain

作ったスプライト全体

 

3.開発について

ゲームを作るの自体はもうだいぶ慣れましたがミニゲームじゃなくレベルデザインのあるゲームを作るのに苦戦しました。敵の発生の仕方は全て時間で管理しているので条件分岐などをなるべく使わないでtakenに余裕を持たせるのが大変でした。またボスなど大きいスプライトは仕方ないですが雑魚敵なども当初は塗分けでアニメーションを作っていました。結局スプライトに余裕ができた上にtakenの余裕がほぼなくなったのでそういうオシャレなことはやめました。またボスの当たり判定などの実装や細かいところは凄い頭を使いました。

 

4.こだわり

さっきも触れましたがデザインはこだわりました。タイトルロゴも簡素ですが画面振動などで動きを入れてシンプルながら面白いゲーム風のロゴにできたと思います。また敵キャラも可愛げのあるデザインにできていていいアクセントになってると思います。また売りである魔法の豪快さや爽快さは意識しました。魔法に失敗すると黒焦げになって煙が出たり、キノコが胞子を出したりドラゴンが風を出したりまあまあ飽きない作りになってるといいですね。

 

5.総評

めっちゃ面白いんでみんなもプレイしてみてね!

 

6.今回の良かったコード

いつもの奴です。

  rectfill(0,70,127,127,1)
  for j=0,2 do
   local w=4*2^j
   local y=72+8*(2^j-1)
   local term=(4-j)*(wt%(3*w/(4-j)))
   for i=0,11-4*j do
    local x=i*3*w-term
    sspr(48,48,16,8,x,y,2*w,w)
    rectfill(x,y+w,x+2*w-1,127,13)
    fillp(░)
    if (t%2==0) rectfill(x,y+w,x+2*w-1,127,10)
    fillp()
    rect(x,y+w,x+2*w,128,6)
   end
  end

これは三面の背景です。正直誰が見てもよくわかんないと思いますがちゃんと三回のforループであの三層のビル群を描いてます。自分も今見ても何のことかわかりません。

function enemy_spawn()
 esp=15
 if stg==2 then
  if t>=2400 or (t<2400 and t%300>179) then
   add_enemy(t/15+8*flr((t/60)))
  end
 else
  add_enemy(24+(16+48*flr((t%150)/75)+flr(t/300)*42)%104)
  if (stg==3) esp=20
 end
end

これは隊列時の敵の発生関数です。あの隊列は1面と2面は時間のみを引数として作ってます。これもキモ過ぎです。

function boss_atari(a,b,r)
 local tf=false
 if stg==1 then
  tf=(a.x+r>96+0.125*min(abs(a.y-127-b.h/6),abs(a.y-127-b.h/6)) and a.y>127-b.h-r)
 elseif stg==2 then
  tf=(abs(b.x-a.x)<32-abs(a.y-b.y-48)/8+r and abs(a.y-(b.y+48))<48+r)
 else
  tf=((abs(b.x-a.x)<20+max(0,min(a.y-78,6))+r and a.y+r>b.y) or (a.x<b.ax1+r and abs(a.y-b.ay1)<r+8) or (a.x<r+8 and abs(a.y-b.ay2)<r+8))
 end
 return tf
end

これはキモ過ぎますがボスの当たり判定です。半径rを持つaがボスbに接触していればtrueを返します。takenを少しでも確保するためにelseif stg==3と書けないところが切ないです。このキモ過ぎ判定にはmaxやminを多用していますが僕の専門がちょっとそういうの使うので得意なだけです。

 

7.最後に

一応ストーリーとか考えてたので載せます。ゲーム本編では一生語られない奴です。

あらすじ

魔女ルチカは錬金術師への借金を滞納し過ぎて家を差し押さえられてしまう。3日以内の返済を求められたルチカはお金稼ぎにまず高級キノコを収穫するため森へと向かう。

STAGE 1 Mush Rush キノコ狂時代

キノコを大漁に収穫したルチカは次にドラゴンの宝石を奪いに谷へと向かう。

STAGE 2 タイトル未定

ドラゴンから宝石を奪うことに成功したが市長が現れ税としてルチカの所持金を全て持って行ってしまう。そこで街に行き市長からお金を奪い返すがロボットに乗り込んだ市長に追いかけられる。

STAGE 3 tax sacks

借金を返済してゲームクリア