C++ pixelbot schreiben
-
^^.
Das Game ist ein Online-Browser Game in 2D.
Es gibt einen Fullscreen mode ,aber der ist nicht nötig , da es auch die normale Größe operfelt ausreicht und auch perfekt sizt.Der Bot sollte für mich eigentlicj nicjts bewonders herausgorfnern programmiertes beonhalten.
Sowas wie drücke Taste "3" ,wenn Leben<30%,Leben kann er nicht sehen sondern muss es sicj ausrechne von dem Grünen Hitpoints Balken .
Sowas halt.
Fer Bot soll unter windows 7 laufen.
-
Grundgerüst:
while true { Screenshot machen: siehe WinAPI - Stichwort DC Bildverarbeitung/Erkennung: siehe OpenCV Maus bedienen: siehe WinAPI - Stichwort Event }
Einlesen musst du dich aber schon selber, das Thema ist viel zu komplex als dass es dir jemand mal eben so erklärt.
-
Der Bot sollte für mich eigentlicj nicjts bewonders herausgorfnern programmiertes beonhalten.
Sowas wie drücke Taste "3" ,wenn Leben<30%,Leben kann er nicht sehen sondern muss es sicj ausrechne von dem Grünen Hitpoints Balken .
Nichts besonders herausforderndes. Nur ein bisschen Bildverarbeitung. LOL. Wenigstens erkennt man gleich dass du keinen Plan hast.
-
Ah, OK.
Wenn es (nur) um so einfache Sachen geht wie die Länge eines Elements mit bekannter Position und Farbe (Energieanzeige) zu ermitteln, DAS sollte auch für nen Anfänger schaffbar sein.
Das Grundgerüst hat dir gdfgdfg ja schon skizziert. Bloss "Stichwort Event" verstehe ich überhaupt nicht - ich hätte da statt dessen einfach mal "SendInput" gesagt.
Den Rest kannst du dir ergoogeln. Auf Stackoverflow etc. solltest du zu den einzelnen Themen genügend Infos finden.
Und wenn du irgendwo anstehst, dann frag nochmal nach. Je konkreter und je besser beschrieben die Frage, desto eher bekommst du schnell brauchbare Antworten.
-
Was der Bot im grunde machen soll.
Benutzung der Maus kontinuierlich.
-Abchecken der Hitpoints(grün)-Schildanzeige(blau) und reagieren,falls eines der beiden sich verändert-basierend auf die Farben
-auf die npc´s klicken die im Radius befinden(nur 4 arten von npcs)
Ich bin lernwillig,aber es ist nicht einfach spezifische Wissenslektüren zu finden für mein Ziel.Hier werde ich von manchen eher angegriffen ,als Hilfe zu erhalten.
-
kingaze schrieb:
Ich bin lernwillig,aber es ist nicht einfach spezifische Wissenslektüren zu finden für mein Ziel.Hier werde ich von manchen eher angegriffen ,als Hilfe zu erhalten.
Er.
Meinst du meinen 1. Beitrag hier?
Wenn ja, vielleicht solltest du ihn dann nochmal lesen und versuchen zu verstehen was ich damit meine.Ansonsten sehe ich in deinem letzten Beitrag keine Frage mehr.
=> Thema abgeschlossen.
-
Wenn du so viel Ahnung hast ,kannst du mir ruhig paar. Links geben passend zu meinem Thema, womit ich gut bedient bin.
Jeder fängt mal klein an.Was muss ich mir genau anschauen um an mein Zeil zu erreichen ein Pixelbot zu programmieren.
-
kingaze schrieb:
Wenn du so viel Ahnung hast ,kannst du mir ruhig paar. Links geben passend zu meinem Thema, womit ich gut bedient bin.
Jeder fängt mal klein an.Was muss ich mir genau anschauen um an mein Zeil zu erreichen ein Pixelbot zu programmieren.
na aber genau das ist die falsche Einstellung fürs Programmieren. Du kannst nicht immer drauf hoffen dass dich wer bei der Hand nimmt.
Schau dir die gegebenen Stichworte in dem Thread an, und arbeite damit.Screenshot unter Windows machen, in OpenCV Datentyp cv::Mat umwandeln:
http://stackoverflow.com/questions/14148758/how-to-capture-the-desktop-in-opencv-ie-turn-a-bitmap-into-a-matGrundlagen Bildverarbeitung und OpenCV:
http://docs.opencv.org/doc/tutorials/tutorials.html
http://shervinemami.info/blobs.html
https://www.youtube.com/watch?v=bSeFrPrqZ2AMaus simulieren:
http://stackoverflow.com/questions/5164774/how-can-i-simulate-mouse-events-from-codeUnd GANZ WICHTIG: solide Programmierkenntnisse in C oder C++. Davor hat es wenig Sinn sich mit komplexen Dingen wie Bildverarbeitung zu beschäftigen.
-
kingaze schrieb:
Wenn du so viel Ahnung hast ,kannst du mir ruhig paar. Links geben passend zu meinem Thema, womit ich gut bedient bin.
Ganz tief durchatmen, und dann nochmal lesen was ich dir geschrieben habe.
Den wichtigsten Link geb' ich dir aber gerne: https://www.google.com
-
Mich würde mal interessieren wie groß deine Programmiererfahrung ist...
-
Meine oder die von kingaze?
Meine is ca. 20 Jahre C++, davon > 15 Jahre professionell.
Dazu noch diverse Assembler (früher, schon ewig nimmer angegriffen), natürlich C (auch schon ewig nimmer angegriffen) und seit > 5 Jahren auch immer mehr C#.
-
die von kingaze natürlich... deine kann man bei über 20.000 Beiträgen ein wenig besser einschätzen
-
Ach so
War (mir) nur nicht klar weil direkt unter meinem Beitrag und ohne @ - da ist nicht unüblich anzunehmen dass es an mich gerichtet ist.
-
Meine Erfahrung(en) noch ein Anfänger.
Danke für die Zahlreichen Links,alle natürlich angeschaut und versucht so gut wie möglich zu verstehen mit meinem Wissensstand.
Hier mal ein kleines 3minütiges Video was mein ungefähres Ziel ist.
https://www.youtube.com/watch?v=C0JXrCTy6pc
Der wurde in AutoIt geschrieben.
Ich versuche mal diesen hustbaer zu ingorieren.
-
Du hast nichts von dem was ich dir vermitteln wollte verstanden.
@dfsdfsfs
Du weisst schon was passiert wenn man jmd. schreibt dass er sich nicht erwarten soll dass ihn jmd. bei der Hand nimmt ... und ihn dann gleich darauf bei der Hand nimmt?
-
@dfsdfsfs
Du weisst schon was passiert wenn man jmd. schreibt dass er sich nicht erwarten soll dass ihn jmd. bei der Hand nimmt ... und ihn dann gleich darauf bei der Hand nimmt?naja, ich hab ihm ein paar Links gegeben, damit er überhaupt mal weiß nach welchen Begriffen er in Google suchen muss.
Wirklich lernen muss er es selbst, da ists dann komplett aus mit dem HändchenhaltenWobei ich immer skeptisch bin wenn jemand gleich sowas großes vorhat. Ich hatte anfangs Spaß daran meine kleinen Hello World Programme immer weiter auszubauen, aber auch zu analysieren, was welche Zeile nun tatsächlich tut.
Dinge wie WinAPI, OpenCV oder ähnliches hab ich erst viel später gelernt. Ich wäre anfangs auch überfordert gewesen. Da müssen einfach die Basics sitzen. Da hantiert man ganz selbstverständlich mit Datenstrukturen wie Bäumen oder ähnlichem. Kein Problem wenn man die Basics kennt. Kann aber zum Scheitern führen wenn man nicht weiß, wie man damit umzugehen hat.
-
kingaze schrieb:
Meine Erfahrung(en) noch ein Anfänger.
Ich hoffe dir ist klar, dass ein Anfänger niemals so ein Programm auf die Beine stellen kann. Du solltest dich erst mal mit MFC an sich befassen und ein bisschen spielen. Danach mit den WinAPIs usw...
kingaze schrieb:
Ich versuche mal diesen hustbaer zu ingorieren.
Ich hoffe dir ist auch klar, dass dieser hustbaer es eigentlich nur gut meint?!
-
Hi,
da nimmst Du AutoIt, man muss nicht alles neu erfinden, dort kannst Du Pixel aus den verschiedneen Sourfaces dx/Gl usw. abrufen:
http://de.wikipedia.org/wiki/AutoIt
Gruß Karsten
-
Ich haben erwähnt ,dass es mein Ziel ist ein solches Programm wie im Link zu sehen zu programmieren.
Ich setze mich jetzt auch nicht hin und erwarte Meilensteine innerhalb paar Tagen?
Ich denke ein paar Monate und kleine Erfolge sollten mir gelingen.Tutorials auf YT schaue ich mir auch an und versucher "step by step" mein Wissen zu erweitern.c++ habe ich genommen ,da dies eine Multi task lang. ist und AutoIt dem leider unterlegen ist ,da keine Multi Task Lang. ist.
Und ich will ein stabiles,performance starkes programm als Endprodukt.
-
Naja dann mach das so,
Hier wird in OnPaint nach einem Client Wnd gesucht, und das wird dann
Pixelig untersucht: wird gesuchtes gefunden sendet es einen
Hardcore MouseEvent und Key press, daraus kannst Du das alles herleiten:
(Damit fuhr ein "Wot" -Panzer die ganze Nacht ^^)Pseudoverbrechen:
COLORREF TestRegion(int x, int y,int w, int h,int linew, void *pbBits) { RGBTRIPLE *pRgb = (RGBTRIPLE *)pbBits; DWORD red(0),green(0),blue(0); for( int yy = y; yy < y+h; yy++ ) { for( int xx = x; xx < x+w; xx++ ) { red += pRgb[xx].rgbtRed; green += pRgb[xx].rgbtGreen; blue += pRgb[xx].rgbtBlue; } pRgb = (RGBTRIPLE *)((LPBYTE)pRgb + (sizeof(RGBTRIPLE) * linew)); } return RGB(red/(h*w),green/(h*w),blue/(h*w)); } void CWotBotDlg::OnPaint() { CPaintDC dc(this); CWnd* pClientWnd=(FindWindow("App","WoT-Client")); if(!pClientWnd) return; CDC* pDC(pClientWnd->GetWindowDC()); CRect rcClient;pClientWnd->GetClientRect(&rcClient); CRect rc;GetClientRect(&rc); int th = ::GetSystemMetrics(SM_CYCAPTION); //titelbar int mh = ::GetSystemMetrics(SM_CYMENU); //menubar int bw = ::GetSystemMetrics(SM_CXFIXEDFRAME)<<1;//border int nWidth = rc.Width();//GetSystemMetrics(SM_CXFULLSCREEN); int nHeight = rc.Height();//GetSystemMetrics(SM_CYFULLSCREEN); HDC hdcMem = ::CreateCompatibleDC(pDC->m_hDC); HBITMAP hbm = ::CreateCompatibleBitmap(pDC->m_hDC, nWidth, nHeight); HBITMAP hbmOld = (HBITMAP)::SelectObject(hdcMem, hbm); ::SetStretchBltMode(dc.m_hDC,STRETCH_DELETESCANS);//stretch with highquality ::StretchBlt(/*m_dib.GetDC()*/dc.m_hDC, 0,0, rc.Width(), rc.Height(),pDC->m_hDC , bw, th+bw,rcClient.Width()-bw,rcClient.Height(),SRCCOPY); //BitBlt(hdcMem, 0, 0, nWidth, nHeight, pDC->m_hDC, 0, 0, SRCCOPY); ::SetStretchBltMode(hdcMem,STRETCH_DELETESCANS);//stretch with highquality ::StretchBlt(hdcMem, 0,0, rc.Width(), rc.Height(),pDC->m_hDC , bw, th+bw,rcClient.Width()-bw,rcClient.Height(),SRCCOPY); BITMAPINFO bmi;ZeroMemory(&bmi, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = nWidth; bmi.bmiHeader.biHeight = -nHeight; bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biSizeImage = nWidth * nHeight * 3; BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage]; ::GetDIBits( hdcMem, hbm,0,abs(bmi.bmiHeader.biHeight),pbBits,&bmi,DIB_RGB_COLORS ); BYTE red1; BYTE green1; BYTE blue1; COLORREF rgb = TestRegion(266, 17, 96 ,22, nWidth, pbBits); //garage red1 = GetRValue(rgb); green1 = GetGValue(rgb); blue1 = GetBValue(rgb); TRACE("(A) %d:%d:%d\r\n",red1,green1,blue1); /* //hier primitiv wird ein Mouse/Key event systemweit gesendet //um eine Usereingabe zu simulieren wenn bestimmte Farben gefunden werden if(red1 > 77 && red1 < 83 && green1 > 33 && green1 < 41 && blue1 > 22 && blue1 < 29 && g_state == 0)//oben ja { int x(511),y(76); SetCursorPos(x,y);Sleep(10); mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);Sleep(10); mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);Sleep(10); keybd_event(VK_ESCAPE ,0x041,0 , 0); g_state = 1; } */ //CString str; str.Format("%d.bmp",n++); //m_dib.Save(str.GetBuffer(),pbBits);//dc.SelectObject(pOldBmp); delete [] pbBits; ::SelectObject(hdcMem, hbmOld); ::ReleaseDC(0, pDC->m_hDC); ::ReleaseDC(0, hdcMem); }
Viel Spass damit
Gruß
Karsten