Forum: SDL collision

Forum huvudsida -> Programmering -> SDL collision

Sidor: 1

Till botten

140chris140 18:57 - 29:e Januari 2009 | Post #1
Medlem
Inlägg: 22


Skicka PM
Tjena! jag undrar hur jag skulle kunna göra SDL collision med tiles . Tex om jag bestämmer kordinater för bilden och sedan fixar så att bilden blir solidSmiley eller ja .. Hur man gör så att bilden blir solid . Hoppas ni kan hjälpa ! Tack




FrozenSnake 23:02 - 29:e Januari 2009 | Post #2
Medlem
Inlägg: 26


Skicka PM
http://www.gamedev.net/community/forums/topic.asp?topic_id=474914

Kanske kan hjälpa dig.




140chris140 00:31 - 30:e Januari 2009 | Post #3
Medlem
Inlägg: 22


Skicka PM
Det kommer det nogSmiley måste bara fundera hur det funkar så ^^ tackar




140chris140 01:16 - 1:a Februari 2009 | Post #4
Medlem
Inlägg: 22


Skicka PM
Hmm.. Me det sättet måste jag typ skapa 100 st wall arrays etc etc o.O lite segt . Vet ni något sätt o göra det lättare? Har sett en tutorial där han gör det me 1:1 osv . Ska checka den lite mer ba undra om ni hade någon nice artikel lr nåttSmiley




achnorr 22:50 - 1:a Februari 2009 | Post #5
Medlem
Inlägg: 82


Skicka PM

  1. if( A2 < A1 + SVARTWIDTH) {}/* SVARTWIDTH är den svarta boxens bredd
  2. */
  3. /*
  4. på svenska blir satsen följande :
  5. Om (A2 är mindre än A1 + bredden av den svarta boxen) {}
  6. */

Skriver vi bara så så kommer kollisionen att se ut så här :

Vilket visserligen skulle sätta stopp för den röda boxen och mer därtill. För att specificera kollisionen mera så måste vi lägga till följande :


  1. if( (A2 < A1 + SVARTWIDTH) && ( A2 + R-DWIDTH > A1) ) {}
  2.  
  3. /*
  4. Om (A2 är mindre än A1 + bredden av den svarta boxen) OCH ( A2 + bredden av den röda boxen ) är större än A1 {}
  5. */

Nu ser kollisionen ungefär ut såhär :



För att få kollisionen enbart till boxen skrivs följande
  1. if( (A2 < A1 + SVARTWIDTH) && ( A2 + R-DWIDTH > A1) && ( C2 + R-DHEIGHT ) > C1 && C2 < (C1 + SVARTHEIGHT) ){}
  2. /*
  3. Om (A2 är mindre än A1 + bredden av den svarta boxen) OCH ( A2 + bredden av den röda boxen ) är större än A1 OCH (C2 + bredden av den röda boxen) är större än C1 OCH C2 är mindre än (C1 + den svarta boxens höjd) {}
  4. */


Precis som vi vill ha det. Enda problemet är att vi inte vet från vilket håll de stöter emot varandra och därmed kan vi inte avgöra vilket håll vi ska EURstötaEUR boxen.
För att ta reda på detta så kollar vi helt enkelt vilka tangenter som är nedtryckta och avgör därifrån vilken sida boxen krockar med.
Detta gör vi med denna funktion
  1. void key_input()
  2. {
  3. Uint8 *keys;
  4. keys = SDL_GetKeyState(NULL);
  5.  
  6. if (keys[SDLK_UP])
  7. {
  8. y -= SPEED;
  9. upp = true;
  10. ner = false;
  11. vänster = false;
  12. höger = false;
  13. }
  14.  
  15. else if (keys[SDLK_LEFT])
  16. {
  17. x -= SPEED;
  18. upp = false;
  19. ner = false;
  20. vänster = true;
  21. höger = false;
  22. }
  23.  
  24. else if (keys[SDLK_DOWN])
  25. {
  26. y += SPEED;
  27. upp = false;
  28. ner = true;
  29. vänster = false;
  30. höger = false;
  31. }
  32.  
  33. else if (keys[SDLK_RIGHT])
  34. {
  35. x +=SPEED;
  36. upp = false;
  37. ner = false;
  38. vänster = false;
  39. höger = true;
  40. }
  41. }


Hela koden
  1. #pragma comment(lib, "SDL.lib") //länkar sdl
  2. #pragma comment(lib, "SDLmain.lib") //..
  3. #pragma comment(lib, "SDL_image.lib") //länkar sdl_image
  4.  
  5. #include "SDL.h"
  6. #include "SDL_image.h"
  7. #include <string>
  8.  
  9. using namespace std;
  10.  
  11. #define SPEED 3 // den röda boxens fart
  12.  
  13. #define SVARTX 200 // svarta boxens x-kordinat
  14. #define SVARTY 100 // svarta boxens y-kordinat
  15. #define SVARTWIDTH 30 // svarta bredd
  16. #define SVARTHEIGHT 30 // svarta höjd
  17.  
  18. #define R-DWIDTH 30 // röda boxens bredd
  19. #define R-DHEIGHT 30 // röda boxenshöjd
  20.  
  21.  
  22.  
  23. SDL_Surface*screen;
  24. SDL_Surface*svartbox;
  25. SDL_Surface*rödbox;
  26.  
  27. SDL_Event event;
  28.  
  29. int x = 0,y = 0; // röda boxens x och y kordinat
  30.  
  31. bool upp = false;
  32. bool ner = false;
  33. bool vänster = false;
  34. bool höger = false;
  35.  
  36. SDL_Surface*Load_Image( string filename ) // vår funktion för att ladda bilder
  37. {
  38. SDL_Surface*loadedimage = IMG_Load( filename.c_str() );
  39. return loadedimage;
  40. }// =================
  41.  
  42.  
  43. void DisplayImage(SDL_Surface* destination,SDL_Surface*img,int x, int y)
  44. {
  45. SDL_Rect rect;
  46. rect.x = x;
  47. rect.y = y;
  48. SDL_BlitSurface(img, NULL, destination, &rect);
  49. }
  50.  
  51. void key_input()
  52. {
  53. Uint8 *keys;
  54. keys = SDL_GetKeyState(NULL);
  55.  
  56. if (keys[SDLK_UP])
  57. {
  58. y -= SPEED;
  59. upp = true;
  60. ner = false;
  61. vänster = false;
  62. höger = false;
  63. }
  64.  
  65. else if (keys[SDLK_LEFT])
  66. {
  67. x -= SPEED;
  68. upp = false;
  69. ner = false;
  70. vänster = true;
  71. höger = false;
  72. }
  73.  
  74. else if (keys[SDLK_DOWN])
  75. {
  76. y += SPEED;
  77. upp = false;
  78. ner = true;
  79. vänster = false;
  80. höger = false;
  81. }
  82.  
  83. else if (keys[SDLK_RIGHT])
  84. {
  85. x +=SPEED;
  86.  
  87. upp = false;
  88. ner = false;
  89. vänster = false;
  90. höger = true;
  91. }
  92. }
  93. bool init()
  94. {
  95. if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ){return false;} // kollar så att SDL initierades korrekt
  96.  
  97. screen = SDL_SetVideoMode(640,480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF ); //sätter upp själva fönstret
  98.  
  99. return true;
  100. }
  101.  
  102.  
  103. bool load_files()
  104. {
  105. svartbox = Load_Image("rödbox.jpg"); if(svartbox == NULL){return false;} //laddar in bilden "träd.jpg" och kollar att det gick bra annars retureras false
  106. rödbox = Load_Image("svartbox.jpg"); if(rödbox == NULL){return false;}
  107. return true;
  108. }
  109.  
  110. int main(int argc, char *argv[])
  111. {
  112. if( init() == false) {return 0;} // kollar om init() returerade false och stänger programmet i så fall
  113. if( load_files() == false ) {return 0;}// kollar om load_files() returerade false och stänger programmet i så fall
  114.  
  115. bool quit = false;
  116.  
  117.  
  118.  
  119. while (quit == false) // körs så länge som quit är false
  120. {
  121. SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0xFF, 0xFF, 0xFF));
  122.  
  123.  
  124. key_input();
  125.  
  126. if( x < ( SVARTX + SVARTWIDTH) && ( x + R-DWIDTH ) > SVARTX && (y + R-DHEIGHT) > SVARTY && y < ( SVARTY + SVARTHEIGHT) )
  127. {
  128. if(upp == true)
  129. y += SPEED;
  130. if(vänster == true)
  131. x += SPEED;
  132. if(ner == true)
  133. y -= SPEED;
  134. if(höger == true)
  135. {x-= SPEED;}
  136.  
  137. }
  138.  
  139. while ( SDL_PollEvent(&event) )
  140. {
  141. if( (event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_ESCAPE) ){quit = true;}
  142. }
  143.  
  144. DisplayImage(screen,rödbox,SVARTX,SVARTY);
  145. DisplayImage(screen,svartbox,x,y);
  146. SDL_Flip(screen);
  147. SDL_Delay(10); // för att inte fönstret ska uppdatera sig onödigt mycket
  148. }
  149.  
  150. return 0;
  151. }


Finns säkert andra sätt att göra det hela på men detta fungerar ( hoppas allt vart rätt nu med vad jag skrevSmiley )



-------------------------
Ohhoo*



140chris140 20:38 - 2:a Februari 2009 | Post #6
Medlem
Inlägg: 22


Skicka PM
Tackar skit sjysst! Ska checka din fina kodSmiley Men som sagt Coll går o göra på så många olika sättSmiley Tack för bådas hjälp .




Sidor: 1

Forum huvudsida -> Programmering -> SDL collision
Atom feed

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