import json import math import os import time from game_state import parse_game_state # 默认配置文件名 WAYPOINTS_FILE = 'waypoints.json' # 记录两个点之间的最小间距阈值(游戏坐标单位) DEFAULT_MIN_DISTANCE = 0.5 class WaypointRecorder: def __init__(self, min_distance=DEFAULT_MIN_DISTANCE, waypoints_file=None, on_point_added=None): self.waypoints = [] self.min_distance = min_distance self.last_pos = (0, 0) self.waypoints_file = waypoints_file or WAYPOINTS_FILE self.on_point_added = on_point_added # 可选回调: (pos, count) => None def get_distance(self, p1, p2): return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2) def record(self, state): """state 来自 game_state.parse_game_state(),坐标字段为 x, y。""" if state is None: return x, y = state.get('x'), state.get('y') if x is None or y is None: return curr_pos = (float(x), float(y)) # 初始点记录 if self.last_pos == (0, 0): self.add_point(curr_pos) return # 只有当移动距离超过阈值时才记录点 dist = self.get_distance(curr_pos, self.last_pos) if dist >= self.min_distance: self.add_point(curr_pos) def add_point(self, pos): self.waypoints.append(pos) self.last_pos = pos if self.on_point_added: self.on_point_added(pos, len(self.waypoints)) else: print(f"已记录点: {pos} | 当前总点数: {len(self.waypoints)}") def save(self, path=None): out_path = path or self.waypoints_file with open(out_path, 'w', encoding='utf-8') as f: json.dump(self.waypoints, f, indent=4, ensure_ascii=False) return out_path # 使用示例(整合进你的主循环) if __name__ == "__main__": recorder = WaypointRecorder() print("开始录制模式:请在游戏内跑动。按 Ctrl+C 停止并保存。") try: while True: state = parse_game_state() if state: recorder.record(state) time.sleep(0.5) except KeyboardInterrupt: path = recorder.save() print(f"路径已保存至 {path}")