70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
|
|
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}")
|