Skip to content

Commit b255b50

Browse files
authored
Merge pull request #175 from carzer299/feature/add-sensitivity-calculate
添加设置游戏内灵敏度功能,不需要再根据脚本更改游戏内灵敏度了
2 parents 84625c6 + 673fef6 commit b255b50

9 files changed

Lines changed: 95 additions & 34 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,6 @@ mod/*
7474
# 但不忽略这个特定的文件夹
7575
!mod/示例-无巧手30火突破素材(1080p) by望目/
7676
!mod/builtin/
77+
78+
# 忽略vscode插件文件
79+
.history/

i18n/en_US/LC_MESSAGES/ok.mo

798 Bytes
Binary file not shown.

i18n/en_US/LC_MESSAGES/ok.po

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,3 +581,18 @@ msgstr "Lowest owned count"
581581

582582
msgid "最大轮数"
583583
msgstr "Max Rounds"
584+
585+
msgid "Game Sensitivity Config"
586+
msgstr "In Game Sensitivity Config"
587+
588+
msgid "Game Sensitivity Description"
589+
msgstr "When using a script of the rotation perspective type, there is no longer a need to adjust the in-game sensitivity"
590+
591+
msgid "Game Sensitivity Switch"
592+
msgstr "Switch"
593+
594+
msgid "X-axis sensitivity"
595+
msgstr "In-game horizontal sensitivity"
596+
597+
msgid "Y-axis sensitivity"
598+
msgstr "In-game vertical sensitivity"

i18n/zh_CN/LC_MESSAGES/ok.mo

344 Bytes
Binary file not shown.

i18n/zh_CN/LC_MESSAGES/ok.po

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,3 +656,18 @@ msgstr ""
656656

657657
msgid "最大轮数"
658658
msgstr ""
659+
660+
msgid "Game Sensitivity Config"
661+
msgstr "游戏灵敏度设置"
662+
663+
msgid "Game Sensitivity Description"
664+
msgstr "使用转动视角类型脚本时不再需要修改游戏内灵敏度"
665+
666+
msgid "Game Sensitivity Switch"
667+
msgstr "开关"
668+
669+
msgid "X-axis sensitivity"
670+
msgstr "游戏内水平灵敏度"
671+
672+
msgid "Y-axis sensitivity"
673+
msgstr "游戏内垂直灵敏度"

src/config.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
'Interact Key': {'type': 'drop_down', 'options': ['f', 'e']}
1818
})
1919

20+
sensitivity_config_option = ConfigOption('Game Sensitivity Config', { #全局配置示例
21+
'Game Sensitivity Switch': False,
22+
'X-axis sensitivity': 1.0,
23+
'Y-axis sensitivity': 1.0
24+
}, description='Game Sensitivity Description')
2025

2126
afk_config_option = ConfigOption('挂机设置', { #全局配置示例
2227
'提示音': 2,
@@ -74,7 +79,7 @@ def make_bottom_right_black(frame): #可选. 某些游戏截图时遮挡UID使
7479
'debug': False, # Optional, default: False
7580
'use_gui': True, # 目前只支持True
7681
'config_folder': 'configs', #最好不要修改
77-
'global_configs': [key_config_option, afk_config_option, monthly_card_config_option],
82+
'global_configs': [key_config_option, sensitivity_config_option, afk_config_option, monthly_card_config_option],
7883
'screenshot_processor': make_bottom_right_black, # 在截图的时候对frame进行修改, 可选
7984
'gui_icon': 'icons/icon.png', #窗口图标, 最好不需要修改文件名
8085
'wait_until_before_delay': 0,

src/tasks/BaseDNATask.py

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
import win32con
88
from datetime import datetime, timedelta
99
from concurrent.futures import ThreadPoolExecutor
10+
from functools import cached_property
1011

11-
from ok import BaseTask, Box, Logger, color_range_to_bound, run_in_new_thread, og
12+
from ok import BaseTask, Box, Logger, color_range_to_bound, run_in_new_thread, og, GenshinInteraction
1213

1314
logger = Logger.get_logger(__name__)
1415
f_black_color = {
@@ -73,6 +74,7 @@ def __init__(self, *args, **kwargs):
7374
self.old_mouse_pos = None
7475
self.next_monthly_card_start = 0
7576
self._logged_in = False
77+
self.sensitivity_config = self.get_global_config('Game Sensitivity Config') # 游戏灵敏度配置
7678

7779
@property
7880
def f_search_box(self) -> Box:
@@ -87,6 +89,15 @@ def f_search_box(self) -> Box:
8789
@property
8890
def thread_pool_executor(self) -> ThreadPoolExecutor:
8991
return og.my_app.get_thread_pool_executor()
92+
93+
@cached_property
94+
def genshin_interaction(self):
95+
"""
96+
缓存 Interaction 实例,避免每次鼠标移动都重新创建对象。
97+
需要确保 self.executor.interaction 和 self.hwnd 在此类初始化时可用。
98+
"""
99+
# 确保引用的是正确的类
100+
return GenshinInteraction(self.executor.interaction.capture, self.hwnd)
90101

91102
def in_team(self) -> bool:
92103
frame = self.frame
@@ -380,7 +391,39 @@ def get_spiral_dive_key(self):
380391
str: 螺旋飞跃的按键字符串。
381392
"""
382393
return self.key_config['HelixLeap Key']
383-
394+
395+
def calculate_sensitivity(self, dx, dy, original_Xsensitivity=1.0, original_Ysensitivity=1.0):
396+
"""计算玩家水平鼠标移动值和垂直鼠标移动值,并且移动鼠标.
397+
398+
Returns:
399+
int: 玩家水平鼠标移动值
400+
int: 玩家垂直鼠标移动值
401+
402+
"""
403+
# 判断设置中灵敏度开关是否打开
404+
if self.sensitivity_config['Game Sensitivity Switch']:
405+
# 获取设置中的游戏灵敏度
406+
game_Xsensitivity = round(self.sensitivity_config['X-axis sensitivity'], 1)
407+
game_Ysensitivity = round(self.sensitivity_config['Y-axis sensitivity'], 1)
408+
409+
# 判断和计算
410+
if original_Xsensitivity == game_Xsensitivity and original_Ysensitivity == game_Ysensitivity:
411+
calculate_dx = dx
412+
calculate_dy = dy
413+
else:
414+
calculate_dx = dx / round(game_Xsensitivity / original_Xsensitivity, 10)
415+
calculate_dy = dy / round(game_Ysensitivity / original_Ysensitivity, 10)
416+
else:
417+
calculate_dx = dx
418+
calculate_dy = dy
419+
420+
return calculate_dx, calculate_dy
421+
422+
def move_mouse_relative(self, dx, dy, original_Xsensitivity=1.0, original_Ysensitivity=1.0):
423+
dx, dy = self.calculate_sensitivity(dx, dy, original_Xsensitivity, original_Ysensitivity)
424+
self.try_bring_to_front()
425+
self.genshin_interaction.move_mouse_relative(int(dx), int(dy))
426+
384427
def try_bring_to_front(self):
385428
if not self.hwnd.is_foreground():
386429
win32api.keybd_event(win32con.VK_MENU, 0, 0, 0)

src/tasks/fullauto/AutoEscortTask.py

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -551,24 +551,6 @@ def execute_mouse_rotation(self, action):
551551
else:
552552
logger.warning(f"未知的鼠标方向: {direction}")
553553
return
554-
555-
# 使用 GenshinInteraction 的 move_mouse_relative 方法
556-
interaction = self.executor.interaction
557-
if isinstance(interaction, GenshinInteraction):
558-
# 直接使用当前的 GenshinInteraction
559-
# 确保窗口在前台,move_mouse_relative 需要窗口处于前台
560-
self.executor.device_manager.hwnd_window.bring_to_front()
561-
interaction.move_mouse_relative(int(dx), int(dy))
562-
else:
563-
# PostMessageInteraction 不支持相对移动,需要使用 GenshinInteraction
564-
# 使用缓存的实例,避免重复创建
565-
if self._genshin_interaction is None:
566-
logger.debug("创建 GenshinInteraction 实例用于相对鼠标移动")
567-
self._genshin_interaction = GenshinInteraction(
568-
interaction.capture, self.executor.device_manager.hwnd_window
569-
)
570-
# 确保窗口在前台
571-
self.executor.device_manager.hwnd_window.bring_to_front()
572-
self._genshin_interaction.move_mouse_relative(int(dx), int(dy))
573-
554+
555+
self.move_mouse_relative(dx, dy)
574556
logger.debug(f"鼠标视角旋转: {direction}, 角度: {angle}, 像素: {pixels}")

src/tasks/fullauto/ImportTask.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,13 @@ def genshin_interaction(self):
376376
def play_macro_actions(self, map_index):
377377
actions = self.script[map_index]["actions"]
378378

379+
if "original_x_sensitivity" and "original_y_sensitivity" in self.script[map_index] :
380+
self.original_Xsensitivity = self.script[map_index]["original_x_sensitivity"]
381+
self.original_Ysensitivity = self.script[map_index]["original_y_sensitivity"]
382+
else:
383+
self.original_Xsensitivity = 1.0
384+
self.original_Ysensitivity = 1.0
385+
379386
# 使用 perf_counter 获得更高精度的时间
380387
start_time = time.perf_counter()
381388

@@ -411,7 +418,7 @@ def execute_action(self, action):
411418

412419
try:
413420
if action_type == "mouse_move":
414-
self.execute_mouse_move(action['dx'], action['dy'])
421+
self.move_mouse_relative(action['dx'], action['dy'], self.original_Xsensitivity, self.original_Ysensitivity)
415422

416423
elif action_type == "mouse_rotation":
417424
self.execute_mouse_rotation(action)
@@ -506,18 +513,9 @@ def execute_mouse_rotation(self, action):
506513
return
507514

508515
dx, dy = direction_map[direction]
509-
self.execute_mouse_move(dx, dy)
516+
self.move_mouse_relative(dx, dy, self.original_Xsensitivity, self.original_Ysensitivity)
510517
logger.debug(f"鼠标视角旋转: {direction}, 角度: {angle}, 像素: {pixels}")
511518

512-
def execute_mouse_move(self, dx, dy):
513-
"""
514-
优化:复用 genshin_interaction 实例,避免频繁创建对象。
515-
"""
516-
self.try_bring_to_front()
517-
518-
# 使用缓存的实例
519-
self.genshin_interaction.move_mouse_relative(int(dx), int(dy))
520-
521519

522520
def normalize_key(key: str) -> str:
523521
"""

0 commit comments

Comments
 (0)