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)
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)