using BetterGenshinImpact.Core.Recognition; using BetterGenshinImpact.Core.Simulator; using BetterGenshinImpact.GameTask.AutoPick.Assets; using BetterGenshinImpact.GameTask.Common.Element.Assets; using BetterGenshinImpact.GameTask.Model.Area; using Fischless.WindowsInput; using OpenCvSharp; using System.Text.RegularExpressions; using System.Threading; namespace BetterGenshinImpact.GameTask.Common.BgiVision; /// /// 模仿OpenCv的静态类 /// 用于原神的各类识别与控制操作 /// /// 此处主要是对游戏内的一些状态进行识别 /// public static partial class Bv { /// /// 通用方法:查找识别对象,如果存在则点击 /// /// 截图区域 /// 识别对象 /// 是否找到并点击 public static bool FindAndClick(ImageRegion captureRa, RecognitionObject ro) { var ra = captureRa.Find(ro); if (ra.IsExist()) { Thread.Sleep(500); ra.Click(); return true; } return false; } /// /// 点击减少按钮 /// /// /// public static bool ClickReduceButton(ImageRegion captureRa) => FindAndClick(captureRa, ElementAssets.Instance.Keyreduce); /// /// 点击增加按钮 /// /// /// public static bool ClickAddButton(ImageRegion captureRa) => FindAndClick(captureRa, ElementAssets.Instance.Keyincrease); /// /// 点击白色确认按钮 /// /// /// public static bool ClickWhiteConfirmButton(ImageRegion captureRa) => FindAndClick(captureRa, ElementAssets.Instance.BtnWhiteConfirm); /// /// 点击白色取消按钮 /// /// /// public static bool ClickWhiteCancelButton(ImageRegion captureRa) => FindAndClick(captureRa, ElementAssets.Instance.BtnWhiteCancel); /// /// 点击黑色确认按钮 /// /// /// public static bool ClickBlackConfirmButton(ImageRegion captureRa) => FindAndClick(captureRa, ElementAssets.Instance.BtnBlackConfirm); /// /// 点击黑色取消按钮 /// /// /// public static bool ClickBlackCancelButton(ImageRegion captureRa) => FindAndClick(captureRa, ElementAssets.Instance.BtnBlackCancel); /// /// 点击联机确认按钮 /// /// /// public static bool ClickOnlineYesButton(ImageRegion captureRa) => FindAndClick(captureRa, ElementAssets.Instance.BtnOnlineYes); /// /// 点击联机取消按钮 /// /// /// public static bool ClickOnlineNoButton(ImageRegion captureRa) => FindAndClick(captureRa, ElementAssets.Instance.BtnOnlineNo); /// /// 点击确认按钮(优先点击白色背景的确认按钮) /// /// /// public static bool ClickConfirmButton(ImageRegion captureRa) { return ClickBlackConfirmButton(captureRa) || ClickWhiteConfirmButton(captureRa) || ClickOnlineYesButton(captureRa); } /// /// 点击取消按钮(优先点击白色背景的确认按钮) /// /// /// public static bool ClickCancelButton(ImageRegion captureRa) { return ClickBlackCancelButton(captureRa) || ClickWhiteCancelButton(captureRa) || ClickOnlineNoButton(captureRa); } /// /// 找到交互按钮 /// /// /// /// public static bool FindF(ImageRegion captureRa, params string[] text) { using var ra = captureRa.Find(AutoPickAssets.Instance.PickRo); if (ra.IsExist()) { if (text.Length == 0) { return true; } var scale = TaskContext.Instance().SystemInfo.AssetScale; var config = TaskContext.Instance().Config.AutoPickConfig; var textRect = new Rect(ra.X + (int)(config.ItemTextLeftOffset * scale), ra.Y, (int)((config.ItemTextRightOffset - config.ItemTextLeftOffset) * scale), ra.Height); var textRa = captureRa.DeriveCrop(textRect); var list = textRa.FindMulti(RecognitionObject.OcrThis); foreach (var item in list) { // 所有匹配成功才算成功 var success = true; foreach (var t in text) { if (!Regex.IsMatch(item.Text, t)) { success = false; } } return success; } } return false; } /// /// 找到交互按钮并点击 /// /// /// /// public static bool FindFAndPress(ImageRegion captureRa, params string[] text) { if (FindF(captureRa, text)) { Simulation.SendInput.Keyboard.KeyPress(AutoPickAssets.Instance.PickVk); return true; } return false; } public static bool FindFAndPress(ImageRegion captureRa, IKeyboardSimulator keyboard, params string[] text) { if (FindF(captureRa, text)) { keyboard.KeyPress(AutoPickAssets.Instance.PickVk); return true; } return false; } }