Forum: felsökning behövs

Forum huvudsida -> Programmering -> felsökning behövs

Sidor: 1

Till botten

genomrutten 18:57 - 29:e Juli 2006 | Post #1
Medlem
Inlägg: 5


Skicka PM
behöver hjälp med att felsöka min kod, C++ med biblioteket SDL.

  1. #ifdef WIN32
  2. #pragma comment(lib, "SDL.lib")
  3. #pragma comment(lib, "SDLmain.lib")
  4. #endif
  5. #include "SDL.h"
  6. #include <iostream>
  7. using namespace std;
  8. int DisplayImage(SDL_Surface* destination, const char*, int x, int y)
  9. {
  10. SDL_Surface* terrorist;
  11. terrorist = SDL_LoadBMP("Terrorist.BMP");
  12. if (terrorist == NULL)
  13. {
  14. cout << "Kunde inte ladda bilden!" << endl;
  15. return 1;
  16. }
  17. else
  18. {
  19. cout << "Bilden laddad." << endl;
  20. }
  21. SDL_Rect rect;
  22. rect.x = x;
  23. rect.y = y;
  24. rect.w = terrorist->w;
  25. rect.h = terrorist->h;
  26. SDL_BlitSurface(terrorist, NULL, destination, &rect);
  27. return 0;
  28. }
  29. int main(int argc, char *argv[])
  30. {
  31. if (SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 )
  32. {
  33. cout << "Error, kunde inte initialisera SDL: " << SDL_GetError() << endl;
  34. SDL_Quit();
  35. return 1;
  36. }
  37. else
  38. {
  39. cout << "SDL initialiserat!" << endl;
  40. }
  41. SDL_Surface *screen;
  42. screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE|SDL_DOUBLEBUF);
  43. if (screen == NULL)
  44. {
  45. cout << "Kunde inte ställa in video mode: " << SDL_GetError << endl;
  46. SDL_Quit();
  47. return 1;
  48. }
  49. else
  50. {
  51. cout << "Video mode inställt!" << endl;
  52. }
  53. SDL_Surface *bakgrund;
  54. bakgrund = SDL_LoadBMP("Bakgrund.BMP");
  55. if (bakgrund == NULL)
  56. {
  57. cout << "Kunde inte ladda bilden!" << endl;
  58. SDL_Quit;
  59. return 1;
  60. }
  61. SDL_BlitSurface(bakgrund, NULL, screen, NULL);
  62. SDL_Flip(screen);
  63. SDL_Delay(3000);
  64. DisplayImage(screen, "Terrorist.BMP", 16, 13);
  65. SDL_Flip(screen);
  66. SDL_Delay(2000);
  67. SDL_Quit;
  68. return 0;
  69. }



-------------------------
Har ingen signatur och inga planer på att införskaffa en heller.

Senast redigerad 21:03 - 29:e Juli 2006


Nissebosselasse 19:08 - 29:e Juli 2006 | Post #2
Medlem
Inlägg: 490


Skicka PM
Du blittar till och från samma surface (rad 45):
  1.  
  2. SDL_BlitSurface (bakgrund, NULL, bakgrund, NULL);

Du måste ju blitta till skärmen:
  1.  
  2. SDL_BlitSurface (bakgrund, NULL, screen, NULL);


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



genomrutten 19:20 - 29:e Juli 2006 | Post #3
Medlem
Inlägg: 5


Skicka PM
okej, dumt av mig att missa det.

hur ska jag göra för att poppa upp fiender i fönsterna (posta ej någon kod, jag vill göra allt själv)? tänkte använda mig av funktionen som beskrivs i del 3 av SDL programmering för att enkelt placera ut fienderna. måste man gissa fram koordinaterna eller går dom att mäta ut via något program? fienderna ska jag också ta bort efter en sekund. det innebär

SDL_Delay(1000);

men hur tar man bort en bild ?

-------------------------
Har ingen signatur och inga planer på att införskaffa en heller.

Senast redigerad 19:20 - 29:e Juli 2006


Nissebosselasse 19:41 - 29:e Juli 2006 | Post #4
Medlem
Inlägg: 490


Skicka PM
Bara blitta över bakgrunden igen för att ta bort dom, alternativt så sparar du innehållet på skärmen där fienden ska komma precis innan du blittar ut honom, ritar ut fienden, och när han ska försvinna, så blittar du dit området du sparade innan.

Jag förstod inte riktigt första frågan... Menar du hur du får fram slumptalskoordinater för fienderna, eller?

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



genomrutten 20:06 - 29:e Juli 2006 | Post #5
Medlem
Inlägg: 5


Skicka PM
okejs, går och testar det nu.

angående den där första frågan så har jag glömt vad jag menade... men nu när du ändå snackar om det...

här är min bakgrundsbild.

det där är bakgrunden, hade tänkt att fiender skulle dyka upp i dom 10 (hela) fönsterna i en sekund. sen försvinner dom. men hur får man datorn att slumpartat välja ett av dom 10 fönsterna?

-------------------------
Har ingen signatur och inga planer på att införskaffa en heller.



Nissebosselasse 20:35 - 29:e Juli 2006 | Post #6
Medlem
Inlägg: 490


Skicka PM
Du skulle kunna skapa en struktur som håller X- och Y-position för ett fönster, och sedan skapa en vektor som innehåller en sådan ifylld struktur för varje fönster (du tar ut koordinaterna i bilden innan i t.ex. ett ritprogram).
Sedan så slumpar du bara ett index mellan noll och storleken på vektorn (d.v.s., antalet fönster totalt). Användet det indexet för att få fram den strukturen ur vektorn, och därmed koordinaten där fienden ska visas.

Du vill ju inte ha källkod, men det blir nog bättre om jag visar lite Smiley :
  1.  
  2. // En fönsterstruktur
  3. struct tag_Window {
  4. int x;
  5. int y;
  6.  
  7. // Konstruktörn ser ut så här bara
  8. // för att underlätta insättningen i
  9. // vektorn nedan
  10. tag_Window (int x, int y) : x(x), y(y) {}
  11. };
  12.  
  13. // Lägg in tre fönsterkoordinater
  14. std::vector<tag_Window> windows;
  15.  
  16. windows.push_back (tag_Window (30, 45));
  17. windows.push_back (tag_Window (30, 85));
  18. windows.push_back (tag_Window (40, 45));


Eller något liknande.

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



genomrutten 20:48 - 29:e Juli 2006 | Post #7
Medlem
Inlägg: 5


Skicka PM
ursäkta mig men nu blev det lite för komplicerat.

rad 3: skapar en struct vid namn tag_Window
rad 4: skapar medlemmen int x
rad 5: skapar medlemmen int y

rad 10 och det som följer får du gärna förklara rad för rad vad det gör.

EDIT: har uppdaterat koden och felrapporten i första posten. det är koden som man kan använda enligt artikeln "Grafik med SDL" del 3. det är något liknande (tror jag) vad du menar. vill dock inte funka.

EDIT2: glömde SDL_Flip(screen);
tror jag har nått på g nu Smiley

-------------------------
Har ingen signatur och inga planer på att införskaffa en heller.

Senast redigerad 21:04 - 29:e Juli 2006


Nissebosselasse 21:03 - 29:e Juli 2006 | Post #8
Medlem
Inlägg: 490


Skicka PM
Hur långt har du kommit inom objektorienterad programmering med C++? Och hur mycket har du använt STL (Standard Template Library) i C++?
Om svaret på båda frågorna är "Vafan...?", så kan jag förstå att mitt exempel är krångligt Smiley

"Grafik med SDL", är det tutorialen här på Blinkenlights? Jag är inte jätteinsatt i den, får kolla upp hur det är gjort där.

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



genomrutten 21:06 - 29:e Juli 2006 | Post #9
Medlem
Inlägg: 5


Skicka PM
har tyvärr ej kommit allt för långt. köpte boken C++-programmeing (Femte upplagan) och har kommit till lite for, while slingor.. har dock lärt mig lite annat (som if-slingor t ex) på internet. så kan inte direkt säga jag kommit alltför långt.

STL vet jag inte ens vad det är.

EDIT: efter lite googlande kan jag säga att jag inte arbetat med något (enligt denna sidan). har bara arbetat med string, math och iostream och liknande (d.v.s grundläggande)

-------------------------
Har ingen signatur och inga planer på att införskaffa en heller.

Senast redigerad 21:14 - 29:e Juli 2006


Nissebosselasse 21:25 - 29:e Juli 2006 | Post #10
Medlem
Inlägg: 490


Skicka PM
Nej, då är det lite svårare att ge några konkreta tips.

Kanske ha tio enskilda variabler av strukturen tag_Windows, som man bygger ut lite?
  1.  
  2. // En utbyggd fönsterstruktur
  3. struct tag_Window {
  4. int x;
  5. int y;
  6.  
  7. // Visas han i fönstret?
  8. bool show;
  9. };
  10.  
  11. // Gör tre fönsterbanditer
  12. tag_Window wnd1, wnd2, wnd3;
  13.  
  14. // Sätt deras positioner
  15. wnd1.x = 25;
  16. wnd1.y = 40;
  17. wnd1.show = false;
  18.  
  19. wnd2.x = 50;
  20. wnd2.y = 50;
  21. wnd2.show = false;
  22.  
  23. wnd3.x = 100;
  24. wnd3.y = 0;
  25. wnd3.show = false;

(Om du förresten vet hur man initierar en strukturvariabel med värden på en gång, kan du göra så här istället: )
  1.  
  2. // En utbyggd fönsterstruktur
  3. struct tag_Window {
  4. int x;
  5. int y;
  6.  
  7. // Visas han i fönstret?
  8. bool show;
  9. };
  10.  
  11. // Gör tre fönsterbanditer, och
  12. // sätt deras värden på en gång
  13. tag_Window wnd1 = { 25, 40, false},
  14. wnd2 = { 50, 50, false},
  15. wnd3 = { 100, 0, false};

Inne i programloopen får du kanske kolla mot ett slumptal huruvida gubben ska visas eller ej:
  1.  
  2. // Gubben visas/döljs i 50 % av fallen.
  3. // rand() ger ett decimaltal mellan 0.0
  4. // och 1.0
  5. if (rand() < 0.5) {
  6. // Utropstecknet betyder 'negera',
  7. // d.v.s., invertera det logiska värdet
  8. // (Sant blir falskt, och falskt blir sant)
  9. wnd1.show = !wnd1.show;
  10. }

Vid utritning blir det något liknande, där man får kolla om dom visas eller ej:
  1.  
  2. if (wnd1.show) {
  3. // Första gubben ska visas
  4. SDL_BlitSurface (surface, NULL, screen, NULL);
  5. }
  6.  
  7. if (wnd2.show) {
  8. // etc...


Det här är dock en ganska dålig lösning (tänk om du skulle vilja ha hundra fönster: hundra variabler!). Se det mer som ett dåligt exempel.

Mitt tips: börja med något mindre. Försök först med ett program som visar en bild, sedan två, sedan tre, kanske två bilder som studsar ovanpå en tredje?

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



Sidor: 1

Forum huvudsida -> Programmering -> felsökning behövs
Atom feed

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