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

10.07.2012, 15:09

Erster Asteroid der spawnt hat falsche Breite & Höhe

Hallo,

ich bin gerade dabei das Asteroidenspiel aus dem Buch zu erweitern. Da ist mir ein Fehler im Spiel aufgefallen. Der erste Asteroid der spawnt hat eine Breite von 640x128px (gesamte Bildbreite), jedoch sollte jeder Asteroid nur eine Breite von 64x64px haben. Alle darauf folgenden Asteroiden haben das auch.

Der Sprite für den Asteroiden wird folgendermaßen geladen:

C-/C++-Quelltext

1
2
3
4
    // Sprite für Asteroiden laden
    m_pSpriteAsteroid = new CSprite;
    m_pSpriteAsteroid->Load ("Data/Asteroid.png", 20, 64, 64);
    m_pSpriteAsteroid->SetColorKey (255, 0, 255);


Die Load-Methode sieht folgendermaßen aus:

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
// Load
//
// Aufgabe: Einfaches, nicht animiertes Sprite laden
//
void CSprite::Load (const string sFilename)
{
    // Bitmap laden
    m_pImage =  IMG_Load(sFilename.c_str() );
    
    // Prüfen, ob alles glatt ging
    if (!m_pImage)
    {
        cout << "Fehler beim Laden von: " << sFilename.c_str ();
        cout << endl;
        cout << "Fehlermeldung: " << SDL_GetError () << endl;

        // Framework herunterfahren
        g_pFramework->Quit ();

        // Gesamtes Spiel beenden
        exit (3);
    }

    // Rect initialisieren
    m_Rect.x = 0;
    m_Rect.y = 0;
    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
    Load (sFilename);

    // Rect für Animationsphase initialisieren
    m_NumFrames   = NumFrames;
    m_FrameWidth  = FrameWidth;
    m_FrameHeight = FrameHeight;
    m_FrameRect.w = FrameWidth;
    m_FrameRect.h = FrameHeight;
    m_NumFramesX  = m_pImage->w / m_FrameWidth;

} // Load


Ich konnte das Problem leider nicht beheben..ich kann mir auch nicht erklären, warum der Fehler nur beim ersten Asteroiden auftritt.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

10.07.2012, 22:19

Ah, das Problem kannte ich. Irgendwie hab ich's aber behoben.

Deine Load-Funktion ist mit meiner identisch, bitte poste mal deine SpawnAsteroids-Funktion ;)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

3

10.07.2012, 22:38

Das ist dieselbe Funktion wie aus dem Buch. Der Fehler tritt auch dort auf.

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
// SpawnAsteroids
//
// Aufgabe: Nach Ablauf einer bestimmten Zeit neuen Asteroiden erzeugen
//
void CGame::SpawnAsteroids ()
{
    // Timer für nächsten Asteroiden erhöhen
    m_fAsteroidTimer += g_pTimer->GetElapsed ();

    // Wenn eine halbe Sekunde vergangen ist,
    // dann einen neuen Asteroiden erzeugen
    if (m_fAsteroidTimer >= 0.5f)
    {
        // Neuer Asteroid
        CAsteroid Asteroid;

        // Zufällige X-Position
        int XPos = rand()%736;

        // Asteroid initialisieren
        Asteroid.Init (m_pSpriteAsteroid, static_cast<float>(XPos), -60.0f);

        // Asteroid in Liste einfügen
        m_AsteroidList.push_back (Asteroid);

        // Zeitgeber wieder zurücksetzen
        m_fAsteroidTimer = 0.0f;

    }

} // SpawnAsteroids

4

11.07.2012, 11:17

Das sieht alles ok aus, vielleicht wäre die Funktion mit der du die animationen renderst noch interessant. Im Zweifel lösch mal den ganzen inhalt vom Debug bzw. Release Ordner außer die dlls und erstelle neu. Manchmal verschluckt sich die IDE irgendwie an den .obj Dateien (das können andere sicher besser erklären) und dann kommen so Fehler wo man verrückt wird.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

5

11.07.2012, 11:42

Ne, es liegt am Code, nicht an irgendwelchen korrupten Dateien.

Das Problem liegt daran, dass das Rect vom ersten Asteroiden falsch berechnet wird, es entspricht nämlich genau der Größe des Spritesheets vom Asteroiden (640*128). Liegt also am Rect, musst mal suchen, wo das Rect berechnet wird und was genau das Problem verursacht.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

6

11.07.2012, 11:59

Ja genau, da liegt manchmal das Problem. Man erkennt nicht, ob die Dateien korrupt sind.

RmbRT

Treue Seele

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

7

11.07.2012, 12:50

Hast du den ersten asteroiden Hard-gecodet?
Ich hatte das mal und dann wusste ich nicht, warum mitten in der map an nem unmöglichen ort n baum stand... hab natürlich im mapgenerator gesucht und irgendwann außerhalb einen Hardgecodeten baum gefunden...
MfG, RmbRT
"Dumm ist, wer dummes tut."

Werbeanzeige