class IntroScreen(): def __init__(self, size_ = (0, 0)): self.size = size_ self.bg = Color(69, 139, 116) self.ball = Ball() self.paddle = Paddle() def update(self, delta_ms): self.ball.update(delta_ms) self.paddle.update(delta_ms) def render(self): from engine.game_env import Game Game.get_surface().fill(self.bg) self.ball.render() self.paddle.render() def resize(self, new_size): self.size = new_size
class IntroScreen(): def __init__(self, size_=(0, 0)): self.size = size_ self.bg = Color(69, 139, 116) self.ball = Ball() self.paddle = Paddle() brick_size = (50, 25) brick_colour = Color(63, 0, 127) self.bricks = [] for x in range(6, self.size[0] - brick_size[0], brick_size[0] + 5): for y in range(25, 250, brick_size[1] + 3): self.bricks.append(Brick((x, y), brick_size, brick_colour)) def update(self, delta_ms): self.ball.update(delta_ms) self.paddle.update(delta_ms) self.bound_ball() self.bind_paddle() self.paddle_bounce() for br in self.bricks: br.update(delta_ms) def render(self): from engine.game_env import Game Game.get_surface().fill(self.bg) for br in self.bricks: br.render() self.ball.render() self.paddle.render() def resize(self, new_size): self.size = new_size def bound_ball(self): if self.ball.rect.left < 0: self.ball.rect.left = 0 self.ball.vel[0] *= -1 if self.ball.rect.right > self.size[0]: self.ball.rect.right = self.size[0] self.ball.vel[0] *= -1 if self.ball.rect.top < 0: self.ball.rect.top = 0 self.ball.vel[1] *= -1 if self.ball.rect.bottom > self.size[1]: self.ball.rect.bottom = self.size[1] self.ball.vel[1] *= -1 def bind_paddle(self): if self.paddle.rect.left < 0: self.paddle.rect.left = 0 if self.paddle.rect.right > self.size[0]: self.paddle.rect.right = self.size[0] def paddle_bounce(self): tolerance = 0.2929 overlap = self.paddle.rect.clip(self.ball.rect) if overlap: if overlap.width < overlap.height: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 self.ball.vel[0] *= -1 if overlap.height < self.ball.rect.height * tolerance: if self.ball.rect.centery < overlap.centery: self.ball.rect.bottom = overlap.top - 1 self.ball.vel[1] *= -1 elif overlap.width > overlap.height: self.ball.rect.bottom = overlap.top - 1 self.ball.vel[1] *= -1 if overlap.width < self.ball.rect.width * tolerance: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 else: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 if self.ball.rect.centery < overlap.centery: self.ball.rect.bottom = overlap.top - 1 else: self.ball.rect.top = self.paddle.rect.bottom + 1 self.ball.vel[0] *= -1 self.ball.vel[1] *= -1
class GameLayer(Layer): is_event_handler = True def __init__(self, levels=1, golds=0, deadcount=0): super(GameLayer, self).__init__() # 添加板子和球 self.paddle = Paddle('images/paddle.png') self.add(self.paddle.sprite) self.ball = Ball('images/ball.png') self.ball.reset_position = (320, self.paddle.sprite.height + self.ball.sprite.height/2) self.add(self.ball.sprite) # 生成关卡 self.level = Level() self.level.levels = levels # 添加标签用于记录金币和关卡。死亡次数 self.gold = golds self.deadcount = deadcount self.hud = Label('金币: '+str(golds)) self.level_hud = Label('关卡: '+str(levels)) self.deadstu = Label('死亡: '+str(deadcount)) self.hud.position = (0, 460) self.level_hud.position = (80, 460) self.deadstu.position = (160, 460) self.add(self.hud) self.add(self.level_hud) self.add(self.deadstu) # 添加按键状态 self.key_pressed_left = False self.key_pressed_right = False self.key_pressed_up = False self.key_pressed_down = False self.blocks = [] self.reset() # 定期调用 self.update 函数 # FPS frame per second 每秒帧数 self.schedule(self.update) # def on_enter(self): # self.visible = True def reset(self): self.paddle.reset() self.ball.reset() # 清空界面上的block for b in self.blocks: self.remove(b) # 再初始化新的砖块 self.blocks = [] positions = self.level.blocks_pos number_of_blocks = len(positions) for i in range(number_of_blocks): b = Sprite('images/block.png') b.position = positions[i] self.add(b) self.blocks.append(b) def game_over(self): self.deadcount += 1 scene = Scene(GameOver(self.level.levels, self.gold, self.deadcount)) director.replace(scene) def update_hud(self): self.hud.element.text = '金币: ' + str(self.gold) self.level_hud.element.text = '关卡: ' + str(self.level.levels) def update_blocks(self): for b in self.blocks: if collision(b, self.ball.sprite): self.ball.hit() self.blocks.remove(b) self.remove(b) self.gold += 1 self.update_hud() print('金币:', self.gold) break def update_ball(self): if self.ball.fired: self.ball.update() else: bx, by = self.ball.sprite.position px, py = self.paddle.sprite.position self.ball.sprite.position = (px, by) collide = collision(self.ball.sprite, self.paddle.sprite) if collide: self.ball.hit() if self.ball.dead(): self.game_over() def update_paddle(self): self.paddle.update() def update_input(self): self.paddle.move_right = self.key_pressed_right self.paddle.move_left = self.key_pressed_left if self.key_pressed_up: self.ball.fire() def update_newlevel(self): if len(self.blocks) == 0: self.level.next() print(self.level.levels) # self.reset() scene = Scene(GuoCangDongHua(self.level.levels, self.gold, self.deadcount)) director.replace(scene) # director.replace(FadeTransition(Scene(GameLayer(self.level.levels, self.gold)))) def update(self, dt): self.update_newlevel() self.update_ball() self.update_paddle() self.update_input() self.update_blocks() self.update_hud() def on_key_press(self, key, modifiers): k = symbol_string(key) status = True if k == 'LEFT': self.key_pressed_left = status elif k == 'RIGHT': self.key_pressed_right = status elif k == 'UP': self.key_pressed_up = status def on_key_release(self, key, modifiers): k = symbol_string(key) status = False if k == 'LEFT': self.key_pressed_left = status elif k == 'RIGHT': self.key_pressed_right = status elif k == 'UP': self.key_pressed_up = status
class GameLayer(Layer): is_event_handler = True def __init__(self, hud): super(GameLayer, self).__init__() # 添加板子和球 self.is_on_exiting = True self.paddle = Paddle('images/paddle.png') self.add(self.paddle.sprite) self.ball = Ball('images/ball.png') self.ball.reset_position = (320, self.paddle.sprite.height + self.ball.sprite.height / 2) self.add(self.ball.sprite) # hud 用于记录,更新关卡,死亡,金币数据 self.hud = hud # 生成关卡 self.level = Level() self.level.levels = self.hud.levels self.add(self.hud.gold_hud) self.add(self.hud.level_hud) self.add(self.hud.death_hud) # 添加按键状态 self.key_pressed_left = False self.key_pressed_right = False self.key_pressed_up = False self.key_pressed_down = False self.reset() # 定期调用 self.update 函数 # FPS frame per second 每秒帧数 self.schedule(self.update) def reset(self): self.paddle.reset() self.ball.reset() # 清空界面上的block for b in self.level.blocks: self.remove(b.sprite) # 再初始化新的砖块 self.level.reset() for b in self.level.blocks: self.add(b.sprite) def game_over(self): self.hud.death += 1 self.is_on_exiting = False scene = create_scene(GameOver(self.hud)) director.replace(scene) def update_hud(self): self.hud.update() def update_blocks(self): for b in self.level.blocks: if collised(b.sprite, self.ball.sprite): print(1) self.ball.hit() b.live -= 1 if b.live < 0: self.level.blocks.remove(b) self.remove(b.sprite) else: b.reset() self.hud.gold += 1 self.update_hud() print('金币:', self.hud.gold) break def update_ball(self): if self.ball.fired: self.ball.update() else: bx, by = self.ball.sprite.position px, py = self.paddle.sprite.position self.ball.sprite.position = (px, by) collide = collised(self.ball.sprite, self.paddle.sprite) if collide: xisu = 1 bx, by = self.ball.sprite.position px, py = self.paddle.sprite.position offect_scale = (bx - px) / (self.paddle.sprite.width / 2) ball_speedx_change = offect_scale * xisu self.ball.speedx += ball_speedx_change self.ball.hit() if self.ball.dead(): self.game_over() def update_paddle(self): self.paddle.update() def update_input(self): self.paddle.move_right = self.key_pressed_right self.paddle.move_left = self.key_pressed_left if self.key_pressed_up: self.ball.fire() def update_newlevel(self): if len(self.level.blocks) == 0: self.is_on_exiting = False if self.level.next(): print(self.level.levels) self.hud.levels += 1 scene = create_scene(GuoCangDongHua(self.hud)) else: scene = create_scene(GameComplite(self.hud)) director.replace(scene) def update(self, dt): if self.is_on_exiting: self.update_newlevel() self.update_ball() self.update_paddle() self.update_input() self.update_blocks() self.update_hud() def on_key_press(self, key, modifiers): k = symbol_string(key) status = True if k == 'LEFT': self.key_pressed_left = status elif k == 'RIGHT': self.key_pressed_right = status elif k == 'UP': self.key_pressed_up = status def on_key_release(self, key, modifiers): k = symbol_string(key) status = False if k == 'LEFT': self.key_pressed_left = status elif k == 'RIGHT': self.key_pressed_right = status elif k == 'UP': self.key_pressed_up = status
class IntroScreen(): def __init__(self, size_=(0, 0)): self.size = size_ self.bg = Color(69, 139, 116) self.ball = Ball() self.paddle = Paddle() def update(self, delta_ms): self.ball.update(delta_ms) self.paddle.update(delta_ms) self.bound_ball() self.bind_paddle() self.paddle_bounce() def render(self): from engine.game_env import Game Game.get_surface().fill(self.bg) self.ball.render() self.paddle.render() def resize(self, new_size): self.size = new_size def bound_ball(self): if self.ball.rect.left < 0: self.ball.rect.left = 0 self.ball.vel[0] *= -1 if self.ball.rect.right > self.size[0]: self.ball.rect.right = self.size[0] self.ball.vel[0] *= -1 if self.ball.rect.top < 0: self.ball.rect.top = 0 self.ball.vel[1] *= -1 if self.ball.rect.bottom > self.size[1]: self.ball.rect.bottom = self.size[1] self.ball.vel[1] *= -1 def bind_paddle(self): if self.paddle.rect.left < 0: self.paddle.rect.left = 0 if self.paddle.rect.right > self.size[0]: self.paddle.rect.right = self.size[0] def paddle_bounce(self): tolerance = 0.2929 overlap = self.paddle.rect.clip(self.ball.rect) if overlap: if overlap.width < overlap.height: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 self.ball.vel[0] *= -1 if overlap.height < self.ball.rect.height * tolerance: if self.ball.rect.centery < overlap.centery: self.ball.rect.bottom = overlap.top - 1 self.ball.vel[1] *= -1 elif overlap.width > overlap.height: self.ball.rect.bottom = overlap.top - 1 self.ball.vel[1] *= -1 if overlap.width < self.ball.rect.width * tolerance: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 else: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 if self.ball.rect.centery < overlap.centery: self.ball.rect.bottom = overlap.top - 1 else: self.ball.rect.top = self.paddle.rect.bottom + 1 self.ball.vel[0] *= -1 self.ball.vel[1] *= -1
class IntroScreen(): def __init__(self, size_=(0, 0)): self.size = size_ self.bg = Color(69, 139, 116) self.ball = Ball() self.paddle = Paddle() brick_size = (50, 25) brick_colour = Color(63, 0, 127) self.bricks = [] for x in range(6, self.size[0] - brick_size[0], brick_size[0] + 5): for y in range(25, 250, brick_size[1] + 3): self.bricks.append(Brick((x, y), brick_size, brick_colour)) def update(self, delta_ms): self.ball.update(delta_ms) self.paddle.update(delta_ms) if not self.ball.launched: self.ball.rect.centerx = self.paddle.rect.centerx self.ball.rect.bottom = self.paddle.rect.top self.launch_ball() for br in self.bricks: br.update(delta_ms) self.brick_bounce() self.bound_ball() self.bind_paddle() self.paddle_bounce() def render(self): from engine.game_env import Game Game.get_surface().fill(self.bg) for br in self.bricks: br.render() self.ball.render() self.paddle.render() def resize(self, new_size): self.size = new_size def bound_ball(self): if self.ball.rect.left < 0: self.ball.rect.left = 0 self.ball.vel[0] *= -1 if self.ball.rect.right > self.size[0]: self.ball.rect.right = self.size[0] self.ball.vel[0] *= -1 if self.ball.rect.top < 0: self.ball.rect.top = 0 self.ball.vel[1] *= -1 if self.ball.rect.bottom > self.size[1]: self.ball.rect.bottom = self.size[1] self.ball.vel[1] *= -1 def bind_paddle(self): if self.paddle.rect.left < 0: self.paddle.rect.left = 0 if self.paddle.rect.right > self.size[0]: self.paddle.rect.right = self.size[0] def paddle_bounce(self): tolerance = 0.2929 overlap = self.paddle.rect.clip(self.ball.rect) if overlap: if overlap.width < overlap.height: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 self.ball.vel[0] *= -1 if overlap.height < self.ball.rect.height * tolerance: if self.ball.rect.centery < overlap.centery: self.ball.rect.bottom = overlap.top - 1 self.ball.vel[1] *= -1 elif overlap.width > overlap.height: self.ball.rect.bottom = overlap.top - 1 self.ball.vel[1] *= -1 if overlap.width < self.ball.rect.width * tolerance: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 else: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 if self.ball.rect.centery < overlap.centery: self.ball.rect.bottom = overlap.top - 1 else: self.ball.rect.top = self.paddle.rect.bottom + 1 self.ball.vel[0] *= -1 self.ball.vel[1] *= -1 def brick_bounce(self): for brick in self.bricks: if brick.active: test_x = self.ball.rect.centerx test_y = self.ball.rect.centery if self.ball.rect.centerx < brick.rect.left: test_x = brick.rect.left elif self.ball.rect.centerx > brick.rect.right: test_x = brick.rect.right if self.ball.rect.centery < brick.rect.top: test_y = brick.rect.top elif self.ball.rect.centery > brick.rect.bottom: test_y = brick.rect.bottom dist_x = self.ball.rect.centerx - test_x dist_y = self.ball.rect.centery - test_y dist_x *= dist_x dist_y *= dist_y distance = (dist_x + dist_y)**0.5 if distance <= self.ball.radius: brick.active = False overlap = self.ball.rect.clip(brick.rect) if overlap.width < overlap.height: self.ball.vel[0] *= -1 elif overlap.width > overlap.height: self.ball.vel[1] *= -1 else: self.ball.vel[0] *= -1 self.ball.vel[1] *= -1 def launch_ball(self): from pygame.locals import K_SPACE from engine.game_env import Game if Game.get_key(K_SPACE): self.ball.launch()
class IntroScreen(): def __init__(self, size_=(0, 0)): self.size = size_ self.bg = Color(69, 139, 116) self.ball = Ball() self.paddle = Paddle() brick_size = (int(self.size[0] / 9), 25) self.bricks = [ Brick((x, y), brick_size) for x in range(int(0.15 * brick_size[0]), self.size[0] - brick_size[0], int(1.1 * brick_size[0])) for y in range(brick_size[1], 9 * brick_size[1], int(1.05 * brick_size[1])) ] def update(self, delta_ms): self.ball.update(delta_ms) self.paddle.update(delta_ms) self.bound_ball() self.bind_paddle() self.paddle_bounce() self.brick_bounce() for br in self.bricks: br.update(delta_ms) def render(self): from engine.game_env import Game Game.get_surface().fill(self.bg) for br in self.bricks: br.render() self.ball.render() self.paddle.render() def resize(self, new_size): self.size = new_size def bound_ball(self): if self.ball.rect.left < 0: self.ball.rect.left = 0 self.ball.vel[0] *= -1 if self.ball.rect.right > self.size[0]: self.ball.rect.right = self.size[0] self.ball.vel[0] *= -1 if self.ball.rect.top < 0: self.ball.rect.top = 0 self.ball.vel[1] *= -1 if self.ball.rect.bottom > self.size[1]: self.ball.rect.bottom = self.size[1] self.ball.vel[1] *= -1 def bind_paddle(self): if self.paddle.rect.left < 0: self.paddle.rect.left = 0 if self.paddle.rect.right > self.size[0]: self.paddle.rect.right = self.size[0] def paddle_bounce(self): tolerance = 0.2929 overlap = self.paddle.rect.clip(self.ball.rect) if overlap: if overlap.width < overlap.height: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 self.ball.vel[0] *= -1 if overlap.height < self.ball.rect.height * tolerance: if self.ball.rect.centery < overlap.centery: self.ball.rect.bottom = overlap.top - 1 self.ball.vel[1] *= -1 elif overlap.width > overlap.height: self.ball.rect.bottom = overlap.top - 1 self.ball.vel[1] *= -1 if overlap.width < self.ball.rect.width * tolerance: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 else: if self.ball.rect.centerx < overlap.centerx: self.ball.rect.right = overlap.left - 1 else: self.ball.rect.left = overlap.right + 1 if self.ball.rect.centery < overlap.centery: self.ball.rect.bottom = overlap.top - 1 else: self.ball.rect.top = self.paddle.rect.bottom + 1 self.ball.vel[0] *= -1 self.ball.vel[1] *= -1 def brick_bounce(self): for br in self.bricks: if br.active: test_x = self.ball.rect.centerx test_y = self.ball.rect.centery if self.ball.rect.centerx < br.rect.left: test_x = br.rect.left elif self.ball.rect.centerx > br.rect.right: test_x = br.rect.right if self.ball.rect.centery < br.rect.top: test_y = br.rect.top elif self.ball.rect.centery > br.rect.bottom: test_y = br.rect.bottom dist_x = self.ball.rect.centerx - test_x dist_y = self.ball.rect.centery - test_y dist_x *= dist_x dist_y *= dist_y dist = (dist_x + dist_y)**0.5 if dist < self.ball.radius: br.active = False if dist_x < dist_y: self.ball.vel[1] *= -1 elif dist_y < dist_x: self.ball.vel[0] *= -1 else: self.ball.vel[0] *= -1 self.ball.vel[1] *= -1