Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.10.2006, 14:24

SDL Programm "kackt" einfach ab!

Hallo!
Ich bastel ja gerade an einer Engine (2D).
Jetzt habe ich ein kleines Beispielprogramm geschrieben.
Doch wenn ich es öffne, dann kommt einmal kurz ein schwarzes fenster und dann ist es wieder weg.
Ich weiß schon des an dieser funktion liegen muss, die in einer dll liegt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Wolkenengine zeigeBMP(char *datei, SDL_Surface *screen, int x, int y)
{
    SDL_Surface *bild;
    SDL_Rect ziel;

    /* lädt die BMP-Datei in ein Surface */
    bild = SDL_LoadBMP(datei);
    if ( bild == NULL ) {
         write_into_Logbuch("Bild_konnte_nicht_geladen_werden!", true);
         return;
    }

    ziel.x = x;
    ziel.y = y;
    ziel.w = bild->w;
    ziel.h = bild->h;
    SDL_BlitSurface(bild, NULL, screen, &ziel);

   
    SDL_UpdateRects(screen, 1, &ziel);

    SDL_FreeSurface(bild);
}


Doch ich bin mir ziemlich sicher das diese Stimmt!
Im Logbuch wird zumindestens nicht vermerkt das man das bild nicht laden konnte.
Hat einer zufällig eine idee woran es liegen könnte?
Gruß Flo

EDIT:
ps: Wolkenengine ist definiert.
So ruf ich die Funktion auf:
zeigeBMP("bild.bmp", screen, 100, 100);

Anonymous

unregistriert

2

22.10.2006, 14:27

Wie wäre es mit ein paar mehr Infos um Dir zu helfen? Mit dieser Problembeschreibung kann ich soviel anfangen wie: "Das was Du letztes Jahr gekocht hast war kalt - ich weiß nicht was es war, es ist aber kalt gewesen!"

Kurz: 0 Infos.

3

22.10.2006, 17:07

Also.
im haupt programm steht das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "dll/dll.h"

#include <sdl/sdl.h>
#include <sdl/sdl_mixer.h>
#include <windows.h> 
#include <SDL/SDL_TTF.h> 
#include <string> 

using namespace std;

SDL_Surface *screen;
tWindow Fenster;
SDL_Event event;

int move(){
    


}

int render(){
    
    
zeigeBMP("bild.bmp", screen, 100, 100);
    
}



int main(int argc, char* argv[])
{
    
Fenster.creat(screen);
write_into_Logbuch("Programm wurde gestartet!");

initSound();
Mix_PlayMusic(sound,-1);

while (!Fenster.done) {        
        while (SDL_PollEvent(&event)) {
            switch(event.type) {
            case SDL_MOUSEBUTTONDOWN:
                   write_into_Logbuch("Mouse is down");    
                 break;
             case SDL_QUIT:
                 Fenster.done = 1;
                break;
            }    
               
        }  
           
        move();
        render();
      
}


Fenster.shotdown();
shutDownSound();
write_into_Logbuch("Programm wurde beendet!");
SDL_Quit();
return 0;
}


(mit Dev-C++)
Wenn ich die funktion zeigeBMP rauspacke funktioniert es einwandfrei! (auch mit sound)

Wenn noch infos fehlen dann fragt mich conkret.
Gruß Flo

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

22.10.2006, 18:43

Heißen deine Methoden wirklich creat und shotdown?! :lol:
(das 1. ist falsch geschrieben, und das zweite heißt "niedergeschossen")

5

22.10.2006, 19:45

ok wurd rausgenommen ... dann meine Antwort an F-Wölkchen nochmal:

Zitat

F-Wölkchen
1. Pack die globalen Variablen mit in die main ... und übergeb den Screen-Pointer an die Render-Funktion ... dann sind se weg ;)
2. Du hast den Funktionen (move, render usw) keinen rückgabewert gegeben ... da muss einer hin .. die main brauch net unbedingt einen ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

6

22.10.2006, 19:48

Nun da structs sich in C++ wie Klassen verhalten, kann man hier eine Verwaltungsklasse/Verwaltungsstruktur benutzen.
Dann muss man nur per singleton eine Instanz holen und schon vermeidet man globale Variablen.

Was ist so schlimm daran?

Wenn man mit Globalen Variablen arbeitet und irgendwo einen falschen Wert zuweist dann viel Spaß beim suchen.
Und außerdem sind globale Variablen unschön.
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

7

22.10.2006, 19:50

Das Globale Variablen unschön/unsauber sind, ist uns bewusst. Vllt ließt du einfach mal die Lösungsvorschläge anderer Leute und fertig. Ein Singleton ist auch nicht die Lösung ALLER Probleme ... am besten sind immernoch lokal angelegte Variablen.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

8

22.10.2006, 22:34

hm, aber in SDL ist "screen" die das eine Surface dass den Fenster-Inhalt wiedergibt, da muss alles hin, dass geht gar nicht anders.

Bei jeder Funktion die "screen" zu übergeben find ich da ziemlich unsinnig. Und der Sinn dahinter, dass man Globale Variablen nicht verwenden soll kommt ja daher dass diese Globale Variablen überall geändert werden könnten und daher eine Fehlersuche nicht wirklich einfach machen.

Aber bei der screen-Variable hat man das Problem dann auch so wenn man die überall durchreicht, man wird wohl kaum "versentlich" anfangen auf den Bildschirm zu zeichnen, resp. wenn man das schafft wird das auch mit einer nicht-globalen "screen" passieren behaupte ich ;)

Alles andere soll nciht global sein, da schliess ich mich an, aber bei der "screen"-variable nicht :badgrin:

@F-Wölkchen:
Ich kann im Moment auch keinen Fehler entdecken. Nur die Funktion

C-/C++-Quelltext

1
SDL_UpdateRects(screen,1,&ziel)
kommt mir ein wenig merkwürdig vor. Kann es sein dass die Funktion als 3ten Parameter nicht nen Pointer auf nen SDL_Rect sondern auf ein Array aus SDL_Rect erwartet?

Ansonsten mach einige write_into_Logbuch-Aufrufe in deiner Funktion versuch herauszufinden auf welcher Code-Zeile der Fehler kommt.

Werbeanzeige