Exemplo n.º 1
0
def run_game():
	#Initializer game, settings and create a screen object
	pygame.init()
	screen_width = 1200
	screen_height = 1200
	bg_color = (168, 164, 0)
	screen = pygame.display.set_mode((screen_width, screen_height))
	pygame.display.set_caption("Raindrops")
	raindrops = Group()



	draw_raindrops(screen, raindrops, screen_width, screen_height)

	while True:

		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				sys.exit()


		#Redraw the screen during each pass through the for loop
		screen.fill(bg_color)

		for raindrop in raindrops:
			if randint(0,1) == 1:
				raindrop.rect.y += 1
			if raindrop.rect.bottom > screen_height:
				raindrops.remove(raindrop)
			raindrop.blitme()

		#Make the most recently drawn screen visible
		pygame.display.flip()
Exemplo n.º 2
0
def run_game():
    #initial game and make a screen target
    pygame.init()
    setting = Setting()
    screen = pygame.display.set_mode((setting.screen_width, setting.screen_height))
    ship = Ship(setting, screen)
    bullets = Group()
    aliens = Group()
    gf.creat_fleet(setting, screen, aliens)
    pygame.display.set_caption(setting.caption)

    #begin main loop 
    while True:
        #watch keyboard and mouse
        gf.check_events(ship, bullets, setting, screen)

        ship.update_position()
        bullets.update()
        aliens.update()
     
        #delete bullet outside of the screen
        for bullet in bullets.copy():
            if bullet.rect.bottom < 0:
                bullets.remove(bullet)       

        #move aliens
        gf.get_fleet_direction(aliens, setting)

        #kill aliens
        gf.kill(aliens, bullets)

        #refresh screen
        gf.update_screen(screen, setting, ship, bullets, aliens)
def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")
    # make a ship
    ship = Ship(ai_settings, screen)
    bullets = Group()
    aliens = Group()
    alien = Alien(ai_settings, screen)
    gf.create_fleet(ai_settings, screen, aliens)


    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        gf.update_bullets(bullets)
        gf.update_screen(ai_settings, screen, ship, aliens, bullets)
        bullets.update()

        # Get rid of bullets that have disappeared.
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))
Exemplo n.º 4
0
def run_game():
    # Initialize game and create a screen object.
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")
    play_button = Button(ai_settings, screen, "Play")
    stats = GameStats(ai_settings)
    sb = Scoreboard(ai_settings, screen, stats)
    ship = Ship(ai_settings, screen)
    bullets = Group()
    aliens = Group()
    alien = Alien(ai_settings, screen)

    gf.create_fleet(ai_settings, screen, ship, aliens)

    # Start the main loop for the game.
    while True:
        gf.check_events(ai_settings, screen, stats, sb, play_button, ship,
                        aliens, bullets)
        if stats.game_active:
            ship.update()
            gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens,
                              bullets)
            gf.update_aliens(ai_settings, screen, stats, sb, ship, aliens,
                             bullets)
            gf.update_screen(ai_settings, screen, stats, sb, ship, aliens,
                             bullets, play_button)
            for bullet in bullets.copy():
                if bullet.rect.bottom <= 0:
                    bullets.remove(bullet)
Exemplo n.º 5
0
def run_game():
    # Initl game and create a screen object
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    # create ship
    ship = Ship(ai_settings, screen)
    #create bullet
    bullets = Group()

    # Start game
    while True:

        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        bullets.update()
        # delect bullet
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))

        gf.update_screen(ai_settings, screen, ship, bullets)
Exemplo n.º 6
0
def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((
        (ai_settings.screen_width, ai_settings.screen_height)
    ))
    pygame.display.set_caption("Corona Python")
    play_button = Button(ai_settings, screen, "Play")
    doctor = Doctor(ai_settings, screen)
    bullets = Group()
    viruses = Group()

    stats = GameStats(ai_settings)
    sb = ScoreBoard(ai_settings, screen, stats)

    gf.create_fleet(ai_settings, screen, doctor, viruses)

    while True:
        gf.check_events(ai_settings, screen, stats,
                        sb, play_button, doctor, viruses, bullets)

        if stats.game_active:
            doctor.update()
            gf.update_bullets(ai_settings, screen, stats,
                              sb, doctor, viruses, bullets)
            gf.update_bullets(ai_settings, screen, stats,
                              sb, doctor, viruses, bullets)
            gf.update_viruses(ai_settings, stats, screen,
                              doctor, viruses, bullets)
            for bullet in bullets.copy():
                if bullet.rect.bottom <= 0:
                    bullets.remove(bullet)
            gf.update_screen(ai_settings, screen, stats, sb, doctor,
                             viruses, bullets, play_button)
Exemplo n.º 7
0
def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")
    # make a ship
    ship = Ship(ai_settings, screen)
    bullets = Group()
    aliens = Group()
    alien = Alien(ai_settings, screen)
    gf.create_fleet(ai_settings, screen, aliens)

    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        gf.update_bullets(bullets)
        gf.update_screen(ai_settings, screen, ship, aliens, bullets)
        bullets.update()

        # Get rid of bullets that have disappeared.
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))
Exemplo n.º 8
0
def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Pick the stars")

    people = People(ai_settings, screen)
    stars = Stars(ai_settings, screen)
    alien = Alien(ai_settings, screen)
    bullets = Group()
    stats = GameStats(ai_settings)
    sb = Scoreboard(ai_settings, screen, stats)
    play_button = Button(ai_settings, screen, "Play")

    while True:
        gf.check_events(ai_settings, stats, sb, people, alien, bullets,
                        play_button)
        bullets.update()
        for bullet in bullets.copy():
            if bullet.rect.bottom >= ai_settings.screen_height:
                bullets.remove(bullet)
        if stats.game_active:
            people.update()
            gf.update_alien(alien)
            gf.update_stars(ai_settings, stats, sb, people, stars)
            if alien.rect.x % 120 == 0:
                gf.update_bullet(ai_settings, stats, screen, people, alien,
                                 bullets)

        gf.update_screen(ai_settings, stats, sb, screen, people, stars, alien,
                         bullets, play_button)
Exemplo n.º 9
0
def run_stars():
    setting = Settings()

    #make screen
    display = make_display(setting)
    rect = display.get_rect()
    #star class
    star = Star(display, setting)
    stars = Group()

    #making the grid of stars appear
    total_usable = get_columbs(display, setting)
    total_star_room = get_rows(display, setting, stars, total_usable)
    star_grid_code(total_usable, total_star_room, display, stars, setting)

    counter = 0
    while counter < 10000:
        check_events()

        star.draw_stars(stars, display)
        update_stars(stars, display, setting)

        #should remove the stars from the group of stars
        for star in stars.copy():
            if star.rect.top == rect.bottom:
                stars.remove(star)
                new_row_stars(display, setting, total_star_room, stars)

        pygame.display.flip()
        counter += 1
Exemplo n.º 10
0
def run_game():
    #初始化游戏
    pygame.init()
    #实例化设置对象
    ai_settings = Settings()
    #创建屏幕
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    #设置游戏标题
    pygame.display.set_caption(ai_settings.caption)
    #创建飞船
    ship = Ship(screen, ai_settings)
    #创建子弹列表
    bullets = Group()
    #开始游戏的主循环
    while True:
        screen.fill(ai_settings.bg_color)
        #监视键盘和鼠标事件
        gf.check_events(ai_settings, screen, ship, bullets)
        #更新飞船位置
        ship.update()
        #更新子弹位置
        bullets.update()
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        #更新屏幕
        gf.update_screen(ai_settings, screen, ship, bullets)
Exemplo n.º 11
0
def run_game():

    #初始化一个屏幕
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    # 创建一艘飞船
    ship = Ship(ai_settings, screen)

    # 创建一个用于存储子弹的编组
    bullets = Group()

    #开始游戏的主循环
    while True:

        #监视鼠标键盘事件
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        bullets.update()

        # 删除已消失的子弹
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        gf.update_screen(ai_settings, screen, ship, bullets)
Exemplo n.º 12
0
def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    ship = Ship(screen)
    bullets = Group()

    # alien = Alien(ai_settings, screen)
    aliens = Group()
    gf.create_fleet(ai_settings, screen, aliens)

    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        bullets.update()
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        gf.update_aliens(ai_settings, aliens)
        pygame.sprite.groupcollide(bullets, aliens, True, True)
        gf.update_screen(ai_settings, screen, ship, aliens, bullets)
        pygame.display.flip()
Exemplo n.º 13
0
def run_game():
    # Initialize pygame, settings and screen object.
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    # Set the background color.
    bg_color = (230, 230, 230)

    # Make a ship, a group of bullets, and a group of aliens.
    ship = Ship(ai_settings, screen)
    bullets = Group()
    aliens = Group()

    # Create a fleet of aliens.
    gf.create_fleet(ai_settings, screen, ship, aliens)
    
    # Start the Main loop for the game,
    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
       
        # Get rid of bullets that have disappeared.
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))
        gf.update_aliens(ai_settings, aliens)
        gf.update_screen(ai_settings, screen, ship, aliens, bullets)
Exemplo n.º 14
0
def run_game():
    # 初始化pygame、设置和屏幕对象
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_hegiht))
    pygame.display.set_caption("Alien Invasion")

    #创建一艘飞船
    ship = Ship(ai_settings, screen)
    # 创建一个用于存储子弹的编组
    bullets = Group()
    #设置背景颜色
    bg_color = (ai_settings.bg_color)
    #开始游戏的主循环
    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        bullets.update()
        # 删除已消失的子弹
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))
        gf.update_screen(ai_settings, screen, ship, bullets)
Exemplo n.º 15
0
def run_game():
    pygame.init()
    # 设置size
    screen = pygame.display.set_mode((1200, 800))
    # 设置title
    pygame.display.set_caption('Alien')
    # init ship
    ship = Ship(screen)
    # init monster
    monster = Group()
    bullets = Group()
    # 随机怪物的数量
    monsters_num = random.uniform(0, 10)
    gf.create_alien(screen, monster, monsters_num)
    while True:
        # 检测键盘事件
        gf.check_events(ship, screen, bullets)
        # 改变自己位置
        ship.update()
        bullets.update()
        monster.update()
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                print("删除消失的子弹")
                bullets.remove(bullet)
        # 判断怪物是不是被杀死了
        gf.check_bullet_alien_collisions(screen, monster, bullets)
        # 如果自己移动,重绘屏幕
        gf.update_screen(screen, ship, bullets, monster)
Exemplo n.º 16
0
def run_game():
    # 初始化 pygame 、设置和屏幕对象
    pygame.init()

    ai_settings = Settings()

    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))

    pygame.display.set_caption("Alien Invasion")

    # 创建一艘飞船
    ship = Ship(ai_settings, screen)
    # 创建一个用于存储子弹的编组
    bullets = Group()
    aliens = Group()
    # 创建外星人群
    gf.create_fleet(ai_settings, screen, ship, aliens)

    # 开始游戏主循环
    while True:
        # 监视键盘和鼠标事件
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        bullets.update()
        # 删除已消失的子弹
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        gf.update_bullets(aliens, bullets)
        gf.update_aliens(ai_settings, aliens)
        # 每次循环时都重绘屏幕
        gf.update_screen(ai_settings, screen, ship, aliens, bullets)
        # 让最近绘制的屏幕可见
        pygame.display.flip()
Exemplo n.º 17
0
def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width,
         ai_settings.screen_height))

    pygame.display.set_caption("Alien Invasion")
    bg_color = (230,230,230)

    ship = Ship(ai_settings,screen)

    bullets = Group()

    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        # 每次循环,都调用ship的update
        ship.update()
        bullets.update()##这个子弹的跟新,子弹往前飞

        ##删除已经消失的子弹
        for bullet in bullets.copy():
            if bullet.rect.bottom<=0:
                bullets.remove(bullet)
        # print(len(bullets)) #用于确认子弹确实消失了

        gf.update_screen(ai_settings, screen, ship, bullets)
Exemplo n.º 18
0
def run_game():
	#Initialize game
	pygame.init()

	ai_settings = Settings()

	screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))

	# Make a ship.
	ship = Ship(screen)	

	stats = GameStats(ai_settings)

	bullets = Group()
	aliens = Group()

	gf.create_fleet(ai_settings, screen, ship, aliens)

	#Main loop for the game:
	while  True:
		gf.check_events(ai_settings, ship, bullets)
		gf.update_screen(ai_settings, screen, ship, aliens, bullets)
		gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)

		for bullet in bullets.copy():
			if bullet.rect.bottom <= 0:
				bullets.remove(bullet)
Exemplo n.º 19
0
def run_game():
    # Initialize game and create a screen object.
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    # Make a ship.
    ship = Ship(ai_settings, screen)
    # Make a group to store bullets in.
    bullets = Group()

    # Start the main loop for the game.
    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        bullets.update()

        # Get rid of bullets that have disappeared.
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))

        gf.update_screen(ai_settings, screen, ship, bullets)
Exemplo n.º 20
0
def run_game():
    # Initialize game and create a screen object.
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")
    # Make a ship
    ship = Ship(ai_settings, screen)
    # Make a group to store bullets in.
    bullets = Group()
    # Set the background color.
    bg_color = (50, 20, 10)
    # Start the main loop for the game.
    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        gf.update_bullets(bullets)
        gf.update_screen(ai_settings, screen, ship, bullets)
        # Get rid of bullets that have disappeared.
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))

        # Watch for keyboard and mouse events.
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
    # Redraw the screen during each pass through the loop.
        screen.fill(ai_settings.bg_color)
        ship.blitme()
        # Make the most recently drawn screen visible.
        pygame.display.flip()
Exemplo n.º 21
0
def run_game():
    pygame.init()  #初始化背景设置
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    #创建一个名为screen的显示窗口,实参(1200,800)实际上是一个元祖,制定了游戏窗口的尺寸,此处宽1200,高800像素
    pygame.display.set_caption("AlienGame Invasion")  ##设置窗口标题

    #创建一个外星人
    alien = Alien(ai_settings, screen)

    #创建一艘飞船、一个子弹编组和一个外星人编组
    ship = Ship(ai_settings, screen)
    aliens = Group()
    bullets = Group()

    #创建外星人群
    gf.create_fleet(ai_settings, screen, ship, aliens)

    #开始游戏主循环
    while True:
        gf.check_events(ai_settings, screen, ship, aliens, bullets)
        ship.update()
        bullets.update()
        #删除已消失的子弹
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        gf.update_bullets(aliens, bullets)
        gf.update_aliens(ai_settings, aliens)
        gf.update_screen(ai_settings, screen, ship, aliens, bullets)
Exemplo n.º 22
0
def run_game():
	#初始化游戏并创建一个屏幕,创建setting实例和船实例,给游戏命名
	pygame.init()
	ai_setting=Settings()
	screen=pygame.display.set_mode(
	(ai_setting.screen_width,ai_setting.screen_height))
	pygame.display.set_caption('Alien Invasion')
	ship=Ship(ai_setting,screen)
	#创建用于存储子弹的编组
	bullets=Group()
	aliens=Group()
	
	#开始游戏主循环
	while True:
		#监视键盘和鼠标事件
		gf.check_events(ai_setting,screen,ship,bullets)
		ship.update()
		gf.create_fleet(screen,ai_setting,ship,aliens)
		bullets.update()
		for bullet in bullets.copy():
			if bullet.rect.right>1200:
				bullets.remove(bullet)
		
				
		gf.update_screen(ai_setting,screen,ship,bullets,aliens)
def run_game():
    #初始化游戏并创建一个屏幕对象
    pygame.init()
    #创建Settings实例存储在ai_settings变量中
    ai_settings = Settings()
    #使用ai_settings的属性screen_width和screen_height
    screen = pygame.display.set_mode(
        (ai_settings.screen_width,ai_settings.screen_height)
    )
    pygame.display.set_caption("Alien Invasion")
    #创建一艘飞船
    #需要传入实参ai_settings
    ship = Ship(ai_settings,screen)
    #创建一个用于存储子弹的编组
    #pygame.sprite.Group类创建一个编组,存储所有有效子弹,类似列表。
    bullets = Group()
    #开始游戏的循环
    while True:
        gf.check_events(ai_settings,screen,ship,bullets)
        #飞船的位置在检测到键盘事件后(但在更新屏幕前)更新。
        ship.update()
        #当对编组调用update()时,编组将自动对其中每个精灵(子弹)调用update()
        bullets.update()
        #删除已消失的子弹
        #不应从列表或编组中删除条目,因此必须遍历编组的副本
        #我们使用了方法copy()来设置for循环
        for bullet in bullets.copy():
            #检查每颗子弹,看看它是否已从屏幕消失。
            if bullet.rect.bottom <= 0:
                #从bullets中删除
                bullets.remove(bullet)
                #显示还有多少子弹
                print(len(bullets))
        gf.update_screen(ai_settings,screen,ship,bullets)
Exemplo n.º 24
0
class UFOs:
    def __init__(self, game):
        self.settings = game.settings
        self.screen = game.screen
        self.game = game

        self.ufo_group = Group()
        self.last_ufo = pg.time.get_ticks()

    def create_ufo_if_time(self):
        now = pg.time.get_ticks()
        if now > self.last_ufo + self.settings.ufo_every * 1000:
            self.ufo_group.add(UFO(game=self.game, parent=self))
            self.last_ufo = pg.time.get_ticks()

    def update(self):
        self.create_ufo_if_time()
        self.ufo_group.update()
        for ufo in self.ufo_group.sprites():
            ufo.draw()
            if ufo.check_edges():
                self.ufo_group.remove(ufo)

        bullet_ufo_collision = pg.sprite.groupcollide(
            self.ufo_group, self.game.ship.bullet_group_that_kill_aliens, True,
            True)
        if bullet_ufo_collision:
            for ufo in bullet_ufo_collision:
                print('UFO HIT')
                ufo.killed()

    def draw(self):
        for ufo in self.ufo_group:
            ufo.draw()
def run_game():
    # 初始化游戏并创建一个屏幕对象
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")
    # 创建Play按钮
    play_button = Button(ai_settings, screen, "Play")
    # 创建一个用于存储游戏统计信息的实例,并创建记分牌
    stats = GameStats(ai_settings)
    sb = Scoreboard(ai_settings, screen, stats)
    ship = Ship(ai_settings, screen)
    bullets = Group()
    aliens = Group()
    alien = Alien(ai_settings, screen)
    gf.create_fleet(ai_settings, screen, ship, aliens)
    # 开始游戏的主循环
    while True:
        # 监视键盘和鼠标事件
        gf.check_events(ai_settings, screen, stats, sb, play_button, ship,
                        aliens, bullets)
        if stats.game_active:
            ship.update(ai_settings)
            gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens,
                              bullets)
            gf.update_aliens(ai_settings, screen, stats, sb, ship, aliens,
                             bullets)
            for bullet in bullets.copy():
                if bullet.rect.bottom <= 0:
                    bullets.remove(bullet)
            print(len(bullets))
        gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,
                         play_button)
Exemplo n.º 26
0
class SpriteGroup:
    ALL_SPRITES = Group()

    def __init__(self):
        self.sprites = Group()

    @property
    def children(self):
        return self.sprites

    def add(self, sprite: Sprite):
        self.ALL_SPRITES.add(sprite)
        self.sprites.add(sprite)

    def remove(self, sprite: Sprite):
        self.ALL_SPRITES.remove(sprite)
        self.sprites.remove(sprite)

    def update(self):
        self.sprites.update()

    def draw(self, screen):
        for sprite in self.sprites:
            if hasattr(sprite, 'on_draw'):
                sprite.on_draw(screen)
            sprite.draw(screen)

    def empty(self):
        return self.sprites.empty()

    def __iter__(self):
        return self.sprites.__iter__()

    def __len__(self):
        return len(self.sprites)
Exemplo n.º 27
0
def run_game():
    pygame.init()

    ai_settings = Settings()

    """ Screen settings and such"""
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))

    pygame.display.set_caption("Alien Invasion")
    stats = GameStats(ai_settings)

    bg_color = (230, 230, 230)
    """background screen color; grey"""

    ship = Ship(ai_settings, screen)
    bullets = Group()
    aliens = Group()
    gf.create_fleet(ai_settings, screen, ship, aliens)

    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
        gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)
        gf.update_screen(ai_settings, screen, ship, aliens, bullets)

        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))
Exemplo n.º 28
0
def run_game():
    #initialize game and create a screen object.
    pygame.init()
    gamesettings = Settings()
    screen = pygame.display.set_mode(
        (gamesettings.screen_width, gamesettings.screen_height))
    pygame.display.set_caption("Alien Invasion")
    #make a ship
    ship = Ship(gamesettings, screen)
    #make a group to store bullets
    bullets = Group()
    aliens = Group()
    #make an alien
    alien = Alien(gamesettings, screen)
    #create the fleet of aliens
    gf.create_fleet(gamesettings, screen, ship, aliens)

    #start main loop for game
    while True:
        gf.check_events(gamesettings, screen, ship, bullets)
        ship.update()
        bullets.update()

        #get rid of excess bullets
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))
        gf.update_screen(gamesettings, screen, ship, aliens, bullets)
Exemplo n.º 29
0
def run_game():  #初始化
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    #创建一艘飞船
    ship = Ship(ai_settings, screen)
    #创建一个外星人
    aliens = Group()
    #创建一个用于存储子弹的组
    bullets = Group()
    #创建外星人群
    gf.create_fleet(ai_settings, screen, ship, aliens)

    #创建一个用于存储游戏统计信息的实例
    stats = GameStats(ai_settings)

    #开始游戏的主循环
    while True:
        gf.check_events(ai_settings, screen, ship, bullets)

        if stats.game_active:
            ship.update()
            gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
            gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)

        gf.update_screen(ai_settings, screen, ship, aliens, bullets)
        #删除屏幕外面的子弹
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
Exemplo n.º 30
0
def run_game():
    # 初始化游戏并创建一个屏幕对象:初始化背景设置,让Pygame能够正确地工作
    pygame.init()

    pw_settings = Settings()
    """调用pygame.display.set_mode()来创建一个名为screen的显示窗口,
    这个游戏的所有图形元素都将在其中绘制。每个元素(如外星人或飞船)都是一个surface对象"""
    screen = pygame.display.set_mode(
        (pw_settings.screen_width, pw_settings.screen_height))

    # 窗口标题
    pygame.display.set_caption('Plane War')

    # 创建一艘飞船
    ship = Ship(pw_settings, screen)

    # 创建一个用于存储子弹的编组
    bullets = Group()

    # 开始游戏的主循环
    while True:
        gf.check_events(pw_settings, screen, ship, bullets)
        ship.update()
        bullets.update()

        # 删除已消失的子弹
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))

        gf.update_screen(pw_settings, screen, ship, bullets)
Exemplo n.º 31
0
class BulletManager:
    def __init__(self, bullet_stats: BulletStats):
        self._bullets = Group()
        self._bullet_stats = bullet_stats

    def add(self, bullet):
        self._bullets.add(bullet)

    def update(self, elapsed):
        self._bullets.update(elapsed)

        # Get rid of bullets that have disappeared
        for bullet in self._bullets.copy():
            if bullet.rect.bottom <= 0 or bullet.rect.top >= config.screen_height:
                self._bullets.remove(bullet)

    def empty(self):
        self._bullets.empty()

    def draw(self, screen):
        self._bullets.draw(screen)

    def sprites(self):
        return self._bullets.sprites()

    def __iter__(self):
        return self._bullets.__iter__()
Exemplo n.º 32
0
def run_game():
    # 初始化游戏并建立一个屏幕对象
    pygame.init()  # 初始化pygame
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption('Alien Invasion')

    # 创建一艘飞船
    ship = Ship(ai_settings, screen)
    # 创建一个用于储存炮弹的编组
    bullets = Group()

    # 开始游戏的主循环
    while True:

        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        bullets.update()

        # 删除已消失的炮弹
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        #print(len(bullets))

        gf.update_screen(ai_settings, screen, ship, bullets)
Exemplo n.º 33
0
 def remove(self, *sprites):
     
     for current_sprite in sprites:
         if current_sprite not in self: continue
         
         row, col = self.get_cell_row_col(current_sprite)
         self.cells[row][col] = None
         
     Group.remove(self, *sprites)
Exemplo n.º 34
0
    def remove(self, *sprites):
        """Removes as normal but also updates the formation array"""

        Group.remove(self, *sprites)

        for current_sprite in sprites:
            row = current_sprite.row
            col = current_sprite.col
            self.formation[col][row] = None
            if col == self.rightmost_col or col == self.leftmost_col:
                self.adjust_borders()
Exemplo n.º 35
0
Arquivo: event.py Projeto: alecain/one
 def handle_event(self, event):
     if isinstance(event, UpdateEvent):
         loop = get_loop()
         group = Group(loop.render.sprites())
         for member in pygame.sprite.spritecollide(loop.bg_sprite, loop.render, False):
             if member in group:
                 group.remove(member)
         for sprite in group:
             loop.rm_object(sprite)
         pygame.sprite.groupcollide(loop.projectiles, loop.enemies, True, True)
         if pygame.sprite.spritecollide(loop.you, loop.enemies, False):
             loop.rm_object(loop.you)
             lose()
Exemplo n.º 36
0
def run_game():

	# Initialize game and create a screen object.

	pygame.init()
	ai_settings = Settings()
	screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
	
	pygame.display.set_caption("Zombie Tower Ultimate Sonic The Next Generation Super EX")
	play_button = Button(ai_settings, screen, "Play")
	# Set the background color
	ship = Ship(screen, ai_settings)
	bullets = Group()
	bomb = Group()
	lasercheat = Group()
	nuke = Nuke(ai_settings, screen, ship)
	block = Block(ai_settings, screen, nuke)
	wall = Wall(ai_settings, screen, ship)
	lift = Lift(ai_settings, screen, nuke)
	aliens = Group()
	alien = Alien(ai_settings, screen)
	# Start the main loop for the game.
	stats = GameStats(ai_settings, bomb, aliens, bullets)
	sb = Scoreboard(ai_settings, screen, stats)
	gf.create_fleet(ai_settings, screen, ship, aliens)

	while True:

		# Watch for keyboard and mouse events.
		gf.check_events(ai_settings, screen, stats, ship, bullets, lasercheat, aliens, nuke, play_button, bomb, wall, lift)
		if stats.game_active:
			ship.update()
			gf.update_aliens(ai_settings, stats, screen, ship, aliens, bomb, wall)
			ai_settings.counterpnts -= 1
			if ai_settings.counterpnts <=0:
				ai_settings.counterpnts = 60
				stats.score += 1
				sb.prep_score()
			bullets.update()
			bomb.update(aliens, ai_settings, screen)
		gf.update_screen(ai_settings, screen, stats, sb, ship, bullets, lasercheat, aliens, nuke, play_button, wall, bomb, lift, block)
		# Get rid of bullets that have disappeared.

		for bullet in bullets.copy():
			if bullet.rect.right >= 1200:
				bullets.remove(bullet)
		print(len(bullets))
Exemplo n.º 37
0
class WvmSpritesList():
    """A class listing all the Sprites of the game."""

    def __init__(self, config, screen):
        """Initialize the sprite list."""
        self.config = config
        self.screen = screen

        #initialize the sprites
        self.wiz = Wizard(config, self)
        self.monsters = Group()
        self.missiles = Group()

    def update_all(self):
        """Update the positions of all sprites."""
        self.update_missiles()
        self.wiz.update()
        self.monsters.update()

    def update_missiles(self):
        """update magic missiles positions"""
        self.missiles.update()
        # remove the missiles that have left the screen
        for mi in self.missiles.copy():
            if mi.rect.left >= self.screen.get_rect().right:
                self.missiles.remove(mi)

    def draw(self):
        self.screen.fill(self.config.bg_color)
        for mi in self.missiles:
            mi.draw_missile()
        self.wiz.blitme()
        for mo in self.monsters:
            mo.blitme()

    def fire_missile(self):
        """Fire a missile if limit not reached yet."""
        if len(self.missiles) < self.wiz.magic_missile_allowed:
            self.missiles.add(MagicMissile(self.config, self))

    def create_monster(self):
        """Create a new monster and place it randomly at the right."""
        monster=Monster(self.config, self)
        #TODO move the monster
        self.monsters.add(monster)
def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")
    ship = Ship(ai_settings, screen)
    bullets = Group()
    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        bullets.update()
        gf.update_screen(ai_settings, screen, ship, bullets)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        screen.fill(ai_settings.bg_color)
        ship.blitme()
        pygame.display.flip()
        bullets.update()
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))
Exemplo n.º 39
0
class EditorLevel(object):
  def __init__(self, editor, level_file=None):
    self.editor = editor
    self.font_manager = editor.font_manager

    if level_file is not None:
      (name, player_start, player_direction, board, enemies, powerups) = level_loader.load(level_file)
    else:
      player_start = None
      player_direction = None
      board = None
      enemies = []
      powerups = []

    self.board = Board(constants.HORIZONTAL_TILES, constants.VERTICAL_TILES)
    
    for x in xrange(0, constants.HORIZONTAL_TILES):
      for y in xrange(0, constants.VERTICAL_TILES):
        if board is None:
          if x == 0 or y == 0 or x == constants.HORIZONTAL_TILES - 1 or y == constants.VERTICAL_TILES - 1:
            tile = Tile("W", Point(x, y))
          else:
            tile = Tile("G", Point(x, y))
        else:
          tile = Tile(board.get_tile(x, y).type, Point(x, y))

        self.board.set_tile(x, y, tile) 
    self.tiles = OrderedUpdates([tile for tile in self.board])

    self.entities = Group()

    if player_start is not None:
      player_entity = Entity("PLAYER", editor_constants.ENTITY_DATA_MAP["PLAYER"], player_start, self.font_manager)
      player_entity.rotate(player_direction, 1)
      self.entities.add(player_entity)

    for (position, direction, waypoint_type, waypoints) in enemies:
      entity = Entity("ENEMY", editor_constants.ENTITY_DATA_MAP["ENEMY"], position, self.font_manager)
      entity.rotate(direction, 1)
      actual_waypoints = []
      for waypoint in waypoints:
        actual_waypoints.append(Entity("WAYPOINT", editor_constants.WAYPOINT_DATA, waypoint, self.font_manager))
      entity.waypoints.set_waypoints(actual_waypoints)
      self.entities.add(entity)

    for powerup in powerups:
      entity = Entity(powerup.type, editor_constants.ENTITY_DATA_MAP[powerup.type], powerup.position, self.font_manager)
      self.entities.add(entity)

    self.toolbars = Group()
    vertical_toolbar = VerticalToolbar(self, self.font_manager)
    self.toolbars.add(vertical_toolbar)

    self.player_exists = bool([entity for entity in self.entities if entity.name == "PLAYER"])
    self.entity_to_create = vertical_toolbar.selected.name
    self.mode = MODE_ADD

    self.rotating = False

    self.pending_actions = []
    self.action_stack = []
    self.undone_action_stack = []

    self.selected_entities = []
    self.waypoint_entity_selected = None      
  
  def add_action(self, action_type, *args):
    self.undone_action_stack = []
    self.pending_actions.append(action_type(self, *args))

  def get_entity(self, position):
    data = editor_constants.ENTITY_DATA_MAP[self.entity_to_create]
    return Entity(self.entity_to_create, data, position, self.font_manager)

  def add_entity(self, entity):
    if entity.name == "PLAYER":
      self.player_exists = True
    self.entities.add(entity)

  def remove_entity(self, entity):
    if entity.name == "PLAYER":
      self.player_exists = False
    self.entities.remove(entity)
    if entity in self.selected_entities:
      entity.select(False)
      self.selected_entities.remove(entity)
    
    if entity is self.waypoint_entity_selected:
      entity.select(False)
      self.waypoint_entity_selected = None

  def delete_selection(self):
    self.add_action(DeleteSelectionAction, list(self.selected_entities))

  def set_selection(self, entities):
    self.clear_selection()
    for entity in entities:
      if not entity in self.entities:
        raise Exception("Tried to select non-existent entity.")
      entity.select(True)
      self.selected_entities.append(entity)

  def clear_selection(self):
    for entity in self.selected_entities:
      entity.select(False)
    self.selected_entities = []

  def selection_click(self, entity, shift):
    if shift:
      if entity in self.selected_entities:
        entity.select(False)
        self.selected_entities.remove(entity)
      else:
        entity.select(True)
        self.selected_entities.append(entity)
    else:
      if entity in self.selected_entities:
        for entity in self.selected_entities:
          entity.select(False)
        self.selected_entities = []
      else:
        for other_entity in self.selected_entities:
          other_entity.select(False)
        entity.select(True)
        self.selected_entities = [entity]

  def left_click(self, position, pressed):
    for toolbar in self.toolbars:
      rect = pygame.Rect(toolbar.position, (toolbar.width, toolbar.height))
      if rect.collidepoint(position):
        toolbar.left_click(position, pressed)

    if self.mode == MODE_ADD:
      entity = self.get_entity(position)
      # make sure the entity doesn't intersect any others
      for other_entity in self.entities:
        if cd.sprite_collide(entity, other_entity):
          return
      # make sure the entity creation is in bounds
      if not sphere_in_bounds(position, entity.data.ratio / 2, editor_constants.EDITOR_AREA_BOUNDS):
        return
      if entity.name != "PLAYER" or not self.player_exists:
        self.add_action(AddEntityAction, entity)
    elif self.mode == MODE_SELECT:
      for entity in self.entities:
        if entity.contains_point(position):
          ctrl = (pressed[pygame.K_LCTRL] or pressed[pygame.K_RCTRL])
          self.selection_click(entity, ctrl)
          break
    elif self.mode == MODE_TILE:
      for tile in self.tiles:
        if cd.sprite_contains(tile, position.scale(constants.TILE_SIZE)):
          tile.toggle_type()
    elif self.mode == MODE_WAYPOINT:
      ctrl = (pressed[pygame.K_LCTRL] or pressed[pygame.K_RCTRL])
      if ctrl:
        if self.waypoint_entity_selected is not None:
          self.add_action(AddWaypointAction, self.waypoint_entity_selected, Entity("WAYPOINT", editor_constants.WAYPOINT_DATA, position, self.font_manager))
      else:
        for entity in self.entities:
          if entity.name == "ENEMY" and entity.contains_point(position):
            if self.waypoint_entity_selected is not None:
              self.waypoint_entity_selected.select(False)
            self.waypoint_entity_selected = entity
            entity.select(True)

  def switch_mode(self):
    if self.mode == MODE_ADD:
      self.mode = MODE_SELECT
    elif self.mode == MODE_SELECT:
      self.clear_selection()
      self.mode = MODE_WAYPOINT
    elif self.mode == MODE_WAYPOINT:
      if self.waypoint_entity_selected is not None:
        self.waypoint_entity_selected.select(False)
      self.waypoint_entity_selected = None
      self.mode = MODE_TILE
    elif self.mode == MODE_TILE:
      self.mode = MODE_ADD
    print self.mode

  def start_rotation(self, key):
    self.rotating = True
    self.total_rotation = 0
    for entity in self.selected_entities:
      entity.rotating = True
      entity.rotation_sign = (1 if key == pygame.K_RIGHT else -1)
    self.rotation_key = key

  def stop_rotation(self, key):
    self.rotating = False
    for entity in self.selected_entities:
      entity.rotating = False
    # directly append to action stack so that we 
    self.action_stack.append(RotateSelectionAction(self, self.selected_entities, self.total_rotation, (1 if key == pygame.K_RIGHT else -1)))

  def update(self, delta, events, pressed, mouse):
    if self.rotating:
      for event in events:
        if event.type == pygame.KEYUP and event.key == self.rotation_key:
          self.stop_rotation(event.key)
    else:
      for event in events:
        if event.type == pygame.KEYDOWN and (event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT) and event.mod & pygame.KMOD_CTRL and self.mode == MODE_SELECT and self.selected_entities:
          self.start_rotation(event.key)
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_m:
          self.switch_mode()
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_DELETE and self.mode == MODE_SELECT:
          self.delete_selection()
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_DELETE and self.mode == MODE_WAYPOINT:
          if self.waypoint_entity_selected is not None:
            self.add_action(DeleteWaypointsAction, self.waypoint_entity_selected)
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_y and event.mod & pygame.KMOD_CTRL:
          if self.undone_action_stack:
            action = self.undone_action_stack.pop()
            action.undo = False
            self.pending_actions.append(action)
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_z and event.mod & pygame.KMOD_CTRL:
          if self.action_stack:
            action = self.action_stack.pop()
            action.undo = True
            self.pending_actions.append(action)
        elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
          self.left_click(Point(event.pos[0], event.pos[1]).scale(1.0 / constants.TILE_SIZE), pressed)
        elif event.type == pygame.KEYDOWN:
          for toolbar in self.toolbars:
            toolbar.hotkey(event.key)

    for action in self.pending_actions:
      action.do()
      if action.undo:
        self.undone_action_stack.append(action)
      else:
        self.action_stack.append(action)
    self.pending_actions = []

    if self.rotating:
      self.total_rotation += 2 * math.pi * (delta / 1000.0)

    self.entities.update(delta)

  def draw(self, screen):
    self.tiles.draw(screen)
    self.entities.draw(screen)
    if self.waypoint_entity_selected is not None:
      self.waypoint_entity_selected.draw(screen)
    self.toolbars.draw(screen)
    for toolbar in self.toolbars:
      toolbar.draw(screen)
Exemplo n.º 40
0
class Level(object):
    fg_color = 0, 0, 0
    jungle = load_image("tilegrass.png")
    cliff = load_image("tilecliff.png")
    lab = load_image("tilemetal.png")

    def __init__(self):
        self.pups = Group()
        self.tiles = Group()

    def reset(self):
        self.__init__()

    def update(self):
        for pup in self.pups:
            if pup.state == 0 or pup.state == 3:
               self.pups.remove(pup)
               self.tiles.add(pup)
        for pup in self.tiles:
            if pup.state == 1 or pup.state == 2:
                self.tiles.remove(pup)
                self.pups.add(pup)

    def draw_hud(self, screen, player):
        bounds = screen.get_rect()
        pixfont = "./data/fonts/pixelated.ttf"
        self.player = player

        file_in = open("score.txt","r")
        for line in file_in:
            self.score = str(line)
        self.currentscore = self.score

        self.display_score = int(self.currentscore) + int(self.player.scorenum)            
        font = pygame.font.Font(pixfont, 15)
       
        self.scoredisplay = font.render(("SCORE:"+" "+str(self.display_score)), True, self.fg_color)
        rect = self.scoredisplay.get_rect()
        rect.center = bounds.centerx - 360, bounds.centery - 160
        screen.blit(self.scoredisplay, rect)
        
        if self.wlimit > 0: 
            self.whistles = font.render(("WHISTLES:"+" "+str(self.wlimit - self.player.whistlecount)), True, self.fg_color)
            rect = self.whistles.get_rect()
            rect.center = bounds.centerx + 340, bounds.centery - 140
            screen.blit(self.whistles, rect)

        if self.tlimit > 0:
            self.treats = font.render(("TREATS:"+" "+str(self.tlimit - self.player.treatcount)), True, self.fg_color)
            rect = self.treats.get_rect()
            rect.center = bounds.centerx + 350, bounds.centery - 160
            screen.blit(self.treats, rect)

    def draw(self, screen, player):
        bounds = screen.get_rect()
        if self.type == "jungle":
            self.bg = load_image("junglebg1.png")
        elif self.type == "cliff":
            self.bg = load_image("cliffbg.png")
        elif self.type == "lab":
            self.bg = load_image("labbg.png")
        rect = self.bg.get_rect()
        rect.center = bounds.centerx, bounds.centery
        screen.blit(self.bg, rect)
Exemplo n.º 41
0
Arquivo: event.py Projeto: alecain/one
class EventLoop(object):
    def __init__(self):
        self.objs = {}
        self.events = []
        self.render = RenderUpdates()
        self.projectiles = Group()
        self.enemies = Group()
        self.you = None
        self.bg_sprite = BGSprite(pygame.display.get_surface())

        # Since we don't care about MOST EVENTS
        pygame.event.set_allowed(None)
        pygame.event.set_allowed([ MOUSEBUTTONDOWN, KEYDOWN, QUIT, UPDATEEVENT, SPAWNEVENT ])

    def add_object(self, obj, type=""):
        if isinstance(obj, HandlesEvents):
            if obj.events == ALL:
                try:
                    self.objs[ALL].append(obj)
                except KeyError:
                    self.objs[ALL] = [ obj ]
            else:
                for event in obj.events:
                    try:
                        self.objs[event].append(obj)
                    except KeyError:
                        self.objs[event] = [ obj ]
        if isinstance(obj, Sprite):
            self.render.add(obj)
            if type == "enemy":
                self.enemies.add(obj)
            if type == "projectile":
                self.projectiles.add(obj)
            if type == "you":
                self.you = obj

    def rm_object(self, obj):
        for key in self.objs.keys():
            self.render.remove(obj)
            if obj in self.objs[key]:
                self.objs[key].remove(obj)
            if self.projectiles.has(obj):
                self.projectiles.remove(obj)
            if self.enemies.has(obj):
                self.enemies.remove(obj)
            print "Removed {0}".format(obj)

    def enqueue(self, event):
        if isinstance(event, Event):
            return self.events.append(event)
        elif isinstance(event, list):
            return [ self.enqueue(ev) for ev in event ]

    def tick(self):
        try:
            event = self.events.pop()
        except IndexError:
            event = None

        if event is not None:
            if isinstance(event, TargettedEvent):
                event.get_target().handle_event(event)
                for obj in self.objs[ALL]:
                    obj.handle_event(event)
            else:
                for obj in self.objs[type(event)] + self.objs[ALL]:
                    if obj.handles_event(event):
                        obj.handle_event(event)


        if random.randint(0, 10000000) == 26:
            return win()
        if random.randint(0, 10000000) == 26:
            return lose()

        py_events = map(lambda event: PygameEvent(event), pygame.event.get())
        for py_event in py_events:
            for obj in reduce(lambda obj_list, obj: obj_list + obj, map(lambda key: self.objs[key], filter(lambda handler_type: issubclass(handler_type, PygameEvent) if handler_type != ALL else False, self.objs.keys())), []):
                if obj.handles_event(py_event):
                    obj.handle_event(py_event)
Exemplo n.º 42
0
class Game:
    
    
    
    def __init__(self, screen):
        self.screen = screen
        self.map_screen = self.screen.subsurface(0, 0, MAP_WIDTH, MAP_HEIGHT)
        #pygame.display.set_icon(pygame.image.load(os.path.join("images", "ui","icon.png")))
        
        self.loaded_maps = {}
        self.current_map = None
        
        pygame.mouse.set_visible(1);        
        
        self.hasKey = False
        self.animalsFreed = False
        
        self.soundUtil = SoundUtil()
        self.soundUtil.sound_on = True
        
        self.pauseMenu = PauseScreen(self)
        
        self.cursor = Sprite()
        self.cursor.rect = Rect(0,0,1,1)
        
        self.hud = Hud(self)
        
        self.player_group = Group()
        self.player = Taz(image_util.load_image("tasmanian.png"), 1, 1, self)
        self.player.inUse = True
        self.player.current_image = self.player.image
        
        self.hud.set_player(self.player)
        
        self.last_rendered_achievement = 0
        self.achievement_countdown = 0
        
        self.clock = pygame.time.Clock()
        self.achievements_done = []
        
        self.pressed = []
        for key in pygame.key.get_pressed():
            self.pressed.append( True )
            
        self.loadLevel("jail.txt")
        
        self.isGameOver = False
        self.returnToMainMenu = False
        
    def reset(self):
        self.player_group.remove(self.player)
        self.current_map.game_objects.remove(self.player)
        self.player = self.player.newPlayer()
        self.player.inUse = True
        self.player.current_image = self.player.image
        self.pressed = []
        for key in pygame.key.get_pressed():
            self.pressed.append( False )
            
        self.loadLevel("jail.txt")
        self.player.x = TILE_SIZE
        self.player.y = TILE_SIZE
        self.player.rect.left = self.player.x + self.player.left_offset
        self.player.rect.top = self.player.y + self.player.top_offset
    
    def loadLevel(self, file):
        self.pressed = []
        for key in pygame.key.get_pressed():
            self.pressed.append( False )
        
        if file in self.loaded_maps:
            self.current_map = self.loaded_maps[file]
            self.current_map.reset()
        else:
            self.current_map = Map(file, self.screen, self)
            self.loaded_maps[file] = self.current_map
            self.current_map.intialize()
    
    def change_maps(self, dest, x, y):
        if self.player.isInCar:
            self.current_map.game_objects.remove(self.player.car)
            self.current_map.not_player.remove(self.player.car)
        
        self.loadLevel(dest)
        self.player.x = x * TILE_SIZE
        self.player.y = y * TILE_SIZE
        self.player.rect.left = self.player.x + self.player.left_offset
        self.player.rect.top = self.player.y + self.player.top_offset
        
        if self.player.isInCar:
            if isinstance(self.player.car, ImperviousCar):
                self.player.car = Car(None,0,0,self)
                self.player.car.driver = self.player
                self.player.car.driving = True
            self.player.car.x = x * TILE_SIZE
            self.player.car.y = y * TILE_SIZE
            self.player.car.rect.left = self.player.car.x
            self.player.car.rect.top = self.player.car.y
            self.player.car.avoidMapLinks()
            self.current_map.game_objects.add(self.player.car)
        elif self.player.isInTree:
            self.player.getOutOfTree()
            self.player.x = TILE_SIZE
            self.player.y = TILE_SIZE
            self.player.rect.left = self.player.x + self.player.left_offset
            self.player.rect.top = self.player.y + self.player.top_offset
    
    def change_player(self, newPlayer):
        self.player.inUse = False
        self.player.leave_car()
        self.current_map.game_objects.add(self.player)
        self.player = newPlayer;
        self.player.inUse = True
        self.player.current_image = self.player.image
        self.hud.set_player(self.player)
    
    def free_all_animals(self):
        self.free_animal("Koala")
        self.free_animal("Tasmanian Devil")
        self.free_animal("Kangaroo")
        self.free_animal("Brown Snake")
        self.free_animal("Dingo")
    
    def free_animal(self, animal_name):
        animals_freed[animal_name] = image_util.load_image(animal_info.info[animal_name][3])
        self.hud.draw()
        if len(animals_freed) is 5 and self.animalsFreed is False:
            cutscene = Cutscene(self, "escape the zoo", \
                                 [image_util.load_image(os.path.join("cutscenes","escape_the_zoo.png"))], \
                                 image_util.load_sliced_sprites(210, 80, os.path.join("cutscenes","press_enter.png")));
            cutscene.fire(self.player)
            self.animalsFreed = True
    
    def gameloop(self):
        self.returnToMainMenu = False
        self.hud.draw()
        while self.returnToMainMenu is False:
            self.clock.tick(60)
            self.get_input()
            self.update_state()
            self.draw()
        print "GAME ENDING!"
            
    
    def achievement(self):
        killed = self.hud.visitors_killed
        if killed >= 1000 and 1000 not in self.achievements_done:#not killed == self.last_rendered_achievement:
            #self.last_rendered_achievement = killed
            self.achievements_done.append(1000)
            self.achievement_image = image_util.load_image("achievement_1000.png")
            self.achievement_countdown = 200
        elif killed >= 500 and 500 not in self.achievements_done:## and not killed == self.last_rendered_achievement:
            self.achievements_done.append(500)
            #self.last_rendered_achievement = killed
            self.achievement_image = image_util.load_image("achievement_500.png")
            self.achievement_countdown = 200
        elif killed >= 100 and 100 not in self.achievements_done:## and not killed == self.last_rendered_achievement:
            self.achievements_done.append(100)
            #self.last_rendered_achievement = killed
            self.achievement_image = image_util.load_image("achievement_100.png")
            self.achievement_countdown = 200
        elif killed >= 10 and 10 not in self.achievements_done:## and not killed == self.last_rendered_achievement:
            self.achievements_done.append(10)
            #self.last_rendered_achievement = killed
            self.achievement_image = image_util.load_image("achievement_10.png")
            self.achievement_countdown = 200
        
        
        if self.achievement_countdown > 0:
            self.screen.blit(self.achievement_image, (250,100))
            self.achievement_countdown -= 1
    
    def get_input(self):
        self.getEvents()
        self.getButtonPresses()
        return
    
    def getEvents(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit()
    
    def getButtonPresses(self):
        keys = pygame.key.get_pressed()

        # quit
        if(keys[K_ESCAPE]):
            if not self.pressed[K_ESCAPE]:
                self.pressed[K_ESCAPE] = True
                self.pauseMenu.loop()
                #figure out what we wanted to do
                if self.pauseMenu.index is CONTINUE:
                    self.hud.draw()
                elif self.pauseMenu.index is MAIN_MENU:
                    self.returnToMainMenu = True
        else:
            self.pressed[K_ESCAPE] = False
    
        # attack
        if(keys[K_SPACE]):
            if not self.pressed[K_SPACE]:
                self.pressed[K_SPACE] = True
                self.player.attack()
        else:
            self.pressed[K_SPACE] = False
    
        # use ability
        if(keys[K_RETURN]):
            if not self.pressed[K_RETURN]:
                self.pressed[K_RETURN] = True
                self.player.use_ability()
        else:
            self.pressed[K_RETURN] = False
            
        # use ability
        if(keys[K_F1]):
            if not self.pressed[K_F1]:
                self.pressed[K_F1] = True
                self.free_all_animals()
        else:
            self.pressed[K_F1] = False
    
        # get into and out of car
        if(keys[K_q]):
            if not self.pressed[K_q]:
                self.pressed[K_q] = True
                self.player.use_object()
        else:
            self.pressed[K_q] = False
        
        # move
        if(keys[K_w]):
            if not self.pressed[K_w]:
                self.player.move(0, -1)
        else:
            self.pressed[K_w] = False
    
        if(keys[K_s]):
            if not self.pressed[K_s]:
                self.player.move(0, 1)
        else:
            self.pressed[K_s] = False
            
        if(keys[K_a]):
            if not self.pressed[K_a]:
                self.player.move(-1, 0)
        else:
            self.pressed[K_a] = False
            
        if(keys[K_d]):
            if not self.pressed[K_d]:
                self.player.move(1, 0)
        else:
            self.pressed[K_d] = False
        
        if(keys[K_UP]):
            if not self.pressed[K_UP]:
                self.player.move(0, -1)
        else:
            self.pressed[K_UP] = False
    
        if(keys[K_DOWN]):
            if not self.pressed[K_DOWN]:
                self.player.move(0, 1)
        else:
            self.pressed[K_DOWN] = False
            
        if(keys[K_LEFT]):
            if not self.pressed[K_LEFT]:
                self.player.move(-1, 0)
        else:
            self.pressed[K_LEFT] = False
            
        if(keys[K_RIGHT]):
            if not self.pressed[K_RIGHT]:
                self.player.move(1, 0)
        else:
            self.pressed[K_RIGHT] = False
        
        if(keys[K_o]):
            if not self.pressed[K_o]:
                self.pressed[K_o] = True
                if self.soundUtil.sound_on:
                    self.soundUtil.sound_on = False
                else:
                    self.soundUtil.sound_on = True
        else:
            self.pressed[K_o] = False
            
            
    def update_state(self):
        if self.current_map is not None:
            self.current_map.update_objects()
            
        for p in self.player_group:
            p.update()
    
    def draw_without_flip(self):
        self.map_screen.fill((0,0,0))
        if self.current_map is not None:
            self.current_map.draw_tiles()
            self.current_map.draw_objects()
        
        #for p in self.player_group:
        #    p.draw()
        self.player.draw()
        self.achievement()
    
    def draw(self):
        self.draw_without_flip()
        for cutscene in self.current_map.start_cutscenes:
            self.current_map.start_cutscenes.remove(cutscene)
            cutscene.fire(self.player)
        pygame.display.flip()
Exemplo n.º 43
0
class TrySprite(DirtySprite):
    """ A sprite class with all the needed things for try-engine.

    TrySprite subclasses pygame.sprite.DirtySprite. It adds
    some mandatory attributes as col_rect and adds a few methods
    to control the render order.

    It also has a host-guest sprite thingy that makes sure the host sprite
    is updated before the guests sprites. You can attach sprites to sprites
    and it will look nice.

    TrySprites adds the rects: col_rect, i_rect, feet_rect
    dirty_rect, col_rect_left, col_rect_right

    TODO: This is probably outdated!
    The dirty attribute does NOT mean the same as in pygame. The
    meaning is:
     0 = The srpite has been drawn in this frame
     1 = hasn't been drawn in this frame yet
     2 = nothing at the moment

    """
    def __init__(self, img, x, y, col_rect):
        DirtySprite.__init__(self)
        self.image = img
        self.rect = Rect((x,y),self.image.get_rect()[2:])

        self.visible = 1
        self.dirty = 1

        # Directions in which this sprite collide
        self.col_direction = (True, True, True, True)
        
        # Has this sprite sprites attached to him? or the opposite
        # If this is used the guest sprite will be always updated
        # after the host sprite.
        self.guest = False
        self.guests = Group()
        self.host = None

        # Create all the needed rects:
        self.init_rects(self.rect, col_rect)
        
        # Init mask
        self.init_masks()
        
        # if True will print lots of debugging stuff
        self.debugging = False

    def init_rects(self, rect, col_rect):
        """ Create all the rects needed for the sprite
        
        Creates: collision rect, feet rect, interpolation rect, 
        dirty rect and collision mask.

        """
        # List holding all the rects, allow for fast iteration 
        # over all the rects
        self.rect_list = rl = []
        rl.append(self.rect)
        
        # Rect used for collisions
        self.col_rect = col_rect.copy().move(rect[:2])
        rl.append(self.col_rect)
        
        # Used to know where was the last interpolated position
        # TODO: do we use this????
        self.i_rect = rect.copy()
        rl.append(self.i_rect)
        
        # Rect to clear this sprite when drawing
        self.dirty_rect = rect.copy()
        rl.append(self.i_rect)

        # Create a rect representing the feet
        self.feet_rect = self.create_feet()
        rl.append(self.feet_rect)
        
        # Create left and right collision rects
        self.col_rect_left, self.col_rect_right = self.create_left_right()
        rl.append(self.col_rect_left)
        rl.append(self.col_rect_right)

    def create_feet(self):
        """ Creates a pygame Rect that will represent the feet. """
        
        cr = self.col_rect
        # One pixel height rect at the feet, overlapping the col_rect
        # PLEASE NOTE: Any additional rect used for collisions needs to
        # be contained by col_rect, if not bad things happens (colision
        # is detected by one rect but no the other and both are used in
        # orther to collide with all the platforms). That is way the
        # -1 is needed in cr.bottom.
        return Rect(cr.left, cr.bottom - 1, cr.width, 1)
        
        # TODO: This has a problem with col_rects the same size as the
        # normal rect

    def create_left_right(self):
        """ Creates two rects each one being a half of col_rect.
        
        These rects are used to detect which side of the sprites
        touches something.
        """
        
        cr = self.col_rect
        col_rect_left = Rect(cr.left, cr.top, cr.width /2 , cr.height)
        col_rect_right = Rect(cr.left + cr.width/2, cr.top,  cr.width /2, cr.height)
        
        return col_rect_left, col_rect_right

    def init_masks(self):
        """ Init the mask for the sprite. 

        NOTE: any additional rect created must be, in general, inside
        of col_rect. That way collisions will work properly
        
        """
        
        # Create a mask with the image
        # TODO, NOTE TO SELF: The mask will use the first frame
        # in the animation! ALWAYS
        self.mask = mask.from_surface(self.image)
        #~ self.view_mask()

        # Feet mask
        self.feet_mask = mask.Mask((self.rect.width, 1))
        h = self.rect.height
        s_at = self.feet_mask.set_at
        g_at = self.mask.get_at
        for x in xrange(self.rect.width):
            if g_at((x, h - 1)):
                s_at((x, 0), 1)

    #~ @property
    #~ def dirty(self):
        #~ return self._dirty
    #~ 
    #~ @dirty.setter
    #~ def dirty(self, value):
        #~ if self.dirty == 1:
            #~ old = self.dirty_rect
        #~ else:
            #~ old = self.rect
        #~ self.dirty_rect  = old.union(self.rect)
        #~ self._dirty = value

    def add_guest(self, sprite):
        """ Add a guest sprite to this sprite.
        
        The guest sprite will be updated after the host.
         """
         
        self.guests.add(sprite)
        sprite.guest = True
        sprite.host = self
    
    def remove_guest(self, sprite):
        """ Remove a guest sprite to this sprite. """
         
        self.guests.remove(sprite)
        sprite.guest = False
        sprite.host = None

    def add_host(self, sprite):
        """ Add a host for this sprite.
        
        This sprite will be updated after the host sprite.
        """
        self.host = sprite
        self.guest = True
        sprite.guests.add(self)
        
    def remove_host(self):
        """ Remove a host from this sprite. """
        self.host.guests.remove(self)
        self.host = None
        self.guest = False

    def one_layer_down(self):
        """ Moves the sprite one layer down in the render group. 
        
        This will make the sprite be seen below other sprites
        in the same group.

        """
        for g in self.groups():
            if isinstance(g, TryGroup):
                g.one_layer_down(self)

    def one_layer_up(self):
        """ Moves the sprites one layer up in the render group.
        
        This will make the sprite be seen over other sprites
        in the same group.
        
        """

        for g in self.groups():
            if isinstance(g, TryGroup):
                g.one_layer_up(self)

    def move_ontop(self, ref_sprite):
        """ Move this sprite just on top of ref_sprite in render order. """

        for g in self.groups():
            if isinstance(g, TryGroup):
                g.ref_render_order_change(ref_sprite, self, 0)

    def move_below(self, ref_sprite):
        """ Move this sprite just below of ref_sprite in render order. """

        for g in self.groups():
            if isinstance(g, TryGroup):
                g.ref_render_order_change(ref_sprite, self, 1)

    def properly_add_ontop(self, sprite):
        """ Add a new sprite on top of this one.
        
        sprite will be added to all the groups in which self is
        and when in render groups, it will be added on top of 
        self.

        """
        for g in self.groups():
            if isinstance(g, TryGroup):
                g.add_ontop(self, sprite)
            else:
                g.add(sprite)

    def properly_add_below(self, sprite):
        """ Add a new sprite below of this one.
        
        sprite will be added to all the groups in which self is
        and when in render groups, it will be added below of 
        self.

        """
        for g in self.groups():
            if isinstance(g,TryGroup):
                g.add_below(self, sprite)
            else:
                g.add(sprite)

    def change_sprite_pos(self, x, y):
        """ Changes the sprite position to x, y.

        Move all the needed rects to the new x, y position.

        """

        rect = self.rect
        dx, dy = x - rect.left, y - rect.top
        self.move_sprite(dx, dy)

    def move_sprite(self, delta_x, delta_y):
        """ Changes the sprite position by delta_x, delta_y.

        Move all the needed rects by delta_x, delta_y

        """

        rect = self.rect.copy()
        dirty_rect = self.dirty_rect

        # TODO: with movements mods this is probably outdated.
        # All movement is made at the same moment.
        # Note to self: This if-else is needed to clean old sprite
        # positions when two movements are done in the same frame, 
        # for example, teleporting/respawning
#         if self.dirty == 1:
#             old = dirty_rect
#         else:
#             old = rect
        old = rect

        # Move rects
        [r.move_ip(delta_x, delta_y) for r in self.rect_list]

        # Update dirty stuff
        self.dirty_rect = old.union(rect)
        self.dirty = 1

    def move_sprite_float(self, delta_x, delta_y):
        """ Move the sprite a float amount

        Uses the integer part to move the sprite and stores
        the float part in a variable.
        """

        self.fx += delta_x
        self.fy += delta_y

        self.fx, dx = modf(self.fx)
        self.fy, dy = modf(self.fy)

        # move rects
        self.move_sprite(dx, dy)

    def dprint(self,text):
        """ If debugging is True it will print debug text. """
        if self.debugging:
            print text

    def _view_mask(self):
        """ Prints the sprite mask to the terminal and exits

        For debugging purposes.
        """

        print self
        print "Printing mask and exiting."
        for y in xrange(self.mask.get_size()[1]):
            for x in xrange(self.mask.get_size()[0]):
                print self.mask.get_at((x,y)),
            print ""
        sys.exit(0)
Exemplo n.º 44
0
class ObstacleManager:

    obstacle_types = {Beer: 89,
                      Nyan: 2,
                      EnergyDrink: 3,
                      HealthPack: 4,
                      Vodka: 10
                      }
    obstacles = []
    counter = 0
    default_speed = 0

    def __init__(self, gameboard, speed, max_obstacles, collision_strategy_factory, player):
        self.max_obstacles = max_obstacles
        self.gameboard = gameboard
        self.width = gameboard.width
        self.height = gameboard.height
        self.speed = speed
        self.default_speed = speed
        self.obstacle_group = Group()
        self.collision_strategy_factory = collision_strategy_factory
        self.player = player

    def update(self, time_passed):
        delete_list = []

        for obstacle in self.obstacles:
            if obstacle.y > self.height:
                delete_list.append(obstacle)
            else:
                obstacle.update(time_passed)

        for obstacle in delete_list:
            self.obstacles.remove(obstacle)
            obstacle.kill()

    def blit(self):
        for obstacle in self.obstacles:
            obstacle.blit()

    def create_obstacle(self):
        if len(self.obstacles) <= self.max_obstacles:
            self.counter += 1
            if self.counter % 10 == 0:
                obstacle = self.__select_obstacle_type()(self.gameboard,
                                                         (random.randint(0, self.width), -40),
                                                         self.speed * (1 + (random.random()-0.5) * 0.2))

                self.obstacles.append(obstacle)
                self.obstacle_group.add(obstacle)

    def __select_obstacle_type(self):
        total = sum(w for c, w in self.obstacle_types.items())
        r = random.uniform(0, total)
        upto = 0
        for c, w in self.obstacle_types.items():
            if upto + w > r:
                return c
            upto += w

    def detect_collision(self):
        collisions = spritecollide(self.player, self.obstacle_group, True)

        for c in collisions:
            self.collision_strategy_factory.get_strategy(c).on_collision()
            self.obstacles.remove(c)
            c.kill()

    def accelerate_obstacles(self, speed):
        self.speed += speed
        if self.speed > 1.5:
            self.speed = 1.5

    def reset(self):
        self.speed = self.default_speed
        for obstacle in self.obstacles:
            obstacle.kill()
            self.obstacle_group.remove(obstacle)
        self.obstacles = []
Exemplo n.º 45
0
class LumberjackGame(Microgame):
    def __init__(self):
        # TODO: Initialization code here
        Microgame.__init__(self)
        self.jack = Man()
        self.count = 0
        self.mycount = pygame.font.SysFont("arial", 50, bold = True)
        self.left, self.left_rect = _load_image(join("games","Lumberjack","images","timberman_normalleft.png"), 105, 400)
        self.left_chop, self.leftc_rect = _load_image(join("games","Lumberjack","images","timberman_chopleft.png"), 130, 450)
        self.right, self.right_rect = _load_image(join("games","Lumberjack","images","timberman_normalright.png"), 500, 400)
        self.right_chop, self.rightc_rect = _load_image(join("games","Lumberjack","images","timberman_chopright.png"), 375, 450)
        self.stump = load(join("games","Lumberjack","images","stump.png"))
        self.sprites = Group(self.jack)
        self.background = load(join("games","Lumberjack","images","forest.png"))
        self.tree = Group(treeBlock(LEFT_POSITION, 550, 1))
  
    def start(self):
        # TODO: Startup code here
        music.load(join("games","Lumberjack","music","tree_song.ogg"))
        music.play()
        self.generateTree()

    def stop(self):
        # TODO: Clean-up code here
        music.stop()

    def generateTree(self):
        _ , min_y = self.tree.sprites()[len(self.tree.sprites()) - 1].rect.topleft
        cur_tree = 0
        for n in range(0, (len(self.tree.sprites()) - 1)):
            _ , y = self.tree.sprites()[n].rect.topleft
            if y < min_y:
                min_y = y
                cur_tree = n
        if min_y > 0 and min_y <= 550:
            tree_type = self.tree.sprites()[cur_tree].type
            if tree_type == 2:
                self.tree.add(treeBlock(LEFT_POSITION, (min_y - 140), randint(1,2)))
            elif tree_type == 0:
                self.tree.add(treeBlock(LEFT_POSITION, (min_y - 140), randint(0,1))) 
            else:
                self.tree.add(treeBlock(LEFT_POSITION, (min_y - 140), randint(0,2)))

    def updateTree(self, side):
        max_y = locals.HEIGHT
        cur_tree = 0
        for n in range(0, (len(self.tree.sprites()))):
            _ , y = self.tree.sprites()[n].rect.topleft
            if 550 == y:
                max_y = y
                cur_tree = n
        print max_y, self.tree.sprites()[cur_tree].type 
        if self.tree.sprites()[cur_tree].type == side:
            self.lose()
        else:
            self.tree.remove(self.tree.sprites()[cur_tree])
            #self.tree.update()
            for each in self.tree:
                each.update()

    def update(self, events):
        # TODO: Update code here
        self.sprites.update()
        self.generateTree()

        #Process user input
        sound_chop = pygame.mixer.Sound(join("games","Lumberjack","music","axe_chop.wav"))
        if self.jack.image == self.left_chop:
            self.jack.image = self.left
            self.jack.rect = self.left_rect
        elif self.jack.image == self.right_chop:
            self.jack.image = self.right
            self.jack.rect = self.right_rect
        for event in events:
            if event.type == KEYDOWN and event.key == K_LEFT:
                self.count += 1
                sound_chop.play()
                self.jack.image = self.left_chop
                self.jack.rect = self.leftc_rect
                self.updateTree(2)
            elif event.type == KEYDOWN and event.key == K_RIGHT:
                self.count += 1
                sound_chop.play()
                self.jack.image = self.right_chop
                self.jack.rect = self.rightc_rect
                self.updateTree(0)

    def render(self, surface):
        # TODO: Rendering code here
        surface.fill(Color(255, 255, 255))
        surface.blit(self.background, (0, 0), area = None, special_flags = 0)
        self.tree.draw(surface)
        surface.blit(self.stump, (318, 690), area = None, special_flags = 0)
        self.sprites.draw(surface)
        label = self.mycount.render(str(self.count), 1, (255, 255, 255))
        if self.count <= 9:
            surface.blit(label, (398, 200))
        else:
            surface.blit(label, (385, 200))

    def get_timelimit(self):
        # TODO: Return the time limit of this game (in seconds, 0 <= s <= 15)
        #raise NotImplementedError("get_timelimit")
        return 15
Exemplo n.º 46
0
class Game:
    
    def __init__(self, 
                 demo, 
                 birds, 
                 screen,
                 menu):
        self.demo = demo
        self.demo_timeout = 45000
        self.screen = screen
        self.ctrl = GameControl()
        self.clock = pygame.time.Clock()
        self.menu = menu
        self.menu.cursor_pos = 0
        
        if demo:
            pygame.mixer.music.load(media.random_silly_chip_song_file)
            pygame.mixer.music.play()
        else:
            pygame.mixer.music.load(media.Grey_Sector_v0_86_0_file)
            pygame.mixer.music.play(-1)
        
        self.bg_explode = 0
        self.bg_color = (0, 0, 0)
        
        self.ui = ui.UI()
        self.birds = []
        self.mainchar = GreenBird(self)
        self.birds.append(self.mainchar)
        
        bird2 = RedBird(self)
        self.birds.append(bird2)
        
        if birds >= 3:
            bird3 = PurpleBird(self)
            self.birds.append(bird3)
        
        if birds == 4:
            bird4 = CyanBird(self)
            self.birds.append(bird4)

        if demo:
            self.mainchar.brain = BirdBrain(self.mainchar, self.birds)
            
        bird2.brain = BirdBrain(bird2, self.birds)
        if birds >= 3:
            bird3.brain = BirdBrain(bird3, self.birds)
        if birds == 4:
            bird4.brain = BirdBrain(bird4, self.birds)
        
        self.bombs = Group()
        
        for b in self.birds:
            b.move.add(self.ui.tiles)
        
        self.lives = ui.LifeCounter(self.birds, self.screen)

    def start(self):
        while self.ctrl.keepPlaying:
            for e in pygame.event.get():
                if self.demo or self.menu.game_over:
                    self.manage_keys_demo(e)
                else:
                    self.manage_keys_normal(e)
                    
                if e.type == pygame.QUIT:
                    self.ctrl.keepPlaying = False
                    self.ctrl.quit = True
                    
            if self.ctrl.leftKeyDown:
                self.mainchar.moveleft(tick)
            if self.ctrl.rightKeyDown:
                self.mainchar.moveright(tick)
            if self.ctrl.upKeyDown:
                self.mainchar.thrust(tick)
            tick = self.clock.tick()
            
            if self.bg_explode > 0:
                if self.bg_explode % 2 == 0:
                    self.bg_color = (255, 255, 255)
                else:
                    self.bg_color = (0, 0, 0)
                self.bg_explode -= 1
            elif self.bg_explode == 1:
                self.bg_explode = 0
                self.bg_color = (0, 0, 0)
                
            self.screen.fill(self.bg_color)
            self.update(tick)
        
            pygame.display.update()
            pygame.time.delay(16)
        
        pygame.mixer.music.stop()
        
    def manage_keys_normal(self, e):
        if e.type == pygame.KEYDOWN:
            if e.key == pygame.K_a:
                self.ctrl.leftKeyDown = True
            elif e.key == pygame.K_d:
                self.ctrl.rightKeyDown = True
            elif e.key == pygame.K_w:
                self.ctrl.upKeyDown = True
        elif e.type == pygame.KEYUP:
            if e.key == pygame.K_a:
                self.ctrl.leftKeyDown = False
            elif e.key == pygame.K_d:
                self.ctrl.rightKeyDown = False
            elif e.key == pygame.K_w:
                self.ctrl.upKeyDown = False
            elif e.key == pygame.K_ESCAPE:
                self.ctrl.keepPlaying = False  
                self.ctrl.quit = True
            elif e.key == pygame.K_SPACE:
                self.mainchar.nuke()
    
    def manage_keys_demo(self, e):
        if e.type == pygame.KEYUP:
            if not self.menu.game_over:
                if e.key == pygame.K_1:
                    gl.RESIZE_FACTOR = 1
                    media.load_all_images()
                    self.ctrl.keepPlaying = False
                    self.ctrl.reset_demo = True
                elif e.key == pygame.K_2:
                    gl.RESIZE_FACTOR = 2
                    media.load_all_images()
                    self.ctrl.keepPlaying = False
                    self.ctrl.reset_demo = True
                elif e.key == pygame.K_3:
                    gl.RESIZE_FACTOR = 3
                    media.load_all_images()
                    self.ctrl.keepPlaying = False
                    self.ctrl.reset_demo = True
            if e.key == pygame.K_ESCAPE:
                self.ctrl.keepPlaying = False  
                self.ctrl.quit = True
            elif e.key == pygame.K_SPACE:
                if not self.menu.next_screen() or self.menu.game_over != 0:
                    self.ctrl.keepPlaying = False
            elif e.key == pygame.K_UP or e.key == pygame.K_w:
                self.menu.cursor_up()
            elif e.key == pygame.K_DOWN or e.key == pygame.K_s:
                self.menu.cursor_down()
    
    def add_bomb_event(self, bomb):
        self.bombs.add(bomb)
        bomb.explode_event = self.explode_event
        bomb.delete_bomb = self.delete_bomb
        
    def explode_event(self, bomb):
        self.bg_explode = 10

        distance = math.sqrt(
                             abs(bomb.rect.centerx - self.ui.tntcrate.rect.centerx)**2 +
                             abs(bomb.rect.centery - self.ui.tntcrate.rect.centery)**2)
        if distance <= 56 * gl.RESIZE_FACTOR:
            self.ui.tntcrate.explode(bomb.bird)
            
        for b in self.bombs:
            if b is bomb:
                continue
            distance = math.sqrt(
                                 abs(bomb.rect.centerx - b.rect.centerx)**2 +
                                 abs(bomb.rect.centery - b.rect.centery)**2)
            if distance <= 24 * gl.RESIZE_FACTOR and not b.exploded:
                b.explode()
                
        for b in self.birds:
            distance = math.sqrt(
                                 abs(bomb.rect.centerx - b.rect.centerx)**2 +
                                 abs(bomb.rect.centery - b.rect.centery)**2)

            if distance <= 24 * gl.RESIZE_FACTOR:
                b.kill()
                
    def delete_bomb(self, bomb):
        self.bombs.remove(bomb)
                
    def update(self, tick):
        for t in self.ui.bg:
            t.update(tick)
            self.screen.blit(t.image, pygame.rect.Rect(t.rect.x, t.rect.y, t.rect.w, t.rect.h))

        for t in self.ui.tiles:
            self.screen.blit(t.image, pygame.rect.Rect(t.rect.x, t.rect.y, t.rect.w, t.rect.h))
        
        for b in self.birds:
            b.update(tick)
            if b.counter_invincible <= 0 or not b.invisible:
                self.screen.blit(b.image, pygame.rect.Rect(b.rect.x, b.rect.y, b.rect.w, b.rect.h))
            b.invisible = not b.invisible
            
        for bomb in self.bombs:
            bomb.update(tick)
            self.screen.blit(bomb.image, pygame.rect.Rect(bomb.rect.x, bomb.rect.y, bomb.rect.w, bomb.rect.h))
            
            if bomb.attached:
                continue
            
            for b in self.birds:
                if b is bomb.bird or b.dead:
                    continue
                distance = math.sqrt(
                                     abs(bomb.rect.centerx - b.rect.centerx)**2 +
                                     abs(bomb.rect.centery - b.rect.centery)**2)                
                if distance <= 8 * gl.RESIZE_FACTOR:
                    bomb.explode()
                    
        if self.demo:
            self.menu.update(tick)
            self.demo_timeout -= tick
            if self.demo_timeout < 0:
                self.ctrl.keepPlaying = False
                self.ctrl.reset_demo = True
        else:
            self.lives.update(tick)
            if self.mainchar.lives == 0:
                self.menu.game_over = 1
                self.menu.update(tick)
            alives = 0
            for b in self.birds:
                if b.lives > 0:
                    alives += 1 
            if alives == 1 and self.mainchar.lives > 0:
                self.menu.game_over = 2
                self.menu.update(tick)
            elif alives == 0:
                self.menu.game_over = 3
                self.menu.update(tick)
Exemplo n.º 47
0
class Scoreboard:
    def __init__(self, game_settings, screen, stats):
        self.game_setting = game_settings
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.stats = stats

        self.text_color = (30, 255, 30)
        self.font = pygame.font.SysFont(None, 48)

        self.score_rect = None
        self.score_string = None
        self.score_image = None
        self.high_score_image = None
        self.high_score_rect = None
        self.level_rect = None
        self.level_image = None

        self.prep_score()
        self.prep_high_score()
        self.prep_level()

        self.ships = Group()

    def prep_score(self):
        rounded_score = int(round(self.stats.score, -1))
        self.score_string = "{:,}".format(rounded_score)
        self.score_image = self.font.render(self.score_string, True, self.text_color, self.game_setting.bg_color)

        self.score_rect = self.score_image.get_rect()
        self.score_rect.right = self.screen_rect.right - 20
        self.score_rect.top = 20

    def prep_high_score(self):
        high_score = int(round(self.stats.high_score, -1))
        high_score_string = "{:,}".format(high_score)
        self.high_score_image = self.font.render(high_score_string, True, self.text_color, self.game_setting.bg_color)

        self.high_score_rect = self.high_score_image.get_rect()
        self.high_score_rect.centerx = self.screen_rect.centerx
        self.high_score_rect.top = self.score_rect.top

    def prep_level(self):
        self.level_image = self.font.render(str(self.stats.level), True, self.text_color,
                                            self.game_setting.bg_color)

        self.level_rect = self.level_image.get_rect()
        self.level_rect.right = self.score_rect.right
        self.level_rect.top = self.score_rect.bottom + 10

    def prep_ships(self):
        for ship_number in range(self.stats.ships_left):
            ship = IconShip(self.game_setting, self.screen)
            ship.rect.x = 10 + ship_number * (ship.rect.width / 2)
            ship.rect.y = 10
            self.ships.add(ship)

    def remove_ships(self):
        self.ships.remove(self.ships, self)

    def show_score(self):
        self.screen.blit(self.score_image, self.score_rect)
        self.screen.blit(self.high_score_image, self.high_score_rect)
        self.screen.blit(self.level_image, self.level_rect)
        self.ships.draw(self.screen)