Skip to content

Instantly share code, notes, and snippets.

@SebastianJarsve
Last active October 28, 2024 15:09
Show Gist options
  • Select an option

  • Save SebastianJarsve/5305895 to your computer and use it in GitHub Desktop.

Select an option

Save SebastianJarsve/5305895 to your computer and use it in GitHub Desktop.

Revisions

  1. SebastianJarsve revised this gist Aug 17, 2014. 1 changed file with 33 additions and 31 deletions.
    64 changes: 33 additions & 31 deletions Breakout_Clone.py
    Original file line number Diff line number Diff line change
    @@ -1,9 +1,11 @@
    # -*- coding: utf-8 -*-
    # Created by Sebastian Jarsve
    # 9. April 2013

    from scene import *
    from sound import play_effect
    from random import randint

    screen_size = Size(768, 1004)

    def centered_rect(x, y, w, h):
    return Rect(x-w/2, y-h/2, w, h)

    @@ -21,7 +23,7 @@ def draw(self):
    stroke(1,1,1)
    for l in self.lines:
    line(*l)


    class Player(object):
    def __init__(self):
    @@ -68,9 +70,9 @@ def collide_with_block(self, block):
    self.vy = -abs(self.vy)
    return True

    def update(self):
    self.rect.x += self.vx
    self.rect.y += self.vy
    def update(self, dt):
    self.rect.x += self.vx + dt*10
    self.rect.y += self.vy + dt*10
    if self.rect.right() >= screen_size.w:
    self.rect.x = screen_size.w - self.rect.w
    self.vx *= -1
    @@ -105,10 +107,10 @@ def __init__(self, x, y, w, mode=1):
    right = self.rect.right()
    bottom = self.rect.bottom()

    self.left = Rect(left-5, bottom, 5, 30)
    self.right = Rect(right, bottom, 5, 30)
    self.bottom = Rect(left, bottom, 60, 5)
    self.top = Rect(left, top-5, 60, 5)
    self.left = Rect(left-5, bottom+5, 5, top-bottom-10)
    self.right = Rect(right, bottom+5, 5, top-bottom-10)
    self.bottom = Rect(left, bottom, right-left, 5)
    self.top = Rect(left, top-5, right-left, 5)

    def draw_sides(self):
    fill(0,1,0)
    @@ -134,13 +136,11 @@ def random_level(n=7, t=13):
    return level

    level = [
    [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]],
    [[1, 1, 1],
    [1, 1, 1],
    [1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]],

    [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
    @@ -164,6 +164,15 @@ def random_level(n=7, t=13):
    [1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]],

    [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 2, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]],

    [[1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1],
    [2, 2, 2, 0, 0, 2, 2, 2]],

    random_level()
    ]

    @@ -206,7 +215,7 @@ def draw(self):

    self.ball.draw()
    if self.ball.is_moving:
    self.ball.update()
    self.ball.update(self.dt)
    self.ball.collide_with_paddle(self.player)
    else:
    self.ball.rect.center(self.player.rect.center().x, self.player.rect.top()+10)
    @@ -225,7 +234,8 @@ def draw(self):
    for solid_block in self.solid_blocks:
    solid_block.draw()
    if self.ball.is_moving:
    self.ball.collide_with_block(solid_block)
    if self.ball.collide_with_block(solid_block):
    play_effect('Ding_1')

    for removed_block in removed_blocks:
    self.blocks.remove(removed_block)
    @@ -261,32 +271,26 @@ def draw(self):
    self.button.draw()
    no_tint()
    text('Game Over', x=screen_size.w/2, y=screen_size.h/4*3, font_size=64)

    def touch_began(self, touch):
    if touch.location in self.button.frame:
    self.button.touch_began(touch)
    def touch_moved(self, touch):
    self.button.touch_moved(touch)
    def touch_ended(self, touch):
    self.button.touch_ended(touch)


    class MultiScene(Scene):
    def __init__(self, start_scene):
    self.active_scene = start_scene
    run(self, PORTRAIT)
    def switch_scene(self, new_scene):
    self.active_scene = new_scene
    self.setup()
    def setup(self):
    global screen_size
    screen_size = self.size
    self.active_scene.root_layer = self.root_layer
    self.active_scene.add_layer = self.add_layer
    self.active_scene.size = self.size
    self.active_scene.bounds = self.bounds
    self.active_scene.setup()
    def draw(self):
    background(0.00, 0.25, 0.50)
    self.active_scene.touches = self.touches
    self.active_scene.dt = self.dt
    self.active_scene.draw()
    def touch_began(self, touch):
    self.active_scene.touch_began(touch)
    @@ -295,6 +299,4 @@ def touch_moved(self, touch):
    def touch_ended(self, touch):
    self.active_scene.touch_ended(touch)

    main_scene = MultiScene(Game())

    run(main_scene, PORTRAIT)
    main_scene = MultiScene(Game())
  2. SebastianJarsve created this gist Apr 3, 2013.
    300 changes: 300 additions & 0 deletions Breakout_Clone.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,300 @@
    from scene import *
    from sound import play_effect
    from random import randint

    screen_size = Size(768, 1004)

    def centered_rect(x, y, w, h):
    return Rect(x-w/2, y-h/2, w, h)

    class Field(object):
    def __init__(self):
    size = screen_size
    left = 0
    bottom = 0
    right = screen_size.w
    top = screen_size.h
    self.lines = [(left, bottom, left, top), (left, top, right, top), (right, top, right, bottom)]

    def draw(self):
    stroke_weight(4)
    stroke(1,1,1)
    for l in self.lines:
    line(*l)


    class Player(object):
    def __init__(self):
    self.rect = centered_rect(screen_size.w/2, 50, 100, 20)
    self.lives = 3

    def update(self):
    self.rect.x += gravity().x * 50
    self.rect.x = min(screen_size.w - 100, max(0, self.rect.x))

    def draw(self):
    fill(1,1,1)
    rect(*self.rect)


    class Ball(object):
    def __init__(self):
    self.rect = centered_rect(screen_size.w/2, 60, 20, 20)
    self.vx = randint(-6, 6)
    self.vy = 7
    self.is_moving = False

    def collide_with_paddle(self, paddle):
    if self.rect.intersects(paddle.rect):
    self.rect.y = paddle.rect.top()
    self.vy *= -1
    pos = self.rect.center().x - paddle.rect.center().x
    self.vx = pos/10
    play_effect('Jump_3')

    def collide_with_block(self, block):
    if self.rect.intersects(block.rect):
    if self.rect.intersects(block.left):
    self.rect.x = block.rect.left()-self.rect.w
    self.vx = -abs(self.vx)
    elif self.rect.intersects(block.right):
    self.rect.x = block.rect.right()
    self.vx = abs(self.vx)
    elif self.rect.intersects(block.top):
    self.rect.y = block.rect.top()
    self.vy = abs(self.vy)
    elif self.rect.intersects(block.bottom):
    self.rect.y = block.rect.bottom()-self.rect.h
    self.vy = -abs(self.vy)
    return True

    def update(self):
    self.rect.x += self.vx
    self.rect.y += self.vy
    if self.rect.right() >= screen_size.w:
    self.rect.x = screen_size.w - self.rect.w
    self.vx *= -1
    play_effect('Jump_5')
    if self.rect.left() <= 0:
    self.rect.x = 0
    self.vx *= -1
    play_effect('Jump_5')
    if self.rect.top() >= screen_size.h:
    self.rect.y = screen_size.h - self.rect.w
    self.vy *= -1
    play_effect('Jump_5')

    def draw(self):
    fill(1,1,0)
    no_stroke()
    ellipse(*self.rect)


    class Block(object):
    def __init__(self, x, y, w, mode=1):
    self.size = Size(w, 30)
    self.rect = Rect(x, y, *self.size)
    self.mode = mode
    if self.mode > 1:
    self.colour = (0.70, 0.70, 0.70)
    else:
    self.colour = (1,0,0)

    top = self.rect.top()
    left = self.rect.left()
    right = self.rect.right()
    bottom = self.rect.bottom()

    self.left = Rect(left-5, bottom, 5, 30)
    self.right = Rect(right, bottom, 5, 30)
    self.bottom = Rect(left, bottom, 60, 5)
    self.top = Rect(left, top-5, 60, 5)

    def draw_sides(self):
    fill(0,1,0)
    rect(*self.left)
    rect(*self.right)
    rect(*self.top)
    rect(*self.bottom)

    def draw(self):
    stroke_weight(1)
    #no_stroke()
    fill(*self.colour)
    rect(*self.rect)
    #self.draw_sides()


    def random_level(n=7, t=13):
    level = []
    for i in range(n):
    level.append([])
    for j in range(t):
    level[i].append(randint(0, 1))
    return level

    level = [
    [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]],

    [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
    [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
    [0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]],

    [[0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
    [0, 1, 1, 0, 0, 0, 0, 1, 1, 0],
    [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
    [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
    [0, 1, 1, 0, 0, 0, 0, 1, 1, 0],
    [0, 0, 1, 1, 1, 1, 1, 1, 0, 0]],

    [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1],
    [1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1],
    [1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1],
    [1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]],

    random_level()
    ]

    class Game(Scene):
    def setup(self):
    self.level = 1
    self.field = Field()
    self.player = Player()
    self.ball = Ball()
    self.blocks = []
    self.spawn_blocks()

    def spawn_blocks(self):
    self.solid_blocks = []
    if self.level > len(level):
    lvl = len(level)-1
    else:
    lvl = self.level-1
    for y in range(len(level[lvl])):
    for x in range(len(level[lvl][y])):
    w = screen_size.w/len(level[lvl][y])
    mode = level[lvl][y][x]
    if level[lvl][y][x] == 1:
    self.blocks.append(Block(x * w, screen_size.h - (y*30+90),
    w, mode))
    elif level[lvl][y][x] == 2:
    self.solid_blocks.append(Block(x * w, screen_size.h - (y*30+90),
    w, mode))

    def draw(self):
    removed_blocks = set()

    text('Lives: {0}'.format(self.player.lives), x=screen_size.w-45, y=screen_size.h-40)
    text('Level: {0}'.format(self.level), x=45, y=screen_size.h-45)

    self.field.draw()

    self.player.draw()
    self.player.update()

    self.ball.draw()
    if self.ball.is_moving:
    self.ball.update()
    self.ball.collide_with_paddle(self.player)
    else:
    self.ball.rect.center(self.player.rect.center().x, self.player.rect.top()+10)
    self.ball.line = (0, 0, 0, 0)
    if self.ball.rect.top() < 0:
    self.player.lives -= 1
    self.ball.is_moving = False

    for block in self.blocks:
    block.draw()
    if self.ball.is_moving:
    if self.ball.collide_with_block(block):
    removed_blocks.add(block)
    play_effect('Hit_3')

    for solid_block in self.solid_blocks:
    solid_block.draw()
    if self.ball.is_moving:
    self.ball.collide_with_block(solid_block)

    for removed_block in removed_blocks:
    self.blocks.remove(removed_block)

    if len(self.blocks) == 0:
    self.ball.is_moving = False
    self.level += 1
    self.spawn_blocks()
    if self.level >= len(level):
    level[-1] = random_level()
    self.spawn_blocks()

    if self.player.lives == 0:
    main_scene.switch_scene(GameOver())

    def touch_began(self, touch):
    if not self.ball.is_moving:
    self.ball.is_moving = True


    class GameOver(Scene):
    def setup(self):
    self.field = Field()
    self.button = Button(Rect(screen_size.w/2-100, screen_size.h/2-50, 200, 100), 'Restart')
    self.button.action = self.restart
    self.add_layer(self.button)

    def restart(self):
    main_scene.switch_scene(Game())

    def draw(self):
    self.field.draw()
    self.button.draw()
    no_tint()
    text('Game Over', x=screen_size.w/2, y=screen_size.h/4*3, font_size=64)

    def touch_began(self, touch):
    if touch.location in self.button.frame:
    self.button.touch_began(touch)
    def touch_moved(self, touch):
    self.button.touch_moved(touch)
    def touch_ended(self, touch):
    self.button.touch_ended(touch)


    class MultiScene(Scene):
    def __init__(self, start_scene):
    self.active_scene = start_scene
    def switch_scene(self, new_scene):
    self.active_scene = new_scene
    self.setup()
    def setup(self):
    global screen_size
    screen_size = self.size
    self.active_scene.root_layer = self.root_layer
    self.active_scene.size = self.size
    self.active_scene.bounds = self.bounds
    self.active_scene.setup()
    def draw(self):
    background(0.00, 0.25, 0.50)
    self.active_scene.touches = self.touches
    self.active_scene.draw()
    def touch_began(self, touch):
    self.active_scene.touch_began(touch)
    def touch_moved(self, touch):
    self.active_scene.touch_moved(touch)
    def touch_ended(self, touch):
    self.active_scene.touch_ended(touch)

    main_scene = MultiScene(Game())

    run(main_scene, PORTRAIT)