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

11

06.09.2011, 17:38

das rectangle bekommt nach dem ich das sprite tauschen will nich den maße des einzel bildes was ja übergeben wird sondern die des gesamten bildes mit den einzelnen animationsbildern, ... aber nur wenn ich versuche so das bild zu ändern ... aber selbst wenn ich das manuell wieder richtig stelle funktioniert die kollisions abfrage nich mehr warum is mir nen rätzel ...

fals du die auch sehen möchtest ^^

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
string Collision::Intersects(SDL_Rect a, SDL_Rect b)
{                             // top, right, bottom, left, posBerechnung
    string illegalDirection = "0000";
    xPosCalculate = 0; yPosCalculate = 0;

    if ( ((b.y + b.h) >= (a.y - 1)) && ((b.y + b.h) < (a.y + 10)) && ((a.x >= b.x && a.x <= (b.x + b.w)) || ((a.x + a.w) <= (b.x + b.w) && (a.x + a.w) >= b.x)) ) //nach oben prüfen
    {
            illegalDirection[0] = '1';
            if((b.y + b.h) - a.y >= 0)
                yPosCalculate = (b.y + b.h) - a.y + 1;
    }

    if ( ( b.x <= (a.x + a.w + 1)) && (b.x > (a.x + a.w - 10)) && ((a.y >= b.y && a.y <= (b.y + b.h)) || ((a.y + a.h) <= (b.y + b.h) && (a.y + a.h) >= b.y)) ) // nach rechts prüfen
    {
        illegalDirection[1] = '1';

        if((a.x + a.w) - b.x >= 0)
            xPosCalculate = ( ((a.x + a.w) - b.x) * -1) -1;
    }

    if ( (b.y <= (a.y + a.h + 1)) && (b.y > (a.y + a.h - 10)) && ((a.x >= b.x && a.x <= (b.x + b.w)) || ((a.x + a.w) <= (b.x + b.w) && (a.x + a.w) >= b.x)) ) //nach unten prüfen
    {   
        illegalDirection[2] = '1';

        if((a.y + a.h) - b.y >= 0)
                yPosCalculate = ( ((a.y + a.h)  - b.y) * -1) -1;
    }

    if ( ((b.x + b.w) >= (a.x - 1)) && ((b.x + b.w) < (a.x + 10)) && ((a.y >= b.y && a.y <= (b.y + b.h)) || ((a.y + a.h) <= (b.y + b.h) && (a.y + a.h) >= b.y)) ) // nach links prüfen
    {
        illegalDirection[3] = '1';

        if((b.x + b.w) - a.x >= 0)
            xPosCalculate = (b.x + b.w) - a.x + 1;
    }
        
    return illegalDirection;
}

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

12

06.09.2011, 17:56

Hab grad nicht die Zeit aber was mir aufgefallen ist:

C-/C++-Quelltext

1
m_NumFramesX  = m_pImage->w / m_FrameWidth;
Ist m_pImage->w ein float oder double? Ansonsten bekommst du immer 0 dabei heraus.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

13

06.09.2011, 18:02

weder noch, ... es scheint ein int zu sein ^^ steht zumindest im tool tip

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

14

06.09.2011, 18:28

Naja dann hat er deine Frage ja grad beantwortet. Das Ergebnis ist immer 0.
„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.“

15

06.09.2011, 18:56

Aber es funktioniert doch ... Nur wenn ich es ein zweites mal aufrufen will nich o.O

16

06.09.2011, 20:06

Tja, berichtige das doch erst einmal und schau ob es dann immer noch so ist.

MfG
Check

ridens

Frischling

Beiträge: 47

Beruf: Freiberuflicher Entwickler

  • Private Nachricht senden

17

06.09.2011, 22:01

Also so in der Art habe ich das umgesetzt...

Beim Laden gebe ich ja Animations-Framegröße und -anzahl mit. Wenn also z.B. der Asteroid einmal so und einmal so aussehen soll brauch ich

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
//Init in game.cpp
CSprite pSprAsteroid = new CSprite;
pSprAsteroid->Load("ast1.bmp",10,22,22);
pSprAsteroid->SetColorKey(0,0,0);

CSprite pSprAsteroid2 = new CSprite;
pSprAsteroid2->Load("ast2.bmp",10,22,22);
pSprAsteroid2->SetColorKey(0,0,0);

//sonstiges...

//Und die werden beide jedem Asteroid übergeben
CAsteroid(pSprAsteroid,pSprAsteroid2, ... );


Dann muss der Asteroid irgendwo was haben, was festhält welche Animation gerendert werden soll:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
private: bool m_bAnim2On; //Init nicht vergessen

//Und außerdem auch bei Init
m_Rect = m_pSprite1->GetRect();

//Und irgendwo das hier
m_bAnim2On = true;
m_Rect = m_pSprite2->GetRect();


Und dann schließlich

C-/C++-Quelltext

1
2
3
4
5
6
7
void CAsteroid::Render() {
    if(!m_bAnim2On) {
        m_pSprite1->Render(m_fAnimPhase);
    } else {
        m_pSprite2->Render(m_fAnimPhase);
    }
}

18

07.09.2011, 16:29

hab jetzt einfach ein großes sprite draus gemacht und es über die animation geregelt

trotzdem vielen dank :)

Werbeanzeige