Haus betretten. Gibt es einen Trick?

  • Haus betretten. Gibt es einen Trick?

    Hay also ich mache grade ein Spiel und habe da mal ne frage.
    Und zwar soll man in dem Spiel ein Haus betretten können.
    Muss ich jetzt immer wenn ich in ein Haus (einen andern raum) gehe und wieder raus gehe einen andern raum machen wo die start position vom Spieler vor dem Haus ist wo man raus kamm, machen?
    Oder gibt es da einen Trick?
    Wie man das machen kann?
  • du kannst in dem event, in welchem der raumübergang ist, vorher deine koordinaten speichern, z.b.

    GML-Quellcode

    1. global.x_koord[room]=x;
    2. global.y_koord[room]=y;
    3. global.koordinaten_gesetzt[room]=true;


    vorher solltest du einmal für alle räume global.koordinaten_gesetzt[room_id] auf false setzen, und in das room_start event deines spielerobjekts kommt dann

    GML-Quellcode

    1. if (global.koordinaten_gesetzt[room]=true)
    2. {
    3. x=global.x_koord[room];
    4. y=global.y_koord[room];
    5. }
  • Da ich meinen Vorschlag mangels Informationen über dein Projekt nicht genau auf dich zuschneidern kann, versuch ich das mal so zu erklären:

    Nehmen wir mal an, du hast ne Straße, und ein persistentes Playerobjekt, das dort herumläuft. Dann stehen da Häuser, und im Kollisionsevent mit den Türen hat dein Playerobjekt die Aktion, den Raum zu betreten, der das Innere des Hauses darstellt. (So stell ich mir deine Ausgangssituation vor.)
    Jetzt schreibst du aber vor den Befehl, den nächsten Raum zu betreten den Code von oben:

    GML-Quellcode

    1. global.x_koord[room]=x;
    2. global.y_koord[room]=y;
    3. global.koordinaten_gesetzt[room]=true;

    Durch den boolschen Wert wird zum einen verhindert, dass versucht wird, nicht existierende Werte auszulesen, zum anderen kannst du bei der Bedingung, die gleich folgt, noch bei else einen Ort setzen, an dem dein Objekt auftaucht, wenn es einen Raum das erste mal betritt. (Wenn du das ganze im Inneren eines Hauses machst, kannst du ihn beim ersten mal an der Haustür erscheinen lassen, und bei jedem weiteren mal entweder bei der Haustür oder bei einem anderen Ausgang des Raumes, je nach dem wo er vorher rausgegangen ist. Und zum Dritten kannst du, wenn du den Wert später wieder manuell auf false setzt so tun, als wenn er einen Raum das erste mal betreten würde...)

    So, und in das Room-Start-Event kommt der zweite Codeschnipsel:

    GML-Quellcode

    1. if (global.koordinaten_gesetzt[room]==true)
    2. {
    3. x=global.x_koord[room];
    4. y=global.y_koord[room];
    5. }
    6. /*else
    7. x=<standardwert>
    8. y=<standardwert>*/


    Wenn du also einen Raum betrittst, prüft er, ob du schonmal da warst, wenn ja nimmt dein Objekt die koordinaten ein, die es hatte, als du den Raum verlassen hast, wenn nicht geht es zu einem eventuellen Startpunkt.

    So, und für jeden Raum, den dein Playerobjekt betreten kann musst du mit einem Controllerobjekt einmal bei Spielbeginn alle global.koordinaten_gesetzt[room] auf false setzen.
  • Also 3 kleine fragen.
    1. So, und für jeden Raum, den dein Playerobjekt betreten kann musst du mit einem Controllerobjekt einmal bei Spielbeginn alle global.koordinaten_gesetzt[room] auf false setzen. ???
    Keine Ahnung was du damit meinst und wie ich das machen soll

    2. Kommt bei [room] die ID des Raumes rein?
    3. Wo schreibe ich die koordinaten hin?
  • Zu erstens:
    Wenn du beispielsweise 5 Räume hast, in die dein Playerobjekt laufen kann (es gibt sicher noch sowas wie ein Menü, in dem dein Player noch gar nicht existiert, und da wäre das überflüssig), legst du in den ersten room, der, in dem dein Spiel startet, ein Objekt, das im Game-Start-Event folgenden Code hat:

    GML-Quellcode

    1. global.koordinaten_gesetzt[/*<ID des ersten Raumes<*/]=false;
    2. global.koordinaten_gesetzt[/*<ID des zweiten Raumes<*/]=false;
    3. global.koordinaten_gesetzt[/*<ID des dritten Raumes<*/]=false;
    4. global.koordinaten_gesetzt[/*<ID des vierten Raumes<*/]=false;
    5. global.koordinaten_gesetzt[/*<ID des fünften Raumes<*/]=false;


    Zu zweitens:
    Im Code lass room so stehen, da dann für jeden Raum die room-ID eingesetzt wird, welche den Etsprechenden Wert im Array bezeichnet.

    Zu drittens:
    Was meinst du jetzt mit koordinaten?

    @Floz:
    Egal, ob der Raum persistent ist oder nicht, das hat mit der Position des Spielers nichts zu tun, da dessen Koordinaten objekt- und nicht raumgebunden sind. Eine alternative Lösung wäre natürlich, die Räume auf persistent zu stellen und den Spieler nicht, dafür in jedem Raum einen Spieler zu setzen, aber ich bin mal davon ausgegangen, dass er bereits ein persistenes Playerobjekt hat...
  • Habe ich eben nicht.
    Ich habe kein persistenes.
    Doch da habe ich mal bei Floz nach gefragt und der hat mir mal das bei meinen Spiel eingestellt, nur habe ich jetzt vollgendes Problem.
    Und zwar, will ich den raum mit einer enter Taste betretten.

    Nochmal genauer erklärt:
    Es gibt ein unsichtbares Object (names: LonLonFarm) wenn der Spieler dann auf den Object steht und ENTER drückt soll der spieler in den ausgewählten raum, gehen.
    Ich habe da scho rum Probiert doch es geht nicht, was ich bisher eingegebeen habe ist das hier (D&D):
    [Ein Enter Key Event gemacht] dann
    If a Variable is Value/ Variable: if distance to object[Mensch]/ value: 5/ operation / smaller than
    [Klammer auf]
    go to a differnet room
    [Klammer zu]

    Was ist daran falsch?
  • Also ich habe selber jetzt mal bischen rum getestet bis das ging, ABER mit diese Wirrwarr
    kann man das nicht so richtig machen wie ich mir das gedacht habe.
    Es wär echt super geil nett, wenn mir jemand ein Exampel macht, das zu der beschreibung von CAS passt.
    Danke
  • Ich habe das hier jetzt gemacht:
    -> Den Spieler persistent gemacht
    -> Bei jedem Object, entsprechenden:

    GML-Quellcode

    1. if distance_to_object(Mensch) < 5 then
    2. room_goto(Markt)

    -> Doch dann passiert das immer wenn ich Enter drücke (das event wo die codes drin sind)
    Der in einen andern Raum geht, siehe Beispiel.
  • Wenn dein Spieler persistent ist, heißt dass, dass er den Raumwechsel "überlebt". Wenn ein Raum persistent ist, heißt das, dass alle Objekte an ihrer Position bleiben und wenn man den Raum wieder betritt, ihn so vorfindet wie man ihn verlassen hat. Bei dir sieht es so aus, als hättest du in jedem Raum ein Spielerobjekt. Sowas macht aber nur Sinn, wenn das Spielerobjekt nicht persistent ist. Sonst hast du nach einem Raumwechsel zwei Spielerfiguren.

    Wenn du in jeden Raum einen nicht-persistenten Spieler setzt und dafür den Raum persistent machst, hast du den Vorteil, dass du dir die Positionsverschiebungen uns -speicherungen sparst, aber den Nachteil, dass alle Werte, die in deinem Spieler gespeichert waren, wieder auf die Standardwerte gesetzt wurden. Um das zu verhindern, empfiehlt es sich entweder mit globalen Variablen zu arbeiten oder ein unsichtbares persistentes Controllerobjekt zu verwenden, das dann die Spielerdaten immer mitträgt.
    Einige meiner Spiele:
  • du erstellst ein objController setzt es auf persistent und packst es in den ersten inGame room rein.

    Im Spiel benutzt du dann nicht Variablen wie

    GML-Quellcode

    1. objSpieler.munition = 50;

    sondern speicherst diese (und fragst diese ab) über

    GML-Quellcode

    1. objController.munition = 50;

    eine Munitionabfrage im Spielerobject würde dann so aussehen:

    GML-Quellcode

    1. if (objController.munition > 0) {
    2. // Tu etwas (z.B. Schießen)
    3. }
    www.glowingorb.de
    „Wenn es im Universum noch irgendwo intelligente Lebewesen gibt, dann kennen sie vielleicht Schach, höchstwahrscheinlich jedoch GO

    (Schachweltmeister Emanuel Lasker)
  • Benutzer online 1

    1 Besucher