Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++, Allegro] getpixel - czujnik ruchu

Ostatnio zmodyfikowano 2014-02-24 11:25
Autor Wiadomość
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:
C/C++
if( getpixel( screen, druga_postac_x - 20, druga_postac_y - 20 ) == makecol( 20, 120, 220 ) /*lewy dol*/
|| getpixel( screen, druga_postac_x, druga_postac_y - 20 ) == makecol( 20, 120, 220 ) /*prawy dol*/
|| getpixel( screen, druga_postac_x, druga_postac_y - 40 ) == makecol( 20, 120, 220 ) /*prawy gora*/
|| getpixel( screen, druga_postac_x - 20, druga_postac_y - 40 ) == makecol( 20, 120, 220 ) /*lewy gora*/ )
{
    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?
P-105149
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,
P-105168
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:
C/C++
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:
C/C++
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 ) );
}
P-105180
« 1 »
  Strona 1 z 1