Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed images/megaball-prev00.gif
Binary file not shown.
Binary file added megaball.pyxapp
Binary file not shown.
Binary file modified megaball/assets/my_resource.pyxres
Binary file not shown.
19 changes: 10 additions & 9 deletions megaball/audio.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

import pyxel

import globals
Expand All @@ -16,7 +15,7 @@
MUS_START,
MUS_STAGE_COMPLETE,
MUS_DEATH,
#MUS_GAME_OVER
# MUS_GAME_OVER
]

SND_MENU_MOVE = 16
Expand All @@ -33,25 +32,27 @@
SND_USED_WEAPON,
]


def play_sound(snd, looping=False):
if globals.g_sound_on == False:
return

if snd not in SOUNDS:
return

if pyxel.play_pos(3) != -1:
return

pyxel.play(3, snd, loop=looping)



def play_music(msc, looping=False):
if globals.g_music_on == False:
return

if msc not in MUSIC:
return

pyxel.stop()

pyxel.playm(msc, loop=looping)
12 changes: 7 additions & 5 deletions megaball/circle.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,29 @@

def overlap(x1, y1, r1, x2, y2, r2):
dx = x1 - x2
dy = y1 - y2
dist = dx * dx + dy * dy
radiusSum = r1 + r2
return dist < radiusSum * radiusSum



def contains_other(x1, y1, r1, x2, y2, r2):
radiusDiff = r1 - r2
if radiusDiff < 0:
return False

dx = x1 - x2
dy = y1 - y2
dist = dx * dx + dy * dy
radiusSum = r1 + r2
return (not(radiusDiff * radiusDiff < dist) and (dist < radiusSum * radiusSum))

return not (radiusDiff * radiusDiff < dist) and (dist < radiusSum * radiusSum)


def contains_point(x, y, radius, px, py):
dx = x - px
dy = y - py
return dx * dx + dy * dy <= radius * radius


class Circle:
def __init__(self, x, y, radius):
self.x = x
Expand Down
12 changes: 4 additions & 8 deletions megaball/constants.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

GAME_TITLE = "MEGABALL"
GAME_WIDTH = 160
GAME_HEIGHT = 144
Expand Down Expand Up @@ -56,18 +55,15 @@
COLLIDE_TOP_LEFT,
COLLIDE_TOP_RIGHT,
COLLIDE_BOTTOM_RIGHT,
COLLIDE_BOTTOM_LEFT
COLLIDE_BOTTOM_LEFT,
]


def is_colliding_matrix(x, y, matrix):
if matrix not in COLLIDE_MATRIX_ALL:
return False

if x < 0 or x > 7 or y < 0 or y > 7:
return False

return matrix[y][x]




47 changes: 23 additions & 24 deletions megaball/game.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

import pyxel

import constants
Expand All @@ -11,93 +10,93 @@
import globals
import audio


class Game:
def __init__(self):
self.pal_control = palette.PaletteControl()

self.screen_shake = screenshake.ScreenShake(self)

self.main_menu = mainmenu.MainMenu(self)
self.stage = stage.Stage(self, 0)
self.hud = hud.Hud(self)

self.pal_index = 0

audio.play_music(audio.MUS_TITLE, True)

def restart_music(self):
if self.main_menu.is_visible:
audio.play_music(audio.MUS_TITLE)
else:
self.stage.restart_music()

def quit_to_main_menu(self):
del self.stage
self.stage = stage.Stage(self, 0)
globals.set_high_score()
globals.reset()
self.main_menu.reset()
self.add_fade(palette.FADE_STEP_TICKS_DEFAULT, palette.FADE_LEVEL_3)

def go_to_next_stage(self):
globals.g_stage_num += 1
del self.stage
self.stage = stage.Stage(self, globals.g_stage_num)
self.add_fade(palette.FADE_STEP_TICKS_DEFAULT, palette.FADE_LEVEL_3)

def go_to_game_complete_stage(self):
del self.stage
self.stage = stage.Stage(self, stage.MAX_STAGE_NUM + 1)
self.add_fade(palette.FADE_STEP_TICKS_DEFAULT, palette.FADE_LEVEL_3)

def restart_stage(self):
del self.stage
self.stage = stage.Stage(self, globals.g_stage_num)
self.add_fade(palette.FADE_STEP_TICKS_DEFAULT, palette.FADE_LEVEL_3)

def start_game(self):
self.main_menu.hide()
del self.stage
self.stage = stage.Stage(self, globals.g_stage_num)
self.add_fade(palette.FADE_STEP_TICKS_DEFAULT, palette.FADE_LEVEL_3)

def add_screen_shake(self, ticks, magnitude, queue=False):
self.screen_shake.add_event(ticks, magnitude, queue)

def cycle_palette(self):
self.pal_index += 1
if self.pal_index == len(palette.ALL):
self.pal_index = 0
self.pal_control.add_palette_event(1, palette.ALL[self.pal_index])
self.add_fade(palette.FADE_STEP_TICKS_DEFAULT, palette.FADE_LEVEL_3)

def add_fade(self, ticks_per_level, target_level, callback=None):
self.pal_control.add_fade_event(ticks_per_level, target_level, callback)

def update(self, last_inputs):
if pyxel.btnp(pyxel.KEY_F1):
globals.toggle_sound()

if pyxel.btnp(pyxel.KEY_F2):
globals.toggle_music(self)

self.main_menu.update(last_inputs)

self.stage.update(last_inputs)

self.pal_control.update()
self.screen_shake.update()

def draw(self):
for c in range(palette.NUM_COLOURS):
pyxel.pal(palette.DEFAULT[c], self.pal_control.get_col(c))

pyxel.cls(self.pal_control.get_col(0))

self.stage.draw(self.screen_shake.x, self.screen_shake.y)
self.hud.draw(self.screen_shake.x, self.screen_shake.y)

self.main_menu.draw(self.screen_shake.x, self.screen_shake.y)

pyxel.pal()

34 changes: 19 additions & 15 deletions megaball/globals.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

import pyxel

import constants
Expand All @@ -21,46 +20,51 @@
g_sound_on = True
g_music_on = True


def reset():
global g_lives
global g_score
global g_stage_num

g_lives = STARTING_LIVES
g_score = 0
g_stage_num = 1



def toggle_sound():
global g_sound_on

g_sound_on = not g_sound_on

if g_sound_on == False:
pyxel.stop()



def toggle_music(game_obj):
global g_music_on

g_music_on = not g_music_on

if g_music_on == False:
pyxel.stop()
else:
game_obj.restart_music()



def set_high_score():
global g_score
global g_highscore

g_highscore = max(g_score, g_highscore)



def add_lives(amt):
global g_lives

g_lives = max(0, min(g_lives + amt, MAX_LIVES))



def add_score(amt):
global g_score

g_score = max(0, min(g_score + amt, MAX_SCORE))

25 changes: 16 additions & 9 deletions megaball/hud.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

import pyxel

import game
Expand All @@ -7,13 +6,14 @@
import utils
import stage


class Hud:
def __init__(self, game):
self.game = game

def update(self):
pass

def draw(self, shake_x, shake_y):
# top bar
pyxel.blt(shake_x + 0, shake_y + 0, 0, 0, 0, constants.GAME_WIDTH, 16)
Expand All @@ -23,9 +23,16 @@ def draw(self, shake_x, shake_y):
pyxel.blt(shake_x + 0, shake_y + 16, 0, 0, 24, 8, 120)
# right bar
pyxel.blt(shake_x + 152, shake_y + 16, 0, 8, 24, 8, 120)

utils.draw_number_shadowed(shake_x + 31, shake_y + 5, globals.g_lives, zeropad=2)
utils.draw_number_shadowed(shake_x + 57, shake_y + 5, globals.g_score, zeropad=6)
utils.draw_number_shadowed(shake_x + 113, shake_y + 5, globals.g_stage_num, zeropad=2)
utils.draw_number_shadowed(shake_x + 137, shake_y + 5, stage.MAX_STAGE_NUM, zeropad=2)


utils.draw_number_shadowed(
shake_x + 31, shake_y + 5, globals.g_lives, zeropad=2
)
utils.draw_number_shadowed(
shake_x + 57, shake_y + 5, globals.g_score, zeropad=6
)
utils.draw_number_shadowed(
shake_x + 113, shake_y + 5, globals.g_stage_num, zeropad=2
)
utils.draw_number_shadowed(
shake_x + 137, shake_y + 5, stage.MAX_STAGE_NUM, zeropad=2
)
Loading