Winner_Of_Death Temat założony przez niniejszego użytkownika |
[C++, Allegro] getpixel - czujnik ruchu » 2014-02-23 16:45:32 Witam. Nie mogę znaleźć skuteczniejszego sposobu od getpixel, ale przy próbie skorzystania z getpixel, napotykam problem. Kod: if( getpixel( screen, druga_postac_x - 20, druga_postac_y - 20 ) == makecol( 20, 120, 220 ) || getpixel( screen, druga_postac_x, druga_postac_y - 20 ) == makecol( 20, 120, 220 ) || getpixel( screen, druga_postac_x, druga_postac_y - 40 ) == makecol( 20, 120, 220 ) || getpixel( screen, druga_postac_x - 20, druga_postac_y - 40 ) == makecol( 20, 120, 220 ) ) { clear_to_color( druga_postac, makecol( 222, 222, 222 ) ); } else { clear_to_color( druga_postac, makecol( 0, 0, 0 ) ); } druga_postac - to kwadrat 20x20 pxl Pierwsze 3 warunki działają bez zarzutu, problem jest z "lewy góra". Gdy lewy górny róg dotknie niebieskiego: nic się nie dzieje. Gdy inne rogi dotkną niebieskiego: druga_postac zmienia kolor. Co tu jest źle? |
|
marianekA |
» 2014-02-23 23:21:28 moim zdaniem źle obliczasz współrzędne narożników "postaci", masz je przesunięte w górę 40p. i w lewo o 20p. jeśli postać to kwadrat o boku 20 p. to jego lewy górny = x, y, prawy górny = x+20,y, prawy dolny = x+20,y+20, lewy dolny = x, y+20, |
|
Winner_Of_Death Temat założony przez niniejszego użytkownika |
» 2014-02-24 11:25:28 Sam na początku tak zrobiłem, lecz wtedy NIC nie działa. Sprawdzałem X i Y kwadratu. 0x i 0y znajduje się (to według mnie dziwne) jakieś 20 pikseli niżej od prawego dolnego rogu kwadratu. Jeśli ktoś ma czas, niech utworzy dwa kwadraty 20x20 i wklei poniższy kod w odpowiednie miejsce. EDIT: Dobra, znalazłem błąd, a dokładniej ten kawałek kodu: masked_blit( druga_postac, bufor, 0, 0, druga_postac_x - 20, druga_postac_y - 40, druga_postac->w, druga_postac->h ); Ten kawałek przesuwał mi X i Y. Teraz kod jest taki jaki podał marianekA: if( getpixel( screen, druga_postac_x, druga_postac_y ) == makecol( 20, 120, 220 ) || getpixel( screen, druga_postac_x + 20, druga_postac_y ) == makecol( 20, 120, 220 ) || getpixel( screen, druga_postac_x + 20, druga_postac_y + 20 ) == makecol( 20, 120, 220 ) || getpixel( screen, druga_postac_x, druga_postac_y + 20 ) == makecol( 20, 120, 220 ) ) { clear_to_color( druga_postac, makecol( 222, 222, 222 ) ); } else { clear_to_color( druga_postac, makecol( 0, 0, 0 ) ); } I o dziwo nadal jest ten sam problem. Lewy górny róg nie reaguje na niebieski kolor, a inne tak o_O EDITx2: Niestety, nie mam zielonego pojęcia czemu ta kolizja nie działa, lecz po odjęciu 1 od X i Y, kolizja działa normalnie ( z przesunięciem o 1 piksel). Na szczęście nie widać tego na pierwszy rzut oka, a więc może zostać. Jak ktoś chce się wypowiedzieć, zostawiam temat otwarty do jutra ;) Teoretycznie, dobrze działający kod: if( getpixel( screen, druga_postac_x - 1, druga_postac_y - 1 ) == makecol( 20, 120, 220 ) || getpixel( screen, druga_postac_x + 20, druga_postac_y ) == makecol( 20, 120, 220 ) || getpixel( screen, druga_postac_x + 20, druga_postac_y + 20 ) == makecol( 20, 120, 220 ) || getpixel( screen, druga_postac_x, druga_postac_y + 20 ) == makecol( 20, 120, 220 ) ) { clear_to_color( druga_postac, makecol( 222, 222, 222 ) ); } else { clear_to_color( druga_postac, makecol( 0, 0, 0 ) ); } |
|
« 1 » |