Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Viivan piirtoa ja värin luentaa

Sivun loppuun

DumTom [02.03.2012 14:45:58]

#

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....

DumTom [02.03.2012 18:24:02]

#

Eikö kukaan osaa selittä miten pääsisi entiseen väridataan ennen uuden laittamista?

Metabolix [02.03.2012 18:26:02]

#

No kai osaat pikseleitä lukea, jos kerran osaat piirtääkin? Mikä nyt oikeastaan on ongelma?

DumTom [02.03.2012 19:20:35]

#

mistä kohti koodia ja miten erotellaan red,green ja blue?

Metabolix [02.03.2012 19:39:58]

#

Funktion SDL_MapRGB vastapari on SDL_GetRGB.

DumTom [03.03.2012 08:06:51]

#

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?

tsuriga [03.03.2012 09:37:06]

#

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 );

Metabolix [03.03.2012 13:25:02]

#

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ä.

DumTom [15.03.2012 12:14:02]

#

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?

User137 [15.03.2012 14:24:21]

#

if (r>0 || g>0 || b>0) este=1;
   }

Tuommoset sisennykset on iso häikkä :)

Grez [15.03.2012 14:39:03]

#

Tuossa vähän siistimmin sisennettynä


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta