【27】いっしょにまなぼう!

Breakout #27 - Using Objects - Pico-8 Hero PICO-8
Breakout #27 - Using Objects - Pico-8 Hero

Breakout #27 – Using Objects – Pico-8 Hero

 TeamworkCastが配信している、PICO-8のチュートリアル動画の解説を連載中です。

前回はこちら

そして今回の動画はこちらになります。

Breakout #27 – Using Objects – Pico-8 Hero
Breakout #27 – Using Objects – Pico-8 Hero

【解説メモ】

ブロックとカプセルの情報にオブジェクトを応用する

まずはカプセル

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_」と検索してみてチェックするのが良いと思う。

コメント

タイトルとURLをコピーしました