├── code ├── main.py ├── settings.py ├── sprites.py └── surfacemaker.py ├── graphics ├── blocks │ ├── blue │ │ ├── bottom.png │ │ ├── bottomleft.png │ │ ├── bottomright.png │ │ ├── center.png │ │ ├── left.png │ │ ├── right.png │ │ ├── top.png │ │ ├── topleft.png │ │ └── topright.png │ ├── bronce │ │ ├── bottom.png │ │ ├── bottomleft.png │ │ ├── bottomright.png │ │ ├── center.png │ │ ├── left.png │ │ ├── right.png │ │ ├── top.png │ │ ├── topleft.png │ │ └── topright.png │ ├── green │ │ ├── bottom.png │ │ ├── bottomleft.png │ │ ├── bottomright.png │ │ ├── center.png │ │ ├── left.png │ │ ├── right.png │ │ ├── top.png │ │ ├── topleft.png │ │ └── topright.png │ ├── grey │ │ ├── bottom.png │ │ ├── bottomleft.png │ │ ├── bottomright.png │ │ ├── center.png │ │ ├── left.png │ │ ├── right.png │ │ ├── top.png │ │ ├── topleft.png │ │ └── topright.png │ ├── orange │ │ ├── bottom.png │ │ ├── bottomleft.png │ │ ├── bottomright.png │ │ ├── center.png │ │ ├── left.png │ │ ├── right.png │ │ ├── top.png │ │ ├── topleft.png │ │ └── topright.png │ ├── player │ │ ├── bottom.png │ │ ├── bottomleft.png │ │ ├── bottomright.png │ │ ├── center.png │ │ ├── left.png │ │ ├── right.png │ │ ├── top.png │ │ ├── topleft.png │ │ └── topright.png │ ├── purple │ │ ├── bottom.png │ │ ├── bottomleft.png │ │ ├── bottomright.png │ │ ├── center.png │ │ ├── left.png │ │ ├── right.png │ │ ├── top.png │ │ ├── topleft.png │ │ └── topright.png │ └── red │ │ ├── bottom.png │ │ ├── bottomleft.png │ │ ├── bottomright.png │ │ ├── center.png │ │ ├── left.png │ │ ├── right.png │ │ ├── top.png │ │ ├── topleft.png │ │ └── topright.png ├── other │ ├── ball.png │ ├── bg.png │ ├── heart.png │ ├── laser.png │ ├── projectile.png │ └── tv.png └── upgrades │ ├── heart.png │ ├── laser.png │ ├── size.png │ └── speed.png └── sounds ├── fail.wav ├── impact.wav ├── laser.wav ├── laser_hit.wav ├── music.wav └── powerup.wav /code/main.py: -------------------------------------------------------------------------------- 1 | import pygame,sys,time 2 | from settings import * 3 | from sprites import Player, Ball, Block, Upgrade, Projectile 4 | from surfacemaker import SurfaceMaker 5 | from random import choice, randint 6 | 7 | class Game: 8 | def __init__(self): 9 | 10 | # general setup 11 | pygame.init() 12 | self.display_surface = pygame.display.set_mode((WINDOW_WIDTH,WINDOW_HEIGHT)) 13 | pygame.display.set_caption('Breakout') 14 | 15 | # background 16 | self.bg = self.create_bg() 17 | 18 | # sprite group setup 19 | self.all_sprites = pygame.sprite.Group() 20 | self.block_sprites = pygame.sprite.Group() 21 | self.upgrade_sprites = pygame.sprite.Group() 22 | self.projectile_sprites = pygame.sprite.Group() 23 | 24 | # setup 25 | self.surfacemaker = SurfaceMaker() 26 | self.player = Player(self.all_sprites,self.surfacemaker) 27 | self.stage_setup() 28 | self.ball = Ball(self.all_sprites,self.player,self.block_sprites) 29 | 30 | # hearts 31 | self.heart_surf = pygame.image.load('../graphics/other/heart.png').convert_alpha() 32 | 33 | # projectile 34 | self.projectile_surf = pygame.image.load('../graphics/other/projectile.png').convert_alpha() 35 | self.can_shoot = True 36 | self.shoot_time = 0 37 | 38 | # crt 39 | self.crt = CRT() 40 | 41 | self.laser_sound = pygame.mixer.Sound('../sounds/laser.wav') 42 | self.laser_sound.set_volume(0.1) 43 | 44 | self.powerup_sound = pygame.mixer.Sound('../sounds/powerup.wav') 45 | self.powerup_sound.set_volume(0.1) 46 | 47 | self.laserhit_sound = pygame.mixer.Sound('../sounds/laser_hit.wav') 48 | self.laserhit_sound.set_volume(0.02) 49 | 50 | self.music = pygame.mixer.Sound('../sounds/music.wav') 51 | self.music.set_volume(0.1) 52 | self.music.play(loops = -1) 53 | 54 | def create_upgrade(self,pos): 55 | upgrade_type = choice(UPGRADES) 56 | Upgrade(pos,upgrade_type,[self.all_sprites,self.upgrade_sprites]) 57 | 58 | def create_bg(self): 59 | bg_original = pygame.image.load('../graphics/other/bg.png').convert() 60 | scale_factor = WINDOW_HEIGHT / bg_original.get_height() 61 | scaled_width = bg_original.get_width() * scale_factor 62 | scaled_height = bg_original.get_height() * scale_factor 63 | scaled_bg = pygame.transform.scale(bg_original,(scaled_width,scaled_height)) 64 | return scaled_bg 65 | 66 | def stage_setup(self): 67 | # cycle through all rows and columns of BLOCK MAP 68 | for row_index, row in enumerate(BLOCK_MAP): 69 | for col_index, col in enumerate(row): 70 | if col != ' ': 71 | # find the x and y position for each individual block 72 | x = col_index * (BLOCK_WIDTH + GAP_SIZE) + GAP_SIZE // 2 73 | y = TOP_OFFSET + row_index * (BLOCK_HEIGHT + GAP_SIZE) + GAP_SIZE // 2 74 | Block(col,(x,y),[self.all_sprites,self.block_sprites],self.surfacemaker,self.create_upgrade) 75 | 76 | def display_hearts(self): 77 | for i in range(self.player.hearts): 78 | x = 2 + i * (self.heart_surf.get_width() + 2) 79 | self.display_surface.blit(self.heart_surf,(x,4)) 80 | 81 | def upgrade_collision(self): 82 | overlap_sprites = pygame.sprite.spritecollide(self.player,self.upgrade_sprites,True) 83 | for sprite in overlap_sprites: 84 | self.player.upgrade(sprite.upgrade_type) 85 | self.powerup_sound.play() 86 | 87 | def create_projectile(self): 88 | self.laser_sound.play() 89 | for projectile in self.player.laser_rects: 90 | Projectile( 91 | projectile.midtop - pygame.math.Vector2(0,30), 92 | self.projectile_surf, 93 | [self.all_sprites, self.projectile_sprites]) 94 | 95 | def laser_timer(self): 96 | if pygame.time.get_ticks() - self.shoot_time >= 500: 97 | self.can_shoot = True 98 | 99 | def projectile_block_collision(self): 100 | for projectile in self.projectile_sprites: 101 | overlap_sprites = pygame.sprite.spritecollide(projectile,self.block_sprites,False) 102 | if overlap_sprites: 103 | for sprite in overlap_sprites: 104 | sprite.get_damage(1) 105 | projectile.kill() 106 | self.laserhit_sound.play() 107 | 108 | def run(self): 109 | last_time = time.time() 110 | while True: 111 | 112 | # delta time 113 | dt = time.time() - last_time 114 | last_time = time.time() 115 | 116 | # event loop 117 | for event in pygame.event.get(): 118 | if event.type == pygame.QUIT or self.player.hearts <= 0: 119 | pygame.quit() 120 | sys.exit() 121 | if event.type == pygame.KEYDOWN: 122 | if event.key == pygame.K_SPACE: 123 | self.ball.active = True 124 | if self.can_shoot: 125 | self.create_projectile() 126 | self.can_shoot = False 127 | self.shoot_time = pygame.time.get_ticks() 128 | 129 | # draw bg 130 | self.display_surface.blit(self.bg,(0,0)) 131 | 132 | # update the game 133 | self.all_sprites.update(dt) 134 | self.upgrade_collision() 135 | self.laser_timer() 136 | self.projectile_block_collision() 137 | 138 | # draw the frame 139 | self.all_sprites.draw(self.display_surface) 140 | self.display_hearts() 141 | 142 | # crt styling 143 | self.crt.draw() 144 | 145 | # update window 146 | pygame.display.update() 147 | 148 | class CRT: 149 | def __init__(self): 150 | vignette = pygame.image.load('../graphics/other/tv.png').convert_alpha() 151 | self.scaled_vignette = pygame.transform.scale(vignette,(WINDOW_WIDTH,WINDOW_HEIGHT)) 152 | self.display_surface = pygame.display.get_surface() 153 | self.create_crt_lines() 154 | 155 | def create_crt_lines(self): 156 | line_height = 4 157 | line_amount = WINDOW_HEIGHT // line_height 158 | for line in range(line_amount): 159 | y = line * line_height 160 | pygame.draw.line(self.scaled_vignette, (20,20,20), (0,y), (WINDOW_WIDTH,y),1) 161 | 162 | def draw(self): 163 | self.scaled_vignette.set_alpha(randint(60,75)) 164 | self.display_surface.blit(self.scaled_vignette,(0,0)) 165 | 166 | if __name__ == '__main__': 167 | game = Game() 168 | game.run() 169 | -------------------------------------------------------------------------------- /code/settings.py: -------------------------------------------------------------------------------- 1 | WINDOW_WIDTH = 1280 2 | WINDOW_HEIGHT = 720 3 | 4 | BLOCK_MAP = [ 5 | '666666666666', 6 | '444557755444', 7 | '333333333333', 8 | '222222222222', 9 | '111111111111', 10 | ' ', 11 | ' ', 12 | ' ', 13 | ' '] 14 | 15 | COLOR_LEGEND = { 16 | '1': 'blue', 17 | '2': 'green', 18 | '3': 'red', 19 | '4': 'orange', 20 | '5': 'purple', 21 | '6': 'bronce', 22 | '7': 'grey', 23 | } 24 | 25 | GAP_SIZE = 2 26 | BLOCK_HEIGHT = WINDOW_HEIGHT / len(BLOCK_MAP) - GAP_SIZE 27 | BLOCK_WIDTH = WINDOW_WIDTH / len(BLOCK_MAP[0]) - GAP_SIZE 28 | TOP_OFFSET = WINDOW_HEIGHT // 30 29 | 30 | UPGRADES = ['speed','laser','heart','size'] -------------------------------------------------------------------------------- /code/sprites.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | from settings import * 3 | from random import choice, randint 4 | 5 | class Upgrade(pygame.sprite.Sprite): 6 | def __init__(self,pos,upgrade_type,groups): 7 | super().__init__(groups) 8 | self.upgrade_type = upgrade_type 9 | self.image = pygame.image.load(f'../graphics/upgrades/{upgrade_type}.png').convert_alpha() 10 | self.rect = self.image.get_rect(midtop = pos) 11 | 12 | self.pos = pygame.math.Vector2(self.rect.topleft) 13 | self.speed = 300 14 | 15 | def update(self,dt): 16 | self.pos.y += self.speed * dt 17 | self.rect.y = round(self.pos.y) 18 | 19 | if self.rect.top > WINDOW_HEIGHT + 100: 20 | self.kill() 21 | 22 | class Projectile(pygame.sprite.Sprite): 23 | def __init__(self,pos,surface,groups): 24 | super().__init__(groups) 25 | self.image = surface 26 | self.rect = self.image.get_rect(midbottom = pos) 27 | 28 | self.pos = pygame.math.Vector2(self.rect.topleft) 29 | self.speed = 300 30 | 31 | def update(self,dt): 32 | self.pos.y -= self.speed * dt 33 | self.rect.y = round(self.pos.y) 34 | 35 | if self.rect.bottom <= -100: 36 | self.kill() 37 | 38 | class Player(pygame.sprite.Sprite): 39 | def __init__(self,groups,surfacemaker): 40 | super().__init__(groups) 41 | 42 | # setup 43 | self.display_surface = pygame.display.get_surface() 44 | self.surfacemaker = surfacemaker 45 | self.image = surfacemaker.get_surf('player',(WINDOW_WIDTH // 10,WINDOW_HEIGHT // 20)) 46 | 47 | # position 48 | self.rect = self.image.get_rect(midbottom = (WINDOW_WIDTH // 2,WINDOW_HEIGHT - 20)) 49 | self.old_rect = self.rect.copy() 50 | self.direction = pygame.math.Vector2() 51 | self.pos = pygame.math.Vector2(self.rect.topleft) 52 | self.speed = 300 53 | 54 | self.hearts = 3 55 | 56 | # laser 57 | self.laser_amount = 2 58 | self.laser_surf = pygame.image.load('../graphics/other/laser.png').convert_alpha() 59 | self.laser_rects = [] 60 | 61 | def input(self): 62 | keys = pygame.key.get_pressed() 63 | if keys[pygame.K_RIGHT]: 64 | self.direction.x = 1 65 | elif keys[pygame.K_LEFT]: 66 | self.direction.x = -1 67 | else: 68 | self.direction.x = 0 69 | 70 | def screen_constraint(self): 71 | if self.rect.right > WINDOW_WIDTH: 72 | self.rect.right = WINDOW_WIDTH 73 | self.pos.x = self.rect.x 74 | if self.rect.left < 0: 75 | self.rect.left = 0 76 | self.pos.x = self.rect.x 77 | 78 | def upgrade(self,upgrade_type): 79 | if upgrade_type == 'speed': 80 | self.speed += 50 81 | if upgrade_type == 'heart': 82 | self.hearts += 1 83 | 84 | if upgrade_type == 'size': 85 | new_width = self.rect.width * 1.1 86 | self.image = self.surfacemaker.get_surf('player',(new_width,self.rect.height)) 87 | self.rect = self.image.get_rect(center = self.rect.center) 88 | self.pos.x = self.rect.x 89 | 90 | if upgrade_type == 'laser': 91 | self.laser_amount += 1 92 | 93 | def display_lasers(self): 94 | self.laser_rects = [] 95 | if self.laser_amount > 0: 96 | divider_length = self.rect.width / (self.laser_amount + 1) 97 | for i in range(self.laser_amount): 98 | x = self.rect.left + divider_length * (i + 1) 99 | laser_rect = self.laser_surf.get_rect(midbottom = (x,self.rect.top)) 100 | self.laser_rects.append(laser_rect) 101 | 102 | for laser_rect in self.laser_rects: 103 | self.display_surface.blit(self.laser_surf,laser_rect) 104 | 105 | def update(self,dt): 106 | self.old_rect = self.rect.copy() 107 | self.input() 108 | self.pos.x += self.direction.x * self.speed * dt 109 | self.rect.x = round(self.pos.x) 110 | self.screen_constraint() 111 | self.display_lasers() 112 | 113 | class Ball(pygame.sprite.Sprite): 114 | def __init__(self,groups,player,blocks): 115 | super().__init__(groups) 116 | 117 | # collision objects 118 | self.player = player 119 | self.blocks = blocks 120 | 121 | # graphics setup 122 | self.image = pygame.image.load('../graphics/other/ball.png').convert_alpha() 123 | 124 | # position setup 125 | self.rect = self.image.get_rect(midbottom = player.rect.midtop) 126 | self.old_rect = self.rect.copy() 127 | self.pos = pygame.math.Vector2(self.rect.topleft) 128 | self.direction = pygame.math.Vector2((choice((1,-1)),-1)) 129 | self.speed = 400 130 | 131 | # active 132 | self.active = False 133 | 134 | # sounds 135 | 136 | self.impact_sound = pygame.mixer.Sound('../sounds/impact.wav') 137 | self.impact_sound.set_volume(0.1) 138 | 139 | self.fail_sound = pygame.mixer.Sound('../sounds/fail.wav') 140 | self.fail_sound.set_volume(0.1) 141 | 142 | def window_collision(self,direction): 143 | if direction == 'horizontal': 144 | if self.rect.left < 0: 145 | self.rect.left = 0 146 | self.pos.x = self.rect.x 147 | self.direction.x *= -1 148 | 149 | if self.rect.right > WINDOW_WIDTH: 150 | self.rect.right = WINDOW_WIDTH 151 | self.pos.x = self.rect.x 152 | self.direction.x *= -1 153 | 154 | if direction == 'vertical': 155 | if self.rect.top < 0: 156 | self.rect.top = 0 157 | self.pos.y = self.rect.y 158 | self.direction.y *= -1 159 | 160 | if self.rect.bottom > WINDOW_HEIGHT: 161 | self.active = False 162 | self.direction.y = -1 163 | self.player.hearts -= 1 164 | self.fail_sound.play() 165 | 166 | def collision(self,direction): 167 | # find overlapping objects 168 | overlap_sprites = pygame.sprite.spritecollide(self,self.blocks,False) 169 | if self.rect.colliderect(self.player.rect): 170 | overlap_sprites.append(self.player) 171 | 172 | if overlap_sprites: 173 | if direction == 'horizontal': 174 | for sprite in overlap_sprites: 175 | if self.rect.right >= sprite.rect.left and self.old_rect.right <= sprite.old_rect.left: 176 | self.rect.right = sprite.rect.left - 1 177 | self.pos.x = self.rect.x 178 | self.direction.x *= -1 179 | self.impact_sound.play() 180 | 181 | if self.rect.left <= sprite.rect.right and self.old_rect.left >= sprite.old_rect.right: 182 | self.rect.left = sprite.rect.right + 1 183 | self.pos.x = self.rect.x 184 | self.direction.x *= -1 185 | self.impact_sound.play() 186 | 187 | if getattr(sprite,'health',None): 188 | sprite.get_damage(1) 189 | 190 | 191 | if direction == 'vertical': 192 | for sprite in overlap_sprites: 193 | if self.rect.bottom >= sprite.rect.top and self.old_rect.bottom <= sprite.old_rect.top: 194 | self.rect.bottom = sprite.rect.top - 1 195 | self.pos.y = self.rect.y 196 | self.direction.y *= -1 197 | self.impact_sound.play() 198 | 199 | if self.rect.top <= sprite.rect.bottom and self.old_rect.top >= sprite.old_rect.bottom: 200 | self.rect.top = sprite.rect.bottom + 1 201 | self.pos.y = self.rect.y 202 | self.direction.y *= -1 203 | self.impact_sound.play() 204 | 205 | if getattr(sprite,'health',None): 206 | sprite.get_damage(1) 207 | 208 | def update(self,dt): 209 | if self.active: 210 | 211 | if self.direction.magnitude() != 0: 212 | self.direction = self.direction.normalize() 213 | 214 | # create old rect 215 | self.old_rect = self.rect.copy() 216 | 217 | # horizontal movement + collision 218 | self.pos.x += self.direction.x * self.speed * dt 219 | self.rect.x = round(self.pos.x) 220 | self.collision('horizontal') 221 | self.window_collision('horizontal') 222 | 223 | # vertical movement + collision 224 | self.pos.y += self.direction.y * self.speed * dt 225 | self.rect.y= round(self.pos.y) 226 | self.collision('vertical') 227 | self.window_collision('vertical') 228 | else: 229 | self.rect.midbottom = self.player.rect.midtop 230 | self.pos = pygame.math.Vector2(self.rect.topleft) 231 | 232 | class Block(pygame.sprite.Sprite): 233 | def __init__(self,block_type,pos,groups,surfacemaker,create_upgrade): 234 | super().__init__(groups) 235 | self.surfacemaker = surfacemaker 236 | self.image = self.surfacemaker.get_surf(COLOR_LEGEND[block_type],(BLOCK_WIDTH, BLOCK_HEIGHT)) 237 | self.rect = self.image.get_rect(topleft = pos) 238 | self.old_rect = self.rect.copy() 239 | 240 | # damage information 241 | self.health = int(block_type) 242 | 243 | # upgrade 244 | self.create_upgrade = create_upgrade 245 | 246 | def get_damage(self,amount): 247 | self.health -= amount 248 | 249 | if self.health > 0: 250 | self.image = self.surfacemaker.get_surf(COLOR_LEGEND[str(self.health)],(BLOCK_WIDTH, BLOCK_HEIGHT)) 251 | else: 252 | if randint(0,10) < 9: 253 | self.create_upgrade(self.rect.center) 254 | self.kill() -------------------------------------------------------------------------------- /code/surfacemaker.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | from settings import * 3 | from os import walk 4 | 5 | class SurfaceMaker: 6 | def __init__(self): 7 | # import all the graphics 8 | for index, info in enumerate(walk('../graphics/blocks')): 9 | if index == 0: 10 | self.assets = {color:{} for color in info[1]} 11 | else: 12 | for image_name in info[2]: 13 | color_type = list(self.assets.keys())[index - 1] 14 | full_path = '../graphics/blocks' + f'/{color_type}/' + image_name 15 | surf = pygame.image.load(full_path).convert_alpha() 16 | self.assets[color_type][image_name.split('.')[0]] = surf 17 | 18 | def get_surf(self,block_type,size): 19 | 20 | # create one surface with the graphics with any size 21 | image = pygame.Surface(size) 22 | image.set_colorkey((0,0,0)) 23 | sides = self.assets[block_type] 24 | 25 | # 4 corners 26 | image.blit(sides['topleft'],(0,0)) 27 | image.blit(sides['topright'],(size[0] - sides['topright'].get_width(),0)) 28 | image.blit(sides['bottomleft'],(0,size[1] - sides['bottomleft'].get_height())) 29 | image.blit(sides['bottomright'],(size[0] - sides['bottomright'].get_width(),size[1] - sides['bottomleft'].get_height())) 30 | 31 | # top side 32 | top_width = size[0] - (sides['topleft'].get_width() + sides['topright'].get_width()) 33 | scaled_top_surf = pygame.transform.scale(sides['top'],(top_width,sides['top'].get_height())) 34 | image.blit(scaled_top_surf,(sides['topleft'].get_width(),0)) 35 | 36 | # left side 37 | left_height = size[1] - (sides['topleft'].get_height() + sides['bottomleft'].get_height()) 38 | scaled_left_surf = pygame.transform.scale(sides['left'],(sides['left'].get_width(),left_height)) 39 | image.blit(scaled_left_surf,(0,sides['topleft'].get_height())) 40 | 41 | # right side 42 | right_height = size[1] - (sides['topright'].get_height() + sides['bottomright'].get_height()) 43 | scaled_right_surf = pygame.transform.scale(sides['right'],(sides['right'].get_width(),right_height)) 44 | image.blit(scaled_right_surf,(size[0] - sides['right'].get_width(),sides['topright'].get_height())) 45 | 46 | # bottom side 47 | bottom_width = size[0] - (sides['bottomleft'].get_width() + sides['bottomright'].get_width()) 48 | scaled_bottom_surf = pygame.transform.scale(sides['bottom'],(bottom_width,sides['bottom'].get_height())) 49 | image.blit(scaled_bottom_surf,(sides['topleft'].get_width(),size[1] - sides['bottom'].get_height())) 50 | 51 | # center color 52 | center_height = size[1] - (sides['top'].get_height() + sides['bottom'].get_height()) 53 | center_width = size[0] - (sides['right'].get_width() + sides['left'].get_width()) 54 | scaled_center = pygame.transform.scale(sides['center'],(center_width,center_height)) 55 | image.blit(scaled_center,sides['topleft'].get_size()) 56 | 57 | # return that image to the blocks or the player 58 | return image -------------------------------------------------------------------------------- /graphics/blocks/blue/bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/blue/bottom.png -------------------------------------------------------------------------------- /graphics/blocks/blue/bottomleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/blue/bottomleft.png -------------------------------------------------------------------------------- /graphics/blocks/blue/bottomright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/blue/bottomright.png -------------------------------------------------------------------------------- /graphics/blocks/blue/center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/blue/center.png -------------------------------------------------------------------------------- /graphics/blocks/blue/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/blue/left.png -------------------------------------------------------------------------------- /graphics/blocks/blue/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/blue/right.png -------------------------------------------------------------------------------- /graphics/blocks/blue/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/blue/top.png -------------------------------------------------------------------------------- /graphics/blocks/blue/topleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/blue/topleft.png -------------------------------------------------------------------------------- /graphics/blocks/blue/topright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/blue/topright.png -------------------------------------------------------------------------------- /graphics/blocks/bronce/bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/bronce/bottom.png -------------------------------------------------------------------------------- /graphics/blocks/bronce/bottomleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/bronce/bottomleft.png -------------------------------------------------------------------------------- /graphics/blocks/bronce/bottomright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/bronce/bottomright.png -------------------------------------------------------------------------------- /graphics/blocks/bronce/center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/bronce/center.png -------------------------------------------------------------------------------- /graphics/blocks/bronce/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/bronce/left.png -------------------------------------------------------------------------------- /graphics/blocks/bronce/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/bronce/right.png -------------------------------------------------------------------------------- /graphics/blocks/bronce/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/bronce/top.png -------------------------------------------------------------------------------- /graphics/blocks/bronce/topleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/bronce/topleft.png -------------------------------------------------------------------------------- /graphics/blocks/bronce/topright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/bronce/topright.png -------------------------------------------------------------------------------- /graphics/blocks/green/bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/green/bottom.png -------------------------------------------------------------------------------- /graphics/blocks/green/bottomleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/green/bottomleft.png -------------------------------------------------------------------------------- /graphics/blocks/green/bottomright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/green/bottomright.png -------------------------------------------------------------------------------- /graphics/blocks/green/center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/green/center.png -------------------------------------------------------------------------------- /graphics/blocks/green/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/green/left.png -------------------------------------------------------------------------------- /graphics/blocks/green/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/green/right.png -------------------------------------------------------------------------------- /graphics/blocks/green/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/green/top.png -------------------------------------------------------------------------------- /graphics/blocks/green/topleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/green/topleft.png -------------------------------------------------------------------------------- /graphics/blocks/green/topright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/green/topright.png -------------------------------------------------------------------------------- /graphics/blocks/grey/bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/grey/bottom.png -------------------------------------------------------------------------------- /graphics/blocks/grey/bottomleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/grey/bottomleft.png -------------------------------------------------------------------------------- /graphics/blocks/grey/bottomright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/grey/bottomright.png -------------------------------------------------------------------------------- /graphics/blocks/grey/center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/grey/center.png -------------------------------------------------------------------------------- /graphics/blocks/grey/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/grey/left.png -------------------------------------------------------------------------------- /graphics/blocks/grey/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/grey/right.png -------------------------------------------------------------------------------- /graphics/blocks/grey/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/grey/top.png -------------------------------------------------------------------------------- /graphics/blocks/grey/topleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/grey/topleft.png -------------------------------------------------------------------------------- /graphics/blocks/grey/topright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/grey/topright.png -------------------------------------------------------------------------------- /graphics/blocks/orange/bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/orange/bottom.png -------------------------------------------------------------------------------- /graphics/blocks/orange/bottomleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/orange/bottomleft.png -------------------------------------------------------------------------------- /graphics/blocks/orange/bottomright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/orange/bottomright.png -------------------------------------------------------------------------------- /graphics/blocks/orange/center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/orange/center.png -------------------------------------------------------------------------------- /graphics/blocks/orange/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/orange/left.png -------------------------------------------------------------------------------- /graphics/blocks/orange/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/orange/right.png -------------------------------------------------------------------------------- /graphics/blocks/orange/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/orange/top.png -------------------------------------------------------------------------------- /graphics/blocks/orange/topleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/orange/topleft.png -------------------------------------------------------------------------------- /graphics/blocks/orange/topright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/orange/topright.png -------------------------------------------------------------------------------- /graphics/blocks/player/bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/player/bottom.png -------------------------------------------------------------------------------- /graphics/blocks/player/bottomleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/player/bottomleft.png -------------------------------------------------------------------------------- /graphics/blocks/player/bottomright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/player/bottomright.png -------------------------------------------------------------------------------- /graphics/blocks/player/center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/player/center.png -------------------------------------------------------------------------------- /graphics/blocks/player/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/player/left.png -------------------------------------------------------------------------------- /graphics/blocks/player/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/player/right.png -------------------------------------------------------------------------------- /graphics/blocks/player/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/player/top.png -------------------------------------------------------------------------------- /graphics/blocks/player/topleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/player/topleft.png -------------------------------------------------------------------------------- /graphics/blocks/player/topright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/player/topright.png -------------------------------------------------------------------------------- /graphics/blocks/purple/bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/purple/bottom.png -------------------------------------------------------------------------------- /graphics/blocks/purple/bottomleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/purple/bottomleft.png -------------------------------------------------------------------------------- /graphics/blocks/purple/bottomright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/purple/bottomright.png -------------------------------------------------------------------------------- /graphics/blocks/purple/center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/purple/center.png -------------------------------------------------------------------------------- /graphics/blocks/purple/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/purple/left.png -------------------------------------------------------------------------------- /graphics/blocks/purple/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/purple/right.png -------------------------------------------------------------------------------- /graphics/blocks/purple/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/purple/top.png -------------------------------------------------------------------------------- /graphics/blocks/purple/topleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/purple/topleft.png -------------------------------------------------------------------------------- /graphics/blocks/purple/topright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/purple/topright.png -------------------------------------------------------------------------------- /graphics/blocks/red/bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/red/bottom.png -------------------------------------------------------------------------------- /graphics/blocks/red/bottomleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/red/bottomleft.png -------------------------------------------------------------------------------- /graphics/blocks/red/bottomright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/red/bottomright.png -------------------------------------------------------------------------------- /graphics/blocks/red/center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/red/center.png -------------------------------------------------------------------------------- /graphics/blocks/red/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/red/left.png -------------------------------------------------------------------------------- /graphics/blocks/red/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/red/right.png -------------------------------------------------------------------------------- /graphics/blocks/red/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/red/top.png -------------------------------------------------------------------------------- /graphics/blocks/red/topleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/red/topleft.png -------------------------------------------------------------------------------- /graphics/blocks/red/topright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/blocks/red/topright.png -------------------------------------------------------------------------------- /graphics/other/ball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/other/ball.png -------------------------------------------------------------------------------- /graphics/other/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/other/bg.png -------------------------------------------------------------------------------- /graphics/other/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/other/heart.png -------------------------------------------------------------------------------- /graphics/other/laser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/other/laser.png -------------------------------------------------------------------------------- /graphics/other/projectile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/other/projectile.png -------------------------------------------------------------------------------- /graphics/other/tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/other/tv.png -------------------------------------------------------------------------------- /graphics/upgrades/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/upgrades/heart.png -------------------------------------------------------------------------------- /graphics/upgrades/laser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/upgrades/laser.png -------------------------------------------------------------------------------- /graphics/upgrades/size.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/upgrades/size.png -------------------------------------------------------------------------------- /graphics/upgrades/speed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/graphics/upgrades/speed.png -------------------------------------------------------------------------------- /sounds/fail.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/sounds/fail.wav -------------------------------------------------------------------------------- /sounds/impact.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/sounds/impact.wav -------------------------------------------------------------------------------- /sounds/laser.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/sounds/laser.wav -------------------------------------------------------------------------------- /sounds/laser_hit.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/sounds/laser_hit.wav -------------------------------------------------------------------------------- /sounds/music.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/sounds/music.wav -------------------------------------------------------------------------------- /sounds/powerup.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clear-code-projects/Breakout/ea623aa8bf0d3e6337122a6c60168ef2234e3a4b/sounds/powerup.wav --------------------------------------------------------------------------------