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

11

18.04.2013, 16:48

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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
#include "Enemy.h"

// Konstruktor
//
// Aufgabe: Allgemeine Initialisierungen
//
CEnemy::CEnemy ()
{
    m_pSpriteEnemy = NULL;
    m_pSpriteShot = NULL;
    m_pPlayer = NULL;

    m_Health = 10;

} // Konstruktor

// Init
//
// Aufgabe: Sprites erzeugen und laden
//
void CEnemy::Init ()
{
    // Spielersprite erstellen
    m_pSpriteEnemy = new CSprite;

    m_pSpriteEnemy->Load ("Data/Opponent.bmp", 11, 64,64);
    m_pSpriteEnemy->SetColorKey (255, 0, 255);

    // Schuss-Sprite erstellen
    m_pSpriteShot = new CSprite;

    m_pSpriteShot->Load ("Data/Laser.bmp", 0, 64, 64);
    m_pSpriteShot->SetColorKey (255, 0, 255);

    // Neuen Spieler initialisieren
    m_pPlayer = new CPlayer;
    m_pPlayer->Init ();
    m_pPlayer->Reset ();

    // Bewegung initialisieren
    m_moving = true;
    
} // Init

// Quit
//
// Aufgabe: Sprites freigeben
//
void CEnemy::Quit ()
{
    // Spieler-Sprite freigeben
    if (m_pSpriteEnemy != NULL)
    {
        delete (m_pSpriteEnemy);
        m_pSpriteEnemy = NULL;
    }

    // Schuss-Sprite freigeben
    if (m_pSpriteShot != NULL)
    {
        delete (m_pSpriteShot);
        m_pSpriteShot = NULL;
    }

} // Quit

// Reset
//
// Aufgabe: Spielerwerte auf Standard setzen
//
void CEnemy::Reset ()
{
    // Startposition des Spielers
    m_fXPos = 520.0f;
    m_fYPos = 100.0f;

    // Animationsphase
    m_fAnimPhase = 5.0f;

    // Es darf geschossen werden
    m_bShotLock = false;

    // Rect initialisieren (Erweiterung für Kollision zwischen Asteroid und Spieler)
    m_Rect.x = static_cast<int>(m_fXPos);
    m_Rect.y = static_cast<int>(m_fYPos);
    m_Rect.w = m_pSpriteEnemy->GetRect().w;
    m_Rect.h = m_pSpriteEnemy->GetRect().h;

} // Reset

// EnemyShot
//
// Aufgabe: Schuss des Gegners abfeuern, wenn Spieler in Reichweite
//
void CEnemy::EnemyShot()
{

    // Schuss des Gegners steuern:
    SDL_Rect RectPlayer;
    
    
        RectPlayer = m_pPlayer->GetRect();

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

} // EnemyShot

// Render
//
// Aufgabe: Spieler und Schüsse rendern
//
void CEnemy::Render ()
{
    // Position des Spielers setzen und Sprite rendern
    m_pSpriteEnemy->SetPos (m_fXPos, m_fYPos);
    m_pSpriteEnemy->Render (m_fAnimPhase);

    // Iterator für Schussliste
    list<CShot>::iterator it = m_ShotList.begin ();

    // Schussliste durchlaufen
    while (it != m_ShotList.end ())
    {
        // Schuss updaten
        it->Update2 ();

        // Ist der Schuss noch aktiv?
        if (it->IsAlive ())
        {
            // Ja, dann rendern
            it->Render ();
            it++;
        }
        else
        {
            // Nein, dann aus der Liste entfernen
            it = m_ShotList.erase (it);
        }

    }

} // Render

// 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 ();
        
        if (m_fXPos > 730.0f)
        {
            m_fXPos = 730.0f;
            m_moving = false;
        }

    }
    // Nach rechts?
    if (m_moving == false)
    {   
        m_fXPos -= 200.0f * g_pTimer->GetElapsed ();
        m_fAnimPhase -= 20.0f * g_pTimer->GetElapsed ();
        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;

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

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

    // Gegnerschuss
    EnemyShot();

} // Update

// ProcessShooting
//
// Aufgabe: Waffe abfeuern
//
void CEnemy::ProcessShooting ()
{
    // Darf geschossen werden?
    if (m_bShotLock == false)
    {
        // Neuen Schuss erzeugen und initialisieren
        CShot Shot;

        Shot.Init (m_pSpriteShot, m_fXPos, m_fYPos);

        // Schuss in Liste einfügen
        m_ShotList.push_back (Shot);

        // Schießen erst wieder erlaubt, wenn Space losgelassen
        m_bShotLock = true;

    }


} // ProcessShooting


Hat vorher aber besser funktioniert. Hab das jetzt nur über CEnemy gelöst ... Anscheinend bleibt der Anfangswert von meinem Schiff einfach gespeichert und deswegen schießt der Gegner auch in Richtung alte Position ...

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

18.04.2013, 17:38

Hmm wer kann dir denn wohl sagen wie die Werte zur Laufzeit wirklich aussehen. Wenn es da doch nur irgendein technisches Hilfsmittel gäbe, womit ein Entwickler das Programm zu Laufzeit unterbrechen könnte, um sich direkt aktuelle Werte anzugucken. Sowas sollte man mal entwickeln. Ich glaube ich würd das Tool debugger nennen. Wenn sich doch nur jemand die Arbeit machen würde.
„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

13

18.04.2013, 17:47

Ich bin zu bloed den zu bedienen. :-)

Mich wuerde erst einmal interessieren, ob das Prinzip mit der Playerinstanz ueberhaupt korrekt ist.

14

18.04.2013, 17:53

Du musst dir den Zeiger auf das vorhandene Player-Objekt holen und nicht eins erzeugen.

TigerClaw25

unregistriert

15

18.04.2013, 18:11

Also einen Zeiger deklarieren und ueber ein Funktion in CGame eine Zuweisung durchfuehren oder beim Enemy KOntruktor als argument uebergeben.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (18.04.2013, 18:16)


16

18.04.2013, 18:29

Zitat

Ich bin zu bloed den zu bedienen. :-)

Dann bist du auch zu blöd zu programmieren. gawd
Hier hättest kannst du auch mal gucken.
Ansonsten mal für 'Blöde':

(Link)

Kein roter Punkt => Nicht hingeklickt
Roter Punkt => Hingeglickt
Roter Punkt mit gelben Pfeil => Momentane Position beim Debuggen
Der Kram darunter => Übersicht über die Variablen, Zeiger und Referenzen sowie über Instanzen.
Wenn du beim Debuggen mit der Maus über eine Variable fährst, wird ihr Wert angezeigt.
Das ist debuggen! Mehr ist das nicht! Komm schon, man muss schon geistig eingeschränkt und nicht mal in der Lage sein, VS zu installieren, wenn man "zu blöd ist, den Debugger zu bedienen"
- oder man ist 64 Jahre alt und will sich mit dem ganzen neumodischen Kram nicht beschäftigen. Das ist hier das Problem.
Du bist weder zu blöd noch "zu alt" dafür, das Problem ist deine Einstellung. Statt "Oh, das wird mir oft geraten, das sollte ich mir näher ansehen." "Hey, das ist ziemlich interessant, mal gucken was passiert, wenn ich...." ist nur "Kann ich nicht" "Will ich nicht" "Hilft mir nicht"
Lerne ihn zu benutzen :pillepalle:
Du gereichst dir damit zu großer Freude, mir damit zur großer Freude und anderen wahrscheinlich ebenso.
Ich entschuldige meine, gerade zu Beginn, recht barsche Wortwahl, die lediglich als untermalendes, rhetorisches Stilmittel gelten soll, um dir, TigerClaw, endlich weiszumachen, dass du den Debugger über alles lieben wirst und er dein engster Freund wird, wenn du mal mit ihm redest und ihm eine Chance gibst. Eine wirkliche Chance, kein "Joa hab mal drüber geguckt war nichts für mich"
Die erstbesten Fehler im Forum posten kann jeder, sie lösen... kann auch jeder, wenn jener denn den Debugger benutzen würde, der es scheinbar noch nicht kann, weshalb jene Person dann auch ständig neue Themen der neusten Probleme öffnet, mit dem halben Code vom Spiel, müsste er eben keine Themen eröffnen.
Zur Not guckst du dir ein Videotutorial an oder was weiß ich...
In Heikos Buch ist der Debugger doch auch aufgeführt! Kapitel 11? keine Ahnung, geht aber gut ein ganzes Kapitel drüber, soweit ich weiß. Nimm das doch als Hilfe und übersprings nicht einfach. :dash:

Das benutzen des Debuggers,
vielleicht auch ganz anders,
als ich oder er es tut,
tut gut.

Zu deinem eigentlichem Problem werde ich mich nicht weiter äußern, da es mit ein wenig debugging gelöst sein dürfte, allem Anschein nach.

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (18.04.2013, 18:34)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

18.04.2013, 18:38

Mal wirklich. Hier werden so oft Youtubetutorials zum zum lernen von Programmiersprache XYZ angepriesen wo ich nur die Hände über dem Kopf zusammenschlagen kann. Hier beim Debugger würden Videotutorials sogar Sinn machen, aber dann wird nicht geguckt was es gibt. Du willst programmieren können, du willst Software entwickeln, also lern es vernünftig oder lass es bleiben. Wenn du aber zu faul dafür bist, dann belästige auch bitte keine anderen Leute damit. Es ist nicht schlimm etwas nicht zu können oder nicht zu verstehen. Es ist aber schlimm wenn man andere die Arbeit machen lässt weil man sich mit gewissen Dingen nicht auseinander setzen möchte. Wer Themen aufmachen kann um Fragen zu stellen, die man mit einem Debugger lösen kann, der kann auch Themen aufmachen, in welchen er Fragen zum Debugger selbst stellt. Wenn du damit nicht klar kommst, dann stell doch fragen dazu. Schreib doch was dir genau Probleme bereitet und was nicht funktioniert. Aber vermutlich hast du dich einfach nicht damit beschäftigt und hat keine Probleme mit ihm, sondern weißt einfach nicht wie es geht.
Also los, erledige deine Hausaufgaben. Wir helfen hier normal alle gerne, aber dann muss nun mal ein wenig vom Hilfesuchenden kommen.
„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.“

18

18.04.2013, 20:44

Na warscheinlich hast du recht, aber ich finds echt schwierig hier ne Grenze zu ziehen, ab wann hier einer Hilfe beanspruchen darf und ab wann einer einfach nur zu faul ist, selbst zu denken(?). Sein letztes Problemchen basiert eher auf nem Verständnisdefizit als darauf, den Debugger nicht bedienen zu können. Ich finde auch nicht, dass er sich gar keine Mühe gibt. Es werden ihm ja keine Fertiglösungen serviert. Kann nicht jeder Autodidakt sein.

19

18.04.2013, 22:38

Seriously?
Was wie wo dürfen? Hilfe beanspruchen dürfen tut man immer. :)
Er ist vllt auch nicht zu faul, selbst zu denken. Nur denkt er eben an den falschen Plätzen: "Wenn ein Problem auftaucht, was ich eigentlich 'leicht' mit dem Debugger lösen könnte, dann bespreche ich das mit dem Forum"
Prinzipiell ein guter Gedanke, aber kommt das Selbst-Suchen dabei natürlich zu kurz, das merkt man auch relativ deutlich eigentlich, allein schon die schiere Menge an Code, die gezeigt wird.
Ein Sich-Mit-Dem-Code-Beschäftigen und daraus auch ein Nach-Dem-Problem-Suchen zeigt sich sehr oft eben auch an der Menge, je länger und je "simpler" das Problem, desto eher ist derjenige "zu faul zum selber denken". Ich meine, wenn man einfach alles hin klatscht, selbst Irrelevantes, hat man dann mal gesucht? Ziemlich unwahrscheinlich. :huh: Diese Menge muss natürlich in Relation zum Problem an sich gebracht werden, an sich auch nur eine vollkommen spekulierende "Theorie", einfach, um ein Argument zu bringen. *lol*
Als ich auch so drauf war, speziell in einem anderem Forum, danke an Rushh0ur btw für die kompetenten Hilfen ( ^^ ), fing ich erst richtig an zu denken, nachdem der Beitrag schon verfasst worden und im Forum veröffentlicht war. Nur weil einem keine Fertiglösungen serviert werden, heißt das auch nicht, dass man sich sonderlich mit dem Code beschäftigte.
Ich schlage vor, dass wir hier einfach diese auf Kleinigkeiten basierende Diskussion lassen. Nachdrücklich verweisen möchte ich hier besonders auf den 17. Beitrag, der von Schorsch.
Ebenso schlage ich vor, dass der Threadstarter vllt einfach mal es selbst probiert (nach dem ersten Mal so ein Problem mit dem Debugger lösen, da fühlst du dich wie der König ;D) und herumsucht, macht und tut und wenn er absolut gar keine und wirklich gar gar gar gar gar keine Ahnung hat, wo das Problem liegt, wie man es finden kann und/oder wie man es beseitigen kann, dann fragt er einfach nochmal hier nach. Besonders nochmal zu dem "Wie-Beseitigen": Google nicht vergessen :thumbup:
Du kannst das auch ohne uns. ;)

MfG
Check

20

18.04.2013, 23:22

;)
Ja nennt mich Erbsenzähler. Ich fand halt, der Vorwurf mit dem Debugger kam nach seinem letzten Problem-Post nicht ganz passend. Seitens TigerClaw fehlt da einfach das Grundverständnis für das eigene Kodierte und ohne das ist halt auch mit dem Debugger nicht gut Kirschen essen.

Werbeanzeige