def __init__(self, screen, event_manager, names, finish_cb): super(BoardPage, self).__init__(screen, CORNSILK, event_manager) def game_end_listener(winner): self.suspended = True self.score_board.update(winner) if not any(score == BoardPage.WINNING_SCORE for score in self.score_board.scores): event_manager.add_timer(1, self.reset) else: self.declare_winner() event_manager.add_timer(3, finish_cb) event_manager.add_game_end_listener(game_end_listener) event_manager.add_tick_listener(self.run) self.event_manager = event_manager self.paddle_1 = Paddle(30, RED, pygame.K_w, pygame.K_s, event_manager) self.paddle_2 = Paddle(1160, RED, pygame.K_UP, pygame.K_DOWN, event_manager) self.paddles = pygame.sprite.RenderUpdates() self.paddles.add(self.paddle_1, self.paddle_2) self.ball = Ball(RED, (self.paddle_1, self.paddle_2), event_manager) self.ball_group = pygame.sprite.RenderUpdates() self.ball_group.add(self.ball) self.suspended = True self.score_board = ScoreBoard(names, screen, event_manager)
def createWinBalls(self): for i in range(1, random.randint(2, 5)): ball = Ball(self, self.renderer, self.world, self.display, self.middle) picList = [Ball.pic, Mine.leftPic, Mine.rightPic, RedBall.pic, Tower.pic] + Ghost.pics.values() + Bonus.pics.values() ball.setPic(random.choice(picList)) self.balls.append(ball) if len(self.balls) <= 60: self.keepPushingBalls = g_player.setTimeout(1000, self.createWinBalls)
class BoardPage(Page): LINE_THICKNESS = 2 ARENA = ARENA WINNING_SCORE = 3 def __init__(self, screen, event_manager, names, finish_cb): super(BoardPage, self).__init__(screen, CORNSILK, event_manager) def game_end_listener(winner): self.suspended = True self.score_board.update(winner) if not any(score == BoardPage.WINNING_SCORE for score in self.score_board.scores): event_manager.add_timer(1, self.reset) else: self.declare_winner() event_manager.add_timer(3, finish_cb) event_manager.add_game_end_listener(game_end_listener) event_manager.add_tick_listener(self.run) self.event_manager = event_manager self.paddle_1 = Paddle(30, RED, pygame.K_w, pygame.K_s, event_manager) self.paddle_2 = Paddle(1160, RED, pygame.K_UP, pygame.K_DOWN, event_manager) self.paddles = pygame.sprite.RenderUpdates() self.paddles.add(self.paddle_1, self.paddle_2) self.ball = Ball(RED, (self.paddle_1, self.paddle_2), event_manager) self.ball_group = pygame.sprite.RenderUpdates() self.ball_group.add(self.ball) self.suspended = True self.score_board = ScoreBoard(names, screen, event_manager) def declare_winner(self): self.score_board.store_result() winner = 0 if self.score_board.scores[ 0] == BoardPage.WINNING_SCORE else 1 name = MEDLARGE.render(self.score_board.names[winner], True, BLACK) name_rect = name.get_rect() name_rect.center = (HALF_WIDTH, HALF_HEIGHT - 80) wins = MEDLARGE.render("Wins!!!", True, BLACK) wins_rect = wins.get_rect() wins_rect.center = (HALF_WIDTH, HALF_HEIGHT + 10) self.screen.blit(name, name_rect) self.screen.blit(wins, wins_rect) pygame.display.update((name_rect, wins_rect)) def display(self): super(BoardPage, self).display() self.score_board.render() self.reset(2) def start(self): self.suspended = False def reset(self, delay=0): self.screen.blit(ARENA, (0, 0)) self.paddle_1.reset() self.paddle_2.reset() self.ball.reset() self.paddles.clear(self.screen, ARENA) self.ball_group.clear(self.screen, ARENA) self.paddles.draw(self.screen) self.ball_group.draw(self.screen) pygame.display.flip() self.event_manager.add_timer(delay, self.start) def clean(self): super(BoardPage, self).clean() self.event_manager.remove_tick_listener(self.run) self.paddle_1.clean() self.paddle_2.clean() def run(self): if not self.suspended: self.paddles.clear(self.screen, ARENA) self.ball_group.clear(self.screen, ARENA) self.ball_group.update() pygame.display.update(self.paddles.draw(self.screen)) pygame.display.update(self.ball_group.draw(self.screen))
def __init__(self): if not glfw.init(): return glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 2) glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, GL_TRUE) window = glfw.create_window(self.WIDTH, self.HEIGHT, self.TITLE, None, None) glfw.set_window_size_limits(window, 320, 480, glfw.DONT_CARE, glfw.DONT_CARE) if not window: glfw.terminate() return glfw.make_context_current(window) glfw.set_key_callback(window, self.key_callback) glfw.set_window_size_callback(window, self.reshape) width, height = glfw.get_framebuffer_size(window) glViewport(0, 0, width, height) aspect_ratio = width / height glClearColor(0.2, 0.3, 0.2, 1.0) glEnable(GL_DEPTH_TEST) self.ball = Ball(TEXTILE_TEXTURE) ball_shader = Shader(BASE_VS, BASE_FS) self.ball.prep(ball_shader, aspect_ratio, 0.5, 85) self.platform = Platform(BUCKET_TEXTURE) shader = Shader(BASE_VS, BASE_FS) self.platform.prep(shader, aspect_ratio, 1.0, 85) self.hearts = [] for i in range(0, self.MAX_FAIL): heart = LiveHeart([-3.0 + i * 0.5, 5.5, 0.0]) heart_shader = Shader(HEART_VS, HEART_FS) heart.prep(heart_shader, aspect_ratio, 0.3, 85) self.hearts.append(heart) self.bg = Background(WOOD_TEXTURE) bg_shader = Shader(BASE_VS, BASE_FS) self.bg.prep(bg_shader, aspect_ratio, 11.0, 85) while not glfw.window_should_close(window): glClearColor(0.0, 0.3, 0.3, 1.0) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glDisable(GL_DEPTH_TEST) self.bg.draw() glEnable(GL_DEPTH_TEST) self.platform.draw(self.game_status_play) self.ball.draw(self.game_status_play) if self.collision_detect(): if self.fails == self.MAX_FAIL: self.game_status_play = False for heart in self.hearts: heart.draw() glfw.swap_buffers(window) glfw.poll_events() glfw.terminate()
class Window: TITLE = 'Catch the ball' WIDTH = 1280 HEIGHT = 720 MAX_FAIL = 5 game_status_play = True fails = 0 score = 0 def reshape(self, window): """Window size callback. Redraw game objects""" angle = 85 width, height = glfw.get_framebuffer_size(window) aspect_ratio = width / height self.ball.shader.use() self.ball.prep(self.ball.shader, aspect_ratio, 0.5, angle) self.platform.shader.use() self.platform.prep(self.platform.shader, aspect_ratio, 1.0, angle) for i in range(0, self.MAX_FAIL): self.hearts[i].shader.use() self.hearts[i].prep(self.hearts[i].shader, aspect_ratio, 0.3, angle) self.bg.shader.use() self.bg.prep(self.bg.shader, aspect_ratio, 11.0, angle) glViewport(0, 0, width, height) def __init__(self): if not glfw.init(): return glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 2) glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, GL_TRUE) window = glfw.create_window(self.WIDTH, self.HEIGHT, self.TITLE, None, None) glfw.set_window_size_limits(window, 320, 480, glfw.DONT_CARE, glfw.DONT_CARE) if not window: glfw.terminate() return glfw.make_context_current(window) glfw.set_key_callback(window, self.key_callback) glfw.set_window_size_callback(window, self.reshape) width, height = glfw.get_framebuffer_size(window) glViewport(0, 0, width, height) aspect_ratio = width / height glClearColor(0.2, 0.3, 0.2, 1.0) glEnable(GL_DEPTH_TEST) self.ball = Ball(TEXTILE_TEXTURE) ball_shader = Shader(BASE_VS, BASE_FS) self.ball.prep(ball_shader, aspect_ratio, 0.5, 85) self.platform = Platform(BUCKET_TEXTURE) shader = Shader(BASE_VS, BASE_FS) self.platform.prep(shader, aspect_ratio, 1.0, 85) self.hearts = [] for i in range(0, self.MAX_FAIL): heart = LiveHeart([-3.0 + i * 0.5, 5.5, 0.0]) heart_shader = Shader(HEART_VS, HEART_FS) heart.prep(heart_shader, aspect_ratio, 0.3, 85) self.hearts.append(heart) self.bg = Background(WOOD_TEXTURE) bg_shader = Shader(BASE_VS, BASE_FS) self.bg.prep(bg_shader, aspect_ratio, 11.0, 85) while not glfw.window_should_close(window): glClearColor(0.0, 0.3, 0.3, 1.0) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glDisable(GL_DEPTH_TEST) self.bg.draw() glEnable(GL_DEPTH_TEST) self.platform.draw(self.game_status_play) self.ball.draw(self.game_status_play) if self.collision_detect(): if self.fails == self.MAX_FAIL: self.game_status_play = False for heart in self.hearts: heart.draw() glfw.swap_buffers(window) glfw.poll_events() glfw.terminate() def key_callback(self, window, key, scancode, action, mode): if key == glfw.KEY_ESCAPE and action == glfw.PRESS: glfw.set_window_should_close(window, GL_TRUE) if key == glfw.KEY_SPACE and action == glfw.PRESS: self.reset_game(self.ball) if key == glfw.KEY_A or key == glfw.KEY_D: if action == glfw.PRESS: glfw.set_time(0) self.platform.curr_movement = self.platform.LEFT if key == glfw.KEY_A else self.platform.LEFT elif action == glfw.RELEASE: self.platform.curr_movement = self.platform.STOP def reset_game(self, item): self.score = 0 self.fails = 0 self.game_status_play = True item.random_pos() item.speed = item.INITIAL_SPEED for heart in self.hearts: heart.pos[1] = 5.5 def collision_detect(self): platform_edges = [self.platform.pos[0] - 0.5 * self.platform.scale, self.platform.pos[0] + 0.5 * self.platform.scale] item_edges = [self.ball.pos[0] - 0.5 * self.ball.scale, self.ball.pos[0] + 0.5 * self.ball.scale] if self.ball.pos[1]-0.5*self.ball.scale < self.platform.pos[1]+0.5*self.platform.scale: self.ball.random_pos() self.ball.speed = self.ball.speed * 1.1 if item_edges[0] >= platform_edges[0] and item_edges[1] <= platform_edges[1]: self.score += 1 else: self.fails += 1 self.hearts[self.MAX_FAIL - self.fails].pos[1] = 20.0 return True return False
def addBall(self): if len(self.balls) < maxBalls: self.balls.append(Ball(self, self.renderer, self.world, self.display, self.middle))
def startBall(self): ball = Ball(self, self.renderer, self.world, self.display, self.middle) self.balls.append(ball) if self.tutorialMode: BallTutorial(self).start()