Пример #1
0
    def update(self, dt):
        self.player.update(dt)
        self.wolves.update(dt)
        player_hits = pg.sprite.spritecollide(self.player, self.trees,
                    False, collided=footprint_collide)
        for tree in player_hits:
            self.player.collide(tree)
        wolf_hits = pg.sprite.groupcollide(self.wolves, self.trees,
                    False, False, collided=footprint_collide)
        for wolf in wolf_hits:
            for tree in wolf_hits[wolf]:
                x, y = wolf.footprint.topleft
                w, h = wolf.footprint.size
                moves = {
                        (-1, 0): (tree.footprint.right, y),
                        (1, 0): (tree.footprint.left - w, y),
                        (0, -1): (x, tree.footprint.bottom),
                        (0, 1): (x, tree.footprint.top - h)}
                wolf.footprint.topleft = moves[wolf.direction]
                dx, dy = wolf.footprint.x - x, wolf.footprint.y - y
                wolf.rect.move_ip(dx, dy)

        close = (x for x in self.wolves
                    if get_distance(x.rect.center, self.player.rect.center) <= 200)
        close_wolves = pg.sprite.Group(close)
        self.all_sprites.empty()
        self.all_sprites.add(self.trees, self.player, close_wolves)
        for sprite in self.all_sprites:
            self.all_sprites.change_layer(sprite, sprite.footprint.bottom)
        pg.draw.circle(self.cover, pg.Color(0,0,0,0), self.player.rect.center, 200)
        self.fog.fill(self.fog_color)
        pg.draw.circle(self.fog, pg.Color(0,0,0,0), self.player.rect.center, 200)
 def nearest_producer_distance(self, cargo_item, planets):
     nearest = None
     for planet in planets:
         if planet is not self.planet:
             if cargo_item in planet.spaceport.products:
                 dist = angles.get_distance(self.planet.pos, planet.pos)
                 if nearest is None or dist < nearest:
                     nearest = dist
     return nearest
 def update(self, dt, bounding, planets, player):
     if not self.docked:
         self.update_ship(dt)
         if angles.get_distance(self.pos, player.pos) < self.sight_distance:
             self.attack(dt, player)
         elif self.destination is None:
             self.new_destination(planets)
         elif self.rect.collidepoint(self.destination):
             self.destination = None
         
         self.move(dt)
         clamped = self.rect.clamp(bounding)
         if clamped != self.rect:
             self.rect.clamp_ip(bounding)
             self.pos = self.rect.center
         self.projectiles.update(dt)
Пример #4
0
    def update(self, mouse_pos):

        self.hovered = get_distance(self.pos, mouse_pos) <= self.radius
        if self.grabbed:
            angle = get_angle(self.pos, mouse_pos)
            if self.angle < .5 * pi:
                if angle > self.min_angle:
                    angle = self.max_angle
            else:
                if angle > self.min_angle:
                    angle = self.min_angle
            self.angle = angle
        if self.angle != self.last_angle:
            self.rotate()
            self.adjust_output()
        self.last_angle = self.angle
 def attack(self, dt, other):
     dist = angles.get_distance(self.pos, other.pos)
     to_other = angles.get_angle(self.pos, other.pos)
     rot_diff = self.get_rotation(to_other)
     try:
         direction = rot_diff / abs(rot_diff)
     except ZeroDivisionError:
         direction = 0
     if abs(rot_diff) < ONEDEG * 1.5:
         self.laser.fire(dt, self)
     else:
         self.steering.rotate(dt, self, direction)
         if abs(rot_diff) < (.5 * math.pi):
             if self.speed < self.thruster.max_speed:    
                 self.thruster.accelerate(dt, self)
         else:
             if self.speed > 0:
                 self.retro_thruster.decelerate(dt, self)