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

ugoessner

Frischling

  • »ugoessner« ist der Autor dieses Themas

Beiträge: 52

Wohnort: Wedemark OT-Mellendorf

Beruf: Systeminformatiker

  • Private Nachricht senden

1

30.05.2016, 16:47

Game mit Player funktioniert nicht

Hallo Leute,

ohne den den Player wird der der Hintergrund angezeigt.
Lade ich den Player dazu bleibt das Bild schwarz.

Was läuft da falsch?

Ich habe mit Absicht bei der Klasse CSprites kein SDL_Surface Speicher organisiert, weil das doch IMG_Load() macht.

Einen schönen Dank für eure Hilfe.
»ugoessner« hat folgende Datei angehängt:
  • Game.tar.gz (8,13 kB - 44 mal heruntergeladen - zuletzt: 14.04.2024, 21:45)
#define __miniMAL 0x00

Zipfelpilz

unregistriert

2

30.05.2016, 17:21

In deiner Sprites_cpp.pdf gibst du in Zeile 86 das SDL_Surface mit den Sprites frei, das danach aber noch verwendet wird. Ohne den Player bleibt dieser Speicherbereich scheinbar lange genug bestehen, dass dein Programm funktioniert. Player lädt aber selbst Sprites durch das gleiche SDL-Subsystem nach, wodurch der Speicher wohl endgültig frei / überschrieben wird.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

30.05.2016, 17:21

Poste den Code doch bitte direkt mal hier. Aus deinem Text werde ich nicht schlau und laden möchte ich das ungern.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

ugoessner

Frischling

  • »ugoessner« ist der Autor dieses Themas

Beiträge: 52

Wohnort: Wedemark OT-Mellendorf

Beruf: Systeminformatiker

  • Private Nachricht senden

4

30.05.2016, 19:28

OK, den gesamten Code:

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
#ifndef SPRITES_H
#define SPRITES_H

#include<iostream>
#include<SDL/SDL_image.h>
#include<list>
#include<Framework.h>

class CSprites
{
        SDL_Surface *Image;
        SDL_Surface *BackGroundImage;
        SDL_Rect *Rect;
        SDL_Rect *BackGroundRect;

    public:
        CSprites();
        ~CSprites();

        void Render_BackGround(short int);
        void Load(const std::string);
        void SetBackGroungImage();

        SDL_Surface *GetImage() const;
};

#endif // CSPRITES_H

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "Sprites.h"

CSprites::CSprites(): Rect(new SDL_Rect), BackGroundRect(new SDL_Rect)
{
}

CSprites::~CSprites()
{
    SDL_FreeSurface(BackGroundImage);

    delete this->Rect;
    delete this->BackGroundRect;
    this->BackGroundRect=nullptr;
    this->Rect=nullptr;
}

void CSprites::Render_BackGround(short int num)
{
    this->Rect->w=Framework->GetScreen()->w;
    this->Rect->h=Framework->GetScreen()->h;
    SDL_FillRect(Framework->GetScreen(), this->Rect, 0xffffffff);

    this->BackGroundRect->w=512;
    this->BackGroundRect->h=432;

    this->Rect->w=this->BackGroundRect->w;
    this->Rect->h=this->BackGroundRect->h;

    switch(num)
    {
        case 0:
        {
            this->BackGroundRect->x=2;
            this->BackGroundRect->y=2;
        } break;

        case 1:
        {
            this->BackGroundRect->x=516;
            this->BackGroundRect->y=2;
        } break;

        case 2:
        {
            this->BackGroundRect->x=2;
            this->BackGroundRect->y=438;
        } break;

        case 3:
        {
            this->BackGroundRect->x=516;
            this->BackGroundRect->y=438;
        } break;

        default:
        {
            this->BackGroundRect->x=2;
            this->BackGroundRect->y=2;
        }
    }

    for(int i=0;i<static_cast<int>(Framework->GetScreen()->w/this->BackGroundRect->w);i++)
    {
        this->Rect->x=i*this->BackGroundRect->w;

        SDL_BlitSurface(this->BackGroundImage,this->BackGroundRect,Framework->GetScreen(),this->Rect);
    }

    if(Framework->GetScreen()->w%this->BackGroundRect->w)
    {
        this->Rect->w=Framework->GetScreen()->w%this->BackGroundRect->w;
        this->Rect->x=static_cast<int>(Framework->GetScreen()->w/this->BackGroundRect->w)*this->BackGroundRect->w;
        SDL_BlitSurface(this->BackGroundImage,this->BackGroundRect,Framework->GetScreen(),this->Rect);
    }
}

void CSprites::Load(const std::string image)
{
    this->Image=IMG_Load(image.c_str());
}

SDL_Surface *CSprites::GetImage() const
{
    return this->Image;

    SDL_FreeSurface(this->Image);
}

void CSprites::SetBackGroungImage()
{
    this->BackGroundImage=this->GetImage();
}

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
#ifndef PLAYER_H
#define PLAYER_H

#include<Framework.h>
#include<Sprites.h>

class CPlayer
{
        int Health;
        int Shield;

        CSprites *Player;
    public:
        CPlayer();
        ~CPlayer();
        int GetHealth() { return Health; }
        void SetHealth(int val) { Health = val; }
        int GetShield() { return Shield; }
        void SetShield(int val) { Shield = val; }
};

#endif // PLAYER_H

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "Player.h"

CPlayer::CPlayer()
{
    this->Player=new CSprites;

    this->Player->Load("Bilder/SNES - Super Mario World - Mario.png");
    if(!this->Player)
    {
        std::cerr << "Player konnte nicht geladen werden.\n" << SDL_GetError() << std::endl;
    }
}

CPlayer::~CPlayer()
{
    delete this->Player;
}

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
#ifndef GAME_H
#define GAME_H

#include<iostream>

#include<Framework.h>
#include<Sprites.h>
#include<Player.h>

class CGame
{
        CSprites *Sprites;
        CPlayer *Player;
        SDL_Event *Event;

        bool Game;

        void Process_Event();

    public:
        CGame();
        ~CGame();

        void Init();
        void Run();
};

#endif // GAME_H

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
#include "Game.h"

CGame::CGame()
{
    this->Sprites=new CSprites;
    this->Player=new CPlayer;
    this->Event=new SDL_Event;

    this->Game=true;
}

CGame::~CGame()
{
    delete this->Sprites;
    //delete this->Player;
    delete Event;
    this->Sprites=nullptr;
    this->Event=nullptr;
}

void CGame::Run()
{
    Sprites->Render_BackGround(3);

    while(Game)
    {
        Framework->Update();

        Process_Event();

        if(Framework->KeyDown(SDLK_ESCAPE)) this->Game=false;

        Framework->Flip();
    }
}

void CGame::Process_Event()
{
    if(SDL_PollEvent(this->Event))
    {
        switch(Event->type)
        {
            case SDL_QUIT: this->Game=false; break;
        }
    }
}

void CGame::Init()
{
    Sprites->Load("Bilder/SNES - Super Mario World - Backgrounds.png");
    Sprites->SetBackGroungImage();


}

Ich hab jetzt die Kommentare weg gemacht.
#define __miniMAL 0x00

Werbeanzeige