[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]
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
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] *