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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

41

04.07.2013, 23:53

Dann guck dir doch die Stelle an an welcher du die Rects erstellst und hinzufügst. Ist hier noch alles cool, guckst du dir die Stellen an wo Rects geändert werden können und so weiter.
„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.“

TigerClaw25

unregistriert

42

05.07.2013, 07:20

Ganzn ehrlich, ich verstehe es einfach nicht:

Tile[j][k] = p_Spritemap[tilemap[j][k]].GetRect();

tile[j][k] beinhaltet ja immer die aktuelle Farbe (0=Rot, 1=blau etc.). Ich hol mir also das Rect von jedem Tile und speichere es. Was ist daran falsch? Ich sehe es einfach nicht ...

43

05.07.2013, 09:58

Ich versteh immer noch nicht ganz, wo genau dein Problem ist.
Woher kommt denn dein Rect (GetRect() code wäre vll ganz nützlich, und eben wie du das ganze initialisierst).
Aber vor allem wäre es sinnig, das du einfach mal durch deinen Code stepst, und dir die Variabeln anschaust. Dann siehst du genau, wo es hakt.

TigerClaw25

unregistriert

44

05.07.2013, 15:14

Das Anzeige der map funktioniert, aBer bei der Kollision gibt es Probleme. Hab da keine Idee, denn in tilemap steck doch meine Map, die ich vorher ja darin gespeichert habe.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

45

05.07.2013, 15:17

Was du ja mit dem Debugger verifizieren könntest aber irgendwie möchtest du das ja anscheinend nicht tun. Dass die Rects falsche Positionsangaben haben hast du damit ja schon mal rausgefunden. Wir können aber auch alle noch ein wenig raten.
„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.“

TigerClaw25

unregistriert

46

05.07.2013, 15:39

Das Forum soll doch anderen helfen oder? Staendig diese Diskussionen. Wenn ich wuesste, wie ich weiter vorgehen muss, wuerde ich nicht fragen.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

47

05.07.2013, 15:46

Ja das Forum soll helfen. Und ich habe dir den Vorschlag gemacht dass du überprüfst welche Werte nicht passen. Da bist du ja drauf eingegangen und hast bemerkt, dass in den Rects wohl falsche Werte drin stecken. Dann habe ich dir den Vorschlag gemacht zu überprüfen wo diese Werte denn falsch gesetzt werden. Dafür bietet sich wie bereits bemerkt auch der Debugger an. Wir können so halt einfach nur raten. Ich schreib das mit dem Debugger nicht weil ich dich nerven will, sondern weil es anders wohl grad nicht geht.
„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.“

TigerClaw25

unregistriert

48

06.07.2013, 20:32

wenn ich in der Zeile hier bin

Tile[j][k] = p_Spritemap[tilemap[j][k]].GetRect();

drück ich F11 und der läuft trotzdem weiter, statt in Sprite.cpp zu springen ... Kann das also schlecht überprüfen ...


Ach zum Thema Sprites, hier ist der 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
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "Sprite.hpp"
// Konstruktor
//
// Aufgabe: Zeiger auf Screen holen
//
CSprite::CSprite ()
{
    // Zeiger auf Screen holen (Wir merken uns den Zeiger, damit nicht bei jedem Rendervorgang auf Framework zugegriffen werden soll)
    m_pScreen = g_pFramework->GetScreen (); // Zeiger auf Screen des Frameworks holen, auf den gerendert werden soll
                                            // Da kein Objekt, sondern Zeiger -> keine freigabe!

} // Konstruktor

// Destruktor
//
// Aufgabe: Surface des Sprites freigeben
//
CSprite::~CSprite ()
{
    // Surface freigeben
    SDL_FreeSurface (m_pImage);     // Bei Framework kümmert sich SDL um Freigabe der Surface m_pScreen
                                    // bei Surface für Sprite muss dies über Funktion "SDL_FreeSurface" geschehen!

} // Destruktor

// Load
//
// Aufgabe: Einfaches, nicht animiertes Sprite laden
//
void CSprite::Load (const string sFilename)
{
    // Bitmap laden
    m_pImage = SDL_LoadBMP (sFilename.c_str () );   // SDL_LoadBMP gibt Zeiger zurück! Daher keine Speicherreservierung ala "new" für m_pImage 

    // Prüfen, ob alles glatt ging
    if (m_pImage == NULL)
    {
        cout << "Fehler beim Laden von: " << sFilename.c_str ();
        cout << endl;
        cout << "Fehlermeldung: " << SDL_GetError () << endl;

        // Framework herunterfahren
        g_pFramework->Quit ();

        // Gesamtes Spiel beenden
        exit (1);
    }

    // Rect initialisieren (Position)
    m_Rect.x = 0;           // Koodinaten für Position von Sprites (Sind relativ zur linken oberen Ecke des Bildschirms)
    m_Rect.y = 0;           // z.B. Hintergrundbild
    //Breite und Höhe über m_pImage ermitteln (Größe), da Zeiger auf eigentlichen BMP zeigt
    m_Rect.w = m_pImage->w;
    m_Rect.h = m_pImage->h;
    
} // Load

// Load
//
// Aufgabe: Animiertes Sprite laden
//
void CSprite::Load (const string sFilename, int NumFrames,
                    int FrameWidth, int FrameHeight)
{
    // Bitmap laden über Funktion "Load (const string sFilename)"
    Load (sFilename);

    // Rect für Animationsphase initialisieren
    m_NumFrames   = NumFrames;                      // Anzahl an Frames (Gesamt)
    m_FrameWidth  = FrameWidth;                     // werden beim Rendern als Zwischen-Membervariablen für die Berechnung verwendet
    m_FrameHeight = FrameHeight;
    m_FrameRect.w = FrameWidth;                     // Breite und Höhe einer einzelnen Animationsphase in m_FrameRec speichern 
    m_FrameRect.h = FrameHeight;                    // Diese Werte ändern sich nicht mehr
    m_NumFramesX  = m_pImage->w / m_FrameWidth;     // Anzahl an Frames in X-Richtung ermitteln

} // Load

// SetColorKey
//
// Aufgabe: Transparente Farbe festlegen
//
void CSprite::SetColorKey (int R, int G, int B)
{
    // Colorkey einstellen
    SDL_SetColorKey (m_pImage, SDL_SRCCOLORKEY,
        SDL_MapRGB (m_pImage->format, R, G, B) );

} // SetColorKey

// SetPos
//
// Aufgabe: Position des Sprites auf dem Bildschirm festlegen
//
void CSprite::SetPos (int fXPos, int fYPos)
{
    // Rect updaten
    m_Rect.x = fXPos;       // m_FrameRect bleibt davon unberührt, da diese Membervariable
                                            // nur für Ausschnitte der aktuellen Animationsphase verantwortlich ist
    m_Rect.y = fYPos;

} // SetPos

// Render
//
// Aufgabe: Sprite rendern (ohne Animation)
//
void CSprite::Render ()
{
    // Sprite rendern 
    // Sprite (oder bei animierte Sprite nur ein Auschnitt) wird in Back-buffer (Buffer, der gerade nicht sichtbar ist, also m_pScreen) kopiert,
    // SDL_Flip übernimmt dann Wechsel zwischen den Buffern, damit es nicht flimmert. 
    SDL_BlitSurface (m_pImage, NULL, m_pScreen, &m_Rect);

} // Render

// Render
//
// Aufgabe: Ausschnitt des Sprites rendern (Animationsphase)
//
void CSprite::Render (float fFrameNumber)
{
    // Ausschnitt der aktuellen Animationsphase berechnen
    //

    // Spalte berechnen
    int Column = static_cast<int>(fFrameNumber)%m_NumFramesX;   // Animationsphase 7 hat den Wert fFrameNumber = 6. Rechnung: 6%AnzahlFramesproZeile = 2(Ganzzahliger Rest)

    // Zeile berechnen
    int Row = static_cast<int>(fFrameNumber)/m_NumFramesX;      // z.B. 6/4=1,5 -> Casting in int liefert 1 -> 1 Zeile

    // Rect berechnen (Position, an der sich die gewünschte Animationsphase befindet)
    m_FrameRect.x = Column * m_FrameWidth;
    m_FrameRect.y = Row * m_FrameHeight;

    // Ausschnitt rendern (also in den Back-buffer kopieren)
    SDL_BlitSurface (m_pImage, &m_FrameRect, m_pScreen, &m_Rect);

} // Render



Verstehe einfach nicht, weshalb die Daten bzw Rects nicht stimmen... Die TIles an sich werden ja richtig gesetzt. Aber beim holen der Rects passt es nicht, verstejh nur nicht weshalb. Hole mir doch von jeder tilemap das Rect ...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »TigerClaw25« (06.07.2013, 20:51)


TigerClaw25

unregistriert

49

24.08.2013, 14:48

Kann mir den keiner da wirklich weiterhelfen? Ich moehctedoch nur, dass eine Kollision zwischen Punkt und Tiles stattfindet ... :(

Wie bereits erwähnt, funktioniert die Kollisionsüberprüfung, wenn ich diese direkt in die verschachtelten for-Schleifen beim Erstellen der Tiles bzw. setzen der Tile einfüge. Packe ich diese aber in eine extra Funktion, kommt es zu Fehlern ... bitte um Hilfe ...

Liegt es vllt an der Gültigkeit, dass ich tilemap[j][k] in der eine FUnktion initialisiere und in einer anderen Funktion diese Werte benutzen möchte? Hab absolut keine Ahnung .

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »TigerClaw25« (24.08.2013, 16:06)


TigerClaw25

unregistriert

50

11.11.2013, 18:11

Das Thema ist etwas her, aber meine Kollision funktioniert immer noch nicht und der debugger brachte auch keine Lösung. Jemand eine Idee was am Code falsch ist?

Werbeanzeige