Example #1
0
 def __init__(self, app, *args, **kwargs):
     super(ScreenNine, self).__init__(*args, **kwargs)
     self.app = app
     self.win_popup = WinPopup(app, "You have played all the stages", "Taking you to menu screen", "menu")
     self.lose_popup = LosePopup(app, "Sorry you lost the game", "Try again", "nine")
     self.box_size = [Window.size[0] / 16., Window.size[1] / 10.]
     self.init_physics()
     self.keyboard = Window.request_keyboard(self.keyboard_closed, self, 'text')
     self.keyboard.bind(on_key_down=self.on_keyboard_down)
     self.keyboard.bind(on_key_up=self.on_keyboard_up)
     Clock.schedule_interval(self.step, 1/FRAMES)
     #Adding the lines
     for i in xrange(16):
         with self.canvas:
             Color(0, 0, 0, 0.3)
             Line(points=[self.box_size[0]*i, 0, self.box_size[0]*i, Window.size[1]], width=0.3)
     for i in xrange(10):
         with self.canvas:
             Line(points=[0, self.box_size[1]*i, Window.size[0], self.box_size[1]*i], width=0.3)
     #Adding back and forward buttons
     back_button = Button(text="<", pos=[Window.size[0]*0.025, Window.size[1]*0.925], size_hint = [0.05, 0.05])
     back_button.bind(on_press=self.back_btn_pressed)
     #forward_button = Button(text=">", pos=[Window.size[0]*0.925, Window.size[1]*0.925], size_hint = [0.05, 0.05])
     #forward_button.bind(on_press=self.forward_btn_pressed)
     self.add_widget(back_button)
Example #2
0
 def __init__(self, app, *args, **kwargs):
     super(ScreenEight, self).__init__(*args, **kwargs)
     self.app = app
     quiz = "X O X X X X X X X X X X X X\n"
     for i in xrange(7):
         quiz += "X X X X X X X X X X X X X X\n"
     self.win_popup = WinPopup(app, "You won the game", quiz, "nine")
     self.lose_popup = LosePopup(app, "Sorry you lost the game", "Try again", "eight")
     self.box_size = [Window.size[0] / 16.0, Window.size[1] / 10.0]
     self.init_physics()
     self.keyboard = Window.request_keyboard(self.keyboard_closed, self, "text")
     self.keyboard.bind(on_key_down=self.on_keyboard_down)
     self.keyboard.bind(on_key_up=self.on_keyboard_up)
     Clock.schedule_interval(self.step, 1 / FRAMES)
     # Adding the lines
     for i in xrange(16):
         with self.canvas:
             Color(0, 0, 0, 0.3)
             Line(points=[self.box_size[0] * i, 0, self.box_size[0] * i, Window.size[1]], width=0.3)
     for i in xrange(10):
         with self.canvas:
             Line(points=[0, self.box_size[1] * i, Window.size[0], self.box_size[1] * i], width=0.3)
     # Adding back and forward buttons
     back_button = Button(text="<", pos=[Window.size[0] * 0.025, Window.size[1] * 0.925], size_hint=[0.05, 0.05])
     back_button.bind(on_press=self.back_btn_pressed)
     forward_button = Button(text=">", pos=[Window.size[0] * 0.925, Window.size[1] * 0.925], size_hint=[0.05, 0.05])
     forward_button.bind(on_press=self.forward_btn_pressed)
     self.add_widget(back_button)
     self.add_widget(forward_button)
Example #3
0
 def __init__(self, app, *args, **kwargs):
     super(ScreenThree, self).__init__(*args, **kwargs)
     self.app = app
     self.win_popup = WinPopup(app, "You won the game", "Green = Good\nRed = Bad", "four")
     self.win_popup.bind(on_dismiss=self.on_pre_leave)
     self.box_size = [Window.size[0] / 16., Window.size[1] / 10.]
     self.init_physics()
     if not self.app.is_touch:
         self.keyboard = Window.request_keyboard(self.keyboard_closed, self, 'text')
         self.keyboard.bind(on_key_down=self.on_keyboard_down)
         self.keyboard.bind(on_key_up=self.on_keyboard_up)
     Clock.schedule_interval(self.step, 1/FRAMES)
     #Adding the lines
     for i in xrange(16):
         with self.canvas:
             Color(0, 0, 0, 0.3)
             Line(points=[self.box_size[0]*i, 0, self.box_size[0]*i, Window.size[1]], width=0.3)
     for i in xrange(10):
         with self.canvas:
             Line(points=[0, self.box_size[1]*i, Window.size[0], self.box_size[1]*i], width=0.3)
     #Adding back and forward buttons
     back_button = Button(text="<", pos=[Window.size[0]*0.025, Window.size[1]*0.925], size_hint = [0.05, 0.05])
     back_button.bind(on_press=self.back_btn_pressed)
     forward_button = Button(text=">", pos=[Window.size[0]*0.925, Window.size[1]*0.925], size_hint = [0.05, 0.05])
     forward_button.bind(on_press=self.forward_btn_pressed)
     self.add_widget(back_button)
     self.add_widget(forward_button)
Example #4
0
class ScreenNine(Screen):
    space = ObjectProperty()
    balls = ListProperty()
    real_balls = ListProperty()
    walls = ListProperty()
    up = BooleanProperty(0)
    left = BooleanProperty(0)
    right = BooleanProperty(0)
    down = BooleanProperty(0)
    fake = BooleanProperty(0)
    win_objects = ListProperty()
    danger_objects = ListProperty()
    drag_circle_objects = ListProperty()
    danger_circle_objects = ListProperty()
    real_drag_circle_objects = ListProperty()
    real_danger_circle_objects = ListProperty()
    real_door_objects = ListProperty()
    fake_door_objects = ListProperty()
    dark_objects = ListProperty()
    door_objects = ListProperty()
    win_popup = ObjectProperty()
    lose_popup = ObjectProperty()
    counter = NumericProperty(0)

    def __init__(self, app, *args, **kwargs):
        super(ScreenNine, self).__init__(*args, **kwargs)
        self.app = app
        self.win_popup = WinPopup(app, "You have played all the stages", "Taking you to menu screen", "menu")
        self.lose_popup = LosePopup(app, "Sorry you lost the game", "Try again", "nine")
        self.box_size = [Window.size[0] / 16., Window.size[1] / 10.]
        self.init_physics()
        self.keyboard = Window.request_keyboard(self.keyboard_closed, self, 'text')
        self.keyboard.bind(on_key_down=self.on_keyboard_down)
        self.keyboard.bind(on_key_up=self.on_keyboard_up)
        Clock.schedule_interval(self.step, 1/FRAMES)
        #Adding the lines
        for i in xrange(16):
            with self.canvas:
                Color(0, 0, 0, 0.3)
                Line(points=[self.box_size[0]*i, 0, self.box_size[0]*i, Window.size[1]], width=0.3)
        for i in xrange(10):
            with self.canvas:
                Line(points=[0, self.box_size[1]*i, Window.size[0], self.box_size[1]*i], width=0.3)
        #Adding back and forward buttons
        back_button = Button(text="<", pos=[Window.size[0]*0.025, Window.size[1]*0.925], size_hint = [0.05, 0.05])
        back_button.bind(on_press=self.back_btn_pressed)
        #forward_button = Button(text=">", pos=[Window.size[0]*0.925, Window.size[1]*0.925], size_hint = [0.05, 0.05])
        #forward_button.bind(on_press=self.forward_btn_pressed)
        self.add_widget(back_button)
        #self.add_widget(forward_button)

    def back_btn_pressed(self, *args):
        self.app.switch_screen("eight")

    def forward_btn_pressed(self, *args):
        self.app.switch_screen("ten")

    def on_keyboard_down(self, keyboard, keycode, text, modifiers):
        direction = keycode[1]
        if direction == "left" or direction == "a":
            self.left = True
        if direction == "right" or direction == "d":
            self.right = True
        if direction == "up" or direction == "w":
            self.up = True
        if direction == "down" or direction == "s":
            self.down = True

    def on_keyboard_up(self, keyboard, keycode, *args):
        direction = keycode[1]
        if direction == "left" or direction == "a":
            self.left = False
        if direction == "right" or direction == "d":
            self.right = False
        if direction == "up" or direction == "w":
            self.up = False
        if direction == "down" or direction == "s":
            self.down = False


    def keyboard_closed(self):
        self.keyboard.unbind(on_key_down=self.on_keyboard_down)

    def init_physics(self):
        self.space = cy.Space()
        self.arbiter = cy.Arbiter(self.space)
        self.space.damping = 0.005
        self.space.collision_slop = 0
        for i in xrange(16):
            self.walls.append([i,0])
            self.walls.append([i,9])
        for i in xrange(1,9):
            self.walls.append([0,i])
            self.walls.append([15,i])
        """
        for i in xrange(1, 11):
            self.fake_door_objects.append((i, 7))
        self.real_door_objects.append((11, 7))
        for i in xrange(12, 15):
            self.fake_door_objects.append((i, 7))
        """
        #self.danger_circle_objects = [(14, 1)]
        """
        self.walls.append((3, 3))
        self.walls.append((14, 6))
        self.walls.append((5, 3))
        """
        self.balls = [(1, 1)]
        self.dark_objects = [(2, 8)]
        #self.danger_objects = [(1, 8), (2, 6), (1, 4), (2, 2), (2, 8), (3, 8), (4, 8), (5, 8), (6, 8), (7, 8), (8, 8), (9, 8), (10, 8), (11, 8), (12, 8), (5, 1), (5, 2), (5, 4), (5, 5), (5, 6), (7, 2), (8, 2), (6, 4), (7, 4), (7, 6), (8, 6), (9, 2), (10, 2), (11, 2), (13, 2), (14, 2), (9, 4), (10, 4), (11, 4), (12, 4), (14, 4), (3, 6), (10, 6), (12, 6), (3, 1), (3, 2), (3, 4), (3, 5), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (9, 3), (10, 3), (9, 1), (10, 1), (11, 1), (4, 6), (9, 6)]
        self.add_balls()
        self.add_walls()
        self.add_win_objects()
        self.add_danger_objects()
        self.add_drag_circle_objects()
        self.add_danger_circle_objects()
        self.add_fake_door_objects()
        self.add_real_door_objects()
        self.add_dark_objects()
        self.space.add_collision_handler(1, 9, begin = self.collision_with_end)
        self.space.add_collision_handler(1, 4, begin = self.collision_with_danger)

    def collision_with_end(self, space, arbiter, *args, **kwargs):
        self.win_popup.open()
        self.on_pre_leave()
        return True

    def collision_with_danger(self, space, arbiter, *args, **kwargs):
        self.lose_popup.open()
        self.on_pre_leave()
        return True

    def add_balls(self):
        radius = min(self.box_size[0], self.box_size[1]) * 0.3
        for x,y in self.balls:
            pos = (x * self.box_size[0]) + (radius * 1.1), (y * self.box_size[1]) + (radius * 1.1)
            ball = GlowCircleObject(pos, radius, self.space)
            self.add_widget(ball)
            self.real_balls.append(ball)

    def add_danger_circle_objects(self):
        for x, y in self.danger_circle_objects:
            radius = min(self.box_size[0], self.box_size[1]) * 0.3
            pos = (x * self.box_size[0]) + (radius * 1.1), (y * self.box_size[1]) + (radius * 1.1)
            danger_ball = DangerCircleObject(pos, radius, self.space)
            self.add_widget(danger_ball)
            self.real_danger_circle_objects.append(danger_ball)

    def add_drag_circle_objects(self):
        for x, y in self.drag_circle_objects:
            radius = min(self.box_size[0], self.box_size[1]) * 0.3
            pos = (x * self.box_size[0]) + (radius * 1.1), (y * self.box_size[1]) + (radius * 1.1)
            drag_ball = DragCircleObject(pos, radius, self.space)
            self.add_widget(drag_ball)
            self.real_drag_circle_objects.append(drag_ball)

    def add_walls(self):
        for x,y in self.walls:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            wall = WallObject(pos, size, self.space)
            self.add_widget(wall)

    def add_fake_door_objects(self):
        for x,y in self.fake_door_objects:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            door = FakeDoorObject(pos, size, self.space)
            self.add_widget(door)

    def add_real_door_objects(self):
        for x,y in self.real_door_objects:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            door = RealDoorObject(pos, size, self.space)
            self.add_widget(door)

    def add_win_objects(self):
        for x, y in self.win_objects:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            win = WinObject(pos, size, self.space)
            self.add_widget(win)

    def add_dark_objects(self):
        for x, y in self.dark_objects:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            dark = DarkObject(pos, size, self.space)
            self.add_widget(dark)

    def add_danger_objects(self):
        for x, y in self.danger_objects:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            danger = DangerObject(pos, size, self.space)
            self.add_widget(danger)

    def step(self, *args):
        self.space.step(1/FRAMES)
        imp = 50
        if self.left:
            for item in self.real_balls:
                item.cy_body.apply_impulse([-1 * imp, 0])
        if self.right:
            for item in self.real_balls:
                item.cy_body.apply_impulse([1 * imp, 0])
        if self.up:
            for item in self.real_balls:
                item.cy_body.apply_impulse([0, 1 * imp])
        if self.down:
            for item in self.real_balls:
                item.cy_body.apply_impulse([0, -1 * imp])
        self.update_objects()
    
    def update_objects(self):
        for item in self.real_balls: 
            item.update()
        for item in self.real_drag_circle_objects:
            item.update()
        for item in self.real_danger_circle_objects:
            item.update()

    def on_pre_leave(self, *args):
        Clock.unschedule(self.step)
        self.keyboard_closed()
Example #5
0
class ScreenSix(Screen):
    space = ObjectProperty()
    ball = ObjectProperty()
    walls = ListProperty()
    up = BooleanProperty(0)
    left = BooleanProperty(0)
    right = BooleanProperty(0)
    down = BooleanProperty(0)
    win_objects = ListProperty()
    danger_objects = ListProperty()
    drag_circle_objects = ListProperty()
    danger_circle_objects = ListProperty()
    real_drag_circle_objects = ListProperty()
    real_danger_circle_objects = ListProperty()
    win_popup = ObjectProperty()
    lose_popup = ObjectProperty()
    counter = NumericProperty(0)

    def __init__(self, app, *args, **kwargs):
        super(ScreenSix, self).__init__(*args, **kwargs)
        self.app = app
        self.win_popup = WinPopup(app, "You won the game", "143%22", "seven")
        self.win_popup.bind(on_dismiss=self.on_pre_leave)
        self.lose_popup = LosePopup(app, "Sorry you lost the game", "Try again", "six")
        self.box_size = [Window.size[0] / 16., Window.size[1] / 10.]
        self.lose_popup.bind(on_dismiss=self.on_pre_leave)
        self.init_physics()
        self.keyboard = Window.request_keyboard(self.keyboard_closed, self, 'text')
        self.keyboard.bind(on_key_down=self.on_keyboard_down)
        self.keyboard.bind(on_key_up=self.on_keyboard_up)
        Clock.schedule_interval(self.step, 1/FRAMES)
        #Adding the lines
        for i in xrange(16):
            with self.canvas:
                Color(0, 0, 0, 0.3)
                Line(points=[self.box_size[0]*i, 0, self.box_size[0]*i, Window.size[1]], width=0.3)
        for i in xrange(10):
            with self.canvas:
                Line(points=[0, self.box_size[1]*i, Window.size[0], self.box_size[1]*i], width=0.3)
        #Adding back and forward buttons
        back_button = Button(text="<", pos=[Window.size[0]*0.025, Window.size[1]*0.925], size_hint = [0.05, 0.05])
        back_button.bind(on_press=self.back_btn_pressed)
        forward_button = Button(text=">", pos=[Window.size[0]*0.925, Window.size[1]*0.925], size_hint = [0.05, 0.05])
        forward_button.bind(on_press=self.forward_btn_pressed)
        self.add_widget(back_button)
        self.add_widget(forward_button)

    def back_btn_pressed(self, *args):
        self.app.switch_screen("five")

    def forward_btn_pressed(self, *args):
        self.app.switch_screen("seven")

    def on_keyboard_down(self, keyboard, keycode, text, modifiers):
        direction = keycode[1]
        if direction == "left" or direction == "a":
            self.left = True
        if direction == "right" or direction == "d":
            self.right = True
        if direction == "up" or direction == "w":
            self.up = True
        if direction == "down" or direction == "s":
            self.down = True

    def on_keyboard_up(self, keyboard, keycode, *args):
        direction = keycode[1]
        if direction == "left" or direction == "a":
            self.left = False
        if direction == "right" or direction == "d":
            self.right = False
        if direction == "up" or direction == "w":
            self.up = False
        if direction == "down" or direction == "s":
            self.down = False


    def keyboard_closed(self):
        self.keyboard.unbind(on_key_down=self.on_keyboard_down)

    def init_physics(self):
        self.space = cy.Space()
        self.arbiter = cy.Arbiter(self.space)
        self.space.damping = 0.005
        self.space.collision_slop = 0
        for i in xrange(16):
            self.walls.append([i,0])
            self.walls.append([i,9])
        for i in xrange(1,9):
            self.walls.append([0,i])
            self.walls.append([15,i])
        self.walls.append((12, 2))
        self.walls.append((12, 3))
        self.walls.append((12, 4))
        self.walls.append((12, 5))
        self.walls.append((12, 6))
        self.walls.append((12, 7))
        self.walls.append((12, 8))
        self.win_objects.append([14, 8])
        self.danger_circle_objects = [(14, 1), (14, 2), (14, 3), (14, 4), (14, 5), (10, 6), (10, 7), (13, 1), (13, 2), (13, 3), (13, 4), (13, 5), (11, 6), (11, 7), (11, 8), (8, 6), (8, 7), (8, 8), (5, 6), (4, 6), (5, 8)]
        """
        for i in xrange(2, 16, 2):
            for j in xrange(1, 8):
                if i%4:
                    self.danger_objects.append((i, j))
                else:
                    self.danger_objects.append((i, j+1))
        """
        self.add_ball()
        self.add_walls()
        self.add_win_objects()
        self.add_danger_objects()
        self.add_drag_circle_objects()
        self.add_danger_circle_objects()
        self.space.add_collision_handler(1, 3, begin = self.collision_with_end)
        self.space.add_collision_handler(1, 6, begin = self.collision_with_danger)

    def collision_with_end(self, space, arbiter, *args, **kwargs):
        Clock.unschedule(self.step)
        self.on_pre_leave()
        self.win_popup.open()
        return True

    def collision_with_danger(self, space, arbiter, *args, **kwargs):
        Clock.unschedule(self.step)
        self.lose_popup.open()
        self.on_pre_leave()
        return True

    def add_ball(self):
        radius = min(self.box_size[0], self.box_size[1]) * 0.3
        pos = self.box_size[0] + (radius * 1.1), self.box_size[1] + (radius * 1.1)
        self.ball = CircleObject(pos, radius, self.space)
        self.add_widget(self.ball)

    def add_danger_circle_objects(self):
        for x, y in self.danger_circle_objects:
            radius = min(self.box_size[0], self.box_size[1]) * 0.3
            pos = (x * self.box_size[0]) + (radius * 1.1), (y * self.box_size[1]) + (radius * 1.1)
            danger_ball = DangerCircleObject(pos, radius, self.space)
            self.add_widget(danger_ball)
            self.real_danger_circle_objects.append(danger_ball)

    def add_drag_circle_objects(self):
        for x, y in self.drag_circle_objects:
            radius = min(self.box_size[0], self.box_size[1]) * 0.3
            pos = (x * self.box_size[0]) + (radius * 1.1), (y * self.box_size[1]) + (radius * 1.1)
            drag_ball = DragCircleObject(pos, radius, self.space)
            self.add_widget(drag_ball)
            self.real_drag_circle_objects.append(drag_ball)

    def add_walls(self):
        for x,y in self.walls:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            wall = WallObject(pos, size, self.space)
            self.add_widget(wall)

    def add_win_objects(self):
        for x, y in self.win_objects:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            win = WinObject(pos, size, self.space)
            self.add_widget(win)

    def add_danger_objects(self):
        for x, y in self.danger_objects:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            danger = DangerObject(pos, size, self.space)
            self.add_widget(danger)

    def step(self, *args):
        self.space.step(1/FRAMES)
        imp = 50
        if self.left:
            self.ball.cy_body.apply_impulse([-1 * imp, 0])
        if self.right:
            self.ball.cy_body.apply_impulse([1 * imp, 0])
        if self.up:
            self.ball.cy_body.apply_impulse([0, 1 * imp])
        if self.down:
            self.ball.cy_body.apply_impulse([0, -1 * imp])
        for item in self.real_danger_circle_objects:
            pos_y = self.ball.pos[1] - item.pos[1]
            pos_x = self.ball.pos[0] - item.pos[0]
            tan_inv = math.atan2(pos_y, pos_x)
            temp_imp = imp * math.cos(tan_inv) * 0.9, imp * math.sin(tan_inv) * 0.9
            item.cy_body.apply_impulse(temp_imp)
        self.update_objects()
    
    def update_objects(self):
        self.ball.update()
        for item in self.real_drag_circle_objects:
            item.update()
        for item in self.real_danger_circle_objects:
            item.update()

    def on_pre_leave(self, *args):
        Clock.unschedule(self.step)
        self.keyboard_closed()
Example #6
0
class ScreenThree(Screen):
    space = ObjectProperty()
    ball = ObjectProperty()
    walls = ListProperty()
    up = BooleanProperty(0)
    left = BooleanProperty(0)
    right = BooleanProperty(0)
    down = BooleanProperty(0)
    win_objects = ListProperty()
    win_popup = ObjectProperty()
    score_label = ObjectProperty()



    def __init__(self, app, *args, **kwargs):
        super(ScreenThree, self).__init__(*args, **kwargs)
        self.app = app
        self.win_popup = WinPopup(app, "You won the game", "Green = Good\nRed = Bad", "four")
        self.win_popup.bind(on_dismiss=self.on_pre_leave)
        self.box_size = [Window.size[0] / 16., Window.size[1] / 10.]
        self.init_physics()
        if not self.app.is_touch:
            self.keyboard = Window.request_keyboard(self.keyboard_closed, self, 'text')
            self.keyboard.bind(on_key_down=self.on_keyboard_down)
            self.keyboard.bind(on_key_up=self.on_keyboard_up)
        Clock.schedule_interval(self.step, 1/FRAMES)
        #Adding the lines
        for i in xrange(16):
            with self.canvas:
                Color(0, 0, 0, 0.3)
                Line(points=[self.box_size[0]*i, 0, self.box_size[0]*i, Window.size[1]], width=0.3)
        for i in xrange(10):
            with self.canvas:
                Line(points=[0, self.box_size[1]*i, Window.size[0], self.box_size[1]*i], width=0.3)
        #Adding back and forward buttons
        back_button = Button(text="<", pos=[Window.size[0]*0.025, Window.size[1]*0.925], size_hint = [0.05, 0.05])
        back_button.bind(on_press=self.back_btn_pressed)
        forward_button = Button(text=">", pos=[Window.size[0]*0.925, Window.size[1]*0.925], size_hint = [0.05, 0.05])
        forward_button.bind(on_press=self.forward_btn_pressed)
        self.add_widget(back_button)
        self.add_widget(forward_button)

    def back_btn_pressed(self, *args):
        self.on_pre_leave()
        self.app.switch_screen("two")

    def forward_btn_pressed(self, *args):
        self.on_pre_leave()
        self.app.switch_screen("four")


    def on_keyboard_down(self, keyboard, keycode, text, modifiers):
        direction = keycode[1]
        if direction == "left" or direction == "a":
            self.left = True
        if direction == "right" or direction == "d":
            self.right = True
        if direction == "up" or direction == "w":
            self.up = True
        if direction == "down" or direction == "s":
            self.down = True

    def on_keyboard_up(self, keyboard, keycode, *args):
        direction = keycode[1]
        if direction == "left" or direction == "a":
            self.left = False
        if direction == "right" or direction == "d":
            self.right = False
        if direction == "up" or direction == "w":
            self.up = False
        if direction == "down" or direction == "s":
            self.down = False


    def keyboard_closed(self):
        if not self.app.is_touch:
            self.keyboard.unbind(on_key_down=self.on_keyboard_down)

    def init_physics(self):
        self.space = cy.Space()
        self.arbiter = cy.Arbiter(self.space)
        self.space.damping = 0.005
        self.space.collision_slop = 0
        for i in xrange(16):
            self.walls.append([i,0])
            self.walls.append([i,9])
        for i in xrange(1,9):
            self.walls.append([0,i])
            self.walls.append([15,i])
        self.win_objects.append([14, 8])
        self.add_ball()
        self.add_walls()
        self.add_win_objects()
        self.score_label = ScoreLabel(self.app)
        self.add_widget(self.score_label)
        self.space.add_collision_handler(1, 3, begin = self.collision_between_balls)

    def collision_between_balls(self, space, arbiter, *args, **kwargs):
        self.win_popup.open()
        self.on_pre_leave()
        return True


    def add_ball(self):
        radius = min(self.box_size[0], self.box_size[1]) * 0.3
        pos = self.box_size[0] + (radius * 1.1), self.box_size[1] + (radius * 1.1)
        self.ball = CircleObject(pos, radius, self.space)
        self.add_widget(self.ball)

    def add_walls(self):
        for x,y in self.walls:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            wall = WallObject(pos, size, self.space)
            self.add_widget(wall)

    def add_win_objects(self):
        for x, y in self.win_objects:
            pos = (x * self.box_size[0]) + (self.box_size[0]/2.), (y * self.box_size[1]) + (self.box_size[1]/2.)
            size = self.box_size[0], self.box_size[1]
            win = WinObject(pos, size, self.space)
            self.add_widget(win)


    def step(self, *args):
        self.space.step(1/FRAMES)
        imp = 50
        if self.left:
            self.ball.cy_body.apply_impulse([-1 * imp, 0])
        if self.right:
            self.ball.cy_body.apply_impulse([1 * imp, 0])
        if self.up:
            self.ball.cy_body.apply_impulse([0, 1 * imp])
        if self.down:
            self.ball.cy_body.apply_impulse([0, -1 * imp])
        self.update_objects()
    
    def update_objects(self):
        self.ball.update()

    def on_pre_leave(self, *args):
        Clock.unschedule(self.step)
        self.keyboard_closed()