(8.4)落ちてくる四角が動かせるようにする

ハンドへルド・ビュー:

-- 8.4 落ちてくる四角を動かせるようにする
local w = platform.window.width()  -- 画面の幅
local h = platform.window.height() -- 画面の高さ
local lineCount = 20               -- 縦の段数(外側の段数)
local colCount = 10              -- 横の段数(内側の段数)
local sideLen = math.floor(h/(lineCount * 1.25))  -- 四角の 1 辺の長さ(隙間をあけないなら 1 辺の長さは 1 段の高さと同じにすればよい)
local dansa = math.floor(h/lineCount)             -- 1 段の高さ
local marginLeft = sideLen * 12 -- 左端の余白
local marginTop = sideLen/2  -- 上端の余白
local refWallL = {marginLeft, marginTop}                                -- 左壁始点
local refWallR = {marginLeft + dansa + dansa * (colCount), marginTop}   -- 右壁始点
local refBottom = {marginLeft + dansa, marginTop + dansa * (lineCount - 1)}--底始点
local refInnerL = {refWallL[1] + dansa, marginTop} -- 内壁左側始点
local gray = {132, 132, 132}
local red = {255, 0, 0}

---- 部分プログラム(どこから, 1 辺いくつの正方形を, どの方向で, 何個描く, 何色で, gc)
function drawBlocks(x, y, sideLen, direction, number, color, gc)
   local a; local b
   gc:setColorRGB(unpack(color))
   if direction == "tate" then
      a = 0; b = 1
   elseif direction == "yoko" then
      a = 1; b = 0
   end
   for i = 0, number - 1 do
      gc:fillRect(x + (dansa * i) * a, y + (dansa * i) * b, sideLen, sideLen)
   end
end
---------------------------------------------------------------------------------

local dropLen = 0
local slideLen = 0
   function on.paint(gc)
   drawBlocks(refWallL[1] , marginTop   , sideLen, "tate", lineCount, gray, gc) -- 左壁を描く
   drawBlocks(refWallR[1] , marginTop   , sideLen, "tate", lineCount, gray, gc) -- 右壁を描く
   drawBlocks(refBottom[1], refBottom[2], sideLen, "yoko", colCount , gray, gc) -- 底を描く
   drawBlocks(refInnerL[1] + dansa * 4 + slideLen, marginTop + dropLen, sideLen, "yoko", 1 , red, gc) -- 落ちるブロックを描く
   if marginTop + dropLen + dansa >= refBottom[2] then   -- 底にぶつかったからとめる
      timer.stop()
   end
   function on.arrowKey(key)      -- 矢印キーで左右に動かす
      if      key == "left"  then slideLen = slideLen - dansa
      elseif  key == "right" then slideLen = slideLen + dansa
      end
   end
end
function on.timer()
   dropLen = dropLen + dansa    -- タイマーが動いたら描画始点の値を 1 段ずつ増やす
   platform.window:invalidate() -- 画面をリフレッシュ
end 

function on.enterKey()     -- Enter キーでリセット
   dropLen = 0
   slideLen = 0
   function on.escapeKey() -- ESC キーでスタート
      timer.start(0.3)
   end
end

参考文献: