[ Fenix @ 07.06.2005. 16:55 ] @
Kako da nađem i pratim sprite nekog drugog 2D programa (tako da mogu uraditi da npr. kurzor miša ode i pokaže na njega).
[ yooyo @ 07.06.2005. 18:17 ] @
Moras biti malo precizniji... Koji OS, koji program, kakvi su sprajtovi?

yooyo

[ Fenix @ 08.06.2005. 10:23 ] @
Evo konkretno, windows je u pitanju:

Krenuo sam da za jedno dijete malo prilagodim njegovom uzrastu jednu njegovu igricu (2D) "ušminkavanjem spolja".

U tu svrhu mi je bilo potrebno da propoznam lokaciju određenih likova koji se pojavljuju tu (npr. lokaciju šešira i sl.).

Stvar me zainteresovala i prerasla praktični značaj toga što se prvobitno htjelo.

Pa sam uzeo DC prozora i pomoću funkcija GetPixel i SetPixel postigao cilj, s obzirom na karakteristični opseg boja npr. toga šešira, i njegovo lociranje u 99% slučajeva.

Ispitivanje čitave površine prozora GetPixel funkcijom je prilično sporo pa sam pomislio da bi puno elegantnije i brze rješenje bilo, kada bih nekako saznao poziciju spritova na prozoru (njihove koordinate ili njihove pravougaonike), pa onda samo njih ispitivati GetPixel-om (ili postoji neki pogodniji / brzi način), da li se radi o šeširu ili ne.

Da li se to moze lako postići kroz DirectX ili je dovoljno mozda samo praviti kopiju DC-ja u sistemskoj memoriji (CreateCompatible... Bitmap/DC npr.), pa onda tu ispitivati pixel-e (na koji način, kojom funkcijom), što bi trebalo biti nešto brze, ali i tada još uvijek pretrazujem čitavu površinu bitmape, a mogu li se mozda locirati spritovi i na ovaj način (kroz kopiju u sistemskoj memoriji)?
[ yooyo @ 08.06.2005. 11:01 ] @
Pravi sprajtovi vise ne postoje. Sva iscrtavanja u DC radi ili CPU ili graficki driver.

DirectX ti ne moze pomoci u resenju ovog problema.

Jedan od nacina je da se u runtime-u zakacis na process i da nekako provalis adresu u memoriji procesa na kojoj se nalazi koordinata sesira. Ovo je izuzetno komlikovan nacin koji zahteva "hakersko" znanje. Naravno.. ovo zavisi od programa do programa.. pa cak od verzije istog programa

Drugi nacin je da malo pametnije pretrazujes sliku. Nemoj koristiti Set/GetPixel, nego pokusaj ca sadrzaj DC-a iskopiras u bitmap a zatim pozovi GetDIBits. Na ovaj nacin dobices sve pixele u tvom bufferu i onda "pointerskim" pristupom analiziras sliku.

Mozes i da pokusas da se zakacis na gdi32 pa da presreces i propustas pozive za crtanje. Linkovi na ovu temu su:

http://www.codeguru.com/Cpp/W-P/dll/hooking/article.php/c3639/
http://www.codeguru.com/Cpp/W-P/dll/hooking/article.php/c127/
http://www.anticracking.sk/EliCZ/export.htm

yooyo
[ Fenix @ 08.06.2005. 11:32 ] @
Citat:
Mozes i da pokusas da se zakacis na gdi32 pa da presreces i propustas pozive za crtanje


Ako misliš na poruke tipa WM_PAINT i sl., već sam pokušao da pronađem path ili rect koji se update-uje nakon stizanja te poruke. Međutim ta poruka uopšte ne stize prozoru, izgleda da koristi DirectDraw.

Ovo što kazeš na način sa GetDIBits će izgleda biti najpovoljnije rješenje, samo kako da tu ispitujem pixel-e i njihovu boju?

Mislim da je posebno vazno pronaći transparent pixele, pošto svaki sprite odnosno lik nikad nije potpuno pravougaon, pa pretpostavljam da bi kod svakog u uglovima pripadajućeg pravougaonika trebao biti određen broj transparent pixela. Šta kazeš na to?

[ yooyo @ 08.06.2005. 12:03 ] @
Citat:

Ako misliš na poruke tipa WM_PAINT i sl., već sam pokušao da pronađem path ili rect koji se update-uje nakon stizanja te poruke. Međutim ta poruka uopšte ne stize prozoru, izgleda da koristi DirectDraw.


Nisam mislio na WM_PAINT... Pomocu hook-a mozes da presretnes SVE draw pozive (TextOut, Fillrect, ...) Na tebi je da provalis koji draw poziv iscrtava sesir pa onda tu nesto promeni. Naravno.. ovo je samo u slucaju da program koristi GDI.

U slucaju DirectDraw-a mozes pokusati da presretnes DDraw pozive pomocu hook dll-a. Skini primere sa linkova koje sam ti dao pa ces videti o cemu pricam.

Sto se GetDIBits tice.. trebalo bi da dobijes sirovu sliku. Ako je format ekrana 24bit onda su boje slozene u tvom bufferu red po red, a u svakom redu pixeli (|rgb|rgb|rgb|).
Svaka od r,g ili b moze biti od 0 do 255.

Ne razumem to o transparenciji... ako je slika vec iscrtana, onda se informacije o transparenciji izgubila...

yooyo
[ Fenix @ 08.06.2005. 13:03 ] @
Pokušao sam sa hook-om, nisam ulovio ništa više od dobijanja fokusa, klika mišem i puno timer poruka. Ima samo jedna poruka koju nisam uspio da dešifrujem a to je &H40A i to ne znam šta je. U proces menageru sam vidio da se obraća na izvjesni DirectDraw dll, pa sam pretpostavio da ne koristi GDI.

Hvatanje DDraw poziva nisam radio ranije, jel slično ovom uobičajenom hook-u?
Prostudiraću primjere kad dođem kući.

Što se tiče transparencije i layera, mislio sam ta informacija postoji negdje u DC-u.
[ yooyo @ 08.06.2005. 13:35 ] @
Postoji dva hook mehanizma. Jedan je win-hook (kacenje na WinProc nekog prozora) a drugi je system-hook, tj. kacenje na bilo koju funkciju Win32 API-a. Ja ti predlazem ovo drugo resenje.

yooyo