Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Image search help?
#1
I'm trying to install a Smashed TH check into the algorithmTH.au3 module.
Been staring at the other modules that call the _ImageSearch function in ImageSearch.au3 and can't get a valid response or coordinates from _ImageSearch?

After staring at 3-4 dozen images of smashed TH, it seems they all look same regardless of the TH level.
Have tried several sizes/shapes of images cut directly from saved attack images. They are stored in BMP, and the 1 pixel tall version is same size as the TH check image. But I NEVER find a match even with 20% tolerance. I'm ready to give up.  Worry

I am sure its some kind of noob mistake, can anyone help?

Code:
Func CheckSmashedTownhall()
  Local $SmashedThx, $SmashedTHy
  If _Sleep(100) Then Return
  _CaptureRegion()
  $IsTHSmashed = _ImageSearch($SmashedTH, 1, $SmashedTHx, $SmashedTHy, 20) ; Getting smashed TH Location
  If $DebugTH = True Then
      SetLog("Check1 Smashed TH returned: " & $IsTHSmashed & ", " & $SmashedTHx & ", " & $SmashedTHy, $COLOR_BLUE)
  EndIf
  If $IsTHSmashed = 1 Then
      Return 1
  EndIf
  If $IsTHSmashed = 0 Then Return "-"
EndFunc
Reply
#2
I don't think you are factoring in the offset with your X/Y coords. Try the script below. It will get the coords and copy them to the clipboard. Change the first $Title line to match the title of your BlueStacks.

The F1 key will get the coords, taking into account the offset, of wherever you click.

Code:
#include <Misc.au3>
#include <WinAPI.au3>

Global $BSpos[2] ; Inside BlueStacks positions relative to the screen

$Title = "BlueStacks App Player for Windows (beta-1)" ; Window name
$Full = WinGetTitle ($Title) ; Get The Full Title..
$HWnD = WinGetHandle ($Full) ; Get The Handle
WinActivate ($HWnD)

Func getBSPos()
    $aPos = ControlGetPos($Title, "", "[CLASS:BlueStacksApp; INSTANCE:1]")
    $tPoint = DllStructCreate("int X;int Y")
    DllStructSetData($tPoint, "X", $aPos[0])
    DllStructSetData($tPoint, "Y", $aPos[1])
    _WinAPI_ClientToScreen(WinGetHandle(WinGetTitle($Title)), $tPoint)

    $BSpos[0] = DllStructGetData($tPoint, "X")
    $BSpos[1] = DllStructGetData($tPoint, "Y")
EndFunc   ;==>getBSPos

HotKeySet ("{F7}", "FindPos")
HotKeySet ("{F8}", "Terminate")

While 1
   Sleep (100)
WEnd

Func FindPos()
    getBSPos()
    Local $Pos[2]
    Local $iColour = 0
    While 1
        If _IsPressed("01") Then
            $Pos[0] = MouseGetPos()[0] - $BSpos[0]
            $Pos[1] = MouseGetPos()[1] - $BSpos[1]
            $iColour = Hex (PixelGetColor($Pos[0],$Pos[1]),6)
            ClipPut($Pos[0] & "," & $Pos[1] & "," & $iColour)
            Return $Pos
        EndIf
    WEnd
EndFunc   ;==>FindPos

Func Terminate()
   Exit
EndFunc   ;==>Terminate
Reply
#3
Thanks for the reply!
Sorry to be dense, I'm not following why I need offsets?
Doesn't existing _CaptureRegion in _CaptureRegion.au3 automatically get BS offsets, and load global variable $hHBitmap with the image to be searched?

I've been searching autoitscript forum as well, and imagesearch is still baffling me. Sad
Thanks Again!
Reply
#4
Because of the border around the window (title at the top, and the thin borders on the sides and bottom) there is a certain amount of X/Y offset you need, otherwise your coordinates will be incorrect. getBSPos() is supposed to get the correct values for the play screen.

I don't know how you are using the function you posted. Are you using it stand-alone, or within a script?

If you use just _CaptureRegion() it won't get the offset. It will call getBSPos(), but getBSPos() will be missing the $Title variable. The script I posted above ensures all the values needed are filled out.

Edit: What size is your BlueStacks window? Have you changed it with the .reg file? If not, then the first line in _CaptureRegion() is screwing you up:

Code:
Func _CaptureRegion($iLeft = 0, $iTop = 0, $iRight = 860, $iBottom = 720, $ReturnBMP = False)

See the hard-coded coords? If your window is not that size, it won't work.
Reply
#5
Thanks Snarg!  Appreciate your continued effort to help. Smile

I'm using the function posted above just like checkTownHall.au3, except instead of searching for 5 different images, using only 1?  All I do is look for successful return value and the x,y positions in the function call, like this:
Code:
If CheckSmashedTownhall() = 1 Then  ; check to see if TH is smashed.
   SetLog("TH Attack successful!", $COLOR_BLUE)
   ExitLoop 2
EndIf


The reason I used _CaptureRegion() like checkTownHall() function; is that it appears to get the BS offsets and loads $hHBitmap (showing only the non-background code)
Code:
getBSPos()
$hHBitmap = _ScreenCapture_Capture("", $iLeft + $BSpos[0], $iTop + $BSpos[1], $iRight + $BSpos[0], $iBottom + $BSpos[1])
Global $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)

Unless I am reading image search wrong, _ImageSearch calls _ImageSearchArea, and it checks to see if $hHBitmap has an image loaded from _captureRegion(), then executes DLLCALL to search for the image passed to it??

I was really hoping to reuse the existing image capture/search functions as the initially seemed pretty straight forward.  But after beating my head against the wall on this off/on for a couple days, I'm just getting more confused.
  Saddest
Reply
#6
(02-24-2015, 07:17 PM)knowjack Wrote:  Thanks Snarg!  Appreciate your continued effort to help. Smile

I'm using the function posted above just like checkTownHall.au3, except instead of searching for 5 different images, using only 1?  All I do is look for successful return value and the x,y positions in the function call, like this:
Code:
If CheckSmashedTownhall() = 1 Then  ; check to see if TH is smashed.
   SetLog("TH Attack successful!", $COLOR_BLUE)
   ExitLoop 2
EndIf


The reason I used _CaptureRegion() like checkTownHall() function; is that it appears to get the BS offsets and loads $hHBitmap (showing only the non-background code)
Code:
getBSPos()
$hHBitmap = _ScreenCapture_Capture("", $iLeft + $BSpos[0], $iTop + $BSpos[1], $iRight + $BSpos[0], $iBottom + $BSpos[1])
Global $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)

Unless I am reading image search wrong, _ImageSearch calls _ImageSearchArea, and it checks to see if $hHBitmap has an image loaded from _captureRegion(), then executes DLLCALL to search for the image passed to it??

I was really hoping to reuse the existing image capture/search functions as the initially seemed pretty straight forward.  But after beating my head against the wall on this off/on for a couple days, I'm just getting more confused.
  Saddest

try writing the hBitmap to an .bmp
_ScreenCapture_SaveImage("C:\COC-Bot-master\images\GdiPlus_Screen.bmp", $hHBitmap)

i have some weird screenshots...Only the captureregion background mode option works for me.
Reply
#7
Thanks for the suggestion Henk500!
Added the code, checked a dozen images and they all look normal?
Sad
Reply
#8
Any chance of posting all of your code? It's hard to debug a snippet.
Reply
#9
jack
have you given up?
Reply
 


Forum Jump:


Users browsing this thread: 1 Guest(s)

About The Bytecode Club

We're a community focused on Reverse Engineering, we try to target Java/Android but we also include other langauges/platforms. We pride ourselves in supporting and free and open sourced applications.

Website