Mplay - Spawnen von Globalen Items -

  • GM 8
  • Mplay - Spawnen von Globalen Items -

    Hallo Ihr,
    Ich bin neu hier und suche schon seit mehreren Tagen nach einer Lösung.
    Ich entwickel gerade einen Onlineshooter mit dem GM8 und den MPlay Funktionen.

    Bisher ist mir alles bestens gelungen. Ich habe es auch geschafft anhand der Übertragung
    von Koordinaten des Items die Position an die anderen Spiele rweiter zu geben.
    Nur leider sehr eingeschränkt und wirklich unpraktisch.

    Habt Ihr eventuell eine Idee, wie ich 1 Item, nehmen wir ein "Medi-Pack" nach dem aufsammeln,
    wieder an einer anderen stelle, nach 10 sekunden spawnen lasse?.

    Das ganze sollte mehrmals passieren können. Das heißt, ich habe nur 1 Objekt "Medipack" und möchte
    dieses mehrmals auf der Map spawnen lassen.

    Wenn Ihr mir weiterhelfen würdet wäre das wirklich eine große Hilfe.
    Ich würde für eine hilfreiche Antwort sogar bezahlen.

    Danke,
    MfG. Kirby4tw

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Wie meinst du das genau? also wenn einer der Spieler das Teil aufsammelt soll es auf allen Computern also bei allen Spielern verschwinden und 10 Sekunden später bei jedem an einer Stelle wieder auftauchen, richtig?

    Wenn ja, dann hier mal das Konzept, ich kann es leider nicht in code fassen da ich die Eingebauten Funktionen nie benutzt hab, aber du brauchst nur die basis funktionen die du ja schon hast denk ich mal.
    Im Kollisionsevent des Pakets mit einem der Spieler lässt du die Instanz einfach zerstören.
    Im destroying event sendest du eine Message mit der Funktion mplay_message_send_guaranteed(player,id,val) mit einem beliebigen von dir bestimmten Wert an alle anderen Spieler.
    Dieser Wert (sozusagen ein Befehl) soll in dem Step event der Pakete bei den anderen Playern bewirken dass diese ebenfalls zerstört werden und zwar so dass diese Pakete dann nicht mehr den Befehl geben die anderen Pakete zu zerstören.

    Dann kommt noch in das Kollisionsevent sowas wie controler.alarm[0] = 10*roomspeed;
    controler muss einfach nur irgendein Objekt sein dass immer aktiv ist.
    Dann im alarm[0] event des Kontrolers lasse infach eine Kiste an einen beliebigen Ort ertellen also instance_create(random(room_width),random(room_height)) und
    sende gleichzeitig die Koordinaten an die anderen Spieler und einen Befehl ein Paket an den gegebenen Koordinaten zu erstellen.

    Hoffe das ist mal ein Ansatz :/

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Hallo,

    Danke dir schonmal vielmals für deine Antwort und Zeit.
    Ich hatte eine Lösung gefunden gehabt, nur leider auf die Anzahl der Alarm[?] eingeschränkt gewesen
    und für jedes Objekt einzelnm sprich Medipak1, Medipak2 etc.

    Das ist so aber leider nicht die optimale Lösung.

    Bei berühren eines Objektes, wurde es auf die Koordinate x-=10 und y-=10 gesendet damit es "verschwindet" aber nicht gelöscht also
    zerstört wird in diesem Sinne. Direkt nach dem "verschieben" des Objektes an diese Minus Koordinaten, wurden diese Koordinaten-werte
    sprich Medipack1.x und Medipack2.y mit folgenden Funktionen...

    GML-Quellcode

    1. mplay_message_send_guaranteed(0,MEDIPAK1_X,Medipak1.x)
    2. mplay_message_send_guaranteed(0,MEDIPAK1_Y,Medipak1.y)


    ... an den Execute Code im Step Event des Controlers gesendet und
    folgender Weise zugeordnet:


    GML-Quellcode

    1. while mplay_message_receive(0)
    2. {
    3. val=mplay_message_value();
    4. switch mplay_message_id()
    5. {
    6. case MEDI_SMALL_X:
    7. Medipack_Small.x = val;
    8. break;
    9. case MEDI_SMALL_Y:
    10. Medipack_Small.y = val;
    11. break;
    12. }
    13. }
    Alles anzeigen


    Das heißt also soweit, dass, wenn ein Spieler das Medipack holt, es an die Position außerhalb
    des Raumes verschwindet und diese Info an alle anderen Spieler weitergegeben wird.
    Nach dem Berühren startete ein Timer mit room_speed*10 welcher die 10 Sekunden respawnzeit widergeben.
    danach wurde ein normaler Create Instance Befehl ausgeführt und direkt im Anschluss Jump to Random
    (Das beide leider fixiert für das Medipack)

    Das komische an dieser Variante war, dass nach ca. geschätzten 5 Minuten bzw. ein paar mak einsammeln
    des Medipacks, dieses einfach nicht mehr autauchte. Dieser Fehler machte für mich keinen Sinn. Jedoch
    wusste ich gleich, dass ich so nicht auf mein gewünschtes Ergebnis komme.

    Wenn Jemand eine Code-Lösung hat bzw. ein Step4Step Plan, wäre ich sehr dankbar.

    MfG. Kirby4tw

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Hallo Burhan82,

    Danke für die Warnung, aber mein Shooter ist bereits Spielfähig.
    Um jetzt den Rest interessant zu gestalten und wichtige Extras einzubauen, muss dieses
    Problem gelöst werden. Das Entfernen eines Objekts bei Berühung eines beliebigen Spielers
    muss ja machbar sein. ber nicht zu vergessen, dass dieses dann auch Random wieder spawnen
    soll, jedoch wenns geht nicht unter bzw. über einem unzugänglichen Objekts.

    MPlay erscheint mir am simpelsten.
    Probleme gab es bislang noch nicht was das Verbinden angeht.

    MfG. Kirby4tw

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Glaub das ganze geht dann einfacher, lass beim Kollidieren weiterhin dass Objekt an einen Punkt außerhalb des Raumes springen und setz gleichzeitig den internen Alarm[0] auf 10*roomspeed, also nicht einen Alarm des Kontrolers.
    Dann gib den Befehl an die anderen Pakete weiter, lass sie springen aber ohne den Alarm zu setzten.
    Ins Alarm event kommt dann:

    GML-Quellcode

    1. x = random(room_width);
    2. y = random(room_height);
    3. while !place_free(x,y)
    4. {
    5. x = random(room_width);
    6. y = random(room_height);
    7. }


    Dabei sollten alle Objekte unter dem das paket nicht landen darf solid sein.
    Jetzt müssen nur noch die neuen Koordinaten an die anderen Pakete übertragen werden.
    Glaube so sollte es bugfrei sein.


    EDIT: Burhan82 meinte damit dass es per DLL Alternativen zu den eingebauten Funktionen gibt die wenn man sie gelernt hat einfacher zu benutzen sind und viel schneller.


    EDIT2: Code-fehler korigiert.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Wie genau soll das mit einem Objekt ablaufen, welches nur einmal exitiert, jedoch mehrmals auf einer
    Map vorhanden ist? Angenommen ich berühre das Objekt, dann verschwinden alle Anderen auch außerhalb
    des Raumes, da es sich ja fixiert auf ein Objekt bezieht.

    Wenn ich jetzt also möchte, dass die "Außerhalb-des-Raumes"-Variante funktionert, muss ich
    jedes "Items" einzeln anlegen sprich Item1_1, Item1_2, Item1_3, Item2_1, Item2_2, Item3_1 etc.
    Nur leider begrenzt sich die Anzahl der Items auf das Alarm Event. Denn davon gibt es nur 11.
    Ansonsten wäre diese Lösung ja durchaus denkbar.

    MfG. Kirby4tw

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • oh, du hast recht, wie gesagt hab noch nie mit MP gearbeitet xD
    Ich nehme an man kann nicht davon ausgehen dass die ID's der Instanzen auf allen Computern genau die selben sind.
    Die einzige Möglichkeit die ich sehe wäre es ein eigenes ID System zu machen.
    das heißt die Instanzen der Medi_packs werden durchnumeriert also beim erstellen eine variable einer globalen zuordnen und dannach die globale variable erhöhen.
    Dann schickt man wenn ein Pket berührt wird auch die spezielle ID dieses Objektes mit und dann wird auf den anderen Computern durch eine if-Abfrage nur das Paket verschoben dass tatsächlich berührt wird.

    Also so in der art sieht die Abfrage aus:


    with(obj_medi_pack)
    if own_id = other.recieved.id
    {

    // bewege Objekt...

    }

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Hallo,

    Ich habe es Dank globaer Variabeln, Timerzuordnung und 2 Spawncontrolern (Mapübergreifend) hinbekommen.
    Sprich, bei berühung zündet der Alarm[3] mit nur 1 Step, so gut wie sofort. Dabei wird die Variable welche den
    Namen des Objekts trägt (zB. ak47) auf true gesetzt. im Alarm[3] wird diese dann auf Wahr oder Falsch abgefragt
    und dementsprechend wird auf "Wahr" reagiert. Das zündet wiederrum einen entfernten Alarm[XY] in einem
    besagten Objekt Namens "Spawner". In diesem sind Platz für 12 Alarme sprich auch 12 Items. Nun kann man jedoch
    beliebig viele sogenannte "Spawner" erstellen. Sagen wir "Spawner1,2,3,4". Da jedoch die Spawnzeit der Objekte
    nicht unermesslich hoch ist, wird man kaum merken das in wirklichkeit nur 3 Medipacks auf der Map kursieren.

    Die einzelnen Alarme im SpawnerXY Objekt sind durch den Alarm[3] des Player_Obj zeitgeschaltet wurden.
    Läuft diese Zeit (room_speed*XY) ab , so wird die Position des Objekts welches gespawnt werden
    soll, auf Random gesetzt sprich, zufällig gespawnt.

    Mein Spiel werde Ich gegebener Zeiten einmal vorstellen. Doch im Moment hab Ich selbst viel Stress mit meinem Unternehmen.

    Mit freundlichen Grüßen,
    Mail: service@designersboard.eu
    ICQ: 291-832-589

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Ähh, was spricht denn gegen meine Lösung? deine scheint ziemlich umständlich zu sein und du du bist trotzdem auf 12 Objekte pro Spawner beschränkt, aber wenn es funktioniert, so sei es xD

    Viel Glück mit deinem Projekt :thumbsup:

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Hallo,

    Deine Lösung ist das selbe nur das ich bei mir mit Objekten arbeite die ich besser im Überblick habe.
    Und nein, les nochmal gewissenhaft durch, es besteht keine Einschränkung. Ich kann soviele Spawnobjekte setzen
    wie ich möchte. Es sind nach oben hin keine Grenzen gesetzt. Und da ich sowieso nur ca. 10 bis 20 Objekte max. auf
    einer Map spawnen lasse, brauch ich nur 2 Spawner. Im nachhinein fallen einem selbst wieder mehrere Lösungen ein,
    diese war aber keineswegs umständlich.

    Danke für deine (eure) Hilfe =)

    MfG.

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Benutzer online 1

    1 Besucher