예제 #1
0
class Universe():
    def __init__(self, zoom_factor, zoom_speed, max_zoom, min_zoom, resolution,assignment):
        print "And God said, 'Let there be light,' and there was light. A new universe was created"
        self.stars = self.generate_starfield(8000, resolution[0]*max_zoom*2, resolution[1]*max_zoom*2)
        self.rockets = []
        self.explosions = []
        self.zoom_factor = zoom_factor
        self.zoom_speed = zoom_speed
        self.min_zoom_factor = min_zoom
        self.max_zoom_factor = max_zoom
        self.planet = "Not initialized"
        self.view_manager = Viewmanager()
        self.view_manager.add_view((10,10), (300, 200))
        self.init_view = False
        self.rocket_shot = False
        self.reset_view = False
        self.assignment = assignment
        self.level=int(1)
        self.fuel_used = 0.0
        self.can_shoot = False
        self.fuel_max = 0.0

        if assignment=="RUSSIAN":
            self.assignment="Destroy All Russian Satellites"
        if assignment=="AMERICAN":
            self.assignment="Destroy All American Satellites"
        if assignment=="EUROPEAN":
            self.assignment="Destroy All European Satellites"
        if assignment=="LANDER":
            self.assignment="Destroy the Lander(s)"
        if assignment=="ROCK":
            self.assignment="Destroy All Space Rocks"
        if assignment=="ALIEN":
            self.assignment="Destroy All Alien Spacecrafts"

    def get_zoom_factor(self):
        return self.zoom_factor

    def create_planet(self, name, mass, radius, rot_speed, sprite):
        self.planet = Planet(self, name, mass, radius, rot_speed, (0,0), sprite)

    def create_launcher(self, *l):
        self.planet.create_launcher(*l)

    def create_satellite(self, distance, direction, angle, nationality, name):
        self.planet.create_satellite(distance, direction, angle, nationality, name)

    def get_planet(self):
        return self.planet

    def get_can_shoot(self):
        return self.can_shoot

    def set_can_shoot(self, b):
        self.can_shoot = b

    def change_level(self,i):
        self.level=i

    def add_fuel(self, df):
        self.fuel_used+=df

    def get_fuel_used(self):
        return self.fuel_used

    def get_fuel_max(self):
        return self.fuel_max

    def change_fuel_max(self,a):
        self.fuel_max=a

    def get_all_satellites(self):
        return self.planet.get_satellites()

    def get_satellites(self):
        if self.assignment=="Destroy All Russian Satellites":
            return self.planet.get_russian_satellites()
        if self.assignment=="Destroy All American Satellites":
            return self.planet.get_american_satellites()
        if self.assignment=="Destroy All European Satellites" or self.assignment=="Destroy the Lander(s)":
            return self.planet.get_european_satellites()
        if self.assignment=="Destroy All Space Rocks":
            return self.planet.get_rock_satellites()
        if self.assignment=="Destroy All Alien Spacecrafts":
            return self.planet.get_alien_satellites()

    def get_all_satellites(self):
        return self.planet.get_satellites()

    def get_rockets(self):
        return self.rockets

    def get_launcher(self):
        return self.planet.get_launcher()

    def get_assignment(self):
        return self.assignment

    def launch_rocket(self, pos, dir, angle, initial_speed, rocket_fuel, spr1, spr2):
        self.rockets.append(Rocket(self, pos, dir, angle, initial_speed, 1e3, 200e3, rocket_fuel, spr1, spr2))
        self.rocket_shot = True

    def get_gravity(self, pos):
        return self.planet.get_gravity(pos)

    def check_collisions(self):
        for r in self.rockets:
            if check_collision(self.planet.get_pos(), r.get_pos(), self.planet.get_radius()-10):
                self.destruct_rocket(r, r)
                break
            for s in self.planet.get_satellites():
                if check_collision(r.get_pos(), s.get_pos(), 20):
                    self.destruct_rocket(r, s)
                    self.planet.remove_satellite(s)
                    break

    def destruct_rocket(self, r, object):
        self.reset_view = True
        r.explode()
        self.reset_view = True
        self.explosions.append(Explosion(r.get_pos(), 0.04, object.get_nationality()))
        self.rockets.remove(r)
        self.planet.load_rocket()

    def draw(self, screen):
        if not self.init_view:
            self.view_manager.set_target(0, self.planet.get_launcher(), screen)
            self.init_view = True

        if self.rocket_shot:
            self.view_manager.set_target(0, self.rockets[-1], screen)
            self.rocket_shot = False

        if self.reset_view:
            self.view_manager.set_target(0, self.get_launcher(), screen)
            self.reset_view = False

        if pygame.mouse.get_pressed()[2]:
            for satellite in self.planet.get_satellites():
                s_pos = to_ints(to_screen(scale_pos(satellite.get_pos(), self.zoom_factor)))
                if get_distance_between(s_pos, pygame.mouse.get_pos()) < 30*self.zoom_factor:
                    self.view_manager.set_target(0, satellite, screen)
            for rocket in self.planet.get_rockets():
                rocket_pos = to_ints(to_screen(scale_pos(rocket.get_pos(), self.zoom_factor)))
                if get_distance_between(rocket_pos, pygame.mouse.get_pos()) < 30*self.zoom_factor:
                    self.view_manager.set_target(0, rocket, screen)
            launcher = self.get_launcher()
            launcher_pos = to_ints(to_screen(scale_pos(launcher.get_pos(), self.zoom_factor)))
            if get_distance_between(launcher_pos, pygame.mouse.get_pos()) < 30*self.zoom_factor:
                self.view_manager.set_target(0, launcher, screen)
            planet_pos = to_ints(to_screen(scale_pos(self.planet.get_pos(), self.zoom_factor)))
            if get_distance_between(planet_pos, pygame.mouse.get_pos()) < 30*self.zoom_factor:
                self.view_manager.set_target(0, self.planet, screen)

        self.draw_stars(screen, self.stars)
        self.planet.draw(screen, self.zoom_factor)
        for rocket in self.rockets:
            rocket.draw(screen, self.zoom_factor)
        for explosion in self.explosions:
            explosion.draw(screen, self.zoom_factor)

        self.view_manager.draw(screen, self.planet, self.rockets, 1.25)

    def draw_stars(self, screen, list):
        resolution = (screen.get_rect().width, screen.get_rect().height)
        i=0
        for pos in list:
            i+=1
            if(i%3)==0:
                draw_pos = to_screen(scale_pos(pos, self.zoom_factor))
                if draw_pos[0] > -10 and draw_pos[0] < resolution[0]+10 and\
                    draw_pos[1] > -10 and draw_pos[1] < resolution[1]+10:
                    pygame.gfxdraw.filled_circle(screen, int(draw_pos[0]), int(draw_pos[1]), 1, (200,0,0))
            if(i%3)==1:
                draw_pos = to_screen(scale_pos(pos, self.zoom_factor))
                if draw_pos[0] > -10 and draw_pos[0] < resolution[0]+10 and\
                    draw_pos[1] > -10 and draw_pos[1] < resolution[1]+10:
                    pygame.gfxdraw.filled_circle(screen, int(draw_pos[0]), int(draw_pos[1]), 1, (0,0,200))
            if(i%3)==2:
                draw_pos = to_screen(scale_pos(pos, self.zoom_factor))
                if draw_pos[0] > -10 and draw_pos[0] < resolution[0]+10 and\
                    draw_pos[1] > -10 and draw_pos[1] < resolution[1]+10:
                    pygame.gfxdraw.filled_circle(screen, int(draw_pos[0]), int(draw_pos[1]), 1, (255,255,255))

    def update(self, dt):
        self.check_collisions()
        self.planet.update(dt)
        for rocket in self.rockets:
            rocket.update(dt)
        for explosion in self.explosions:
            explosion.update(dt)
            if explosion.is_done():
                self.explosions.remove(explosion)

    def pass_event(self, event):
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 4:
                self.zoom_factor *= self.zoom_speed
                if self.zoom_factor > self.max_zoom_factor:
                    self.zoom_factor = self.max_zoom_factor
            if event.button == 5:
                self.zoom_factor /= self.zoom_speed
                if self.zoom_factor < self.min_zoom_factor:
                    self.zoom_factor = self.min_zoom_factor
        self.planet.pass_event(event)
        for rocket in self.rockets:
            rocket.pass_events(event)





    def generate_starfield(self, n, width, height):
        star_list = []
        for i in xrange(n):
            tempX = random.randrange(-width, width, 1)
            tempY = random.randrange(-height, height, 1)
            pos = (int(tempX), int(tempY))
            star_list.append(pos)
        return star_list