Forum: Hjälp med ett första program i SDL

Forum huvudsida -> Programmering -> Hjälp med ett första program i SDL

Sidor: 1

Till botten

Jepsson 15:26 - 28:e Januari 2007 | Post #1
Medlem
Inlägg: 7


Skicka PM
Hejsan.

Jag har ganska nyss börjat med SDL och har börjat lätt med ett program där man har en gubbe som man styr på en plan. När jag skulle göra så att man dör om man är när väggarna så fick jag det inte att funka när man åkte in i höger eller nedre vägg, men jag tror att jag kan fixa det.
Men till det riktiga problemet. När man åker in i väggen och dör så visas det en ful bild och sen ska programmet avslutas, men när detta händer så står det att SDL.exe har stött på ett fel och måste avslutas. Varför undrar jag?

Här kommer bilderna till programmet:
http://www.blinkenlights.se/?p=upload&do=download&id=304

Och här koden:
  1.  
  2. #include <SDL/SDL.h>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. int DisplayImageDead(const char*) {
  7. SDL_Surface *screen1;
  8. screen1 = SDL_SetVideoMode(640, 480, 16, 0);
  9. SDL_Surface* image3;
  10. image3 = SDL_LoadBMP("dead.bmp");
  11. SDL_BlitSurface(image3, NULL, screen1, NULL);
  12. SDL_Flip(screen1);
  13. SDL_Delay(3000);
  14. return 0;
  15. }
  16.  
  17. int DisplayImage(SDL_Surface* destination, const char*, int x, int y);
  18.  
  19.  
  20. int main(int argc, char *argv[])
  21. {
  22. SDL_Surface *screen;
  23. // En yta
  24. SDL_Event event;
  25. // Variabel för händelser
  26. int imgX=10,imgY=10, visa;
  27. // Variabler för att hålla reda på vart bilden ska ritas ut
  28. // Initiera SDL
  29. if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 )
  30. {
  31. cout << "Error, unable to initialize SDL: " << SDL_GetError() << endl;
  32. SDL_Quit();
  33. return 1;
  34. }
  35. else
  36. {
  37. cout << "SDL initialized successfully!" << endl;
  38. }
  39. screen = SDL_SetVideoMode(640, 480, 16, 0);
  40. if (screen == NULL)
  41. {
  42. cout << "Unable to set video mode: " << SDL_GetError() << endl;
  43. SDL_Quit();
  44. return 1;
  45. }
  46. else
  47. {
  48. cout << "Successfully set video mode!" << endl;
  49. }
  50. while (1)
  51. {
  52. SDL_PollEvent(&event);
  53. switch (event.type)
  54. {
  55. case SDL_QUIT:
  56. cout << "Terminating program!" << endl;
  57. SDL_Quit();
  58. return 0;
  59. case SDL_KEYDOWN:
  60. Uint8 *keys;
  61. keys = SDL_GetKeyState(NULL);
  62. if (keys[SDLK_UP])
  63. visa = 1;
  64. //tempY -= 5;
  65. if (keys[SDLK_DOWN])
  66. visa = 2;
  67. //tempY += 5;
  68. if (keys[SDLK_LEFT])
  69. visa = 3;
  70. //tempX -= 5;
  71. if (keys[SDLK_RIGHT])
  72. visa = 4;
  73. //tempX += 5;
  74. if (keys[SDLK_ESCAPE])
  75. {
  76. cout << "Terminating program!" << endl;
  77. SDL_Quit();
  78. return 0;
  79. }
  80. }
  81. //gör så att gubben åker hela tiden utan att man trycker
  82. if(visa == 1)
  83. {
  84. imgY -= 5;
  85. }
  86. if(visa == 2)
  87. {
  88. imgY += 5;
  89. }
  90. if(visa == 3)
  91. {
  92. imgX -= 5;
  93. }
  94. if(visa == 4)
  95. {
  96. imgX += 5;
  97. }
  98. //dör om man åker in i väggen
  99. if(imgY == 0)
  100. {
  101. DisplayImageDead("dead.bmp");
  102. SDL_Quit();
  103. /*
  104. SDL_Surface *screen1;
  105. screen1 = SDL_SetVideoMode(640, 480, 16, 0);
  106. SDL_Surface* image3;
  107. image3 = SDL_LoadBMP("dead.bmp");
  108. SDL_BlitSurface(image3, NULL, screen1, NULL);
  109. SDL_Flip(screen1);
  110. SDL_Delay(10000);
  111. SDL_Quit();
  112. return 0;
  113. */
  114. }
  115. if(imgX == 0)
  116. {
  117. DisplayImageDead("dead.bmp");
  118. SDL_Quit();
  119. }
  120. if(imgY == 420)
  121. {
  122. DisplayImageDead("dead.bmp");
  123. SDL_Quit();
  124. }
  125. if(imgX == 600)
  126. {
  127. DisplayImageDead("dead.bmp");
  128. SDL_Quit();
  129. }
  130. //imgX = tempX;
  131. //imgY = tempY;
  132. SDL_Surface* image2;
  133. image2 = SDL_LoadBMP("bg.bmp");
  134. SDL_BlitSurface(image2, NULL, screen, NULL);
  135. //SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0x00, 0x00, 0x00));
  136. DisplayImage(screen, "gubbe.bmp", imgX, imgY);
  137. SDL_Flip(screen);
  138. SDL_Delay(10);
  139. }
  140. // Stäng ner SDL och frigör resurser
  141. SDL_Quit();
  142. return 0;
  143. }
  144.  
  145. int DisplayImage(SDL_Surface* destination, const char*, int x, int y)
  146. {
  147. // Ladda bilden
  148. SDL_Surface* image;
  149. image = SDL_LoadBMP("gubbe.bmp");
  150. if (image == NULL)
  151. {
  152. cout << "Image could not be loaded!" << endl;
  153. return 1;
  154. }
  155. // Skapa en rect
  156. SDL_Rect rect;
  157. rect.x = x;
  158. rect.y = y;
  159. rect.w = image->w;
  160. rect.h = image->h;
  161. // Kopiera över bilden till ytan
  162. SDL_BlitSurface(image, NULL, destination, &rect);
  163. return 0;
  164. }
  165.  
  166.  


-------------------------
EUR~Real programmers don't document. If it was hard to write it should be hard to understand.EUR(TM) - Norem Pascalido



Jepsson 15:30 - 28:e Januari 2007 | Post #2
Medlem
Inlägg: 7


Skicka PM
Ojsan, sorry för dubbelpost.
Stod att sidan inte gick att visa bara.

-------------------------
EUR~Real programmers don't document. If it was hard to write it should be hard to understand.EUR(TM) - Norem Pascalido



nibbo 15:34 - 28:e Januari 2007 | Post #3
Administratör
Inlägg: 446


Skicka PM
    Citat av Jepsson:
Ojsan, sorry för dubbelpost.
Stod att sidan inte gick att visa bara.

Ingen fara Smiley

-------------------------
Ja! Det är en ,,KTA pungsvansknapp på min avatar!



Independence 18:06 - 28:e Januari 2007 | Post #4
Administratör
Inlägg: 1800


Skicka PM
Hm, det var både en och två kostigheter här Smiley
Varför har du en funktion som heter DisplayImageDead ?
,,ven om du skulle vilja ha en sådan funktion, varför sätter du upp en Ny screen i den?
Du borde kunna ersätta anropet till din specialfunktion med ett anrop till DisplayImage istället, och sedan ha en delay på tre sekunder efter det, och sedan köra sdl_quit.

-------------------------

Vi är riddarna som säger fiskbulle!





Jepsson 19:51 - 28:e Januari 2007 | Post #5
Medlem
Inlägg: 7


Skicka PM
Okej, ja jag kom på det förut när jag läste din guide lite mer. Men jag sa ju att jag inte var så duktig Smiley

Men nu kom jag på den annan sak, när jag kör mitt program eller ditt i guiden så använder det mer och mer minne hela tiden. Jag undrar vad det är som snor åt sig så mycket minne i programet? Tillslut är det så att hela programet hackar fram och det går knappt att styra gubben.

-------------------------
EUR~Real programmers don't document. If it was hard to write it should be hard to understand.EUR(TM) - Norem Pascalido



FunkyChicken 20:32 - 28:e Januari 2007 | Post #6
Nyhetsredaktör
Inlägg: 800


Skicka PM
chansar på varje bild behålls i minnet varje gång du laddat den (tänker som så att surfaceobjekten inte förstörs, bara pekarna till dem, även att du hoppar ur funktionen). I vilket fall är det dumt att ladda om bilden hela tiden, återanvänd samma surface istället.




Jepsson 21:10 - 28:e Januari 2007 | Post #7
Medlem
Inlägg: 7


Skicka PM
Tack för hjälpen, det funka fint. Men jag har inte fattat varför det blir det mysko felet när man åker in i kanten. Ingen som vet?
Och nu när jag bara använder DisplayImage funktionen för att visa bilderna så kommer inte min dead.bmp över bakgrunden, hur gör man för att få den överst? eller kanske tömma så att de andra bilderna försvinner?

-------------------------
EUR~Real programmers don't document. If it was hard to write it should be hard to understand.EUR(TM) - Norem Pascalido



Independence 23:39 - 28:e Januari 2007 | Post #8
Administratör
Inlägg: 1800


Skicka PM
Hmm, har du kört flip?

-------------------------

Vi är riddarna som säger fiskbulle!





Jepsson 18:10 - 29:e Januari 2007 | Post #9
Medlem
Inlägg: 7


Skicka PM
Nej hade inte det. Nu funkar det iaf, tack så mycket.

Men nu ett annat problem:

Jag ska göra en simpel kollision mellan två fyrkanter. En är en gubbe och en är en punkt. När jag har kolliderat så ska det skapas en ny punktslumpmässigt på planen. Men när jag använder en algoritm som skulle göra just det jag ville så blir det helt tvärtom. Alltså den skapar en random punkt varje varv i spelloopen och det är bara när en sådan punkt träffar gubben som den finns kvar.
Jag har verkligen försökt nu, så jag hoppas att någon kan hjälpa mig.

Först mina strukturer
  1. struct objekt
  2. {
  3. int imgX;
  4. int imgY;
  5. int w;
  6. int h;
  7. double fart;
  8. };
  9.  
  10. objekt gubbe;
  11. gubbe.imgX = 100;
  12. gubbe.imgY = 100;
  13. gubbe.w = 32;
  14. gubbe.h = 52;
  15. gubbe.fart = 2;
  16. objekt punkt;
  17. punkt.imgX = 0;
  18. punkt.imgY = 0;
  19. punkt.w = 10;
  20. punkt.h = 10;


Sen koden för kollisionen:

  1. //rita ut en random punkt
  2. if(punkt.imgX == 0 && punkt.imgY == 0)
  3. {
  4. punkt.imgX = rand() / (RAND_MAX / 560 + 1) + 40;
  5. punkt.imgY = rand() / (RAND_MAX / 400 + 1) + 40;
  6. DisplayPoint(screen, punkt.imgX, punkt.imgY, point);
  7. }
  8. if(punkt.imgX != 0 && punkt.imgY != 0)
  9. {
  10. if ((punkt.imgY+punkt.h <= gubbe.imgY) || (punkt.imgY >= gubbe.imgY+gubbe.h) ||
  11. (punkt.imgX+punkt.h <= gubbe.imgX) || (punkt.imgX >= gubbe.imgX+gubbe.w))
  12. {
  13. punkt.imgX = 0;
  14. punkt.imgY = 0;
  15. score++;
  16. }
  17. else
  18. DisplayPoint(screen, punkt.imgX, punkt.imgY, point);


-------------------------
EUR~Real programmers don't document. If it was hard to write it should be hard to understand.EUR(TM) - Norem Pascalido



Independence 18:20 - 29:e Januari 2007 | Post #10
Administratör
Inlägg: 1800


Skicka PM
Jag tror du bör byta ut eller-tecken (||) mot och-tecken (&&) i din kollisionskontroll.
Det var även intressant att du döpt en variabel i din strukt med svenskt namn, och de andra med engelskt namn. Jag läste först "fart" på engelska och förstod inte riktigt vad en fis gjortde i strukten Smiley Inget viktigt, men lite kul ^^

-------------------------

Vi är riddarna som säger fiskbulle!





Kanye 18:34 - 29:e Januari 2007 | Post #11
Medlem
Inlägg: 130


Skicka PM
du har alltid lagt märke till knasiga grejor independence :/

-------------------------
Motiverar?



Independence 18:50 - 29:e Januari 2007 | Post #12
Administratör
Inlägg: 1800


Skicka PM
    Citat av Kanye:
du har alltid lagt märke till knasiga grejor independence :/


Tja, jag måste ju läsa koden för att kunna hjälpa honom, och då är det inte så svårt att lägga märke till vad det står Smiley

-------------------------

Vi är riddarna som säger fiskbulle!





Jepsson 18:51 - 29:e Januari 2007 | Post #13
Medlem
Inlägg: 7


Skicka PM
Hehe, jag förstår att du la märke till det, men jag tänkte att jag vill få det att funka först. Så kan jag strukturera upp koden mer sedan.
Ska prova om det funkar, återkommer annars.

EDIT: nepp det fungerade inte, nu kommer det en slumpad punkt men kollisionen funkar inte. Du kan åka in i punkten utan att det händer något.

-------------------------
EUR~Real programmers don't document. If it was hard to write it should be hard to understand.EUR(TM) - Norem Pascalido

Senast redigerad 18:56 - 29:e Januari 2007


Sidor: 1

Forum huvudsida -> Programmering -> Hjälp med ett första program i SDL
Atom feed

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