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

19.04.2013, 08:01

Wenn 'TigerClaw25' nicht warm mit dem Debugger wird,....hat er immer noch die Möglichkeit relevante Daten in ein Log-File zu schreiben und anschliessend auszuwerten... Neben dem Debugger auch ein hilfreiches Mittel zum Zweck...
Die besten Grüsse

Thomas

Mutant3D Basic
www.tcspiele.de

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

22

19.04.2013, 08:20

Checkmateing, ich glaube Du solltest etwas an Deinem Ausdruck und Deiner fehlenden Höflichkeit arbeiten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TigerClaw25

unregistriert

23

19.04.2013, 10:44

Hab den debugger benutzt. Mir fällt aber nichts ungewöhnliches auf. AUßer das RectPlayer.x immer den selben Wert hat ... :( Das ist auch das Problem

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CEnemy::EnemyShot()
{
// Schuss des Gegners steuern:
    SDL_Rect RectPlayer;
    
        RectPlayer = m_pPlayer->GetRect();

        if (RectPlayer.x <= m_Rect.x)       
            m_bShotLock = false;
                
        else 
            m_bShotLock = true;
        

} // EnemyShot

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (19.04.2013, 10:59)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

24

19.04.2013, 10:52

Dann wäre doch sicher mal ein Breakpoint in CEnemy::Update () ganz sinnvoll. Da kannst du dann ja sehen wie m_Rect.x verändert wird.

Übrigens speicherst Du die Position doppelt. Nämlich in m_fXPos und in m_Rect.x. Das ist irgendwie kontraproduktiv.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TigerClaw25

unregistriert

25

19.04.2013, 11:01

Scheint alles zu funktionieren. m_Rect.x scheint doch zu updaten. Ich denke, dass der Fehler eventuell darin liegt, dass ich in CEnemy::Update nach der Überprüfung m_fXPos immer auf 730 oder auf 0 setze ...

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

26

19.04.2013, 11:46

Wofür brauchst du denn die Position überhaupt 2 mal? Reicht es nicht die Position nur ein mal zu speichern? Und was sinnvoll sein kann, ist einfach mal einen Breakpoint zu setzen. An dieser Stelle hält dein Programm dann an und du kannst Schritt für Schritt dein Programm weiter ausführen. Dann kannst du dir genau angucken was da passiert und wie sich die Werte verändern. Dann siehst du ja an welchen Stellen deine Position wie geändert wird.
„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.“

27

19.04.2013, 13:00

Ich hoffe, der Verweis auf das Player-Objekt ist jetzt richtig (hört sich nämlich nicht so an). Wenn du, wie in Zeile 36, dein Objekt neu erzeugst, macht das wenig Sinn (weshalb sollte dein Enemy einen Player, also seinen eigenen Feind, gebären?). Mit dem Debugger kannst du auch Zeigerwerte prüfen, beide Zeiger (der innerhalb und der außerhalb von CEnemy) müssen den gleichen Wert haben, dann verweisen sie auf das gleiche Objekt.

TigerClaw25

unregistriert

28

19.04.2013, 13:30

Hab eine neue Instanz erstellt, da ich mir nicht sicher bin, wie ich das am besten mache. Soll ich den Zeiger auf das vorhandene Player-Objekt über eine Funktion holen?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

29

19.04.2013, 13:38

Logisch wäre der Enemy bekommt es übergeben. Eventuell sogar nur die Position.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TigerClaw25

unregistriert

30

19.04.2013, 13:39

Ach so, stimmt.

also beispielsweise:

public:
void Init (CPlayer *pPlayer, float fXPos, float fYPos);

private:
CPlayer m_pPlayer


Dann kann ich innerhalb meiner EnemyKlasse diese Kopie nutzen ...

Wobei ich die Koordinaten nicht brauche, da ich mir diese auch über den Zeiger, der auf das Player-Objekt zeigt, holen kann.


EDIT: Scheint jetzt zu gehen. Nervt nur, dass ununterbrochen geschossen wird, wenn ich mich in einem bestimmten Toleranzbereich befinde und wenn ich nur bei Stelle x1 = x2 schieße, wird nur ein Schuss abgegeben ... :(

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
// Update
//
// Aufgabe: Spieler updaten
//
void CEnemy::Update ()
{   
// Nach links?

    if (m_moving == true)
    {
        m_fXPos += 200.0f * g_pTimer->GetElapsed ();
        m_fAnimPhase += 20.0f * g_pTimer->GetElapsed ();
        
        
    }
    // Nach rechts?
    else if (m_moving == false)
    {   
        m_fXPos -= 200.0f * g_pTimer->GetElapsed ();
        m_fAnimPhase -= 20.0f * g_pTimer->GetElapsed ();
    }
    
    
    else
    {
        // Animation zurück zum Ausgangspunkt (Mitte entspricht 5 Bild!)
        if (m_fAnimPhase > 5.0f)
            m_fAnimPhase -= 20.0f * g_pTimer->GetElapsed ();
        if (m_fAnimPhase < 5.0f)
            m_fAnimPhase += 20.0f * g_pTimer->GetElapsed ();
    }

        m_Rect.x = static_cast<int>(m_fXPos);

    // Prüfen, ob geschossen wurde
    ProcessShooting ();

    if (m_fXPos > 752.0f)
        {
            m_fXPos = 752.0f;
            m_moving = false;
        }

    else if (m_fXPos < 0.0f)
    {
            m_fXPos = 0.0f;
            m_moving = true;
    }

    // Animationsphase prüfen
    if (m_fAnimPhase < 0.0f)
        m_fAnimPhase = 0.0f;
    else if (m_fAnimPhase > 10.0f)
        m_fAnimPhase = 10.0f;


    // Gegnerschuss
    EnemyShot();

    
} // Update

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »TigerClaw25« (19.04.2013, 13:56)


Werbeanzeige