Problem mit Wechseln zwischen Spielern (sozusagen Turn Based Gameplay)

  • Problem mit Wechseln zwischen Spielern (sozusagen Turn Based Gameplay)

    Heyho :)

    Ich arbeite momentan an einem sehr kleinen lokalen Multiplayer Projekt, wo man, ähnlich wie in Worms, jeder Mitspieler einen Panzer steuert und die anderen abschießen soll. Es wird nacheinander gespielt, d.h. Panzer 2 ist erst dran, nachdem Panzer 1 geschossen hat. Die Panzer sind 4 mal das Objekt oTank, im Creation Code hat jeder Panzer eine individuelle turn_number: 0, 1, 2, oder 3. Ich habe ein Controller Objekt mit der globalen Variable global.player_turn = 0.

    Für jede vom Spieler ausgeführte Aktion wird abgefragt, ob die turn_number mit global.player_turn übereinstimmt. Nachdem man geschossen hat, soll global.player_turn 1 weiter zählen und somit ist der nächste Spieler dran. Das funktioniert auch super, bis jeder Spieler einmal geschossen hat und der erste Panzer dran ist, denn auch wenn ich global.player_turn wieder auf 0 setze, schießen auf einmal alle Panzer beim Klicken. Andere Aktionen allerdings, wie das ausrichten des Kanonenrohrs funktionieren nur noch für den ersten Panzer.

    Hier das Step Event des oTanks:

    GML-Quellcode

    1. key_right = keyboard_check(vk_right);
    2. key_left = keyboard_check(vk_left);
    3. key_up = keyboard_check(vk_up);
    4. key_down = keyboard_check(vk_down);
    5. mouse_click = mouse_check_button_pressed(mb_left);
    6. if (turn_number = global.player_turn)
    7. {
    8. // Rotate Canon
    9. if (key_right)
    10. rotation-=2;
    11. if (key_left)
    12. rotation+=2;
    13. rotation = clamp(rotation, 0, 180);
    14. // Set strength
    15. if (key_up)
    16. strength+=.15;
    17. if (key_down)
    18. strength-=.15;
    19. strength = clamp(strength, 0, max_strength);
    20. // Shoot
    21. if (mouse_click && !keyboard_check(vk_anykey) && other.strength > 0)
    22. {
    23. bullet = instance_create(x, y, oBullet);
    24. with(bullet)
    25. {
    26. direction = other.rotation;
    27. speed = other.strength;
    28. }
    29. turn_number += 4;
    30. global.player_turn++;
    31. }
    32. }
    Alles anzeigen


    global.player_turn wird nicht wirklich zurück auf 0 gesetzt, die turn_number des aktuellen Panzers wird einfach um 4 erweitert. Es ist aber dasselbe Resultat als würde man global.player_turn auf 0 zurücksetzen.

    Freue mich über jede Hilfe :)
    Es gibt 10 Arten von Menschen: Diejenigen, die Binärcode verstehen und die, die es nicht tun ^^
  • Hi, also ein Vergleich wird normalerweise so gemacht:

    Quellcode

    1. if (turn_number == global.player_turn)


    Denn turn_number = global.player_turn ist eine Zuweisung. Was ich mir noch vorstellen
    könnte, sind die letzten 2 Zeilen, wo Du schreibst:


    Quellcode

    1. turn_number += 4;
    2. global.player_turn++;

    Da ist natürlich global.player_turn schon um 1 größer als turn_number, wenn Du das
    so machst. Kann aber auch beabsichtigt sein, ich hab mir den Code jetzt nicht komplett
    angesehen.


    Miradur
  • Das hatte ich auch schon versucht, ändert aber nichts.

    Gibt es vielleicht eine Herangehensweise als meine?

    Im Prinzip ist das Gameplay ja turn-based, da die Panzer sozusagen immer abwechselnd dran sind, also nacheinander sich ausrichten und schießen.

    Danke für mögliche Vorschläge :)
    Es gibt 10 Arten von Menschen: Diejenigen, die Binärcode verstehen und die, die es nicht tun ^^
  • Ehrlich gesagt, blicke ich immer noch nicht so durch, weil auch scheinbar Code aus
    anderen Events fehlt, aber die Abfrage kann man auch so lösen:

    Quellcode

    1. // Create Event
    2. // Runden Zähler
    3. round_turn = 0
    4. // Step Event
    5. // Zuordnung: Player0 = 0, Player1 = 1, Player2 = 2, Player3 = 3
    6. if (round_turn - ((round_turn >> 2) << 2)) < 1 {
    7. Player0 ist dran ...
    8. } else if (round_turn - ((round_turn >> 2) << 2)) < 2 {
    9. Player1 ist dran ...
    10. } else if (round_turn - ((round_turn >> 2) << 2)) < 3 {
    11. Player2 ist dran ...
    12. } else {
    13. Player3 ist dran ...
    14. }
    15. round_turn ++
    Alles anzeigen

    Hab ich jetzt nicht getestet, sollte aber funktionieren und geht sicher noch kürzer,
    vielleicht schaut noch ein Profi vorbei :)


    Miradur
  • Vielen Dank für den Vorschlag, leider habe ich nach deiner Implementierung dasselbe Problem. :(

    Konnte es allerdings auf einen anderen Weg beheben, und zwar hatte ich einfach eine Abfrage gemacht, dass man nur schießen kann (und somit auch der Nächste drankommen kann), wenn strength > 0 ist und nach Beendigung des Zuges wird strength immer auf 0 zurückgesetzt, das klappt super :)

    Trotzdem vielen Dank für die Hilfe, hat mir bei der Erkennung des Problems geholfen.
    Es gibt 10 Arten von Menschen: Diejenigen, die Binärcode verstehen und die, die es nicht tun ^^
  • Neu

    Ist zwar schon als Gelöst markiert, aber ich hätte es so behoben, falls jemand ein ähnliches Problem hat:

    objControll
    Create Event:

    GML-Quellcode

    1. global.spielerAnzahl = 4;
    2. for (i = 0; i < spielerAnzahl; i+=1)
    3. {
    4. global._ins[i] = instance_create(x, y, objPanzer);
    5. global._ins[i]._id = i;
    6. }
    7. global._ins[0].turn = 1;

    objPanzer
    Create Event:

    GML-Quellcode

    1. _id = 0;
    2. turn = 0;

    Leertaste Released Event:

    GML-Quellcode

    1. /* *Schuss* */
    2. turn = 0;
    3. if (_id < global.spielerAnzahl)
    4. {
    5. global._ins[_id + 1] = 1;
    6. }
    7. else
    8. {
    9. global._ins[0] = 1;
    10. }
    Alles anzeigen
  • Benutzer online 1

    1 Besucher