Variablen aus einzelnen Instanzen auslesen

  • GM 8
  • Variablen aus einzelnen Instanzen auslesen

    Hallöchen... :) Ich hab mich vorhin hier registriert, bin also brand neu. Auch bei Game Maker und dem Programmieren allgemein. :)

    Mein Projekt nennt sich sinngemäß "War Wind: Rebuilt": Ich baue mehr oder weniger vollständig ein älteres 2D RTS von 1996 im Stil von Warcraft 2 nach, mit einigen Bugfixes und Verbesserungen (z.B. hab ich bis jetzt kein Grid und weiß auch nicht, ob ich eins einfüge, weil sich die Einheiten ohne viel schöner bewegen). Ist mein allererstes Projekt, hab vorgestern angefangen und natürlich läuft zwar einiges, aber noch nichts richtig. :) Ich hab mehrere Probleme, also wird es nicht bei diesem einen Fred hier bleiben. :D

    Original: Meins:

    Also, ich habe meine zwei bisherigen Einheiten (obj_eaggra_worker und obj_eaggra_fighter) unter dem Parent obj_unit. In diesem Parent-Objekt stecken sämtliche Funktionen aller Einheiten und in den Einheiten-Objekten selbst dann nur Werte wie Name, HP, Geschwindigkeit ect. Durch diese Templates kann ich spielend neue Einheiten hinzufügen und an der Technik dahinter problemlos weiterarbeiten. Dufte! :)

    Das Problem ist nur, dass ich offenbar nicht die Instanzen auslese, sondern die Objekte selbst. Für jede Einheit soll ihrer Art entsprechend ein Portraitbild, ein Name, eine Beschreibung ect. angezeigt werden. Ich erhalte allerdings immer nur die Daten des zuerst im Raum platzierten Objekts. Ich platziere die Objekte einfach im Raumeditor. Egal, welche Einheit ich markiere, ich erhalte immer die selben Werte - das gleiche bei Gebäuden. Wie lese ich Instanzen einzeln aus und nicht ganze Objekte?

    Die Daten sollen erst angezeigt werden, sobald eine (oder mehrere) der Einheiten die Variable "selected = 1" enthalten.

    GML-Quellcode

    1. // General unit information
    2. /* The name of the unit */ unit_name = "Arbeiter";
    3. /* Description of the unit */ unit_desc = "Ein einfacher Arbeiter.";
    4. /* Life points */ unit_hp = 20;
    5. /* Max life points */ unit_hp_max = 20;
    6. /* Movement speed */ unit_speed = 3;
    7. /* Portrait picture for the HUD */ unit_prt = spr_prt_eaggra_worker;


    Ist die Einheit markiert, soll unter anderem ihr Portrait mit Hilfe von draw_sprite(obj_unit.unit_prt, 0, x, y); angezeigt werden ---> klappt nicht. Ich krieg immer nur die Daten des Objektes, das ich zuerst im Raum platziert habe. :(

    Hier meine Datei, falls meine Erklärung nicht ausreicht (habs bestimmt zu kompliziert formuliert): file-upload.net/download-6813919/RTS.gm81.html

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }
  • Immer wenn man versucht mit einer Objekt-ID eine Instance zu referenzieren, dann wird nur die Instance von dem Objekt genohmen das die kleinste ID hat (also das Objekt was du als erstes in den Raum setzts). Du musst also "instance_id.unit_prt" benutzen, du könntest die ID von dieser Instance in einer globalen Variable speichern (global.currentSelectedUnit) oder du kannst auch dann wenn du mehere Bilder anzeigen willst ein
    with Konstrukt nehmen und dann alle Instance durch gehen und dann prüfen ob die Instance ausgehlt ist oder nicht.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Soweit komm ich mit. Aber wie setze ich denn die instance_id, bzw. finde sie heraus? Meine Einheiten sind als Objekte im Raum platziert und erscheinen dann, dort wo sie platziert wurden, mit draw_sprite, mehr hab ich da nicht hingefrickelt.

    Kannst du mir da einen Beispielcode geben oder verlinken? Wie ich alle Instanzen durchgehe, weiß ich auch nicht. Also, mir gehts nicht darum, mit Zahlen um mich zu werfen. Ich möchte nur, dass die Daten der gerade markierten Instanz angezeigt werden (sind mehrere markiert, erscheint ein Gruppenbild, welches ich mit global.selected_units realisiert hab) und nicht die des zuerst erstellten Objektes. :)

    Es gibt eine simple RTS Engine, bei der die Werte nur mit (ähnlich) "obj_parent.target.obj_unit" ausgelesen werden. Ich versteh sowas am besten durch Reverse Engineering, aber wo das "target" überhaupt definiert wird, find ich einfach nicht . :/

    EDIT: Also, ich hab jetzt versucht, sowohl im obj_unit-Parent als auch direkt im obj_worker-Objekt die instance_id in einer Variable zu speichern (Create Event):


    GML-Quellcode

    1. global.target = instance_id;
    2. target = global.target;



    Leider erhalte ich bei beiden Herangehensweisen trotzdem keine Daten :(

    GML-Quellcode

    1. draw_sprite(obj_unit.target.unit_prt, 0, view_xview+global.prtx, view_yview+global.prty);


    Das ist bestimmt total einfach. ;(


    EDIT 2:

    Ich habs geschaaafft! :) :)

    wiki.yoyogames.com/index.php/Id

    Das gibts doch nicht, so einfach! Ich musste einfach nur anstatt "obj_unit.unit_prt" "id.unit_prt" eingeben und schon klappt alles perfekt, auch mit Gebäuden!

    Jippiiiiie! :D

    EDIT 3: Eine Frage hätte ich noch diesbezüglich. Wie lese ich denn Daten nur bei einem MouseOver aus, für Statusleisten oder Infokästen? Wenn ich ein einfaches "if instance_position(mouse_x, mouse_y, obj_own)" (obj_own ist das Mutterparent aller Einheiten und Gebäude) mache, liest es wieder nur die Werte des zuerst platzierten Objekts aus (in dem Fall eine Mine). Muss ich den Objekten, über denen die Maus schwebt, jeweils eine temporäre Variable ala "mouseover = 1" zuweisen? Wenn ja, wie geht denn das? Das wäre ja das selbe irgendwie... :/

    if instance_position(mouse_x, mouse_y, id.obj_own) geht nicht...

    GML-Quellcode

    1. COMPILATION ERROR in code actionError in code at line 11:
    2. if instance_position(mouse_x, mouse_y, id.obj_own)
    3. ^at position 48: Variable name expected.


    Hiermit will ich darstellen, was unter meiner Maus liegt - die Beschreibung (desc) der Instanz un der Maus:

    GML-Quellcode

    1. draw_text(view_xview+32, view_yview+view_hview-24, string(id.desc));


    EDIT 4: Mouseover-Sache ebenfalls gelöst :) Siehe hier: gmc.yoyogames.com/index.php?showtopic=403144

    GML-Quellcode

    1. if (distance_to_point(mouse_x, mouse_y) <= 5)
    2. { mouseover = 1; }
    3. else { mouseover = 0; }


    Einfach diesen Code ins Step-Event des Objekts (Parents), das bei Mouseover irgendwas machen soll und dann mit "if mouseover = 1 oder 0" abfragen. :D Voll gut. Jetzt werden in meiner Statusleiste die Beschreibungen der Einheiten und Gebäude angezeigt, wenn ich mit der Maus über eins gehe - auch über sich selbst bewegende.

    GML-Quellcode

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

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

  • Benutzer online 1

    1 Besucher