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