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

valentin

Treue Seele

  • »valentin« ist der Autor dieses Themas

Beiträge: 212

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

1

08.05.2011, 20:22

Schüsse werden in Warteschleife gespeichert

Moin,

Ich arbeite zurzeit an nem Spiel, in dem man nen Panzer fährt, und mit diesem die gegnerischen Panzer abschiessen muss. Da wären wir dann auch schon bei meinem Problem: Die Schüsse. Funktioniert alles eigentlich relativ gut, solange ich es unabhängig von der Zeit mache. Also dass man keine Wartezeit zwischendrin hat. Wenn ich jetzt die Wartezeit miteinbringe, werden die Schüsse in ne "Warteschleife" gesteckt, welche dann nach und nach abgearbeitet wird. Das soll natürlich nicht so sein, da der Schuss dann auf einmal von nem völlig anderen Ort kommt, als ich selbst bin... Warum das ganze so ist, kann ich mir rein garnicht vorstellen, da der Schuss erst garnicht erstellt wird, sofern die Zeit nicht vorüber ist. Hier der Quellcode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//main.cpp:

void controlP1()
{
    sf::Vector2f pos;
    pos=P[0].Avatar.GetPosition();

    double Winkel=P[0].degree;
    int drive=0;

    if (App.GetInput().IsKeyDown(sf::Key::Left))            Winkel+=5;
    else if (App.GetInput().IsKeyDown(sf::Key::Right))      Winkel-=5;
    if (App.GetInput().IsKeyDown(sf::Key::Up))              drive=-1;
    else if (App.GetInput().IsKeyDown(sf::Key::Down))       drive=1;

    P[0].control2(Winkel-P[0].degree, drive);

    if(App.GetInput().IsMouseButtonDown(sf::Mouse::Left))
        P[0].shoot(App.GetInput().GetMouseX()-pos.x,App.GetInput().GetMouseY()-pos.y);

}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Player.cpp
bool Player::shoot(int x, int y)
{
    if(Clock.GetElapsedTime()>=0.5)
    {
        Clock.Reset();
        pos=Avatar.GetPosition();
        float _x=x*x,_y=y*y;
        float hypo=sqrt(_x+_y);
        float faktor=hypo/speedShoot;

        alreadyShot++;
        //if(alreadyShot<=maxShoots)
        shot[alreadyShot].create(x/faktor,y/faktor, pos.x,pos.y);

        return true;
    }

    else
        return false;
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//Schuss.cpp
void Schuss::create(int x, int y, int xStartpos, int yStartpos)
{
    xSpeed=x;
    ySpeed=y;

    bullet.SetPosition(xStartpos, yStartpos);
}


Das ist natürlich jeweils nicht der ganze Code, sondern nur der (meiner Meinung nach) relevante Teil.

Danke für eure Hilfe
Valentin
visit me on deviantArt!
http://v-alentin.deviantart.com/

There is no programming language, no matter how structured, that will prevent programmers from making bad programs. //Larry Flon

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

09.05.2011, 11:00

Naja ohne weitere Erklärung hilft der Code nicht 100% weiter. Erstmal, wo ist die Warteschleife von der du redest? Du meinst, dass du die Schüsse in einem Array speicherst und nicht einfach einen einzelnen hast? Die Kugel wird an der Position von Avatar erzeugt. Ich vermute mal, dass ist die Position von deinem Panzer? Normal sollte der Code dann ja passen. Wenn dein Schuss erzeugt wurde, wird er auch direkt angezeigt und geupdated? Oder gibt es da irgendeine Verzögerung? Weil du im Titel halt Warteschleife stehen hast;) Vielleicht würde auch ein Screenshot weiter helfen.
„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.“

3

09.05.2011, 11:48

Warum machst du es dann mit Warteschleife? Wenn man versucht zu schießen und die Kanone noch nicht geladen ist o.Ä. wird der Schussbefehl einfach ignoriert...

4

09.05.2011, 11:55

Und selbst wenn du aus irgendeinem Gameplay-technischen Grund so eine Warteschleife haben willst, also das die Schüsse nach Ablauf der Wiederaufladung automatisch abgefeuert werden, dann kannst du doch einfach in einer Variable die Anzahl der noch ausstehenden Schüsse speichern und immer wenn die Ladezeit der Kanone rum ist, dann prüfst du ob noch ein Schuss aussteht und wenn ja schießt du einfach, egal ob nun eine Taste gedrückt wurde oder nicht.

Aber ich gebe Chromanoid da recht. Das macht nicht sonderlich viel Sinn, jedenfalls kann ich mir das nicht vorstellen. Wenn ich dann 100 Mal klicke, dann hört der Panzer ja gar nicht mehr auf zu schießen, weil noch so viele Schüsse in der Warteschleife sind... Überdenk da noch mal deine Idee und geh sicher, dass es auch wirklich das ist was du willst, bevor du es umsetzt.

Gruß
SaRu_

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

09.05.2011, 13:25

Guckt euch den Code doch mal genau an. Wenn die Ladezeit nicht um ist passiert nichts. Wenn die Zeit um ist, wird ein neuer Schuss im Array erzeugt. Das hat alles relativ wenig mit einer Warteschlange zu tun. Ich geh davon aus, dass er dort einfach den falschen Begriff gewählt hat.
„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.“

6

09.05.2011, 14:09

Ah :) mmh muss mit der Verarbeitung von dem shot-Array zu tun haben - vielleicht mal überprüfen ob vergangene Schüsse nicht erneut verarbeitet werden oder so.

valentin

Treue Seele

  • »valentin« ist der Autor dieses Themas

Beiträge: 212

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

7

09.05.2011, 18:11

Joa, das Wort "Warteschleife" war wohl etwas danebengegriffen. Ich speichere nichts in einer Warteschleife, allerdings sieht es innerhalb des Spieles so aus. Warum? Das ist hier genau meine Frage ;). Aber da sich das ja nun geklärt hat, werd' ich mal Chromanoid's Tipp befolgen.

So: Ich hab' mal getestet: Mir ist aufgefallen, dass auch ohne Zeitverzögerung der letzte Schuss immer in diese "Warteschleife" kommt. Er wird also erst bei nächsten schiessean abgeschossen. Allerdings an die alte Position. Ich geh mal weiter testen :D.

Ahrg. Sehr, sehr dummer Fehler. Ich hab' die Variable "alreadyShot" vor dem Schiessen erhöht, nicht wie es sein sollte danach.

Danke an alle die versucht haben mir zu helfen. (Auch wenn's mir fast n bisschen peinlich ist, dass ich den nicht schon bei meiner ersten Suche selbst gefunden habe :rolleyes:.)
visit me on deviantArt!
http://v-alentin.deviantart.com/

There is no programming language, no matter how structured, that will prevent programmers from making bad programs. //Larry Flon

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »valentin« (09.05.2011, 18:21)


Werbeanzeige