我正在尝试使用C++构建一个自动点击器,以击败出现以下情况的2D视频游戏:
主角在屏幕的中央,背景完全是黑色的,敌人来自四面八方。我希望我的程序能够点击敌人,就像他们出现在屏幕上一样。
我最初想出的是敌人的最小大小为15 if,所以我尝试每15个像素搜索一次,并使用GetPixel()分析是否有任何像素与背景的RGB不同。看起来是这样的:
COLORREF color;
int R, G, B;
for(int i=0; i<SCREEN_SIZE_X; i+=15){ //These SCREEN_SIZE values are #defined with the ones of my screen
for(int j=0;j<SCREEN_SIZE_Y, j+=15){
//The following conditional excludes the center which is the player's position
if((i<PLAYER_MIN_EDGE_X or i>PLAYER_MAX_EDGE_X) and (j<PLAYER_MIN_EDGE_Y or j>PLAYER_MAX_EDGE_Y)){
color = GetPixel(GetDC(nullptr), i, j);
R = GetRValue(color);
G = GetGValue(color);
B = GetBValue(color);
if(R!=0 or G!=0 or B!=0) cout<<"Enemy Found"<<endl;
}
}
}事实证明,正如预期的那样,GetPixel()功能非常慢,因为它需要验证大约4000像素才能覆盖一次屏幕扫描。我在想一种更快地解决这个问题的方法,当我看着键盘时,我注意到了按钮"Pt Scr",然后我意识到,无论这个按钮在做什么,它几乎能够立即节省数百万像素的信息。
我当然认为有一种适当而不同的技术来处理这类问题。我应该研究和阅读什么样的像素分析理论或技术,这样才能被认为是值得尊敬的代码,并使其真正发挥作用,而且速度更快?
发布于 2020-06-29 07:34:04
GetPixel()例程很慢,因为它一个接一个地从录像机(设备)内存中获取数据。因此,要优化您的循环,您必须立即获取整个屏幕,并将其放入像素数组中。然后,您可以更快地遍历该像素数组,因为它将对RAM (主机内存)中的数据进行操作。
为了进行更好的优化,我还建议在将屏幕提取到像素数组之后,清除播放机的像素(位于屏幕中央)。这样,您就可以消除循环中的if((i<PLAYER_MIN_EDGE_X or i>PLAYER_MAX_EDGE_X) and (j<PLAYER_MIN_EDGE_Y or j>PLAYER_MAX_EDGE_Y))条件。
发布于 2020-06-29 09:33:15
CImage image;
//Save DC to image
int R, G, B;
BYTE *pRealData = (BYTE*)image.GetBits();
int pit = image.GetPitch();
int bitCount = image.GetBPP()/8;
int w=image.GetWidth();
int h=image.GetHeight();
for (int i=0;i<h;i++)
{
for (int j=0;j<w;j++)
{
B=*(pRealData + pit*i + j*bitCount);
G=*(pRealData + pit*i + j*bitCount +1);
R=*(pRealData + pit*i + j*bitCount +2);
}
}https://stackoverflow.com/questions/62632682
复制相似问题