void SLine(Uint16 left,Uint16 top,Uint16 right,Uint16 bottom,Uint8 r, Uint8 g, Uint8 b) { Uint32 g_Color=SDL_MapRGB(screen->format,r,g,b); char* g_pData; Uint16 temp,dx,dy,x,y,x_sign,y_sign,flag; dx=abs(right-left);dy=abs(bottom-top); if (((dx>=dy) && (left>right)) || ((dy>dx) && (top>bottom))) { temp=left; left=right; right=temp; temp=top; top=bottom; bottom=temp; } if ((bottom-top) < 0) y_sign=-1;else y_sign=1; if ((right-left) < 0) x_sign=-1;else x_sign=1; if (dx>=dy) { for (x=left,y=top,flag=0;x<=right;x++,flag+=dy) { if (flag>=dx) { flag -=dx; y+=y_sign; } //grab pixel pointer if ((x>-1 && x<800) && (y>-1 && y<600)) { g_pData=(char*)screen->pixels; //vertical offset //g_pData+=VALMISY[y];//(y*screen->pitch); g_pData+=(y*screen->pitch); //horizontal offset g_pData+=(x*screen->format->BytesPerPixel); //copy from color to frame buffer memcpy(g_pData,&g_Color,screen->format->BytesPerPixel); } } } else { for (x=left,y=top,flag=0;y<=bottom;y++,flag+=dx) { if (flag>=dy) { flag -=dy; x+=x_sign; } if (x>-1 && x<800 && y>-1 && y<600) { //grab pixel pointer g_pData=(char*)screen->pixels; //vertical offset //g_pData+=VALMISY[y];//y*screen->pitch); g_pData+=(y*screen->pitch); //horizontal offset g_pData+=(x*screen->format->BytesPerPixel); //copy from color to frame buffer memcpy(g_pData,&g_Color,screen->format->BytesPerPixel); } } } }
Mikä olisi tuossa viivan piirron ohella paras tapa tarkistaa edellinen väri ennen uudella "peittämistä"?
Tieto olisi tärkeä törmäystarkistukseen....
Eikö kukaan osaa selittä miten pääsisi entiseen väridataan ennen uuden laittamista?
No kai osaat pikseleitä lukea, jos kerran osaat piirtääkin? Mikä nyt oikeastaan on ongelma?
mistä kohti koodia ja miten erotellaan red,green ja blue?
Funktion SDL_MapRGB vastapari on SDL_GetRGB.
Et ole tosissasi. Eihän tolla tiedolla saa mitenkään koodista aikaisempaa väriä selville kun ei ole mitään hajua kuinka SDL_GetRGB:tä käytetään....
Siellä varmaan pitäisi olla toinenkin memcpy?
Miksi nää kysymykset ja vastaukset menee aina näin vaikeiksi?
Tulokset hakusanoilla "SDL_GetRGB" "example".
Ja hakutulosten pohjalta päättelin jotain tällaista ilman, että C++:aa itse koodailisin juuri ollenkaan:
Uint32 get_pixel32( SDL_Surface *surface, int x, int y ) { //Convert the pixels to 32 bit Uint32 *pixels = (Uint32 *)surface->pixels; //Get the requested pixel return pixels[ ( y * surface->w ) + x ]; } //The RGB values Uint8 r, g, b; // Current pixel Uint32 pixel = get_pixel32( screen, x, y ); // Get pixel's RGB values SDL_GetRGB( pixel, screen->format, &r, &g, &b );
Asioita helpottaisi, jos opettelisit itse ohjelmoimaan etkä kopioisi koodeja, joita et ymmärrä. On ihan älytöntä odottaa, että muut antaisivat aina valmista koodia.
Jos nyt alkuperäisestä koodistasi lähdetään, niin toivottavasti sen verran tiedät, että väri (r,g,b) piirretään valittuun kohtaan (g_pData) varsinaisesti seuraavilla riveillä:
g_Color = SDL_MapRGB(screen->format, r, g, b); memcpy(g_pData, &g_Color, screen->format->BytesPerPixel);
Ei pitäisi olla paljon vaadittu, että pystyisi selvittämään haulla näiden funktioiden toiminnan ja kääntämään ne vastakkaisiksi:
memcpy(&g_Color, g_pData, screen->format->BytesPerPixel); SDL_GetRGB(g_Color, screen->format, &r, &g, &b);
Nykyinen koodisi edellyttää, että koneen tavujärjestys on little endian, mutta se jääköön omaksi murheeksesi, jos joskus päädyt muunlaisille koneille kehittämään.
tsurigan löytämä koodi taas edellyttää, että pinta on 32-bittinen eikä sisällä täytetavuja rivien päissä.
short CollisionLine(Uint16 left,Uint16 top,Uint16 right,Uint16 bottom) { Uint32 g_Color; //SDL_MapRGB(O_Ship->format,r,g,b); char* g_pData; Uint8 r,g,b; //Uint8 rgb[3]; Uint16 temp,dx,dy,x,y,x_sign,y_sign,flag; dx=abs(right-left);dy=abs(bottom-top); if (((dx>=dy) && (left>right)) || ((dy>dx) && (top>bottom))) { temp=left; left=right; right=temp; temp=top; top=bottom; bottom=temp; } if ((bottom-top) < 0) y_sign=-1;else y_sign=1; if ((right-left) < 0) x_sign=-1;else x_sign=1; if (dx>=dy) { for (x=left,y=top,flag=0;x<=right;x++,flag+=dy) { if (flag>=dx) { flag -=dx; y+=y_sign; } memcpy(&g_Color, g_pData, screen->format->BytesPerPixel); SDL_GetRGB(g_Color, screen->format, &r, &g, &b); //grab pixel pointer // g_pData=(char*)O_Ship->pixels; //vertical offset //g_pData+=VALMISY[y];//(y*screen->pitch); // g_pData+=(y*O_Ship->pitch); //horizontal offset //g_pData+=(x*O_Ship->format->BytesPerPixel); //copy from color to frame buffer //memcpy(g_pData,&g_Color,O_Ship->format->BytesPerPixel); } return 0; } else { for (x=left,y=top,flag=0;y<=bottom;y++,flag+=dx) { if (flag>=dy) { flag -=dy; x+=x_sign; } memcpy(&g_Color, g_pData, screen->format->BytesPerPixel); SDL_GetRGB(g_Color, screen->format, &r, &g, &b); // g_pData=(char*)O_Ship->pixels; //vertical offset //g_pData+=VALMISY[y];//y*screen->pitch); // g_pData+=(y*O_Ship->pitch); //horizontal offset // g_pData+=(x*O_Ship->format->BytesPerPixel); //copy from color to frame buffer //memcpy(g_pData,&g_Color,O_Ship->format->BytesPerPixel); } } return 0; }
Tälläsen tein mutta kaatuu jostain syystä vaikka värejä en vielä tarkistakkaan....
Lisäys:
short CollisionLine(Uint16 left,Uint16 top,Uint16 right,Uint16 bottom) { short este=0; Uint32 *bufp; Uint8 r,g,b; Uint16 temp,dx,dy,x,y,x_sign,y_sign,flag; dx=abs(right-left);dy=abs(bottom-top); if (((dx>=dy) && (left>right)) || ((dy>dx) && (top>bottom))) { temp=left; left=right; right=temp; temp=top; top=bottom; bottom=temp; } if ((bottom-top) < 0) y_sign=-1;else y_sign=1; if ((right-left) < 0) x_sign=-1;else x_sign=1; if (dx>=dy) { for (x=left,y=top,flag=0;x<=right;x++,flag+=dy) { if (flag>=dx) { flag -=dx; y+=y_sign; } bufp = (Uint32 *) screen -> pixels + y*screen -> pitch/4 + x; SDL_GetRGB(*bufp, screen -> format, &r, &g, &b); if (r>0 || g>0 || b>0) este=1; } return este; } else { for (x=left,y=top,flag=0;y<=bottom;y++,flag+=dx) { if (flag>=dy) { flag -=dy; x+=x_sign; } bufp = (Uint32 *) screen -> pixels + y*screen -> pitch/4 + x; SDL_GetRGB(*bufp, screen -> format, &r, &g, &b); if (r>0 || g>0 || b>0) este=1; } } return este; }
korjasin näin,vieläkö tässä on jotain häikkää?
ainakin törmäys toimii ja ei kaadu?
if (r>0 || g>0 || b>0) este=1; }
Tuommoset sisennykset on iso häikkä :)
Tuossa vähän siistimmin sisennettynä
Aihe on jo aika vanha, joten et voi enää vastata siihen.