Code: Select all
--[[
Breakout clone, Copyright (c) 2005 Nigel Brine <[email protected]>
]]
System.usbDiskModeActivate()
red = Color.new(255, 0, 0);
black = Color.new(0, 0, 0);
white = Color.new(255, 255, 255);
breakout = Image.createEmpty(480,272)
breakout:clear(black)
-- define globals
frameskip = 0
score = 0
high = 0
paddle = {}
ball = {}
function updatePaddle()
-- clear paddle
breakout:fillRect(paddle.x, paddle.y, paddle.w, paddle.h, black)
-- update position
if (paddle.x + paddle.dx*paddle.vx < 1) then
paddle.x = 1
elseif (paddle.x + paddle.dx*paddle.vx + paddle.w > 480) then
paddle.x = 480-paddle.w
else
paddle.x = paddle.x + paddle.dx*paddle.vx
end
-- redraw paddle
breakout:fillRect(paddle.x, paddle.y, paddle.w, paddle.h, red)
end
function updateBall()
-- clear ball
breakout:fillRect(ball.x, ball.y, ball.w, ball.h, black)
-- update position and angle
if (ball.x + ball.v*math.sin(ball.ang) < 1) then
ball.x = 1
ball.y = ball.y - ball.v*math.cos(ball.ang)
ball.ang = 2*math.pi-ball.ang
elseif (ball.x + ball.v*math.sin(ball.ang) > 480-ball.w) then
ball.x = 480-ball.w
ball.y = ball.y - ball.v*math.cos(ball.ang)
ball.ang = 2*math.pi-ball.ang
elseif (ball.y - ball.v*math.cos(ball.ang) < 1) then
ball.y = 1
ball.x = ball.x + ball.v*math.sin(ball.ang)
ball.ang = math.pi-ball.ang
elseif (ball.y - ball.v*math.cos(ball.ang) >= paddle.y-ball.h) and (ball.y - ball.v*math.cos(ball.ang) <= paddle.y-ball.h-ball.v*math.cos(ball.ang)) and (ball.x + ball.v*math.sin(ball.ang) >= paddle.x) and (ball.x + ball.v*math.sin(ball.ang) <= paddle.x + paddle.w) then
ball.ang = math.pi-ball.ang
ball.x = ball.x + ball.v*math.sin(ball.ang)
ball.y = ball.y - ball.v*math.cos(ball.ang)
--ball.y = paddle.y
--ball.ang = math.pi-ball.ang
elseif (ball.y - ball.v*math.cos(ball.ang) > 272-ball.h) then
--ball.y = 272-ball.h
--ball.x = ball.x + ball.v*math.sin(ball.ang)
--ball.ang = math.pi-ball.ang
ball.isin = 0 -- ball is out of play
else
ball.x = ball.x + ball.v*math.sin(ball.ang)
ball.y = ball.y - ball.v*math.cos(ball.ang)
end
-- redraw ball
if ball.isin == 1 then
breakout:fillRect(ball.x, ball.y, ball.w, ball.h, white)
end
end
function newGame()
score = 0
paddle.x = 30 -- position of paddle
paddle.y = 250
paddle.w = 60 -- dimensions of paddle
paddle.h = 10
paddle.dx = 0 -- direction of paddle, -1 = left, +1 = right
paddle.vx = 20 -- velocity of paddle
ball.x = 200
ball.y = 100
ball.w = 5
ball.h = 5
ball.v = 5
ball.ang = math.pi/4 -- trajectory of ball
ball.isin = 0 -- is ball in play?
end
function keyboardControl()
screen.waitVblankStart()
pad = Controls.read()
anax = pad:analogX()
if math.abs(anax) > 32 then
if anax > 0 then
paddle.dx = 1
else
paddle.dx = -1
end
paddle.vx = math.exp(0.028*math.abs(anax));
elseif pad:left() then
paddle.dx = -1
paddle.vx = 5
elseif pad:right() then
paddle.dx = 1
paddle.vx = 5
else
paddle.dx = 0
paddle.vx = 0
end
if pad:square() and ball.isin == 0 then
ball.isin = 1
ball.x = 200
ball.y = 100
end
end
-- init
newGame()
-- game loop
while not Controls.read():start() do
for i=0,frameskip do
keyboardControl()
end
updatePaddle()
updateBall()
screen:blit(0, 0, breakout)
screen.waitVblankStart()
screen.flip()
end