规范识别范围,避免直接使用genshin.width (#2464)

* 规范识别范围,避免直接使用genshin.width
This commit is contained in:
躁动的氨气
2025-12-09 13:20:43 +08:00
committed by GitHub
parent dd139c24d1
commit 383232869a
24 changed files with 46 additions and 52 deletions

View File

@@ -313,7 +313,7 @@
* @returns {Promise<number[]>} 返回熟练度数组 [当前熟练度, 总熟练度]
*/
async function check_proficiency(ui="main") {
let ocrRo = RecognitionObject.Ocr(0, 0, genshin.width, genshin.height);
let ocrRo = RecognitionObject.Ocr(0, 0, 1920, 1080);
if (ui === "main") {
ocrRo = RecognitionObject.Ocr(1424, 422, 82, 37);
} else if (ui === "finish") {
@@ -371,7 +371,7 @@
*/
async function select_food_by_fullname(food_name) {
log.info(`在当前页面寻找 ${food_name} ...`);
const ocrRo = RecognitionObject.Ocr(0, 0, genshin.width, genshin.height);
const ocrRo = RecognitionObject.Ocr(0, 0, 1920, 1080);
moveMouseTo(1555, 860); // 移走鼠标防止干扰OCR
await sleep(200);

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "一只爱可菲(厨娘版)",
"version": "1.3.3",
"version": "1.3.4",
"bgi_version": "0.45.0",
"description": "专精料理制作的爱可菲(自动烹饪及解锁、特殊料理)",
"authors": [

View File

@@ -20,10 +20,10 @@ async function switchToActivityPage(activityName, activityKey, maxOcrCount) {
await keyUp(activityKey);
await sleep(1000);
let ocr_x = parseInt(100 * gameWidth / 1920 + '')
let ocr_y = parseInt(200 * gameHeight / 1080 + '')
let ocr_width = parseInt(450 * gameWidth / 1920 + '')
let ocr_hight = parseInt(600 * gameHeight / 1080 + '')
let ocr_x = 100;
let ocr_y = 200;
let ocr_width = 450;
let ocr_hight = 600;
log.info(`参考值(1920*1080):{"x": 100, "y": 200, "width": 450, "height": 600}`)
let ocrRegion = {
"x": ocr_x,

View File

@@ -1,6 +1,6 @@
{
"name": "切换活动页面",
"version": "1.1.1",
"version": "1.1.2",
"description": "(需要处于主界面)一个通过 F5 打开活动页面、(鼠标上滑/滚轮滑动)并根据活动名称选择活动的脚本",
"settings_ui": "settings.json",
"main": "main.js",

View File

@@ -24,7 +24,7 @@ const ocrRegion3 = { x: 1200, y: 520, width: 300, height: 300 }; // 拾取区
// 预定义识别对象
const openRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/open.png"));
const closeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/close.png"));
const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/paimon_menu.png"), 0, 0, genshin.width / 3.0, genshin.width / 5.0);
const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/paimon_menu.png"), 0, 0, 640, 216);
const boxIconRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/box.png"));
const ocrRo1 = RecognitionObject.ocr(ocrRegion1.x, ocrRegion1.y, ocrRegion1.width, ocrRegion1.height);
const ocrRo2 = RecognitionObject.ocr(ocrRegion2.x, ocrRegion2.y, ocrRegion2.width, ocrRegion2.height);

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "全自动地脉花",
"version": "4.4.5",
"version": "4.4.6",
"tags": ["地脉花"],
"bgi_version": "0.52.0",
"description": "基于OCR图像识别的全自动刷取地脉花。\n💡更多信息请查看README! \n\n----------注意事项----------\n●仅支持BetterGI 0.52.0 及以上版本!\n●部分地脉花因特殊原因不支持全自动具体的点位请在手册中查看。\n●树脂使用的优先级2倍原粹树脂 > 浓缩树脂 > 原粹树脂。\n●运行时会传送到七天神像设置中设置的七天神像需要关闭七天神像设置中的“是否就近七天神像恢复血量”并指定七天神像。\n●战斗策略注意调度器设置中地图追踪行走配置里的“允许在JsSpript中使用”和“覆盖JS中的自动战斗配置”只有在都打开的情况下脚本才会使用下面的战斗配置否则会使用独立任务中的战斗策略。战斗超时时间不能大于脚本自定义配置中的时间。\n\n如果遇到问题请先参照README中的方法进行解决。",

View File

@@ -28,7 +28,7 @@
const BossPartyName = settings.BossPartyName;// 战斗队伍
let mijingCount = 1;// 自动秘境计数
// OCR对象用于检测战斗文本
const ocrRo2 = RecognitionObject.Ocr(0, 0, genshin.width, genshin.height);
const ocrRo2 = RecognitionObject.Ocr(0, 0, 1920, 1080);
// 创建材质到ITEM的映射表
// 养成道具=1食物=2材料=3

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "全自动周一",
"version": "1.3.5",
"version": "1.3.6",
"tags": [
"周常",
"纪行",

View File

@@ -8,8 +8,8 @@ const paimonMenuRo = RecognitionObject.TemplateMatch(
file.ReadImageMatSync("Data/RecognitionObject/paimon_menu.png"),
0,
0,
genshin.width / 3.0,
genshin.width / 5.0
640,
216
);
// 读取设置
@@ -539,8 +539,8 @@ const isInMainUI = () => {
file.ReadImageMatSync("Data/RecognitionObject/paimon_menu.png"),
0,
0,
genshin.width / 3.0,
genshin.width / 5.0
640,
216
);
return () => {

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "自动剧情加载器",
"version": "1.5",
"version": "1.6",
"tags": ["剧情","任务"],
"description": "剧情自动加载器一键挂机过剧情:自动寻路、对话、战斗(需任务脚本支持),脚本拖进调度器就能跑,仅提供技术框架,完全体须搭配需任务脚本使用,详情见说明文档",
"authors": [

View File

@@ -3,8 +3,8 @@ const paimonMenuRo = RecognitionObject.TemplateMatch(
file.ReadImageMatSync("assets/RecognitionObject/paimon_menu.png"),
0,
0,
genshin.width / 3.0,
genshin.width / 5.0
640,
216
);
// 判断是否在主界面的函数

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "地图追踪录制",
"version": "1.1",
"version": "1.2",
"bgi_version": "0.45.0",
"description": "自动地图追踪录制每3秒从小地图获取一次当前坐标打开大地图结束录制",
"tags": [

View File

@@ -1353,7 +1353,7 @@
} else if (turnStatus === "enemy") { // 敌方回合
await sleep(500);
} else {
click(genshin.width / 2, genshin.height / 2);
click(960, 540);
await sleep(500);
}
}
@@ -1552,7 +1552,7 @@
await terminateTurn();
}
} else if (turnStatus === "enemy") { // 敌方回合
click(genshin.width / 2, genshin.height / 2);
click(960, 540);
await sleep(1000);
} else {
click(1873, 47);
@@ -1598,7 +1598,7 @@
} else if (turnStatus === "enemy") { // 敌方回合
await sleep(500);
} else {
click(genshin.width / 2, genshin.height / 2);
click(960, 540);
await sleep(500);
}
}

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "「牌圣」",
"version": "1.1",
"version": "1.2",
"bgi_version": "0.45.0",
"description": "智能版自动七圣召唤",
"authors": [

View File

@@ -2000,8 +2000,8 @@ const isInMainUI = () => {
file.ReadImageMatSync(`${main_interface.path}${main_interface.name}${main_interface.type}`),
0,
0,
genshin.width / 3.0,
genshin.width / 5.0
640,
216
);
let captureRegion = openCaptureGameRegion();
let res = findByCaptureGameRegion(captureRegion, paimonMenuRo);

View File

@@ -1,6 +1,6 @@
{
"name": "圣遗物批量强化",
"version": "1.1.7",
"version": "1.1.8",
"description": "一个批量强化圣遗物的脚本",
"settings_ui": "settings.json",
"main": "main.js",

View File

@@ -109,8 +109,8 @@ const paimonMenuRo = RecognitionObject.TemplateMatch(
file.ReadImageMatSync("assets/paimon_menu.png"),
0,
0,
genshin.width / 3.0,
genshin.width / 5.0
640,
216
);
// 判断是否在主界面的函数

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "OCR主界面读取队伍 ",
"version": "1.1",
"version": "1.2",
"description": "至少0.44.3版本。OCR识别队伍角色",
"authors": [
{

View File

@@ -124,14 +124,8 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) {
var u = {}; // utilities 工具函数集合
u.logi = function (message, args) { log.info("[切换账号]" + message, args) };
u.logw = function (message, args) { log.warn("[切换账号]" + message, args) };
u.x = function (value) { return (value === undefined) ? genshin.width : genshin.width * (value / 1920); };
u.y = function (value) { return (value === undefined) ? genshin.height : genshin.height * (value / 1080); };
u.loadTemplate = function (filePath, x /* 0 if omit */, y /* 0 if omit */, w /* maxWidth if omit */, h /* maxHeight if omit */) {
const _x = u.x(x === undefined ? 0 : x);
const _y = u.y(y === undefined ? 0 : y);
const _w = u.x(w) - _x;
const _h = u.y(h) - _y;
return RecognitionObject.TemplateMatch(file.ReadImageMatSync(filePath), _x, _y, _w, _h);
return RecognitionObject.TemplateMatch(file.ReadImageMatSync(filePath), x, y, w, h);
};
u.findText = function (resList, text) {
for (let i = 0; i < resList.count; i++) {
@@ -279,7 +273,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) {
let logoutIconFound = !res.isEmpty();
if (logoutIconFound) {
let resList = captureRegion.findMulti(RecognitionObject.ocr(u.x(850), u.y(970), u.x(220), u.y(100)));
let resList = captureRegion.findMulti(RecognitionObject.ocr(850, 970, 220, 100));
captureRegion.dispose();
if (u.findText(resList, "点击进入")) {
u.logi("检测到目前处于登录界面");
@@ -329,10 +323,10 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) {
// 识别派蒙菜单,点击登出按钮
await u.waitAndFindImage(assetPaimonCancelIcon);
// u.logi("点击登出按钮");
click(u.x(50), u.y(1024));
click(50, 1024);
// 退出至登录界面
let btnExitToLogin = await u.waitAndFindText("退出至登录界面", u.x(680), u.y(380), u.x(540), u.y(340));
let btnExitToLogin = await u.waitAndFindText("退出至登录界面", 680, 380, 540, 340);
// u.logi("检测到\"退出至登录界面\"按钮,点击");
// btnExitToLogin.DrawSelf("ExitToLoginBtn");
btnExitToLogin.Click();
@@ -355,7 +349,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) {
async function stateChangeUser() {
u.logi("开始切换账号");
await u.waitAndFindText(["进入游戏", "登录其他账号"], u.x(680), u.y(380), u.x(540), u.y(340), 200);
await u.waitAndFindText(["进入游戏", "登录其他账号"], 680, 380, 540, 340, 200);
const assetSelectUserDropDownIcon = u.loadTemplate("Assets/RecognitionObject/caret.png", 680, 380, 1220, 720);
let captureRegion = captureGameRegion();
@@ -363,7 +357,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) {
captureRegion.dispose();
if (res.isEmpty()) {
u.logi("未找到下拉菜单图标,点击硬编码的坐标(960, 500)展开菜单");
click(u.x(960), u.y(500));
click(960, 500);
} else {
// u.logi("识别到下拉菜单,点击");
// res.DrawSelf("UserDropdown");
@@ -379,7 +373,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) {
await sleep(200);
let captureRegion = captureGameRegion();
let resList = captureRegion.findMulti(RecognitionObject.ocr(u.x(680), u.y(540), u.x(540), u.y(500)));
let resList = captureRegion.findMulti(RecognitionObject.ocr(680, 540, 540, 500));
captureRegion.dispose();
for (let i = 0; i < resList.count; i++) {
let res = resList[i];
@@ -409,7 +403,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) {
await sleep(500);
{
let captureRegion = captureGameRegion();
let btnEnterGame = captureRegion.DeriveCrop(u.x(684), u.y(598), u.x(552), u.y(66));
let btnEnterGame = captureRegion.DeriveCrop(684, 598, 552, 66);
btnEnterGame.Click();
captureRegion.dispose();
btnEnterGame.dispose();
@@ -420,7 +414,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) {
async function stateEnterGame() {
// u.logi("开始进入游戏,等待游戏加载。");
let textClickToStart = await u.waitAndFindText("点击进入", u.x(850), u.y(970), u.x(220), u.y(100));
let textClickToStart = await u.waitAndFindText("点击进入", 850, 970, 220, 100);
// u.logi("已识别到\"点击进入\"文本,点击鼠标进入游戏。");
textClickToStart.DrawSelf("ClickToStart");
textClickToStart.Click();
@@ -520,7 +514,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) {
keyDown("VK_MENU");
await sleep(500);
for (let i = 0; i <= 4; i++) {
await click(Math.round(genshin.width / 2.0), Math.round(genshin.height * 0.8));
await click(960, 864);
await sleep(1000);
}
} finally {
@@ -584,7 +578,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) {
keyDown("VK_MENU");
await sleep(500);
for (let i = 0; i <= 4; i++) {
await click(Math.round(genshin.width / 2.0), Math.round(genshin.height * 0.8));
await click(960, 864);
await sleep(1000);
}
//keyUp("VK_MENU");

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "切换账号多模式",
"version": "1.2",
"version": "1.3",
"bgi_version": "0.53.0",
"description": "多种模式的切换账号有下拉列表、填写账号密码OCR操作或键鼠操作\n免责申明所有的账号密码均保存在本地请使用者妥善保管账号密码请勿外泄账号密码。若因使用此脚本导致的账号泄露、封禁问题与脚本作者无关。",
"tags": [

View File

@@ -345,7 +345,7 @@ async function locate() {
*/
async function waitToMain(hasKeyMouse = false) {
log.info("等待返回主界面...");
const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/paimon_menu.png"), 0, 0, genshin.width / 3.0, genshin.width / 5.0);
const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/paimon_menu.png"), 0, 0, 640, 216);
const maxRetries = 180; // 设置最大重试次数以防止无限循环
let retries = 0;
let enteredLoop = false;

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "游逸旅闻",
"version": "0.2.1",
"version": "0.2.2",
"bgi_version": "0.45.1",
"description": "自动游逸旅闻",
"authors": [

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "周本一条龙",
"version": "3.1.2",
"version": "3.1.3",
"description": "https://www.bilibili.com/video/BV1F2uvz3E4K/?vd_source=9dfaf88af48ecc0ff95a41f1145af7a2",
"authors": [
{

View File

@@ -625,7 +625,7 @@ async function autoFightAndEndDetection(extraFightAction) {
// 定义两个检测区域
const region1 = RecognitionObject.ocr(700, 0, 450, 100);//区域一 BOSS名称
const region2 = RecognitionObject.ocr(820, 935, 280, 50);//区域二 成功倒计时
const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/paimon_menu.png"), 0, 0, genshin.width / 3.0, genshin.width / 5.0);
const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/paimon_menu.png"), 0, 0, 640, 216);
const teamRo1 = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/team1.png"), 1820, 240, 80, 400);
const teamRo2 = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/team2.png"), 1820, 240, 80, 400);
let challengeTime = 0;