Forum: SDL-Hjälp

Forum huvudsida -> Programmering -> SDL-Hjälp

Sidor: 1

Till botten

Sotai 15:15 - 6:e Maj 2006 | Post #1
Medlem
Inlägg: 5


Skicka PM
Tjenare, jag håller på att skriva ett "super tank"-spel i SDL. Jag har dock tampats med 2st problem de senaste två dagarna. Här är spelet som det ser ut nu så kan ni se exakt hur det ser ut.
http://design.sobaku.net/files/bin/Tahkns-bin-b0.1.rar
(Styr tanken med wsad och tornet med qe).

Problemet med hur tanken rör sig ligger troligtvis i:
  1. if ( keystates[SDLK_w] )
  2. {
  3. this->Clip.y -= RoundDouble(this->Velocity * cos((M_PI/180)*Angle));
  4. this->Clip.x -= RoundDouble(this->Velocity * sin((M_PI/180)*Angle));
  5. }
  6. if ( keystates[SDLK_s] )
  7. {
  8. this->Clip.y += RoundDouble(this->Velocity * cos((M_PI/180)*Angle));
  9. this->Clip.x += RoundDouble(this->Velocity * sin((M_PI/180)*Angle));
  10. }


Här är avrundningsfunktionen ifall ni undrar:
  1.  
  2. int RoundDouble(double d)
  3. {
  4. int x = d + 0.5;
  5. return x;
  6. }


Problemet med de svarta rutorna har jag inte riktigt klurat ut vart det ligger, men jag tror att det kommer från rotozoomSurface ( som ligger i SDL_gfx ) när den är tvungen att förstora surfacen så att den inte klipper hörnen. rotozoomSurface verkar också ta bort colorkeyen efter varje gång. Här är funktionen som blittar ihop kroppen till ett surface som sedan ritas ut:

  1. void Player::BuildBody ()
  2. {
  3. //Uint32 colorkey;
  4. SDL_FillRect(Surface, NULL, 0x00FFFF);
  5. if ( this->hull != NULL )
  6. {
  7. SDL_Rect dst;
  8. dst.x = (int)(Surface->w/2) - (int)(hull->w/2);
  9. dst.y = (int)(Surface->h/2) - (int)(hull->h/2);
  10. // Blit the hull
  11. SDL_BlitSurface(this->hull, &hull->clip_rect, this->Surface, &dst);
  12. }
  13. if ( this->turret != NULL )
  14. {
  15. SDL_SetColorKey(turret, SDL_RLEACCEL | SDL_SRCCOLORKEY, 0x00FFFF);
  16. SDL_Rect dst;
  17. dst.x = (int)(Surface->w/2) - (int)(turret->w/2);
  18. dst.y = (int)(Surface->h/2) - (int)(turret->h/2);
  19. // Blit the turret
  20. SDL_BlitSurface(this->turret, NULL, this->Surface, &dst);
  21. }
  22. }

"Surface" är det som sedan blittas ut på skärmen, ovanför bakgrunden.

Ifall ni vill så finns källkoden här: http://design.sobaku.net/files/bin/Tahnks-src-b0.1.rar
(använder SDL, SDL_image, SDL_ttf, SDL_gfx och libmysql)

Hoppas någon kan hjälpa mig!

-------------------------
Ingen signatur!

Senast redigerad 15:20 - 6:e Maj 2006


Nissebosselasse 16:40 - 6:e Maj 2006 | Post #2
Medlem
Inlägg: 490


Skicka PM
Du ska inte sätta färgen explicit med färgvärden (0x00FF t.ex.), utan använd istället SDL_MapRGB, eftersom färgformatet beror på vilket bitdjup du har i just den surface:n där du sätter färgen. Om detta löser några problem med koden vetefasen, men det var det första jag reagerade på när jag läste koden här ovanför.

-------------------------
http://pushingcows.se
Gula Nallen



Sotai 16:42 - 6:e Maj 2006 | Post #3
Medlem
Inlägg: 5


Skicka PM
Jo, jag har tänkt på det, men i detta fall så spelar det ingen roll, detta är bara en massa skitkod bara för att få de att funka innan jag fixar till den. Alla mina surfaces är i detta fall 32-bitars utan någon alphachannel

-------------------------
Ingen signatur!



Sidor: 1

Forum huvudsida -> Programmering -> SDL-Hjälp
Atom feed

Du får inte posta i den här tråden | Till toppen