コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

ドットインストールのPICO-8入門に手を出したのでこれからTIC-80をやります

ピコピコしたレトロなやつをつくりたいんじゃぁ

はい、どーも。脳内メモリ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

f:id:andron:20180808201834p:plain
利用できるコードは色々ありますがLuaで確認していきます。

それじゃあ、まずは何はともあれ「Hello」とでも表示させるやつでもやっていきましょうか。とりあえず上の画面で以下のコマンドを打ってESCキーでエディットモードに移動します。

> new lua

f:id:andron:20180808222942p:plain

このままprint ("HELLO")で動かしたいところだけどもPICO-8と違って、コンソール画面的なやつからそのまま動かせないっぽいですね……。とりあえず、下の書き方でゲーム用のスクリプトを書けるようです。

-- 初期設定
function TIC()
  -- メインループ
 cls(0)
 print("Hello World!")
end

コードを書きましたら、ESCキーで先ほどの黒い画面に戻ってrunで実行します。すると、こんな感じに恒例のハローワールドが実行できます。
f:id:andron:20180808232455p:plain


まあ、動かないコード書いても面白くないですしボールを描画して動かすなどをしていきましょうか。こんな感じに書くと動きます。

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

f:id:andron:20180809001058g:plain

実質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


はい、動くの確認できたのでドットインストールのボールゲームクローンでも作っていきます。
f:id:andron:20180809182500g:plain
こんなんできました。

以下、ソースコード

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


とりあえず作ってみて音声周りがなんか気になるんだけど、仕様なのか不具合なのかよくわかんなかった。まあ、そんな感じのツールがあるんですよ。今日のところはそんな感じです。


おしまい