カテゴリー
pico-8メモ PICO-8作品

ミニゲーム「O-SAKA(ゼロサカ)」

ミニシューティングゲームを作りました。

2025年の大阪万博のロゴが発表された瞬間、Twitterがロゴの大喜利祭りになりました。

シンプルながらも、愛らしくとも不気味とも見える、ある意味ロゴらしくない不思議なデザインにみんな魅了されたようです。突っ込みどころがいっぱいある、隙がとても良かったのかも知れません。

自分も、あっ、これ動かしたい!と思いました。

みなが数時間であげてたので祭りには乗り遅れたものの、これまで自学してきたPICO-8のいろいろを短時間でまとめて、ゲームのようなものを作ってみました。

もともとは動かしたい!から始まったものなので、ゲームは二次的なものです。動作の全てが乱数で作られているので、アルゴリズムはありません。
ゲームというにはややおこがましい。

コード部分だけ以下に公開します。

function _init()
	k=0
	anim={
		164,166,168,166
	}
	t=0
	bub={}
	snw={}
	_swim={
		x=72,
		y=74,
		s=2,
		dx=0,
		dy=0,
		f=false
	}
	sb=0x6000
	rs=0
end

function move_swim()
	if _swim.dx>0 then _swim.dx-=0.02 end
	if _swim.dx<0 then _swim.dx+=0.02 end
	_swim.dy-=0.1
	if btn(0) then _swim.dx-=0.2 _swim.f=true end
	if btn(1) then _swim.dx+=0.2 _swim.f=false end
	if btn(4) then _swim.dy+=0.2 end
	if _swim.dx>1 then _swim.dx=1 end
	if _swim.dx<-1 then _swim.dx=-1 end
	if _swim.dy>1 then _swim.dy=1 end
	if _swim.dy<-1 then _swim.dy=-1 end
	_swim.x+=_swim.dx
	_swim.y+=_swim.dy
	if _swim.x>109 then _swim.x=109 end
	if _swim.y<0 then _swim.y=0 end
	if _swim.y>109 then _swim.y=109 end
end
function move_babble()
	for o in all(bub) do
		if o.l>0 then 
			if t%4==0 then
				o.r+=0.2
			end
			o.x-=o.dx
			o.y-=o.dy
			o.l-=1
		else
			del(bub,o)
		end
	end
	for o in all(snw) do
		if o.x>0 then
			o.x-=o.dx
		else
			del(snw,o)
		end
	end
	if t%5==0 then
		add(bub,{
			x=_swim.x+8,
			y=_swim.y+8,
			r=0,
			dx=flr(rnd(2)+1)/2,
			dy=flr(rnd(3)+1)/2,
			l=flr(rnd(20)+20)
		})
		add(snw,{
			x=127,
			y=flr(rnd(127)),
			dx=flr(rnd(6)+2)/2
		})
	end
end

function text(t,x,y,c)
	print(t,x-1,y,1)
	print(t,x+1,y,1)
	print(t,x,y-1,1)
	print(t,x,y+1,1)
	print(t,x-1,y-1,1)
	print(t,x+1,y+1,1)
	print(t,x,y,c)
end

function _update60()
	t+=1
	pal(3,129,1)
	pal(14,140,1)
	cls(3)
	k+=0.2
	move_swim()
	move_babble()
	rs+=0.01
end

function _draw()
	fillp() rectfill(0,116,127,124,0) rectfill(0,110,127,114,3)--bk
	fillp(0b0101101001011010.1) rectfill(0,99,127,104,1)--db chk
	rectfill(0,91,127,99,1)--db
	rectfill(0,0,127,90,14)--db
	fillp(0b0101101001011010.1) rectfill(0,86,127,90,3)--db chk
	fillp(0b0101111110101111.1) rectfill(0,82,127,85,3)--db chk
	fillp() rectfill(0,5,127,5,12)--db
	fillp() rectfill(0,0,127,3,12)--db
	for o in all(bub) do
		circ(o.x,o.y,o.r,7)
	end
	for o in all(snw) do
		circ(o.x,o.y,o.r,7)
	end
	memcpy(0,0x6000,128*64)
	for y=0,127 do
		local rx=flr(sin(rs+y/100)*4)
		sspr(0,y,128,1,0,y+rx,128,1)
	end
	reload()
	spr(anim[flr(k)%4+1],_swim.x,_swim.y,2,2)
	text("cpu:"..stat(1),2,10,7)
	text("rs:"..flr(sin(rs+1/100)*10),2,18,7)
end