ピコピコしたレトロなやつをつくりたいんじゃぁ
はい、どーも。脳内メモリ8ビットの僕です。メモリが8ビットなので256回頭を使うとオーバーフローを起こして脳みそが消滅します。脳みそが消滅します。大事なことで二回言いました。怖いですね。なので、みなさん僕に頭を使わせることをさせないでくださいね。脳みそが消滅しますので……。
それでですね。先ほどドットインストールのPICO-8入門(全20回)を終えて頭を使ってきました。なので残り236回ほど頭を使うと脳みそが消滅します。あと、236回しか頭を使えないなんて、僕はどうしたらいいんだ……。
まあ、そういう茶番どうでもいいですね。
TIC-80が無償で動かせたので……
というわけでして、本題に入ります。ドットインストールというサイトにPICO-8入門レッスンがあるのをみなさんご存知でしょうか?有償のツールだったので今まで触る機会がなかったんですよ。で、代替できそうなものないかなーって探していたらTIC-80が似たようなことできそうだったのでそれで何かを作るなどをしていきたいと思ったのでした。多分、操作性的なやつは異なると思いますが見た感じ似たような感じで使えそうだったのでそれをいじってみることにしました。
ちなみにPICO-8は以下のようなやつです。
PICO-8 Fantasy Console
なにができるツールなのかというとレトロなゲームを作ることのできるツールになります。
ドットインストール参考(PICO-8)
PICO-8入門
PICO-8のほう詳しく知りたい場合は公式見るなり、ドットインストール見るなりすると僕のわけわかんないことやっている記事より理解が深まると思います。
TIC-80をはじめるお
てなわけで、TIC-80はじめていきます。こいつも上記に同じく似た感じのことできるプチゲーム開発環境です(多分)。なんかファンタジーコンピュータとか自称してるのでなんて呼べばいいのかよくわかんないですけど……。
公式
tic.computer
まあ、とりあえず動かしてみましょう。Createに移動すればブラウザからでもなんかつくることができるようです。
TIC-80 tiny computer
利用できるコードは色々ありますがLuaで確認していきます。
それじゃあ、まずは何はともあれ「Hello」とでも表示させるやつでもやっていきましょうか。とりあえず上の画面で以下のコマンドを打ってESCキーでエディットモードに移動します。
> new lua
このままprint ("HELLO")
で動かしたいところだけどもPICO-8と違って、コンソール画面的なやつからそのまま動かせないっぽいですね……。とりあえず、下の書き方でゲーム用のスクリプトを書けるようです。
-- 初期設定 function TIC() -- メインループ cls(0) print("Hello World!") end
コードを書きましたら、ESCキーで先ほどの黒い画面に戻ってrun
で実行します。すると、こんな感じに恒例のハローワールドが実行できます。
まあ、動かないコード書いても面白くないですしボールを描画して動かすなどをしていきましょうか。こんな感じに書くと動きます。
function init() x=10 y=10 r=3 end init() function TIC() cls(0) circ(x,y,r,14) x=x+3 y=y+3 end
実質Luaなので、こういった書き換えでも動くようです。
ball={} ball.new=function() ball.x=10 ball.y=10 ball.r=3 end ball.draw=function() circ(ball.x,ball.y,ball.r,14) end ball.update=function() ball.x=ball.x+3 ball.y=ball.y+3 end --main function init() ball.new() end init() function TIC() cls(0) ball.draw() ball.update() end
はい、動くの確認できたのでドットインストールのボールゲームクローンでも作っていきます。
こんなんできました。
以下、ソースコード
ball={} ball.new=function() ball.x=math.random(0,128) ball.y=14 ball.r=3 ball.vx=math.random(0,2)+1*(math.random(0,1)>0.5 and 1 or -1) ball.vy=math.random(0,2)+1 end ball.draw=function() circ(ball.x,ball.y,ball.r,14) end ball.update=function() ball.x=ball.x+ball.vx ball.y=ball.y+ball.vy if ball.x<0 or ball.x>240 then ball.vx=ball.vx*(-1) sfx(0,"E-4") end if ball.y<14 then ball.vy=ball.vy*(-1) sfx(0,"E-4") end if ball.y>136 then ball.vy=ball.vy*(-1) game.life=game.life-1 ball.new() game.quake=4 end end paddle={} paddle.new=function() paddle.x=54 paddle.y=125 paddle.w=20 paddle.h=4 end paddle.update=function() if btn(2) then paddle.x=paddle.x-3 end if btn(3) then paddle.x=paddle.x+3 end if paddle.y<ball.y and (paddle.x+15>ball.x and paddle.x-15<ball.x) then game.score=game.score+1 ball.vy=ball.vy*(-1) sfx(0,"A-5") end end paddle.draw=function() rect(paddle.x,paddle.y,paddle.w,paddle.h,9) end --game game={} game.new=function() game.score=0 game.life=3 game.mode="start" game.fcount=0 game.quake=0 game.textcolor=11 end game.update=function() if game.life <= 0 then game.mode="over" end game.fcount=game.fcount+1 if game.fcount > 32000 then game.fcount=0 end game.quake=game.quake-1 if game.quake < 0 then game.quake=0 end game.textcolor=(game.fcount%24>12) and 11 or 3 end game.draw=function() local offset= game.fcount%2== 0 and 1 or -1 rect(0,0+offset*game.quake,240,10,1) print("Score:".. game.score,1,3,7) for i=1, game.life do spr(0,200+i*9,14+offset*game.quake) end --print(" life:" .. game.life ,1,3,7) end --start start={} start.update=function() if btn(4) then game.mode = "play" end end start.draw=function() cls(1) print("presss z to start",75,64,game.textcolor) end --over over={} over.update=function() if btn(4) then init() game.mode="play" end end over.draw=function() cls(1) print("GAME OVER",75,64,11) print("presss z to restart",75,84,game.textcolor) end --main function init() game.new() ball.new() paddle.new() end init() function update() if game.mode == "start" then start.update() elseif game.mode == "play" then ball.update() paddle.update() elseif game.mode == "over" then over.update() end game.update() end function draw() if game.mode == "start" then start.draw() elseif game.mode == "play" then game.draw() ball.draw() paddle.draw() elseif game.mode == "over" then over.draw() end end function TIC() cls(0) draw() update() end
同じLuaだしコピペでいけるやろとか思って甘い見通し立てて書いてたけど、そのまま流用は無理だった……。画面サイズとか、フレームの仕様とか、独自APIの形式とか……。でもまあそれでもこんなのがサクッとできちゃうっぽいですよ。
そして、Wikiに仕様とかチュートリアルとかついていたりして、ゲーム作る参考にもなるのもいい感じです。
Home · nesbox/TIC-80 Wiki · GitHub
とりあえず作ってみて音声周りがなんか気になるんだけど、仕様なのか不具合なのかよくわかんなかった。まあ、そんな感じのツールがあるんですよ。今日のところはそんな感じです。
おしまい