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

TigerClaw25

unregistriert

1

06.05.2013, 16:29

Timer für Gegnerbewegung

Hallo Zusammen,

keine Sorge, bevor ich Frage, habe ich mir eine eigene Lösung geschrieben. und zwar habe ich meine Gegner in einem Rechteck fliegen lassen. Soweit so gut. Auf Basis dieser Bewegung würde ich gerne die Gegner in einem Zufälligen Muster fliegen lassen.

Habe mithilfe der Timerfunktion eine Wert zwischen 1 und 4 erzeugt, um damit die jeweiligen Bewegungen zu steuern. Klappt aber irgendwie nicht ... Die FLiegen teilweise komplett aus dem Bildschirm raus, ich weiß, hängt daran, wie ich die switch-case Verzweigung aufgebaut habe, aber irgendwie hängt es eben ... eventuell gibt es eine weniger umständliche Methode ...

Interessant ist auch, dass zeitgleich mit der Erstellung der Gegner meine Sterne, die im Hintergrund animiert werden, plötzlich eine ganz bestimmte x-Koordinate haben. Vorher werden diese zuffällig erzeugt, und sobald die Gegner kommen, habe ich alles auf einer Koordinate :( Also ein Streifen von Sternen, statt den gesamten Bildschirm ... -> Liegt es eventuell daran, dass sich das Programm dann in dieser switch-case Anweisung reinhängt und dadurch nicht mehr richtig updatet??? Wenn ich es dem debugger richtig entnommen habe, würde ich aber eher auf das NULL setzen der timer tippen :( was sich auf alle timer auswirkt ...

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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// Update
//
// Aufgabe: Spieler updaten
//
void CEnemy::Update ()
{   
    // Rechteckige Bewegung des Gegners
    MoveEnemyRectangle ();

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

    // Rechteckige Bewegung des Gegners
    RectEnemyRectangle ();

    // Gegnerschuss
    EnemyShot();
    
} // Update


// MoveLeft
//
// Aufgabe: Bewegung nach links
//
void CEnemy::MoveLeft ()
{
    m_fXPos -= 300.0f * g_pTimer->GetElapsed ();
    m_fAnimPhase -= 20.0f * g_pTimer->GetElapsed ();
} // MoveLeft

// MoveRight
//
// Aufgabe: Bewegung nach rechts
//
void CEnemy::MoveRight ()
{
    m_fXPos += 300.0f * g_pTimer->GetElapsed ();
    m_fAnimPhase += 20.0f * g_pTimer->GetElapsed ();
} // MoveRight

// MoveUp
//
// Aufgabe: Bewegung nach oben 
//
void CEnemy::MoveUp ()
{
    m_fYPos -= 150.0f * g_pTimer->GetElapsed ();
    m_fAnimPhase = 5.0f;
} // MoveUp

// MoveDown
//
// Aufgabe: Bewegung nach unten unten
//
void CEnemy::MoveDown ()
{
    m_fYPos += 150.0f * g_pTimer->GetElapsed ();
    m_fAnimPhase = 5.0f;
} // MoveDown


// MoveEnemyRectangle
//
// Aufgabe: Bewegungsverlauf des Raumschiffes
//
void CEnemy::MoveEnemyRectangle ()
{
    // Nach links?
    if (m_right)
        MoveRight ();

    // Nach rechts?
    else if (m_left)
        MoveLeft ();

    // Nach oben?
    else if (m_up)
        MoveUp ();
    
    // Nach unten?
    else if (m_down)
        MoveDown ();

    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);
        m_Rect.y = static_cast<int>(m_fYPos);

} // MoveEnemyRectangle

// RectEnemyRectangle
//
// Aufgabe: Richtung des Raumschiffes
//
void CEnemy::RectEnemyRectangle ()
{
        int direction = rand() % 4 + 1;
srand(time(NULL));

        switch (direction)
        {
        case 1: 
            {
                // Bildschirmrand als Grenze
                if (m_fXPos > 600.0f)
                    {
                        m_fXPos = 600.0f;
                        m_right = false;
                        m_up = true;
                    }

            }break;
        case 2: 
            {   
                if (m_fXPos < 100.0f)
                    {
                        m_fXPos = 100.0f;
                        m_left = false;
                        m_down = true;
                    }
            }break;
        case 3: 
            {
                    if (m_fYPos > 300.0f)
                        {
                            m_fYPos = 300.0f;
                            m_down = false;
                            m_right = true;
                        }
            }break;
        case 4: 
            {
                
                if (m_fYPos < 0.0f)
                {
                    m_fYPos = 0.0f;
                    m_up = false;
                    m_left = true;
                }
            }break;
        }
    



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

} // RectEnemyRectangle

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »TigerClaw25« (06.05.2013, 16:46)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

06.05.2013, 17:22

Um mal auf die einzige Frage zu antworten, die sich finden ließ: Nein, das Programm "hängt" sich nicht "rein" in der Switch-Anweisung.
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

3

06.05.2013, 18:13

Dann setze ich durch srand den timer immer auf null, was dazu fuehrt, dass danach immer alle Objekte, die auch per Zufall berechnet werden, immer an der selben stelle erzeugt werden oder???

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (06.05.2013, 19:40)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

06.05.2013, 23:50

würde ich aber eher auf das NULL setzen der timer tippen :(

Wenn du schon einen Verdacht hast, warum probierst du es nicht einfach aus?

5

07.05.2013, 00:35

Auch für das zufällige Setzen deiner direction-variablen willst du eine Timervariable benutzen. Ansonsten wird direction in jedem Frame neu gesetzt und du bekommst bestenfalls wirre Rüttelbewegungen. Deine switch-Logik ist Murks. Du willst ja, dass sich deine Gegner entweder links oder rechts herum bewegen (wenn ichs richtig verstanden hab) . Also hast du nur 2 und nicht 4 zufallige Möglichkeiten. Du brauchst also eine weitere Membervariable für das Vorzeichen der Geschwindigkeiten. Die Vorzeichenvariable setzt du zufallig auf 1 oder -1 und benutzt sie in deinen Move-Methoden.

TigerClaw25

unregistriert

6

07.05.2013, 07:14

Die schuettelbewegung habe ich bereits umgangen, indem ich die Zufallszahlen mit einem Timer verzoegere. Aber irgendwie will das noch nicht so, wie ich es moechte.

Und Nein, der Gegner soll ich alle Richtungen fliegen koennen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »TigerClaw25« (07.05.2013, 10:27)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

07.05.2013, 09:15

Wie BlueCobold schon sagte, es ist keine Frage vorhanden. Immer noch nicht. Und David hat dich ja darauf hingewiesen, dass du Ideen testen sollst und sie nicht nur posten sollst. Hast du das nun getan oder nicht? Antworten zu ignorieren hilft nicht besonders viel 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

8

07.05.2013, 10:43

Bin ja dabei,

aber irgendwie klappt es mit der Zeit nicht.

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
// RectEnemyRectangle
//
// Aufgabe: Richtung des Raumschiffes
//
void CEnemy::RectEnemyRectangle ()
{
    m_fMoveTimer += g_pTimer->GetElapsed ();
    if (m_fMoveTimer >= 2.5)
    {
    direction = rand() % 4 + 1;
m_fMoveTimer = 0.0f;
    
    }
    cout << direction << endl;
        switch (direction)
        {
        case 1: 
            {
                // Bildschirmrand als Grenze
                if (m_fXPos > 600.0f)
                    {
                        m_fXPos = 600.0f;
                        m_right = false;
                        m_up = true;
                    }

            }break;
        case 2: 
            {   
                if (m_fXPos < 100.0f)
                    {
                        m_fXPos = 100.0f;
                        m_left = false;
                        m_down = true;
                    }
            }break;
        case 3: 
            {
                    if (m_fYPos > 300.0f)
                        {
                            m_fYPos = 300.0f;
                            m_down = false;
                            m_right = true;
                        }
            }break;
        case 4: 
            {
                
                if (m_fYPos < 0.0f)
                {
                    m_fYPos = 0.0f;
                    m_up = false;
                    m_left = true;
                }
            }break;
        }
    
    // Animationsphase prüfen
    if (m_fAnimPhase < 0.0f)
        m_fAnimPhase = 0.0f;
    else if (m_fAnimPhase > 10.0f)
        m_fAnimPhase = 10.0f;

    
} // RectEnemyRectangle


Wenn ich die Zeit nach dem Vorgang zurücksetze, wird diese non stop zurückgesetzt, irgendwie klappt das nicht ... Der wechselt ständig zwischen den Zahlen, statt erst nach 2,5 Sekunden ... was mache ich falsch?

Ich persönlich vermute, dass es daran liegt, dass ich in meinem Konstruktor die direction-Variable immer mit NULL initialisiere. UNd dadurch, dass immer wieder neue Gegner erzeugt werden, verändert sich der Wert. Eventuell wäre es sinnvoller diese Zahl 1x statisch zu initialisieren oder bei der Erzeugung in der SpawnEnemy.

Jetzt zu meiner Frage: Wie Löse ich das Problem, falls 3x hintereinander die gleiche Zahl erzeugt wird (Zufallszahl) und mein Gegner aus dem Bildschirm fliegt? Ich könnte zwar sagen, dass wenn der Rand erreicht ist, das FLugzeug zurück fliegen soll, aber das ist auch nicht gerade die beste Lösung ... :(

z.B. eine solche Abfrage für rechts und links vor der switch Anweisung:

C-/C++-Quelltext

1
2
3
4
5
if ((m_fXPos > 700.0f) || ((m_fXPos < 100.0f)))
    {
        m_right = false;
        m_left = false;
    }


Aber dann bekomme ich sehr sehr viele if else Abfragen, außerdem bekomme ich das Problem, dass die Schüsse vpom Gegner parallel auch aus dem nichts auftauchen :(

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »TigerClaw25« (07.05.2013, 11:20)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

07.05.2013, 11:21

Das ist doch eine gute Möglichkeit. Wenn dir dein Code zu groß wird, dann versuch weiter zu unterteilen. Oft ist es sinnvoll Code in Funktionen auszulagern. Weiterhin kann man Dinge in Klassen kapseln. Wie das alles sinnvoll geht ist am Anfang nicht immer ganz einfach. Da hilft aber nur machen, machen machen. Je mehr du programmierst umso leichter wird dir das irgendwann fallen.
„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

10

07.05.2013, 12:37

Ich versuche es ja, aber irgendwie komme ich mit diesen vier if Abfragen nicht weiter :(

eigentlich muss ich die Abfrage für alle vier Koordinaten für alle vier case-Fälle machen oder?

Werbeanzeige