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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

31

19.04.2013, 14:05

So wie du oben deine Init Funktion zeigst ist das mit der Position auch Unsinn. Wenn die Position von außen geändert wird, bekommt dein Gegner das dann mit? Nein tut er nicht, da die Variablen kopiert werden sobald sie als Parameter übergeben werden. Dafür gibt es dann ja Referenzen. Und BlueCobold meinte glaube ich nicht, dass du den Spieler und seine Potition übergeben sollst, sondern dass es eigentlich reichen müsste nur die Position zu übergeben. Dann natürlich passend als Referenz.
„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

32

19.04.2013, 14:23

Du beziehst es jetzt darauf, dass ich die Parameterübergabe in der Init Funktion mache und der Initialisierungsteil nur einmal pro Spielstart ausgeführt wird oder? Wobei ich im Endeffekt trotzdem eine Zeiger habe, der auf das Spieler-Objekt zeigt. Da ich mir dann jedes Mal über die Enemy::Update() Funktion die Enemy:EnemyShot() ausführe und dort auch das Rect vom Spieler hole, dürfte es immer aktuell sein:

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
// 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 (RectPlayer.x < m_Rect.x)
            for (int i = 0; i<2; ++i)
            {
                if (i==1)
            m_bShotLock = false;
            
                else if (i==2)
                    m_bShotLock = true;

            }
                
        else 
            m_bShotLock = true;
        

} // EnemyShot



Merkwürdig auch, dass je schneller der Gegner animiert wird, desto weniger schießt er, weil die Werte ungenau werden :( trotz casten in int

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


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

33

19.04.2013, 15:17

Den Spieler oder seine Anfangsposition zu kopieren ergibt keinen Sinn. Du wirst schon eine dauerhafte Referenz oder Pointer auf diese Datensätze brauchen.
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

34

19.04.2013, 18:54

Also im Prinzip ein Referenz auf die Koordinaten?

Woran liegt es eigentlich,dass bei hoehere Geschwindigkeit in der Bewegung die Werte der beiden Raumschiffe oft nicht verglichen werden koennen? Sobald ich naemlich die Geschwindigkeit erhoehe, haben die Raumschiff so gut wie nie die gLeichen Koordinate.

Eventuell lasse ich diese doch nach einem bestimmten Muster fliegen und schiessen.

35

19.04.2013, 23:32

Was genau willst du eigentlich den mit deier EnemyShot()-Funktion erreichen? Das sieht irgendwie wirr aus.

TigerClaw25

unregistriert

36

19.04.2013, 23:37

ER Gegner soll schiessen, und zwar mehrmals hintereinander . Dazwischen soll er immer kurz pausieren, damit nicht jeder Schuss am anderen haengt. Als erweiterung koennte man den Gegner ein Muster abfliegen lassen statt hin und her.

37

19.04.2013, 23:48

Da musst du in deiner ProcessShooting() ne timervaraible setzen, und dann so prüfen, dass z.B. nur alle 0.2 sekunden gefeuert wird.

TigerClaw25

unregistriert

38

20.04.2013, 08:14

Stimmt, bei jedem Schuss wird ja das Pbjekt erzeugt und in die Liste geschoben ... bei den Asteroiden ist es ja auch nicht anders. Hat nur etwas gedauert bis ich gemerkt habe, dass ich in der Enemy::Init() den Timer erst einmal auf 0 sethen muss ;)

Ich würde sagen, ich experimentiere noch ein paare Tage damit und schaue mir andere Quellcodes an, bevor ich weiter frage :) Danke euch und schönes Wochenende.

TigerClaw25

unregistriert

39

24.04.2013, 22:59

Hallo,
habe es mittlerweile geschafft Gegner aehnlich wie Asteroiden zu erstellen. Jedoch moechte ich jetzt erst 5 min lang steroiden erzeugen und dann die Gegner. Soll ich dafuer eine Neue timervariable erzeugen?

Außerdem moechte ich nicht, dass die Raumschiffe zufaellig und alle paar Sekunden erzeugt werden, sondern 5 gleichzetig, die in einer bestimmten formazion fliegen. Sollte ich dafuer ueber ine schleife in meiner spawnenemy-funktion beispielsweie gleich 5 Gegner in die Liste schieben, aber wie lasse ich diese dann in Formationen fliegen?

Danke vorab.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

40

25.04.2013, 14:08

Probier es aus. Dabei lernt man am meisten. Bei jedem Problem zu fragen wie es am besten geht ist nicht sehr sinnvoll. Was die Formationen angeht, so solltest du dir erst mal selbst Gedanken dazu machen. Einfacher wäre es sicherlich auch dafür mal ein einzelnes Testprogramm zu schreiben in welchem du dich nur um die Formationen kümmerst. Einfach Einheiten, welche sich in Formation bewegen. Dann lässt du dich nicht durch den Rest vom Code ablenken. Stichwort hierzu wäre Steering Behaviour. Damit wirst du aber noch gut überfordert sein;)
„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.“

Werbeanzeige