Raumkoordinaten für den Spieler in eigenes +/- Koordinatensystem umwandeln?

  • GM 8
  • Raumkoordinaten für den Spieler in eigenes +/- Koordinatensystem umwandeln?

    Hi... :)

    Bei meiner Weltraumsimulation will ich ein eigenes Koordinatensystem einbauen, damit der Spieler weiß, wo er ist. Im Moment mache ich das so, dass ich die Koordinaten meines 4000*4000 großen Raums abgreife und durch 4 teile. Dadurch erhalte ich schöne 0/0 bis 1000/1000 Koordinaten.

    Lieber wären mir allerdings -400/-400 bis 400/400 Koordinaten. Wie allerdings bekomme ich das so angezeigt? Wohl gemerkt: Es geht nicht darum, GM ein anderes Koordinatensystem aufzuzwingen, sondern nur darum, es dem Spieler anders anzuzeigen.

    Hier hab ich aufgezeichnet, wie genau ich das meine:


    Meine Idee: Man gibt dem Sektor einen Mittelpunkt (entweder ein Objekt oder man macht es, wenn möglich, am besten ohne mit room_width/room_height oder irgendwie anders) und von dort aus werden die 4 bzw. 8 verschiedenen Richtungskoordinaten berechnet, bzw. angezeigt.

    Wie würde man das umsetzen? Ich glaub, das ist eine reine Frage der Mathematik... Oder womöglich stell ichs mir auch einfach zu kompliziert vor. :huh:

    P.S.: Natürlich muss das dann auch anders herum funktionieren. Also, wenn ich z.B. ein gegnerisches Schiff markiere und Informationen darüber abrufe, möchte ich auch seine Koordinaten im Sinne meines Koordinatensystems angezeigt bekommen. Auch eine Minimap muss damit umzusetzen sein. Es muss also nur spontan umgerechnet werden. Der Spieler soll die internen Koordinaten von GM selber nicht sehen, sondern nur das neue Koordinatensystem.

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Bonsaiheld ()

  • Tice schrieb:

    Gehts dir jetzt darum das Grid dementsprechend zu Zeichnen oder die Koordinaten zu berechen?
    Soll der 0,0 punkt im room -400,-400 darstellen?
    Genau. Es geht mir darum, dem Spieler die Koordinaten des eigenen Schiffes und die anderer Instanzen im Raum in diesem Koordinatensystem anzuzeigen. 0,0 wird dem Spieler dann als -400/-400 angezeigt, 4000, 4000 als 400/400 usw. Es geht also nur um eine Umrechnung. Intern soll der GM ruhig weiter seine eigenen Koordinaten verwenden - nur dem Spieler soll es anders angezeigt werden. :)

    Ich versuche gerade, das auf Basis meines bisherigen Systems mit einfachen if-Abfragen zu lösen... Klappt noch nicht so ganz, vielleicht kennt jemand ne bessere Lösung, weil ich glaube, dass damit keine Minimap umzusetzen würde, kann mich aber auch irren (hab noch keine Minimap selber programmiert - ich will nur, dass möglichst alles zukunftssicher ist).

    Mein erster Versuch kann nicht funktionieren, weil nur ein Minus vor den Zahlen erscheint, aber ab 0,0 nach unten und nicht nach oben gezählt werden soll. Bin ich ganz links oben, wird mir also -0/-0 angezeigt.

    GML-Quellcode

    1. // X/Y Coordinates of the ship
    2. wherex = string(floor(obj_ship.x/10));
    3. wherey = string(floor(obj_ship.y/10));
    4. if (wherex < "200") then wherex = "-"+wherex;
    5. if (wherey < "200") then wherey = "-"+wherey;
    6. draw_text(view_xview[0]+5, view_yview[0], "Koordinaten: "+string(wherex)+"/"+string(wherey));


    Zweiter Versuch, das einfach ins Gegenteil umzurechnen, scheitert auch. Das gibt einen "Cannot compare arguments"-Fehler. Der stört sich wohl an dem Minus... Aber wie ziehe ich sonst was von wherex ab? 8|

    GML-Quellcode

    1. if (wherex < "200") then wherex = (wherex-400);
    2. if (wherey < "200") then wherey = (wherey-400);

    Ich glaub, das ist eigentlich ganz einfach (solangs nicht um ne Minimap geht, das kann warten)... Ab dem Mittelpunkt des Raumes soll einfach rückwärts gezählt bzw. es dem Spieler so angezeigt werden.

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von Bonsaiheld ()

  • GML-Quellcode

    1. var newx, newy;
    2. newx = round(((-room_width/2) + x) / 10);
    3. newy = round(((-room_height/2) + y) / 10);
    Sollte eig. deine formel sein (hoff ich zumindest)

    Zweiter Versuch, das einfach ins Gegenteil umzurechnen, scheitert auch. Das gibt einen "Cannot compare arguments"-Fehler. Der stört sich wohl an dem Minus... Aber wie ziehe ich sonst was von wherex ab?

    Liegt daran das wherex ein string ist und versuchst es mit einem real zu subtrahieren.

    EDIT:

    GML-Quellcode

    1. var newx, newy;
    2. newx = round((x - room_width/2) / 10);
    3. newy = round((y - room_height/2) / 10);
    :saint:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Tice ()

  • Tice schrieb:

    GML-Quellcode

    1. var newx, newy;
    2. newx = round(((-room_width/2) + x) / 10);
    3. newy = round(((-room_height/2) + y) / 10);
    Sollte eig. deine formel sein (hoff ich zumindest)

    Zweiter Versuch, das einfach ins Gegenteil umzurechnen, scheitert auch. Das gibt einen "Cannot compare arguments"-Fehler. Der stört sich wohl an dem Minus... Aber wie ziehe ich sonst was von wherex ab?

    Liegt daran das wherex ein string ist und versuchst es mit einem real zu subtrahieren.
    Fast: Ich musste die beiden Zahlen am Ende (10) durch 5en ersetzen. Mit den 10ern wurde der Raum in einem -200/-200 bis 200/200 Raster unterteilt - keine Ahnung, warum. Der Raum ist auf jeden Fall 4000 * 4000 groß.

    Großartig!! Vielen, vielen Dank! :) Jetzt muss ich nur nachschlagen, um den Code verstehen, denn einfach Kopieren geht ja nicht. :D

    Warum wherex ein String ist, versteh ich allerdings nicht. Ich mein, klar, wherex selbst ist ein Wort, aber es hat doch einen Integer gespeichert. Wenn ich schreibe "test = 100;", ergibt "test - 100;" nicht 0? Komisch, weil sonst arbeitet man doch ständig damit. Man gibt z.B. eine Geschwindigkeit mit "max_speed = 3;" an und dann z.B. im Step Event "speed = max_speed;", damit erhält die Instanz die Geschwindigkeit 3. Warum geht das eine, aber das andere nicht? :huh:

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Bonsaiheld ()

  • GML-Quellcode

    1. if (wherex < "200") then wherex = (wherex-400);
    2. if (wherey < "200") then wherey = (wherey-400);

    wherex muss gleichzeitig ein string und gleichzeitig ein real sein damit das funktioniert, das geht aber nicht eine Variable kann entweder ein Real oder ein String sein. Deine Versuche die Zahl ins Minus zu machen ist interessant, ein - tut es auch.

    GML-Quellcode

    1. x=real("-"+string(42));

    Ist eigentlich sinnlos, man kann ja gleich x=-42 hinschreiben.

    Das Rechnen mit Strings funktioniert nunmal nicht und daher rechne erst dein Zeug aus und am Ende mach daraus ein string:

    GML-Quellcode

    1. var x;
    2. x=sin(cos(42));
    3. draw_text(0, 0, string(x));


    Dein Code:

    GML-Quellcode

    1. wherex = string(floor(obj_ship.x/10));
    2. wherey = string(floor(obj_ship.y/10));
    3. if (wherex < "200") then wherex = "-"+wherex;
    4. if (wherey < "200") then wherey = "-"+wherey;


    kann man auch als

    GML-Quellcode

    1. wherex = floor(obj_ship.x/10);
    2. wherey = floor(obj_ship.y/10);
    3. if (wherex < 200) then wherex = -wherex;
    4. if (wherey < 200) then wherey = -wherey;


    schreiben (und damit bleibt wherex ein Real).


    Strings ist nur für Texte und Reals nur für Zahlen, wenn du x=string(x); schreibst wird x zu einem string und damit kannste nicht mehr rechnen.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Benutzer online 2

    2 Besucher