2011-06-27 11 views
1

私は画面上に私のためのゲームをするために、この短いちょっとしたコードを書こうとしましたが、期待通りに応答していません。 それは私の窓に関連するかもしれないと疑われた後、私は代わりにそれを見つめてみて、反応がなかった。画面のピクセルテストは期待通りではありません(win32 C++)

プログラムは観測のために7ポイントを取り、シフトを押して開始します。それから私はそこにrgbの上のコメントにある色の近くのピクセルをクリックする必要があります。私はそれらの範囲を緩めようとしましたが、間違った色のものを一度クリックすることに気付きました。 色の値をトレースしたとき、フロントウィンドウに黒いピクセルがないので、奇妙なものが多く見つかりました。

(それが何を意味している場合、私はWindows7のを使用しています)

誰も私が間違って何が起こっているかを把握助けることができますか?

#include <iostream> 
#include <Windows.h> 
using namespace std; 

void ClickAt(int x,int y){ 
    SetCursorPos(x, y); 
    Sleep(10); 
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); 
    Sleep(10); 
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); 
    Sleep(10); 
} 

int absDist(int a,int b) 
{ 
    int diff = a - b; 
    if(diff<0) diff*=-1; 
    return diff; 
} 

LPPOINT mouse; 
POINT testPoints[7]; 

int main() 
{ 
    mouse = new POINT; 
    BYTE state=FALSE; 
    BYTE prevState=FALSE; 

    cout<< "Hello, let\'s get ready to play the game.\n"; 


    cout<< "Please provide your click-points by clicking them now.\n"; 

    int clicksFound = 0; 

    while(true){ 
     state = (bool)GetAsyncKeyState(VK_LBUTTON); 
     if(state!=prevState){ 
      prevState=(bool)state; 
      if((bool)state != 0){ 
       // a click happened 
       GetCursorPos(mouse); 
       testPoints[clicksFound].x = mouse->x; 
       testPoints[clicksFound].y = mouse->y; 
      }else{ 
       clicksFound++; 
       if(clicksFound>=7) 
        break; 
      } 
     } 
    } 
    cout<< "\aGreat! Now press shift when you\'re ready to start.\n"; 
    cout<< "(You\'ll press space to quit.)\n"; 

    while(true) 
    { 
     if((bool)GetAsyncKeyState(VK_SHIFT)) 
      break; 
    } 

    cout<< "\aNow playing the game.\n"; 

    COLORREF myPixel; 
    int r,g,b; 

    while(true) 
    { 
     HDC scrn = GetDC(NULL); 

     // R 225 
     // G 141 
     // B 35 
     for(int i=0;i<7;i++) 
     { 
      myPixel = GetPixel(scrn,testPoints[i].x,testPoints[i].y); 
      if(myPixel==CLR_INVALID) 
       cout<< "invalid\n"; 


      r = GetRValue(myPixel); 
      g = GetGValue(myPixel); 
      b = GetBValue(myPixel); 

      if(absDist(r,225)<20 && absDist(g,141)<20 && absDist(b,35)<20) 
      { 
       cout<< "click\n"; 
       ClickAt(testPoints[i].x,testPoints[i].y); 
      } 
     } 

     Sleep(20); 

     if((bool)GetAsyncKeyState(VK_SPACE)) 
      break; 

     ReleaseDC(NULL,scrn); 
    } 

    cout<< "\aThank you for playing the game.\n"; 

    system("pause"); 

    return 0; 
} 
+0

これは私には大丈夫に見えます。私はそれが役に立たなかったので私の答えを削除しました。たぶん誰かが良いアイデアを持っているかもしれません。 – Blazes

+0

見た目が悪いです。 – Ulterior

答えて

0

間違っているか、 ReleaseDC(NULL、scrn)です。 は、この行がループ内の "ブレーク"の後にあるため、解放されません。

0

他のプログラムがGDIを使用して画面に描画していない場合(ほとんどのゲームでDirect3DまたはOpenGLが使用されます)、そのようにピクセルを読み取ることはできません。

この答えはあなたを助けるかもしれない:Take screenshot of DirectX full-screen application

関連する問題