SDL Problem



  • hallo, ich habe mich mit SDL beschäftigt und ein Tutorial auf meine Wünsche abgeändert um eine Karte zu bekommen.

    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #if defined(_MSC_VER)
    #include "SDL.h"
    #else
    #include "SDL/SDL.h"
    #endif
    
    SDL_Surface *Screen, *Untergrund;
    SDL_Event event;
    
    #define PITCH (Screen->pitch / 4)
    #define WIDTH 1024
    #define HEIGHT 768
    
    #define LEVELWIDTH 16
    #define LEVELHEIGHT 12
    #define TILESIZE 64
    
    enum leveldataenum
    {
    	LEVEL_GRAS = 0,
    };
    
    unsigned char Karte[LEVELWIDTH * LEVELHEIGHT];  
    
    void untergrundzeichnen(int x, int y, int width, int height, int c)
    {
      int i, j;
      for (i = 0; i < height; i++)
      {
        if ((y + i) >= 0 && (y + i) < HEIGHT)
        {
          int len = width;
          int xofs = x;
          if (xofs < 0)
          {
            len += xofs;
            xofs = 0;
          }
          if (xofs + len >= WIDTH)
          {
            len -= (xofs + len) - WIDTH;
          }
          int ofs = (i + y) * PITCH + xofs;
    
          for (j = 0; j < len; j++)
            ((unsigned int*)Screen->pixels)[ofs + j] = c;
        }
      }
    }
    void tileszeichnen(int x, int y, int untergrund)
    {
    if (SDL_MUSTLOCK(Untergrund))
        if (SDL_LockSurface(Untergrund) < 0) 
          return;
    
      int i, j;
      for (i = 0; i < TILESIZE; i++)
      {
        int screenofs = x + (y + i ) * PITCH;
        int tileofs = (i + untergrund * TILESIZE) * (Untergrund->pitch / 4);
        for (j = 0; j < TILESIZE; j++)
        {
          ((unsigned int*)Screen->pixels)[screenofs] = 
            ((unsigned int*)Untergrund->pixels)[tileofs];
          screenofs++;
          tileofs++;
        }
      }
    
      if (SDL_MUSTLOCK(Untergrund)) 
        SDL_UnlockSurface(Untergrund);
    }
    
    void reset()
    {
      FILE *f = fopen("karte.txt", "rb");
      if (f == NULL)
      exit(0);
    
      int p = 0;
      while (p < LEVELWIDTH * LEVELHEIGHT && !feof(f))
      {
        int v = fgetc(f);
        if (v > 32)
        {
          switch (v)
          {
          case '0':
            Karte[p] = LEVEL_GRAS;
            break;
    	  }
          p++;
        }
      }
      fclose(f);
    }
    
    void init()
    {
      SDL_Surface *temp = SDL_LoadBMP("untergrund.bmp");
      Untergrund = SDL_ConvertSurface(temp, Screen->format, SDL_SWSURFACE);
      SDL_FreeSurface(temp);
      reset();
    }
    
    void render()
    {
    
      if (SDL_MUSTLOCK(Screen))
        if (SDL_LockSurface(Screen) < 0) 
          return;
    
      int i, j;
      for (i = 0; i < LEVELHEIGHT; i++)
      {
        for (j = 0; j < LEVELWIDTH; j++)
        {
          switch (Karte[i * LEVELWIDTH + j])
          {
    
    	  case LEVEL_GRAS:
            tileszeichnen(j * TILESIZE, i * TILESIZE, 0);
            break;
    	  }
    	}
      }
          if (SDL_MUSTLOCK(Screen)) 
            SDL_UnlockSurface(Screen);
    
      // Der Ganze Screen muss neu geladen werden
        SDL_UpdateRect(Screen, 0, 0, WIDTH, HEIGHT);    
    }
    
    int main(int argc, char *argv[])
    {
    
      if (SDL_Init(SDL_INIT_VIDEO) < 0) 
      {
        fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
        exit(1);
      }
    
      atexit(SDL_Quit);
    
      Screen =SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_FULLSCREEN | SDL_DOUBLEBUF);
    
      init();
    
      if (Screen == NULL) 
      {
        fprintf(stderr, "Unable to set up video: %s\n", SDL_GetError());
        exit(1);
      }
    
      while (1)
      {
    
        render();
    	while (SDL_PollEvent(&event)) 
        {
          switch (event.type) 
          {
          case SDL_KEYUP:                    
            switch (event.key.keysym.sym)
            {
            case SDLK_ESCAPE:
               return 0;
    		 }
    	  }
    	}
      }
      return 0;
    }
    

    Wenn ich Komiliere: 0 Fehler
    Wenn ich das Spiel aufrufe kommt der Vollbildmodus in Schwarz
    Leider kommt danach die wohl allen bekannte fehlermeldung:
    (warket).exe hat ein Problem festgestellt und muss beendet werden.
    Tja ich habe leider echt keine ahnung mehr. Wäre echt nett, wenn man mir helfen könnte. Es kann ja nicht viel sein, dass Fehlt oder zu viele ist. In meinen anderen Projekten hat es ja immer funktioniert...



  • Lass mal den Debugger drüber laufen.



  • Ich kenn mich zwar mit dem Debuggen im MVC++ 6.0 nicht so gut aus aber:

    Unbehandelte Ausgabe in warket.exe (SDL.dll): 0xC00000005: Access Violent

    68128E69 ???

    (kam als fehler)



  • Steppe mal mit dem Debugger durch und schau nach, an welcher Stelle es kracht.



  • es kracht an:

    --- crtexe.c -------------------------------------------------------------------------------------------------------------
    WinMainCRTStartup:
    004018A0 push ebp

    er kann sie nicht finden glaube ich. Ich kenn mich aber leider mit dem debuggen garnicht aus 😞



  • was sagt der Call Stack?



  • Du solltest im Debugger den Code Zeile fuer Zeile durchgehen, dann siehst du schoen, welche Codezeile fuer den Absturz verantwortlich ist.



  • o.o

    kennt jemand ein (gutes) tutorial, wo man sowas lernen kann. Ich hab kein wort verstanden 😞

    ich seh dort nur zahlen und buchstaben...



  • Da hast Du Glück. Im Magazin dieses Forums gibt es einen entsprechenden Artikel: http://www.c-plusplus.net/forum/viewtopic-var-t-is-120832.html



  • danke,

    ich komme aber leider auch damit nicht weiter 😞
    muss ich wohl mit was anderem anfangen 😞



  • Was genau meinst du mit "komme damit nicht weiter"? Hast du Probleme, die Debug-Anleitung zu verstehen?



  • hast du im verzeichniß der exe auch eine datei mit dem namen "untergrund.bmp" sowie eine mit dem namen "karte.txt" ??
    nachdem ich die beiden dateien erzeugt habe, bekam ich keine fehlermeldung mehr!!

    ohne das bild kommt:
    "Fatal signal: Segmentation Fault (SDL Parachute Deployed)"

    PS.:
    Ich benutzte den Dev-Cpp


Anmelden zum Antworten