Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
21.04.2002, 11:06
Gnomo



Hi!
Ich habe das driite SDL Tut durchgearbeitet, aber es klappt nicht d.h. es kompiliert ohne fehler lädt die Bitmap aber nicht hier der code:
Quellcode:
//---Libs---//
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include <sdl.h>
#include "Main.h"

#ifdef _WIN32
#undef main
#endif


SDL_Surface *g_pScreen;
SDL_Surface *g_pBitmap;
Uint32 g_Black;

const int worlds = 50;


log class_log;

log::log()
{
    Log=fopen("log.txt","w");
}

log::~log()
{
    fclose(Log);
}

log::OutputLog(const char* text)
{
    fprintf(Log,text);
    fprintf(Log,"\n");
}

struct world g_World[worlds];


void RandBackground()
{
    int i;
    int num_types;

    num_types = g_pBitmap->w/16;

    for(i = 0; i < worlds; i++)
    {
        g_World[i].coordx = rand() %640;
        g_World[i].coordy = rand() %480;
        g_World[i].type = rand()  %num_types;
    }
}

void DrawBackground()
{
    int i;

    for(i = 0; i < worlds; i++);
    {
        SDL_Rect src;
        SDL_Rect dest;

        src.x = g_World[i].type * 16;
        src.y = 0;
        src.w = 16;
        src.h = 16;

        dest.x = g_World[i].coordx;
        dest.y = g_World[i].coordy;

        SDL_BlitSurface(g_pBitmap, &src, g_pScreen, &dest);
        if (SDL_BlitSurface == 0)
        {
            class_log.OutputLog("SDL Kopierung - FEHLGESCHLAGEN");
        }else
        {
            class_log.OutputLog("SDL Kopierung - ERFOLGREICH");
        }
    }
}


int main()
{
    int running;

    srand(time(0));

    
    if (SDL_Init(SDL_INIT_VIDEO)<0)
    {
        fprintf(stderr,"SDL konnte nicht initialisiert werden%s\n",
            SDL_GetError());

        class_log.OutputLog("SDL Initialisierung - FEHLGESCHLAGEN");

        exit(1);
    }else
    {
        class_log.OutputLog("SDL Initialisierung - ERFOLGREICH");
    }

    atexit(SDL_Quit);
    
    
    g_pScreen = SDL_SetVideoMode(640,480,0,0);

    if (!g_pScreen)
    {
        fprintf(stderr,"SDL konnte Video Mode nicht setzen%s\n",
            SDL_GetError());

        class_log.OutputLog("SDL Video Mode Setzung - FEHLGESCHLAGEN");

    
        exit (1);
    }else
    {
        class_log.OutputLog("SDL Video Mode Setzung - ERFOLGREICH");
    }
    
    
    g_pBitmap = SDL_LoadBMP("b.bmp");

    if (!g_pBitmap)
    {
        fprintf(stderr,"Konnte Bitmap nicht laden%s\n",
            SDL_GetError());
    
        class_log.OutputLog("SDL Bitmap laden - FEHLGESCHLAGEN");

        exit(1);
    }else
    {
        class_log.OutputLog("SDL Bitmap laden - ERFOLGREICH");
    }


    RandBackground();
    
    g_Black = SDL_MapRGB(g_pScreen->format,0,0,0);
    SDL_FillRect(g_pScreen,0,g_Black);
    
    SDL_UpdateRect(g_pScreen,0,0,0,0);

    DrawBackground();
    SDL_FreeSurface(g_pBitmap);
    
    
    running=1;
    
    while(running)
    {
        SDL_Event event;

        while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
            case SDL_KEYDOWN:
                running=0;
                break;

            case SDL_QUIT:
                running=0;
                break;
            }
        }
    }

    
return 0;

}

ich kann keinen fehler finden.

--

zum Seitenanfang zum Seitenende Profil || Suche
001
21.04.2002, 11:28
Prefect



Zwei Dinge; zunächstmal der eigentliche Fehler:

Quellcode:
    SDL_UpdateRect(g_pScreen,0,0,0,0);
    DrawBackground();

SDL_UpdateRect muß nach dem Zeichnen erfolgen, sonst wird der Bildschirminhalt ja nur mit den Bilddaten von vor dem Zeichnen aufgefrischt - und das ist ziemlich sinnlos.

Außerdem:

Quellcode:
        SDL_BlitSurface(g_pBitmap, &src, g_pScreen, &dest);
        if (SDL_BlitSurface == 0)
        {
            class_log.OutputLog("SDL Kopierung - FEHLGESCHLAGEN");
        }else
        {
            class_log.OutputLog("SDL Kopierung - ERFOLGREICH");
        }

Eigentlich sollte dir der Compiler eine Warnung geben, weil die Bedingung immer gleich false ist. Was du in dem if-Statement machst: du prüfst, ob die _Addresse_ der Funktion SDL_BlitSurface gleich 0 ist - was sie natürlich nie ist.
Abgesehen davon gibt SDL_BlitSurface bei Erfolg 0 zurück, und bei Mißerfolg eine negative Zahl.

Der Code sollte also so aussehen:

Quellcode:
        ret = SDL_BlitSurface(g_pBitmap, &src, g_pScreen, &dest);
        if (ret < 0)
            class_log.OutputLog("SDL Kopierung - FEHLGESCHLAGEN");
        else
            class_log.OutputLog("SDL Kopierung - ERFOLGREICH");

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
002
21.04.2002, 12:14
Gnomo



Ok danke, ich werde das mal ausprobieren.

--

zum Seitenanfang zum Seitenende Profil || Suche
003
21.04.2002, 12:32
[RMen]OneStone



Zitat:
Der Code sollte also so aussehen:

Quellcode:ret = SDL_BlitSurface(g_pBitmap, &src, g_pScreen, &dest);
if (ret < 0)
class_log.OutputLog("SDL Kopierung - FEHLGESCHLAGEN");
else
class_log.OutputLog("SDL Kopierung - ERFOLGREICH");

Warum nicht gleich so (?):
Quellcode:if(SDL_BlitSurface(g_pBitmap, &src, g_pScreen, &dest))
DoIfTrue();
else
DoIfFalse();

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
004
21.04.2002, 15:05
Another1



@RMENEINSTEIN: das macht man so, damit man ret nochmal benutzen kann, da in diesem fall ret < 0 irgendein errorcode is, den man dann im notfall ausgeben kann, und das geht mit deiner variante nich

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
005
21.04.2002, 15:34
Gnomo



@prefect: ich habe das jetzt verbessert, also erst nach dem zeichnen updaterect() aufgerufen, aber es geht immer noch nicht.

--

zum Seitenanfang zum Seitenende Profil || Suche
006
21.04.2002, 16:32
[RMen]OneStone



@EineAndereEins/EinAnderer: Aber in seinem Code verwendet er den Rückgabetyp nicht.

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
007
24.04.2002, 16:58
Prefect



Doch, ich verwende den Rückgabetyp von SDL_BlitSurface, nämlich bei der (nicht gezeigten) Deklaration der Variable ret. Aber das nur am Rande.

Gnomo: Hört sich seltsam an. Kannst du mal versuchen, SDL_MapRGB andere Werte zu übergeben um zu überprüfen, ob überhaupt irgendwas passiert? Wenn die RGB-Werte bei SDL_MapRGB geändert werden müßte der Hintergrund ja in einer anderen Farbe sein.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
008
24.04.2002, 17:17
Gnomo



Habs jetzt hingebekommen und thx an euch.

--

zum Seitenanfang zum Seitenende Profil || Suche
009
25.04.2002, 13:59
Prefect



Woran lag's denn?

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
010
25.04.2002, 15:53
WareWolf



nebenbei: ab Sdltut#9 ist die Datei Galaxien.bmp defekt (in den Zip und rar), hab es an verschiedenen Tagen mehrmals gesaugt, aber gleiches Problem.
(Macht zwar nichts, da man die anderen Files dennoch entpacken kann und man die fehlerhaften aus vorangegengenen Tuts kopiert)

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW

zum Seitenanfang zum Seitenende Profil || Suche