[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] SDL/c++ newbie



On 2004-08-18, Niels Hygum Nielsen <sslug@sslug> wrote:

Hej Niels,

Jeg har kigget lidt på det, og jeg tror jeg har fundet fejlen. Jeg kan
ihvertfald kompilere og køre programmet uden problemer hos mig.

> static void move_partikler()
> {
> 	int i;
>
> 	for (i = 0; i < NUM_PARTIKLER; i++)
> 	{
> 	//flytter partiklerne
> 		partikler[i].x += partikler[i].vx*DT;
> 		partikler[i].y += partikler[i].vy*DT;
> 	//gør at partiklerne skifter retning hvis de rammer siderne
> 		if(partikler[i].x < 0 || partikler[i].x > screen->w - 1)
> 			partikler[i].vx = -partikler[i].vx;
> 		if(partikler[i].y < 0 || partikler[i].y > screen->h - 1)
> 			partikler[i].vy = -partikler[i].vy;
>
> 	}
> }

Her, ovenfor, går det galt. Når du opdager at en partikel er uden for skærmen,
altså at x/y ikke er imellem 0 og højde/bredde, så ændrer du på partiklens
retning. Du gør ikke noget ved det faktum at partikelen ikke er inden for
skærmområdet.

Når du så senere skal tegne partiklen og udregner dit offset, så vil du
udregne et offset der ligger uden for det område SDL har ret til at skrive i.
Generelt er den slags noget rigtigt farligt noget at gøre, og det er derfor
SDL bryder sammen. 

Jeg ved ikke helt hvorfor det fungerer når cout linien er med, men jeg har
nøjagtig samme opførsel som du har. Jeg er ret sikker på at det er
tilfældigheder der gør det, for det burde ikke være sådan. Programmet burde
være i stykker, ligemeget om du udskriver debug information eller ej.

> static void draw_partikler()
> {
> 	Uint16 *raw_pixels;
> 	int offset, i;
> 	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
> 	if ( SDL_MUSTLOCK(screen) ) 
> 	{
>         	if ( SDL_LockSurface(screen) < 0 ) 
> 		{
>         		return;
>         	}
>     	}	
>
> 	//tror måske det er her det går galt?
> 	for(i = 0; i < NUM_PARTIKLER; i++)
> 	{

Du kan løse problemet ved at indsætte følgende her:

 		if(partikler[i].x < 0 || partikler[i].x > screen->w - 1 ||
 			partikler[i].y < 0 || partikler[i].y > screen->h - 1)
		{
			continue;
		}

> 		raw_pixels = (Uint16*) screen->pixels;
> 		offset = (screen->pitch / 2 * partikler[i].y + partikler[i].x);
> 		raw_pixels[offset] = 12226; //tegner grønne pixels		
> 	}
>
> 	if ( SDL_MUSTLOCK(screen) ) 
> 		{
>         		SDL_UnlockSurface(screen);
> 		}
> 	SDL_UpdateRect(screen, 0, 0, 0, 0);
> }

Håber det hjalp dig lidt videre,

Hilsen Anders





 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 22:44 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *