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

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

1

23.07.2010, 03:35

[SDL + C++] Wo ist hier mein Fehler? (Pongclone)

hi @ all,

ich bin noch ziemlich neu im SDL bereich bzw fange jetzt wieder an nach einer kleinen pause. Ich wollte mir jetzt mal eine Klasse schreiben für meinen Pong clone, der so ziemlich die wichtigsten Funktionen besitzt(bild laden, bewegen etc). Diese Klasse bzw diese cpp und hpp dateien wollte ich dann aber auch für vllt zukünftige spiele benutzen die ich versuche zu schreiben. Nunja bevor ich zu meinem Problem komme poste ich mal die Dateien meines Pongclones:

main.cpp:

C-/C++-Quelltext

1
2
3
4
5
#include <iostream>#include "CGame.hpp"#include "JawaiicaEngine.hpp"
using namespace std;
int main(int argc, char *args[]){    JawaiicaEngine Init;    CGame TheGame;
    Init.JawaiicaEngineInit     (500, 500, 32, "JawaiicaEngine-Test");    TheGame.Init                ();    TheGame.Run                 ();    TheGame.Quit                ();
    return 0;}



Game.hpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#ifndef _CGAME_HPP_#define _CGAME_HPP_
#include "JawaiicaEngine.hpp"
class CGame{    public :    CGame();
    void Init ();    void Run  ();    void Quit ();
    private:    bool GameIsRunning;
    SDL_Event   Event;    SDL_Surface *background;
    JawaiicaEngine Jawaiica;};
#endif



Game.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
#include "CGame.hpp"
CGame::CGame(){    background                  = NULL;}
void CGame::Init(){    GameIsRunning               = true;}
void CGame::Run(){    while(GameIsRunning)    {        while(SDL_PollEvent(&Event))        {            if(Event.type == SDL_QUIT)            {                GameIsRunning   = false;            }            switch(Event.key.keysym.sym)            {                case SDLK_ESCAPE    : GameIsRunning = false; break;            }
        }        Jawaiica.LoadImage("Data/Background.bmp", background, 0, 0);    }}
void CGame::Quit(){
}



JawaiicaEngine.hpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#ifndef _JAWAIICA_ENGINE_HPP_#define _JAWAIICA_ENGINE_HPP_
#include <iostream>#include <SDL/SDL.h>#include <SDL/SDL_image.h>#include <SDL/SDL_ttf.h>
using namespace std;
class JawaiicaEngine{    public :    JawaiicaEngine();           //Konstruktor
    //Initialisiert das Bild    void JawaiicaEngineInit(int xWindow, int yWindow, int Bpp, char *WindowName);    //Ende der Initialisierung
    //Lädt Bilder und setzt die Position fest    void LoadImage(const string sFilename, SDL_Surface *Surface, int x, int y);    bool FlipImage() { return SDL_Flip(buffer); }    //Ende des Ladens
    private:    SDL_Rect    Rect;
    protected:    SDL_Surface *buffer;};
#endif



JawaiicaEngine.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
#include "JawaiicaEngine.hpp"
JawaiicaEngine::JawaiicaEngine(){    buffer      = NULL;}
void JawaiicaEngine::JawaiicaEngineInit(int xWindow, int yWindow, int Bpp, char *WindowName){              SDL_Init          (SDL_INIT_EVERYTHING);    buffer  = SDL_SetVideoMode  (xWindow, yWindow, Bpp, SDL_SWSURFACE | SDL_DOUBLEBUF);              SDL_WM_SetCaption (WindowName, NULL);}
void JawaiicaEngine::LoadImage(const string sFilename, SDL_Surface *Surface, int x, int y){    Surface = IMG_Load(sFilename.c_str() );
    Rect.x  = x;    Rect.y  = y;
    SDL_BlitSurface(Surface, NULL, buffer, &Rect);}



So, nun zu meinem Problem:
Wie oben schon gesagt, wollte ich die Dateien auch für zukünftige spiele benutzen. Deshalb wollte ich das initialisieren vom fenster etwas vereinfachen und gleich eine init funktion schreiben. Leider musste ich deswegen auch das buffer surface in der Klasse erstellen.
Wenn ich jetzt versuche, ein neues bild (zb background.bmp) in die Game.hpp hauptschleife zu tun dann geht noch alles gut. Füge ich dann SDL_Flip(buffer) hinzu wird buffer nicht erkannt weil das surface ja in einer anderen Klasse ist nicht in der Game klasse. Nunja deswegen wollte ich in der JawaiicaEngine.hpp ne funktion machen die ich dann in Game.hpp in der hauptschleife aufrufe.
Wenn ich jetzt das Spiel Starte, dann öffnet sich das fenster ist sofort wieder weg und es steht unten bei code::blocks: "Process terminated with status 3 (0 minutes, 0 seconds)"

wisst ihr vielleicht was ich falsch gemacht habe? ^^

naja hoffentlich könnt ihr mir helfen!


MfG Jawaiica.
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

23.07.2010, 10:51

hallo, könntest du den code bitte nochmal posten? am besten hier
sonst wird dir wahrscheinlich keiner helfen können.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

3

23.07.2010, 11:47

jo klar kann ich das machen :)

main.cpp:
http://codepad.org/zRfcw0EH


CGame.hpp:
http://codepad.org/pYzRyNgd


CGame.cpp:
http://codepad.org/5tli1JcT


JawaiicaEngine.hpp:
http://codepad.org/8DFOCvxz



JawaiicaEngine.cpp:
http://codepad.org/MMTcMjqz



so ich hab jetzt erstmal alles in verschiedene Links getan, kann sie aber wenns hilft auch in eine packen^^


MfG Jawaiica
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

23.07.2010, 11:56

das funktioniert nicht weil du zwei verschiedene instanzen von JawaiicaEngine hast.
du darfst aber nur eine haben. da es teil des spielst ist kannst du es auch in die spielklasse packen. dann solltest du alles was mit der JawaiicaEngine zutun hat aus der main funktion raus nehmen und sie in der gameklasse initialisieren.

hast du dir schon die sfml angeschaut? es lohnt sich.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

5

23.07.2010, 12:37

ok ich werds gleich mal versuchen :) hoffentlich klappt es^^ ne bis jetzt noch nicht ... wusste bis vor 20 min nichtmal das es sowas gibt :D :D oh mein gott es geht :D vielen dank für die hilfe^^

Also ich hab jetzt ein paar Funktionen hinzugefügt und wollte jetzt mal den Colorkey adden. Ich weiß zwar nicht wieso, aber wenn ich den in meine JawaiicaEngine.hpp und cpp packe und in der Hauptschleife aufrufe, dann stürzt das spiel mit dem selben fehler ab wie ebend. lass ich den weg dann läuft das game... hier mal meine colorkey funktion:


http://codepad.org/xsmfoBby

wisst ihr woran das liegen könnte?
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Jawaiica« (23.07.2010, 16:50)


Werbeanzeige