Breakout #27 – Using Objects – Pico-8 Hero
TeamworkCastが配信している、PICO-8のチュートリアル動画の解説を連載中です。
前回はこちら。
そして今回の動画はこちらになります。
【解説メモ】
ブロックとカプセルの情報にオブジェクトを応用する
まずはカプセル
function spawnpill(_x,_y) 〜 end 内の
add(pill_x,_x)
add(pill_y,_y)
add(pill_v,true)
add(pill_t,_t)
を
local _pill
_pill={}
_pill.x=_x
_pill.y=_y
_pill.t=_t
add(pill, _pill)
に変更する
function draw_game() 〜 end 内の for i=1,#pill_x do 〜 end
for i=1,#pill_x do
if pill_v[i] then
if pill_t[i]==5 then
palt(0,false)
palt(15,true)
end
spr(pill_t[i],pill_x[i],pill_y[i])
palt()
end
end
を
for i=1,#pill do
if pill[i].t==5 then
palt(0,false)
palt(15,true)
end
spr(pill[i].t,pill[i].x,pill[i].y)
palt()
end
に変更する
function update_game() 〜 end 内の for i=1,#pill_x do 〜 end
for i=1,#pill_x do
if pill_v[i] then
pill_y[i]+=0.7
if pill_y[i] > 128 then
pill_v[i]=false
end
if box_box(pill_x[i],pill_y[i],8,6,pad_x,pad_y,pad_w,pad_h) then
powerupget(pill_t[i])
pill_v[i]=false
sfx(11)
end
end
end
を
for i=#pill,1,-1 do
pill[i].y+=0.7
if pill[i].y > 128 then
-- remove pill
del(pill,pill[i])
i-=1
elseif box_box(pill[i].x,pill[i].y,8,6,pad_x,pad_y,pad_w,pad_h) then
powerupget(pill[i].t)
-- remove pill
del(pill,pill[i])
i-=1
sfx(11)
end
end
に変更する
次は、ブロック
function buildbricks(lvl) 〜 end 内の
brick_x={}
brick_y={}
brick_v={}
brick_t={}
を
bricks={}
にする
function addbrick(_i, _t) 〜 end 内の
add(brick_x,4+((_i-1)%11)*(brick_w+2))
add(brick_y,20+flr((_i-1)/11)*(brick_h+2))
add(brick_v,true)
add(brick_t,_t)
を
local _b
_b={}
_b.x=4+((_i-1)%11)*(brick_w+2)
_b.y=20+flr((_i-1)/11)*(brick_h+2)
_b.v=true
_b.t=_t
add(bricks,_b)
にする
function resetpills() 〜 end 内の
pill_x={}
pill_y={}
pill_v={}
pill_y={}
を消去(pill={}がある)
function levelfinished() 〜 end 内の
for i=1,#brick_v do
if brick_v[i]==true and brick_t[i]!="i" then
return false
end
end
を
if #bricks==0 then return true end
for i=1,#bricks do
if bricks[i].v==true and bricks[i].t!="i" then
return false
end
end
にする(brickじゃなくてbricksなので注意)
function update_game() 〜 end 内のボールとブロックの当たり判定の所
for i=1,#brick_x do
-- check if ball hit brick
if brick_v[i] and ball_box(nextx,nexty,brick_x[i],brick_y[i],brick_w,brick_h) then
-- deal with collision
-- find out in which direction to deflect
if not(brickhit) then
if (powerup == 6 and brick_t[i]=="i") or powerup != 6 then
if deflx_ball_box(ball_x,ball_y,ball_dx,ball_dy,brick_x[i],brick_y[i],brick_w,brick_h) then
ball_dx = -ball_dx
else
ball_dy = -ball_dy
end
end
end
brickhit=true
hitbrick(i,true)
end
end
を
for i=1,#bricks do
-- check if ball hit brick
if bricks[i].v and ball_box(nextx,nexty,bricks[i].x,bricks[i].y,brick_w,brick_h) then
-- deal with collision
-- find out in which direction to deflect
if not(brickhit) then
if (powerup == 6 and bricks[i].t=="i") or powerup != 6 then
if deflx_ball_box(ball_x,ball_y,ball_dx,ball_dy,bricks[i].x,bricks[i].y,brick_w,brick_h) then
ball_dx = -ball_dx
else
ball_dy = -ball_dy
end
end
end
brickhit=true
hitbrick(i,true)
end
end
にする(ここも、brickじゃなくてbricksなので注意)
function hitbrick(_i,_combo) 〜 end 内の
if brick_t[_i]=="b" then
sfx(2+chain)
brick_v[_i]=false
if _combo then
points+=10*chain*pointsmult
chain+=1
chain = mid(1,chain,7)
end
elseif brick_t[_i]=="i" then
sfx(10)
elseif brick_t[_i]=="h" then
if powerup == 6 then
sfx(2+chain)
brick_v[_i]=false
if _combo then
points+=10*chain*pointsmult
chain+=1
chain = mid(1,chain,7)
end
else
sfx(10)
brick_t[_i]="b"
end
elseif brick_t[_i]=="p" then
sfx(2+chain)
brick_v[_i]=false
if _combo then
points+=10*chain*pointsmult
chain+=1
chain=mid(1,chain,7)
end
spawnpill(brick_x[_i],brick_y[_i])
elseif brick_t[_i]=="s" then
sfx(2+chain)
brick_t[_i]="zz"
if _combo then
points+=10*chain*pointsmult
chain+=1
chain=mid(1,chain,7)
end
end
を
if bricks[_i].t=="b" then
sfx(2+chain)
bricks[_i].v=false
if _combo then
points+=10*chain*pointsmult
chain+=1
chain = mid(1,chain,7)
end
elseif bricks[_i].t=="i" then
sfx(10)
elseif bricks[_i].t=="h" then
if powerup == 6 then
sfx(2+chain)
bricks[_i].v=false
if _combo then
points+=10*chain*pointsmult
chain+=1
chain = mid(1,chain,7)
end
else
sfx(10)
bricks[_i].t="b"
end
elseif bricks[_i].t=="p" then
sfx(2+chain)
bricks[_i].v=false
if _combo then
points+=10*chain*pointsmult
chain+=1
chain=mid(1,chain,7)
end
spawnpill(bricks[_i].x,bricks[_i].y)
elseif bricks[_i].t=="s" then
sfx(2+chain)
bricks[_i].t="zz"
if _combo then
points+=10*chain*pointsmult
chain+=1
chain=mid(1,chain,7)
end
end
にする
function explodebrick(_i) 〜 end 内の
brick_v[_i]=false
for j=1,#brick_x do
if j!=_i
and brick_v[j]
and abs(brick_x[j]-brick_x[_i]) <= (brick_w+2)
and abs(brick_y[j]-brick_y[_i]) <= (brick_h+2)
then
hitbrick(j,false)
end
end
を
bricks[_i].v=false
for j=1,#bricks do
if j!=_i
and bricks[j].v
and abs(bricks[j].x-bricks[_i].x) <= (brick_w+2)
and abs(bricks[j].y-bricks[_i].y) <= (brick_h+2)
then
hitbrick(j,false)
end
end
にする
function draw_game() 〜 end 内
for i=1,#brick_x do
if brick_v[i] then
if brick_t[i] == "b" then
brickcol = 14
elseif brick_t[i] == "i" then
brickcol = 6
elseif brick_t[i] == "h" then
brickcol = 15
elseif brick_t[i] == "s" then
brickcol = 9
elseif brick_t[i] == "p" then
brickcol = 12
elseif brick_t[i] == "z" or brick_t[i] == "zz" then
brickcol = 8
end
rectfill(brick_x[i],brick_y[i],brick_x[i]+brick_w,brick_y[i]+brick_h,brickcol)
end
end
を
for i=1,#bricks do
if bricks[i].v then
if bricks[i].t == "b" then
brickcol = 14
elseif bricks[i].t == "i" then
brickcol = 6
elseif bricks[i].t == "h" then
brickcol = 15
elseif bricks[i].t == "s" then
brickcol = 9
elseif bricks[i].t == "p" then
brickcol = 12
elseif bricks[i].t == "z" or bricks[i].t == "zz" then
brickcol = 8
end
rectfill(bricks[i].x,bricks[i].y,bricks[i].x+brick_w,bricks[i].y+brick_h,brickcol)
end
end
にする
【自分の感想】
長々と変更したが、これでカプセルとブロックの情報を個々にテーブルで管理できるようになった。
pill={} も pills={} にしたほうが良かったんじゃないか?とも思う。
修正に抜けがあるかもしれないので、テキストエディタの検索機能で、「pill_」や「brick_」と検索してみてチェックするのが良いと思う。
コメント