Initial commit.
This commit is contained in:
commit
1d824dcc10
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*.pdx
|
3
license.md
Normal file
3
license.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
Copyright 2023 Anna Rose Wiggins.
|
||||||
|
|
||||||
|
All rights reserved.
|
7
readme.md
Normal file
7
readme.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
## March of the Sinister Bricks
|
||||||
|
|
||||||
|
This is a simple game for the (Playdate)[https://play.date] handheld console. In it, you use the crank to control a paddle, and try to break the bricks marching toward you from the right.
|
||||||
|
|
||||||
|
This is, of course, a completely novel idea and is dissimilar from any other game ever made.
|
||||||
|
|
||||||
|
It was written as part of a series of games to learn the Playdate SDK.
|
10
src/Makefile
Normal file
10
src/Makefile
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
PLAYDATE_SDK_PATH := ~/playdate
|
||||||
|
GAME := SinisterBricks
|
||||||
|
|
||||||
|
all: build
|
||||||
|
|
||||||
|
build: clean
|
||||||
|
PLAYDATE_SDK_PATH=$(PLAYDATE_SDK_PATH) $(PLAYDATE_SDK_PATH)/bin/pdc -k main.lua ../$(GAME).pdx
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf ../$(GAME).pdx
|
81
src/ball.lua
Normal file
81
src/ball.lua
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
import "CoreLibs/graphics"
|
||||||
|
import "CoreLibs/timer"
|
||||||
|
import "pixie"
|
||||||
|
|
||||||
|
local gfx <const> = playdate.graphics
|
||||||
|
|
||||||
|
class("Ball", {
|
||||||
|
direction = {x=5, y=5},
|
||||||
|
}).extends(Pixie)
|
||||||
|
|
||||||
|
function Ball:init(width, height, color, x, y)
|
||||||
|
local img = gfx.image.new(width, height, color)
|
||||||
|
Ball.super.init(self, img, x, y)
|
||||||
|
self.collisionResponse = gfx.sprite.kCollisionTypeBounce
|
||||||
|
|
||||||
|
self:levelUpTimer()
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function Ball:levelUpTimer()
|
||||||
|
playdate.timer.performAfterDelay(5000,
|
||||||
|
function(ball)
|
||||||
|
if ball.direction.x > 0 then
|
||||||
|
ball.direction.x += 1
|
||||||
|
else
|
||||||
|
ball.direction.x -= 1
|
||||||
|
end
|
||||||
|
if ball.direction.y > 0 then
|
||||||
|
ball.direction.y += 1
|
||||||
|
else
|
||||||
|
ball.direction.y -= 1
|
||||||
|
end
|
||||||
|
|
||||||
|
ball:levelUpTimer()
|
||||||
|
end,
|
||||||
|
self)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Ball:move()
|
||||||
|
local collisions
|
||||||
|
collisions = select(3, self:moveWithCollisions(self.x + self.direction.x, self.y + self.direction.y))
|
||||||
|
|
||||||
|
for i=1, #collisions, 1 do
|
||||||
|
self:changeDirection(collisions[i].normal)
|
||||||
|
end
|
||||||
|
|
||||||
|
return collisions
|
||||||
|
end
|
||||||
|
|
||||||
|
function Ball:changeDirection(normal)
|
||||||
|
local dx,dy = normal:unpack()
|
||||||
|
if dx ~= 0 then
|
||||||
|
self.direction.x *= -1
|
||||||
|
end
|
||||||
|
|
||||||
|
if dy ~= 0 then
|
||||||
|
self.direction.y *= -1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Ball:setDirection(x, y)
|
||||||
|
x = x or self.direction.x
|
||||||
|
y = y or self.direction.y
|
||||||
|
self.direction.x = x
|
||||||
|
self.direction.y = y
|
||||||
|
end
|
||||||
|
|
||||||
|
function Ball:deflect()
|
||||||
|
self:setDirection(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Ball:_normalizePosition()
|
||||||
|
local changeVector = Ball.super._normalizePosition(self)
|
||||||
|
if changeVector[1] ~= 0 then
|
||||||
|
self.direction.x = changeVector[1]
|
||||||
|
end
|
||||||
|
if changeVector[2] ~= 0 then
|
||||||
|
self.direction.y = changeVector[2]
|
||||||
|
end
|
||||||
|
end
|
12
src/brick.lua
Normal file
12
src/brick.lua
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import "CoreLibs/graphics"
|
||||||
|
|
||||||
|
import "pixie"
|
||||||
|
|
||||||
|
class("Brick").extends(Pixie)
|
||||||
|
|
||||||
|
function Brick:init(x, y)
|
||||||
|
local img = playdate.graphics.image.new("images/brick.png")
|
||||||
|
Brick.super.init(self, img, x, y)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
14
src/constants.lua
Normal file
14
src/constants.lua
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
-- Important constants used by multiple files.
|
||||||
|
|
||||||
|
-- The playable screen limits; this allows us to set aside regions of the screen for
|
||||||
|
-- UI elements. Pixies will not venture beyond these bounds.
|
||||||
|
-- This must be coordinated with background images / drawing functions.
|
||||||
|
constants = {
|
||||||
|
screenTop = 20,
|
||||||
|
screenBottom = 240,
|
||||||
|
screenLeft = 0,
|
||||||
|
screenRight = 400,
|
||||||
|
}
|
||||||
|
|
||||||
|
constants.screenHeight = constants.screenBottom - constants.screenTop
|
||||||
|
constants.screenWidth = constants.screenRight - constants.screenLeft
|
BIN
src/fonts/Mini Mono 2X-table-16-20.png
Normal file
BIN
src/fonts/Mini Mono 2X-table-16-20.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
103
src/fonts/Mini Mono 2X.fnt
Normal file
103
src/fonts/Mini Mono 2X.fnt
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
|
||||||
|
space 16
|
||||||
|
A 16
|
||||||
|
B 16
|
||||||
|
C 16
|
||||||
|
D 16
|
||||||
|
E 16
|
||||||
|
F 16
|
||||||
|
G 16
|
||||||
|
H 16
|
||||||
|
I 16
|
||||||
|
J 16
|
||||||
|
K 16
|
||||||
|
L 16
|
||||||
|
M 16
|
||||||
|
N 16
|
||||||
|
O 16
|
||||||
|
P 16
|
||||||
|
Q 16
|
||||||
|
R 16
|
||||||
|
S 16
|
||||||
|
T 16
|
||||||
|
U 16
|
||||||
|
V 16
|
||||||
|
W 16
|
||||||
|
X 16
|
||||||
|
Y 16
|
||||||
|
Z 16
|
||||||
|
[ 16
|
||||||
|
\ 16
|
||||||
|
] 16
|
||||||
|
^ 16
|
||||||
|
_ 16
|
||||||
|
` 16
|
||||||
|
a 16
|
||||||
|
b 16
|
||||||
|
c 16
|
||||||
|
d 16
|
||||||
|
e 16
|
||||||
|
f 16
|
||||||
|
g 16
|
||||||
|
h 16
|
||||||
|
i 16
|
||||||
|
j 16
|
||||||
|
k 16
|
||||||
|
l 16
|
||||||
|
m 16
|
||||||
|
n 16
|
||||||
|
o 16
|
||||||
|
p 16
|
||||||
|
q 16
|
||||||
|
r 16
|
||||||
|
s 16
|
||||||
|
t 16
|
||||||
|
u 16
|
||||||
|
v 16
|
||||||
|
w 16
|
||||||
|
x 16
|
||||||
|
y 16
|
||||||
|
z 16
|
||||||
|
{ 16
|
||||||
|
| 16
|
||||||
|
} 16
|
||||||
|
~ 16
|
||||||
|
¥ 16
|
||||||
|
… 16
|
||||||
|
™ 16
|
||||||
|
‼ 16
|
||||||
|
© 16
|
||||||
|
® 16
|
||||||
|
<EFBFBD> 16
|
||||||
|
! 16
|
||||||
|
" 16
|
||||||
|
# 16
|
||||||
|
$ 16
|
||||||
|
% 16
|
||||||
|
& 16
|
||||||
|
' 16
|
||||||
|
( 16
|
||||||
|
) 16
|
||||||
|
* 16
|
||||||
|
+ 16
|
||||||
|
, 16
|
||||||
|
- 16
|
||||||
|
. 16
|
||||||
|
/ 16
|
||||||
|
0 16
|
||||||
|
1 16
|
||||||
|
2 16
|
||||||
|
3 16
|
||||||
|
4 16
|
||||||
|
5 16
|
||||||
|
6 16
|
||||||
|
7 16
|
||||||
|
8 16
|
||||||
|
9 16
|
||||||
|
: 16
|
||||||
|
; 16
|
||||||
|
< 16
|
||||||
|
= 16
|
||||||
|
> 16
|
||||||
|
? 16
|
||||||
|
@ 16
|
BIN
src/fonts/Mini Mono-table-8-10.png
Normal file
BIN
src/fonts/Mini Mono-table-8-10.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
103
src/fonts/Mini Mono.fnt
Normal file
103
src/fonts/Mini Mono.fnt
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
|
||||||
|
space 8
|
||||||
|
A 8
|
||||||
|
B 8
|
||||||
|
C 8
|
||||||
|
D 8
|
||||||
|
E 8
|
||||||
|
F 8
|
||||||
|
G 8
|
||||||
|
H 8
|
||||||
|
I 8
|
||||||
|
J 8
|
||||||
|
K 8
|
||||||
|
L 8
|
||||||
|
M 8
|
||||||
|
N 8
|
||||||
|
O 8
|
||||||
|
P 8
|
||||||
|
Q 8
|
||||||
|
R 8
|
||||||
|
S 8
|
||||||
|
T 8
|
||||||
|
U 8
|
||||||
|
V 8
|
||||||
|
W 8
|
||||||
|
X 8
|
||||||
|
Y 8
|
||||||
|
Z 8
|
||||||
|
[ 8
|
||||||
|
\ 8
|
||||||
|
] 8
|
||||||
|
^ 8
|
||||||
|
_ 8
|
||||||
|
` 8
|
||||||
|
a 8
|
||||||
|
b 8
|
||||||
|
c 8
|
||||||
|
d 8
|
||||||
|
e 8
|
||||||
|
f 8
|
||||||
|
g 8
|
||||||
|
h 8
|
||||||
|
i 8
|
||||||
|
j 8
|
||||||
|
k 8
|
||||||
|
l 8
|
||||||
|
m 8
|
||||||
|
n 8
|
||||||
|
o 8
|
||||||
|
p 8
|
||||||
|
q 8
|
||||||
|
r 8
|
||||||
|
s 8
|
||||||
|
t 8
|
||||||
|
u 8
|
||||||
|
v 8
|
||||||
|
w 8
|
||||||
|
x 8
|
||||||
|
y 8
|
||||||
|
z 8
|
||||||
|
{ 8
|
||||||
|
| 8
|
||||||
|
} 8
|
||||||
|
~ 8
|
||||||
|
¥ 8
|
||||||
|
… 8
|
||||||
|
™ 8
|
||||||
|
‼ 8
|
||||||
|
© 8
|
||||||
|
® 8
|
||||||
|
<EFBFBD> 8
|
||||||
|
! 8
|
||||||
|
" 8
|
||||||
|
# 8
|
||||||
|
$ 8
|
||||||
|
% 8
|
||||||
|
& 8
|
||||||
|
' 8
|
||||||
|
( 8
|
||||||
|
) 8
|
||||||
|
* 8
|
||||||
|
+ 8
|
||||||
|
, 8
|
||||||
|
- 8
|
||||||
|
. 8
|
||||||
|
/ 8
|
||||||
|
0 8
|
||||||
|
1 8
|
||||||
|
2 8
|
||||||
|
3 8
|
||||||
|
4 8
|
||||||
|
5 8
|
||||||
|
6 8
|
||||||
|
7 8
|
||||||
|
8 8
|
||||||
|
9 8
|
||||||
|
: 8
|
||||||
|
; 8
|
||||||
|
< 8
|
||||||
|
= 8
|
||||||
|
> 8
|
||||||
|
? 8
|
||||||
|
@ 8
|
BIN
src/fonts/font-Bitmore-table-7-11.png
Normal file
BIN
src/fonts/font-Bitmore-table-7-11.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
121
src/fonts/font-Bitmore.fnt
Normal file
121
src/fonts/font-Bitmore.fnt
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
space 2
|
||||||
|
! 2
|
||||||
|
" 4
|
||||||
|
# 6
|
||||||
|
$ 5
|
||||||
|
% 7
|
||||||
|
& 6
|
||||||
|
' 2
|
||||||
|
( 2
|
||||||
|
) 2
|
||||||
|
* 3
|
||||||
|
+ 5
|
||||||
|
, 2
|
||||||
|
- 4
|
||||||
|
. 2
|
||||||
|
/ 4
|
||||||
|
0 5
|
||||||
|
1 2
|
||||||
|
2 5
|
||||||
|
3 5
|
||||||
|
4 5
|
||||||
|
5 5
|
||||||
|
6 5
|
||||||
|
7 5
|
||||||
|
8 5
|
||||||
|
9 5
|
||||||
|
: 2
|
||||||
|
; 3
|
||||||
|
< 4
|
||||||
|
= 5
|
||||||
|
> 4
|
||||||
|
? 6
|
||||||
|
@ 7
|
||||||
|
A 5
|
||||||
|
B 5
|
||||||
|
C 5
|
||||||
|
D 5
|
||||||
|
E 5
|
||||||
|
F 5
|
||||||
|
G 5
|
||||||
|
H 5
|
||||||
|
I 3
|
||||||
|
J 5
|
||||||
|
K 5
|
||||||
|
L 4
|
||||||
|
M 7
|
||||||
|
N 7
|
||||||
|
O 5
|
||||||
|
P 5
|
||||||
|
Q 6
|
||||||
|
R 5
|
||||||
|
S 5
|
||||||
|
T 5
|
||||||
|
U 5
|
||||||
|
V 7
|
||||||
|
W 7
|
||||||
|
X 7
|
||||||
|
Y 5
|
||||||
|
Z 5
|
||||||
|
[ 2
|
||||||
|
\ 4
|
||||||
|
] 2
|
||||||
|
^ 6
|
||||||
|
_ 5
|
||||||
|
` 2
|
||||||
|
a 6
|
||||||
|
b 5
|
||||||
|
c 5
|
||||||
|
d 5
|
||||||
|
e 5
|
||||||
|
f 5
|
||||||
|
g 5
|
||||||
|
h 5
|
||||||
|
i 2
|
||||||
|
j 4
|
||||||
|
k 5
|
||||||
|
l 2
|
||||||
|
m 7
|
||||||
|
n 5
|
||||||
|
o 5
|
||||||
|
p 5
|
||||||
|
q 5
|
||||||
|
r 5
|
||||||
|
s 5
|
||||||
|
t 4
|
||||||
|
u 5
|
||||||
|
v 5
|
||||||
|
w 5
|
||||||
|
x 5
|
||||||
|
y 5
|
||||||
|
z 5
|
||||||
|
{ 4
|
||||||
|
| 2
|
||||||
|
} 4
|
||||||
|
~ 4
|
||||||
|
ag -1
|
||||||
|
at -1
|
||||||
|
av -1
|
||||||
|
ay -1
|
||||||
|
ff -2
|
||||||
|
fi -1
|
||||||
|
fr -1
|
||||||
|
ft -1
|
||||||
|
fu -2
|
||||||
|
le -1
|
||||||
|
is -1
|
||||||
|
it -1
|
||||||
|
iv -1
|
||||||
|
li -1
|
||||||
|
ll -1
|
||||||
|
iz -1
|
||||||
|
ly -1
|
||||||
|
rc -1
|
||||||
|
re -1
|
||||||
|
ri -1
|
||||||
|
ro -1
|
||||||
|
tf -1
|
||||||
|
rt -1
|
||||||
|
ry -1
|
||||||
|
vi -1
|
||||||
|
tt -1
|
BIN
src/fonts/font-Cuberick-Bold-table-12-15.png
Normal file
BIN
src/fonts/font-Cuberick-Bold-table-12-15.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.3 KiB |
258
src/fonts/font-Cuberick-Bold.fnt
Normal file
258
src/fonts/font-Cuberick-Bold.fnt
Normal file
|
@ -0,0 +1,258 @@
|
||||||
|
tracking=1
|
||||||
|
space 6
|
||||||
|
! 2
|
||||||
|
" 7
|
||||||
|
# 9
|
||||||
|
$ 8
|
||||||
|
% 8
|
||||||
|
& 8
|
||||||
|
' 3
|
||||||
|
( 3
|
||||||
|
) 3
|
||||||
|
* 6
|
||||||
|
+ 6
|
||||||
|
, 3
|
||||||
|
- 4
|
||||||
|
. 2
|
||||||
|
/ 6
|
||||||
|
0 8
|
||||||
|
1 6
|
||||||
|
2 7
|
||||||
|
3 7
|
||||||
|
4 8
|
||||||
|
5 7
|
||||||
|
6 7
|
||||||
|
7 7
|
||||||
|
8 7
|
||||||
|
9 7
|
||||||
|
: 2
|
||||||
|
; 2
|
||||||
|
< 7
|
||||||
|
= 7
|
||||||
|
> 7
|
||||||
|
? 6
|
||||||
|
@ 10
|
||||||
|
A 8
|
||||||
|
B 8
|
||||||
|
C 8
|
||||||
|
D 8
|
||||||
|
E 6
|
||||||
|
F 6
|
||||||
|
G 8
|
||||||
|
H 8
|
||||||
|
I 2
|
||||||
|
J 6
|
||||||
|
K 7
|
||||||
|
L 6
|
||||||
|
M 12
|
||||||
|
N 9
|
||||||
|
O 8
|
||||||
|
P 8
|
||||||
|
Q 9
|
||||||
|
R 8
|
||||||
|
S 8
|
||||||
|
T 8
|
||||||
|
U 8
|
||||||
|
V 9
|
||||||
|
W 12
|
||||||
|
X 8
|
||||||
|
Y 8
|
||||||
|
Z 8
|
||||||
|
[ 3
|
||||||
|
\ 6
|
||||||
|
] 3
|
||||||
|
^ 6
|
||||||
|
_ 7
|
||||||
|
` 3
|
||||||
|
a 6
|
||||||
|
b 6
|
||||||
|
c 6
|
||||||
|
d 6
|
||||||
|
e 6
|
||||||
|
f 5
|
||||||
|
g 6
|
||||||
|
h 6
|
||||||
|
i 2
|
||||||
|
j 3
|
||||||
|
k 7
|
||||||
|
l 2
|
||||||
|
m 10
|
||||||
|
n 6
|
||||||
|
o 6
|
||||||
|
p 6
|
||||||
|
q 6
|
||||||
|
r 5
|
||||||
|
s 6
|
||||||
|
t 6
|
||||||
|
u 6
|
||||||
|
v 7
|
||||||
|
w 10
|
||||||
|
x 7
|
||||||
|
y 7
|
||||||
|
z 6
|
||||||
|
{ 5
|
||||||
|
| 2
|
||||||
|
} 5
|
||||||
|
~ 7
|
||||||
|
™ 9
|
||||||
|
… 12
|
||||||
|
¥ 8
|
||||||
|
‼ 5
|
||||||
|
© 10
|
||||||
|
® 10
|
||||||
|
<EFBFBD> 10
|
||||||
|
|
||||||
|
va -1
|
||||||
|
Wm -1
|
||||||
|
Ok 0
|
||||||
|
Eu 0
|
||||||
|
Fo 0
|
||||||
|
Pe -1
|
||||||
|
W; -1
|
||||||
|
Ol 0
|
||||||
|
Ev 0
|
||||||
|
Vu -1
|
||||||
|
He 0
|
||||||
|
Yd -1
|
||||||
|
Fr 0
|
||||||
|
Ye -1
|
||||||
|
Nu 0
|
||||||
|
Wr -1
|
||||||
|
Ft -1
|
||||||
|
Fu 0
|
||||||
|
Ic 0
|
||||||
|
Wt -1
|
||||||
|
Id 0
|
||||||
|
J, 0
|
||||||
|
Wu -1
|
||||||
|
Xo 0
|
||||||
|
Yi -1
|
||||||
|
Ac 0
|
||||||
|
J. 0
|
||||||
|
B, 0
|
||||||
|
Ad 0
|
||||||
|
Po -1
|
||||||
|
Fy -1
|
||||||
|
Ae 0
|
||||||
|
Ja 0
|
||||||
|
Rd -1
|
||||||
|
S, -1
|
||||||
|
Y: -1
|
||||||
|
B. 0
|
||||||
|
Wy -1
|
||||||
|
Re -1
|
||||||
|
Ho 0
|
||||||
|
Ag 0
|
||||||
|
Gu 0
|
||||||
|
Y; -1
|
||||||
|
S. -1
|
||||||
|
Bb 0
|
||||||
|
Xu 0
|
||||||
|
Je 0
|
||||||
|
Yp -1
|
||||||
|
C, 0
|
||||||
|
T, -1
|
||||||
|
C. 0
|
||||||
|
Xy -1
|
||||||
|
Io 0
|
||||||
|
Ca 0
|
||||||
|
Hu 0
|
||||||
|
T. -1
|
||||||
|
Yu -1
|
||||||
|
Ta -1
|
||||||
|
Iq 0
|
||||||
|
Ao 0
|
||||||
|
Ke 0
|
||||||
|
Bi 0
|
||||||
|
Yv -1
|
||||||
|
Ap 0
|
||||||
|
D, 0
|
||||||
|
Si -1
|
||||||
|
Hy 0
|
||||||
|
Aq 0
|
||||||
|
Ro -1
|
||||||
|
Tc -1
|
||||||
|
Bk 0
|
||||||
|
U, -1
|
||||||
|
It 0
|
||||||
|
D. 0
|
||||||
|
Te -1
|
||||||
|
Jo 0
|
||||||
|
Da 0
|
||||||
|
Bl 0
|
||||||
|
U. -1
|
||||||
|
At -1
|
||||||
|
Ua -1
|
||||||
|
Au 0
|
||||||
|
Rt -1
|
||||||
|
Av -1
|
||||||
|
Ru -1
|
||||||
|
Ma 0
|
||||||
|
Aw -1
|
||||||
|
Ti -1
|
||||||
|
Sp -1
|
||||||
|
V, -1
|
||||||
|
Br 0
|
||||||
|
Ko 0
|
||||||
|
Ay -1
|
||||||
|
Mc 0
|
||||||
|
Ju 0
|
||||||
|
Md 0
|
||||||
|
T: -1
|
||||||
|
N, 0
|
||||||
|
V. -1
|
||||||
|
Va -1
|
||||||
|
Ug -1
|
||||||
|
Bu 0
|
||||||
|
Me 0
|
||||||
|
T; -1
|
||||||
|
N. 0
|
||||||
|
F, -2
|
||||||
|
To -1
|
||||||
|
Na 0
|
||||||
|
Su -1
|
||||||
|
W, -1
|
||||||
|
Cr 0
|
||||||
|
F. -2
|
||||||
|
Ve -1
|
||||||
|
Ku 0
|
||||||
|
By -1
|
||||||
|
Fa -1
|
||||||
|
Tr -1
|
||||||
|
W. -1
|
||||||
|
O, -1
|
||||||
|
Ts -1
|
||||||
|
Ne 0
|
||||||
|
Um -1
|
||||||
|
Un -1
|
||||||
|
O. -1
|
||||||
|
Tu -1
|
||||||
|
Oa 0
|
||||||
|
Fe -1
|
||||||
|
Vi -1
|
||||||
|
Up -1
|
||||||
|
Ob 0
|
||||||
|
Wd -1
|
||||||
|
Tw -1
|
||||||
|
Mo 0
|
||||||
|
Lu 0
|
||||||
|
Ni 0
|
||||||
|
V: -1
|
||||||
|
Ty -1
|
||||||
|
Us -1
|
||||||
|
Fi 0
|
||||||
|
V; -1
|
||||||
|
Xa -1
|
||||||
|
Vo -1
|
||||||
|
Ly -1
|
||||||
|
Pa -1
|
||||||
|
Wi -1
|
||||||
|
Oh 0
|
||||||
|
Y, -1
|
||||||
|
F: -1
|
||||||
|
Xe 0
|
||||||
|
No 0
|
||||||
|
F; -1
|
||||||
|
Vr -1
|
||||||
|
W: -1
|
||||||
|
Y. -1
|
BIN
src/images/brick.png
Normal file
BIN
src/images/brick.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 485 B |
165
src/main.lua
Normal file
165
src/main.lua
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
-- Collision mask reference:
|
||||||
|
import "CoreLibs/object"
|
||||||
|
import "CoreLibs/graphics"
|
||||||
|
import "CoreLibs/sprites"
|
||||||
|
import "CoreLibs/timer"
|
||||||
|
import "CoreLibs/crank"
|
||||||
|
|
||||||
|
import "pixie"
|
||||||
|
import "ball"
|
||||||
|
import "brick"
|
||||||
|
import "textbox"
|
||||||
|
|
||||||
|
local gfx <const> = playdate.graphics
|
||||||
|
|
||||||
|
local brickFreq <const> = 0.7
|
||||||
|
|
||||||
|
local paddle = nil
|
||||||
|
local deadWall = nil
|
||||||
|
local ball = nil
|
||||||
|
|
||||||
|
local startTime = nil
|
||||||
|
local endTime = nil
|
||||||
|
local timeWidget = nil
|
||||||
|
local speedWidget = nil
|
||||||
|
|
||||||
|
function setup()
|
||||||
|
playdate.resetElapsedTime()
|
||||||
|
math.randomseed(playdate.getSecondsSinceEpoch())
|
||||||
|
|
||||||
|
paddle = Pixie.new(6, 50, gfx.kColorWhite, 6, 120)
|
||||||
|
paddle:add()
|
||||||
|
ball = Ball(6, 6, gfx.kColorWhite, 12, 120)
|
||||||
|
ball:add()
|
||||||
|
|
||||||
|
addWallColliders()
|
||||||
|
setupBricks()
|
||||||
|
|
||||||
|
timeWidget = TextBox(100, 20, 350, 10, 5, kTextAlignment.center)
|
||||||
|
updateTimeWidget()
|
||||||
|
timeWidget:add()
|
||||||
|
|
||||||
|
speedWidget = TextBox(100, 20, 50, 10, 5, kTextAlignment.center)
|
||||||
|
updateSpeedWidget()
|
||||||
|
speedWidget:add()
|
||||||
|
|
||||||
|
local backgroundImage = gfx.image.new(400, 220, gfx.kColorBlack)
|
||||||
|
gfx.sprite.setBackgroundDrawingCallback(
|
||||||
|
function(x, y, width, height)
|
||||||
|
backgroundImage:draw(0, 20)
|
||||||
|
end
|
||||||
|
)
|
||||||
|
|
||||||
|
startTime = playdate.getElapsedTime()
|
||||||
|
end
|
||||||
|
|
||||||
|
function addWallColliders()
|
||||||
|
-- set up border boundaries
|
||||||
|
-- top
|
||||||
|
gfx.sprite.addEmptyCollisionSprite(constants.screenLeft, constants.screenTop,
|
||||||
|
constants.screenWidth, 1)
|
||||||
|
-- right
|
||||||
|
gfx.sprite.addEmptyCollisionSprite(constants.screenRight, constants.screenTop,
|
||||||
|
1, constants.screenHeight)
|
||||||
|
-- bottom
|
||||||
|
gfx.sprite.addEmptyCollisionSprite(constants.screenLeft, constants.screenBottom,
|
||||||
|
constants.screenWidth, 1)
|
||||||
|
|
||||||
|
-- left
|
||||||
|
deadWall = Pixie.new(1, constants.screenHeight, gfx.kColorClear,
|
||||||
|
0, constants.screenHeight / 2 + constants.screenTop)
|
||||||
|
deadWall:add()
|
||||||
|
end
|
||||||
|
|
||||||
|
function setupBricks()
|
||||||
|
for i=1,12 do
|
||||||
|
addBrickRow()
|
||||||
|
advanceBricks()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function addBrickRow()
|
||||||
|
for i=1,10 do
|
||||||
|
if math.random() < brickFreq then
|
||||||
|
local brick = Brick(constants.screenRight - 5,
|
||||||
|
constants.screenTop + (22 * (i-1)) + 11)
|
||||||
|
brick:add()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function advanceBricks()
|
||||||
|
-- move all the bricks over
|
||||||
|
local sprites = gfx.sprite.getAllSprites()
|
||||||
|
for i=1, #sprites, 1 do
|
||||||
|
local brick = sprites[i]
|
||||||
|
if brick:isa(Brick) then
|
||||||
|
brick:moveBy(-10, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function playdate.update()
|
||||||
|
gfx.clear()
|
||||||
|
|
||||||
|
if endTime then
|
||||||
|
if playdate.buttonJustPressed(playdate.kButtonA) then
|
||||||
|
gfx.sprite.removeAll()
|
||||||
|
playdate.file.run("main.pdz")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Handle player movement
|
||||||
|
movePaddle(playdate.getCrankTicks(80))
|
||||||
|
|
||||||
|
-- Handle ball movement + collision
|
||||||
|
moveBall()
|
||||||
|
|
||||||
|
-- UI Updates
|
||||||
|
updateTimeWidget()
|
||||||
|
updateSpeedWidget()
|
||||||
|
|
||||||
|
playdate.timer.updateTimers()
|
||||||
|
end
|
||||||
|
|
||||||
|
gfx.sprite.update()
|
||||||
|
end
|
||||||
|
|
||||||
|
function updateTimeWidget()
|
||||||
|
timeWidget:setText(string.format("time: %.2f", playdate.getElapsedTime()))
|
||||||
|
end
|
||||||
|
|
||||||
|
function updateSpeedWidget()
|
||||||
|
speedWidget:setText(string.format("speed: " .. math.abs(ball.direction.x) - 4))
|
||||||
|
end
|
||||||
|
|
||||||
|
function movePaddle(ticks)
|
||||||
|
if ticks == 0 then return end
|
||||||
|
paddle:moveWithCollisions(paddle.x, paddle.y + ticks*-5)
|
||||||
|
end
|
||||||
|
|
||||||
|
function moveBall()
|
||||||
|
local collisions = ball:move()
|
||||||
|
for i = 1, #collisions, 1 do
|
||||||
|
local obj = collisions[i].other
|
||||||
|
if obj:isa(Brick) then
|
||||||
|
obj:remove()
|
||||||
|
end
|
||||||
|
if obj == deadWall then
|
||||||
|
endGame()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function endGame()
|
||||||
|
endTime = playdate.getElapsedTime()
|
||||||
|
|
||||||
|
local textBox = TextBox(275, 40, 200, 120, 5, kTextAlignment.center)
|
||||||
|
textBox:setText(
|
||||||
|
"Game Over!\nYou survived for " ..
|
||||||
|
string.format("%.2f", endTime) ..
|
||||||
|
" seconds.\n Press 'A' to play again."
|
||||||
|
)
|
||||||
|
textBox:add()
|
||||||
|
end
|
||||||
|
|
||||||
|
setup()
|
5
src/pdxinfo
Normal file
5
src/pdxinfo
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
name=March of the Sinister Bricks
|
||||||
|
author=Anna Rose Wiggins
|
||||||
|
description=You think they're essential masonry supplies but I think they're sinister.
|
||||||
|
bundleID=net.annabunches.sinister-bricks
|
||||||
|
version=0.1
|
32
src/pixie.lua
Normal file
32
src/pixie.lua
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
-- A pixie is like a sprite, but better
|
||||||
|
-- built-in collider, support for setting position at creation
|
||||||
|
-- ideal for subclassing sprites that don't need a custom
|
||||||
|
-- draw function
|
||||||
|
|
||||||
|
import "CoreLibs/object"
|
||||||
|
import "CoreLibs/graphics"
|
||||||
|
import "CoreLibs/sprites"
|
||||||
|
|
||||||
|
import "constants"
|
||||||
|
|
||||||
|
local gfx <const> = playdate.graphics
|
||||||
|
|
||||||
|
class("Pixie").extends(gfx.sprite)
|
||||||
|
|
||||||
|
-- automatically initialize pixie with a simple rectangle.
|
||||||
|
-- great for simple games or for debugging
|
||||||
|
function Pixie.new(width, height, color, x, y)
|
||||||
|
local img = gfx.image.new(width, height, color)
|
||||||
|
local pixie = Pixie(img, x, y)
|
||||||
|
return pixie
|
||||||
|
end
|
||||||
|
|
||||||
|
function Pixie:init(img, x, y)
|
||||||
|
x = x or 0
|
||||||
|
y = y or 0
|
||||||
|
|
||||||
|
Pixie.super.init(self, img)
|
||||||
|
self:setCollideRect(0, 0, self:getSize())
|
||||||
|
self:moveTo(x, y)
|
||||||
|
return self
|
||||||
|
end
|
43
src/textbox.lua
Normal file
43
src/textbox.lua
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
import "CoreLibs/graphics"
|
||||||
|
import "CoreLibs/object"
|
||||||
|
import "pixie"
|
||||||
|
|
||||||
|
local gfx <const> = playdate.graphics
|
||||||
|
|
||||||
|
local defaultFont = gfx.font.new("fonts/Mini Mono")
|
||||||
|
|
||||||
|
class("TextBox").extends(gfx.sprite)
|
||||||
|
|
||||||
|
function TextBox:init(w, h, x, y, vert, align, font)
|
||||||
|
TextBox.super.init(self)
|
||||||
|
|
||||||
|
self:setSize(w, h)
|
||||||
|
self:moveTo(x, y)
|
||||||
|
self:setZIndex(999)
|
||||||
|
self.align = align or kTextAlignment.left
|
||||||
|
self.font = font or defaultFont
|
||||||
|
self.vert = vert
|
||||||
|
self.text = ""
|
||||||
|
end
|
||||||
|
|
||||||
|
function TextBox:setText(text)
|
||||||
|
self.text = text
|
||||||
|
end
|
||||||
|
|
||||||
|
function TextBox:draw(x, y, w, h)
|
||||||
|
gfx.pushContext()
|
||||||
|
|
||||||
|
gfx.setColor(gfx.kColorWhite)
|
||||||
|
gfx.fillRect(x, y, w, h)
|
||||||
|
gfx.setColor(gfx.kColorBlack)
|
||||||
|
gfx.drawRoundRect(x, y, w, h, 2)
|
||||||
|
|
||||||
|
gfx.setFont(self.font)
|
||||||
|
gfx.drawTextInRect(
|
||||||
|
self.text,
|
||||||
|
x, y+self.vert, w, h, nil, nil, self.align
|
||||||
|
)
|
||||||
|
|
||||||
|
gfx.popContext()
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in New Issue
Block a user