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

21

31.07.2014, 17:46

Dann prüf mal, ob alle pointer, die du der funktion gibst, auch auf das zeigen, auf was sie zeigen sollen.

22

31.07.2014, 17:47

Ok, gibts da ein gutes Tutorial? :)
Ich habe das Kapitel 8.8 des Buches C++ für Spieleprogrammierer schon gelesen und verstanden, nur leider steht da nichts davon drin.

EDIT: ja, die beiden Pointer Format und m_pBitmap zeigen auf das was sie sollten.
Gruß

23

31.07.2014, 18:22

Mit "Position" ist eine Speicheradresse gemeint...

Zur Lösung:
  • Überprüfe das Ergebnis von SDL_LockSurface und teile es uns mit
  • Überprüfe den Wert von m_pBitmap->format und teile ihn uns mit
  • Teile uns die Funktion / den Code um die Definition von r, g, b mit
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

24

31.07.2014, 18:39

Wert von Format: 0x00fc0488
r, g, b sind im Konstruktor wie folgt definiert:
r = g = b = 0;
SDL_LockSurface gibt den Int-Wert 0 zurück.

25

31.07.2014, 19:06

Du verschweigst uns code, der Fehler-relevant ist.

Über welchen "Konstruktor" reden wir hier? Deine Funktion ist in keiner Klasse. Somit können r, g, b auch nicht von einem Konstruktor initialisiert sein.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

26

31.07.2014, 19:12

Sorry, aber wenn ich die ganze Klasse hier hochladen würde, dann würde das hier sehr unübersichtlich werden :D
Ich kürze mal die beiden relevanten Dateien:
Map.hpp:

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
#ifndef MAP_HPP
#define MAP_HPP
#define MAPHEIGHT 550 // Fields
#define MAPWIDTH  1000 // Fields

#include "Singleton.hpp"
#include "Sprite.hpp"


#define g_pMap CMap::Get ()
class CMap : public TSingleton<CMap>
{
public:
    CMap();
    void Init();
    void Render ();
    bool UseField (int xPos, int yPos, int Object_ID, bool bOverwrite);
    void MoveMap  (int x, int y);
    void LoadImages ();
    void CreateWorld();
    int  GetMapXPos () {return mapXPos;}
    int  GetMapYPos () {return mapYPos;}
    int  GetZoom ()     {return Zoom;}
    void Quit ();

    struct m_SField
    {
        int XPos; // Pixels
        int YPos; // Pixels
        int ObjectID;
        float AnimPhase;
        float Timer;
    };

    m_SField Field[MAPWIDTH][MAPHEIGHT];

    const int Width;
    const int Height;
    int Zoom;

private:
Uint32 CMap::get_pixel32( SDL_Surface *surface, int x, int y );

    CSprite *m_pSpriteWater;            // Sprite für das Wasser
    CSprite *m_pSpriteLand;             // Sprite für das Land
    CSprite *m_pSpriteCoast;            // Sprite für die Küste
    CSprite *m_pSpriteForest;           // Sprite für Wald
    CSprite *m_pSpriteMountain;         // Sprite für Berg
    CSprite *m_pSpriteTenement;         // Sprite für Wohnhaus
    CSprite *m_pSpriteLumberjack;       // Sprite für Holzfäller
    CSprite *m_pSpritePath;             // Sprite für Feldweg

    int mapXPos; // Pixels
    int mapYPos; // Pixels

    SDL_Surface *m_pBitmap;
    Uint8 r, g, b;
    SDL_PixelFormat *format;
};

#endif


Map.cpp:

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
93
94
95
96
97
98
99
100
101
#include "Map.hpp"
#include <iostream>

using namespace std;

CMap::CMap() : Width (MAPWIDTH), Height (MAPHEIGHT)
{
    m_pSpriteWater = NULL;
    m_pSpriteLand  = NULL;
    m_pSpriteCoast = NULL;
    m_pSpritePath  = NULL;

    m_pBitmap = NULL;
    r = g = b = 0;
    format = NULL;

    mapXPos = 0;
    mapYPos = 0;
    Zoom = 1;

    for(int i=0; i<MAPHEIGHT; i++)
    {
        for (int j=0; j<MAPWIDTH; j++)
        {
            Field[j][i].ObjectID=0;
            Field[j][i].XPos=j*10;
            Field[j][i].YPos=i*10;
            Field[j][i].AnimPhase = 0;
            Field[j][i].Timer = 0;
        }
    }

    r = g = b = 0;
}

void CMap::Init()
{
    LoadImages ();

    CreateWorld ();
}

void CMap::Render()
{
    // ...
}

bool CMap::UseField(int xPos, int yPos, int Object_ID, bool bOverwrite)
{
    // ...
}

void CMap::MoveMap(int x, int y)
{
    // ...
}

void CMap::Quit()
{
    // ...
}

void CMap::LoadImages()
{
    // ...
}


void CMap::CreateWorld()
{
    if (m_pBitmap == NULL && format == NULL)
    {
        m_pBitmap = new SDL_Surface;
        m_pBitmap = SDL_LoadBMP ("C:/Users/Manfred/Verschiedenes/PC/Programmieren/C++/Projekte/In Bearbeitung/1492/Debug/Data/Weltkarte.bmp");
        if (m_pBitmap != NULL)
            cout << "Bitmap wurde geladen" << endl;

    cout << SDL_LockSurface (m_pBitmap);


        format =  m_pBitmap->format;
        Uint32 pixel = get_pixel32(m_pBitmap, 0, 0);

        SDL_GetRGB(get_pixel32(m_pBitmap, 0, 0), format, &r, &g, &b);

        cout << "Rot: " << (int)(r) << " Grün: " << (int)(g) << " Blau: " << (int)(b) << endl;
        cout << "BytesPerPixel: " << (int) m_pBitmap->format->BytesPerPixel;
        cout << endl;

        SDL_UnlockSurface (m_pBitmap);
    }
}

Uint32 CMap::get_pixel32( SDL_Surface *surface, int x, int y )
{
    //Convert the pixels to 32 bit
    Uint32 *pixels = (Uint32 *)surface->pixels;
    
    //Get the requested pixel
    return pixels[ ( y * surface->w ) + x ];
}

27

31.07.2014, 19:29

Ich sehe da jetzt keinen Fehler, der den Crash versuchen würde.
Ich vermute, dass deine Instanz der cmap klasse nicht stimmt.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

28

31.07.2014, 19:46

C-/C++-Quelltext

1
#define g_pMap CMap::Get ()


nutzt du diesen Define? Wenn ja
1. sehe ich in der Klasse CMap die Funktion Get() nicht
2. dürfte der Zugriff über g_pMap nur funktionieren wenn die Funktion Statisch ist

Edit: ah habe gerade gesehen das wohl das Get von TSingleton<CMap> kommt.

C-/C++-Quelltext

1
2
Field[j][i].XPos=j*10;
Field[j][i].YPos=i*10;


Du multiplizierst hier mit 10 ist das wirklich so gewollt, ich bin der Meinung XPos und YPos sollten j und i entsprechen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (31.07.2014, 19:56)


29

01.08.2014, 09:23

Ja, das ist gewollt, dadurch, dass die Felder jeweils 10 Pixel auseinander liegen.
Ich muss die Map Klasse in dieser hinsicht sowieso noch verbessern, aber da ist mir bis jetzt noch keine gute Idee gekommen. Aber das ist ein anderes Thema ;)

Die Instanz der CMap klasse stimmt ziemlich sicher, da ich sonst keine Fehler habe und auch alle Variablen richtig funktionieren :)

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

30

01.08.2014, 09:36

Da man dir ja scheinbar alles aus der Nase ziehen muss:
Überprüfe den Wert von *(m_pBitmap->format) und teile ihn uns mit

Werbeanzeige