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

14.03.2015, 19:15

Problem mit Listing 12.21 - Update, Zusammenhang Rect und Bild

Jo Leute, habe das Buch von Heiko Kalista fast durch, habe n kleines Verständnisproblem beim Listing 12.21:

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
    // Zeiger auf Sprite kopieren und Koordinaten setzen
    m_pSpriteShot = pSpriteShot;
    m_fXPos = fXPos;
    m_fYPos = fYPos;

    // Rect initialisieren
    m_Rect.x = static_cast<int>(m_fXPos);
    m_Rect.y = static_cast<int>(m_fYPos);
    m_Rect.w = pSpriteShot->GetRect().w; 
    m_Rect.h = pSpriteShot->GetRect().h;

    // Schuss aktivieren
    m_bIsAlive = true;

} // Init


// Update
//
// Aufgabe: Schuss bewegen und Position prüfen
//
void CShot::Update ()
{
    // Schuss bewegen
    m_fYPos -= 400.0f * g_pTimer->GetElapsed ();

    m_Rect.y = static_cast<int>(m_fYPos);

    // Deaktivieren, falls außerhalb des Bildschirms
    if (m_fYPos < -15.0f)
        m_bIsAlive = false;

} // Update


An sich ist die Funktion ja easy aber ich frage mich folgendes:
Es wird ein Rect namens m_Rect deklariert und benutzt. Wieso wird dies gemacht? Wir haben doch bereits ein Rect aus der Klasse CSprite (hier mal die 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
#ifndef SPRITE_HPP
#define SPRITE_HPP

#include "Framework.hpp"

class CSprite
{
    public:
        CSprite();
        ~CSprite();

        void Load           (const string sFilename);
        void Load           (const string sFilename, int NumFrames,
                            int FrameWidth, int FrameHeight);
        void SetColorKey    (int R, int G, int B);
        void SetPos         (float fXPos, float fYPos);
        void Render         ();
        void Render         (float framenumber);
        SDL_Rect GetRect    () {return m_Rect;}

    private:
        SDL_Surface *m_pScreen;         // Zeiger auf den Screen des Frameworks
        SDL_Surface *m_pImage;          // Das eigentliche Bild des Sprites
        SDL_Rect m_Rect;                // Rect des Sprites
        SDL_Rect m_FrameRect;           // Ausschnitt für Animationsphase
        int m_NumFrames;                // Breite einer Animationsphase
        int m_FrameWidth;               // Höhe einer Animationsphase
        int m_FrameHeight;              // Höhe einer Animationsphase
        int m_NumFramesX;               // Wie viele Anim-Phasen in X_Richtung ?

};


#endif


Man kann sogar wunderbar mit ner Get-Funktion drauf zugreifen.

Andere Frage: Ab wann schafft man denn einen Zusammenhang zwischen dem Bild, dass sich bewegen soll und dem Rect? Bei der Update Funktion (in CShot) wird ja die YPos in Rect gespeichert. Wunderbar, aber ich seh nirgends im Code, dass das Rect dem Bild zugeordnet wird ? Hab ich irgendwas überlesen?


Danke schon mal im Voraus, Jungs :thumbsup:

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

14.03.2015, 20:55

Auf die schnelle würde ich behaupten das was da passiert ist unnötig. Aber teste es doch einfach mal aus. Änder den Code doch so ab dass kein extra Rect benötigt wird und guck was passiert.
„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.“

3

14.03.2015, 22:49

Ich glaube, das Rechteck wird zur Kollisionserkennung gebraucht. Du kanns dazu nicht das vom Sprite nehmen, weil alle Shots auf das selbe Sprite zugreifen und dabei die Position des Sprite-Rects verändern. Trotzdem könntest du wahrscheinlich auf das Rect verzichten weil sich ja die Größe des Sprites nicht verändert und du die Position separat verwaltest.

Werbeanzeige