Example #1
0
    def _game_step(self):
        """
            Proceed one game step - do turns, movements and boundary check
        """
        self.debug('obj step %s', self)
        if self._revolvable and self._state == 'turning':
            delta = self.vector.angle - self.course
            if abs(delta) < tank_turn_speed:
                self.course = self.vector.angle
                if self._need_moving:
                    self._state = 'moving'
                else:
                    self._state = 'stopped'
                    self._events.put(EventStopped())
            else:
                if -180 < delta < 0 or delta > 180:
                    self.course -= tank_turn_speed
                else:
                    self.course += tank_turn_speed
                self.course = normalise_angle(self.course)

        if self._state == 'moving':
            self.coord.add(self.vector)
            if self.coord.near(self.target_coord):
                self.stop()
                self._events.put(EventStoppedAtTargetPoint(
                    self.target_coord))
        # boundary_check
        left_ro = self._runout(self.coord.x)
        if left_ro:
            self.coord.x += left_ro + 1
            self.stop()
        botm_ro = self._runout(self.coord.y)
        if botm_ro:
            self.coord.y += botm_ro + 1
            self.stop()
        righ_ro = self._runout(self.coord.x, field_width)
        if righ_ro:
            self.coord.x -= righ_ro + 1
            self.stop()
        top_ro = self._runout(self.coord.y, field_height)
        if top_ro:
            self.coord.y -= top_ro + 1
            self.stop()

        self._heartbeat_tics -= 1
        if not self._heartbeat_tics:
            event = EventHearbeat()
            self._events.put(event)
            self.hearbeat()
            self._heartbeat_tics = 5
Example #2
0
def _in_radar_fork(obj, target):
    """
        Is target in radar beam?
    """
    point_back_vector = geometry.Vector(obj.course + 180,
                                        _radar_point_back_distance)
    point_back = geometry.Point(obj.coord)
    point_back.add(point_back_vector)

    dx = target.coord.x - point_back.x
    dy = target.coord.y - point_back.y

    left_radar_angle = geometry.normalise_angle(obj.course
                                                  + _half_tank_radar_angle)
    right_radar_angle = geometry.normalise_angle(obj.course
                                                   - _half_tank_radar_angle)

    target_direction = geometry.get_arctan(dy, dx)
    obj.debug("course %s dx %s dy %s", obj.course, dx, dy)
    obj.debug("left_angle %s right_angle %s target_direction %s",
              left_radar_angle, right_radar_angle, target_direction)

    if right_radar_angle < target_direction < left_radar_angle:
        obj.debug("in radar beam")
        return True
    if 0 + constants.tank_radar_angle > left_radar_angle and \
       right_radar_angle > 360 - constants.tank_radar_angle:
        obj.debug("radar beam near zero")
        if target_direction < left_radar_angle:
            obj.debug("target_direction < left_radar_angle")
            return True
        if target_direction > right_radar_angle:
            obj.debug("target_direction > right_radar_angle")
            return True

    return False