Mehrere gleiche objects mit unterschiedlicher Funktion in einem Room verwenden?

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Mehrere gleiche objects mit unterschiedlicher Funktion in einem Room verwenden?

    Nach einer langen Nacht und keiner Lösung wende ich mich nun Vertrauensvoll an die Community. Zum besseren Verständnis beschreibe ich kurz was ich getan habe und was ich gerne beabsichtige.

    Mein Projekt soll einen Imbissstand simulieren, indem Waren eingekauft, Preise festgelegt und natürlich Waren verkauft werden sollen. Da sich die Produktpreise später auch ändern lassen sollen, habe ich bereits als globale.variablen deklariert und einen Anfangswert zugewiesen. Um die Verkaufspreise durch den Player festlegen zu lassen wollte ich eine Textbox und zwei Buttons für jedes zu verkaufende Produkt erstellen. Durch Eingabe (integer) oder durch klicken auf die Buttons sollten die entsprechenden globalen.verkaufspreis.variablen nun verändert werden.

    Mit einer jeweils erstellen Textbox und den dazugehörigen Buttons bekomme ich das schon hin irgendwie hin. Nun stehe ich jedoch vor der Schwierigkeit, dass ich nicht für jede zu einzustellende Variable eigene Objekte erstellen möchte. Ich glaube dafür gibt es eine elegantere Lösung. Durch die Hilfe und Tutorials habe ich von den instance_id's erfahren. Daher habe ich versucht mittels nearest_instance mit der Maus und If Bedingungen etwas zu basteln das ich die oben genannte Textboxen und Buttons mehrfach im Raum platzieren kann aber diese unterschieldiche Aufgaben erfüllen können.

    Ungefähr so:
    Im obj_mouse_over

    GML-Quellcode

    1. global.mnearest_id = string(instance_nearest(mouse_x, mouse_y, all));


    Im obj_sell_pricecontroller

    GML-Quellcode

    1. global.sellprice_fries = 0.10

    Drawevent zum Ausgben der Werte auf den Textboxen (was auch noch nicht so ganz funktioniert)

    Im obj_arrow_up (mit dem entsprechenden Sprite)

    GML-Quellcode

    1. If global.mnearest_id = string(inst_XXX) && check_mouse_button(mb_left)
    2. {
    3. global.sellprice_fries +=0.10
    4. }


    Leider funktioniert das so und so ähnlich nicht. Stellenweise bekomme ich auch keine Fehlermeldung, sondern es tut sich einfach garnichts. Nur leider kann ich mich nicht mehr an alles erinnern was ich versucht under verändert habe.

    Für mich wäre es also sehr hilfreich wenn mir jemand erklären könnte, wie ich mit einem mouse_over die instance_id des darunterliegenden Objektes bekommen kann und dann dieses in einer If-Funktion auf die verschiedenen Buttons und Textboxen die ich im Room plaziert habe anwenden kann. Für alternative Lösungen wie man viele Werte unterschiedlicher Variablen angezeigt bekommt und sie gleichzeitig duch den Spieler veränderbar sind, wären natürlich auch super. So in der Art von Pizza Connection wäre schon geil.

    Danke für Eure Hilfe.
  • Also du könntest die Schaltflächen nur im Draw Event zeichnen lassen und dann per Mausklick in den jeweiligen Regionen bestimmen, was man gerade umstellt. Dann brauchst du nur ein einziges Controller Objekt, das dies verwaltet.

    GML-Quellcode

    1. draw_sprite(spr_menu,image_index,760,8);
    2. if (mouse_x >= 760 && mouse_x <= 792 && mouse_y >= 8 && mouse_y <= 40)
    3. {
    4. if (mouse_check_button_released(mb_left))
    5. {
    6. }
    7. }



    Das Problem ist nämlich, wenn du ifs nach IDs hardcodest, dass sich jedesmal wenn du den Raum veränderst, oder ein neues Objekt erstellst, sich diese ID ändert (ändern kann). Daher wäre das keine ute Methode herauszufinden, worauf du gerade klickst.

    Und die ID ist immer eine Nummer, dh kannst du string() weglassen um an die ID zu kommen.

    GML-Quellcode

    1. global.nearestid = instance_nearest(mouse_x,mouse_y, inst_XXX);
    2. if (check_mouse_button(mb_left))
    3. {
    4. with (global.nearesid)
    5. {
    6. global.price += 0.1;
    7. }
    8. }
    9. //ich hab sowas noch nie gemacht, aber wie gesagt, das sollte sowieso nicht die beste methode sein.

    out now: KNOSSOS auf itch.io
    ancient-pixel.com <<< ich freue mich über einen Besuch! ^^
  • Danke für die Antwort ich werde das bei Gelegenheit ausprobieren, nur heute nicht mehr :)

    Wenn ich mich richtig eingelesen habe, gibt es mehrer unterschiedliche ID's. Zunächst Die ID's die du jetzt meinst sind Nummer ab 10000 glaube ich. Ich meinte aber die Instance_id die im Roomeditor angezeigt wird. Dies müsste ein String sein. Du kannst dir eine Liste davon auch anzeigen lassen und diese umbenennen. Wie ich jetzt aber an die Ins_id aus dem Roomeditor in den Funktionen komme ist mir nicht klar.

    Ich glaube irgendwo in der Hilfe steht auch, dass jedes Objekt welches in dem Roomeditor platziert wird eine Constante / Variable zugewiesen bekommt. Zudem gibt es ja die Möglichkeit mit Rechtsklick auf ein Object im Roomeditor einen eigenständigen Creationcode einzufügen. Das hatte ich auch schon probiert, dort die Events bzw. Funktionen einzufügen.
  • Hallo zusammen,

    bin mittlerweile von den vielen Objekten zur Wertveränderung weggegangen. Dafür habe ich die globalen.Variablen in ein globales zweidimensionales Array gepackt. Diese dann per Drawevent ausgegeben. Dabei werden auch gleich Rechtecke gezeichnet. Jedoch nur die Ränder, da die sich sonst über die ausgegebenen Zahlen legen. Mittels Mausposition und den Abmessungen der Rechtecke können nun alle gewünschten Werte per Mausklick angepasst werden. Was ich nur nicht verstehe ist, dass z. B. trotz eines mouse_check_butten(mb_left) die Werte sich auch verändern wenn ich die Maustaste gedrückt halte. Außerdem bekomme ich es nicht hin, dass bei einem wieder eingestellten Nullwert kein Minuszeichen angezeigt wird.

    Ich pack den Code mal in nen Spoiler


    Spoiler anzeigen
    Im Stepevent

    GML-Quellcode

    1. if mouse_x>220 and mouse_x<330 and mouse_y>20 and mouse_y<40
    2. {
    3. if mouse_check_button(mb_left)
    4. {
    5. global.goods[2,1] +=0.10
    6. }
    7. if mouse_check_button(mb_right) && global.goods[2,1] !=0
    8. {
    9. global.goods[2,1] -=0.10
    10. }
    11. }
    Alles anzeigen


    Hier noch der Code zurAusgabe des Arrays inklusive Tabellen

    Spoiler anzeigen

    GML-Quellcode

    1. // i = the amount of products in the array
    2. // t = the depth of the array
    3. //
    4. draw_set_color(c_black)
    5. draw_set_font(font_small)
    6. draw_set_halign(fa_center)
    7. draw_set_valign(fa_center)
    8. for (i=0; i<=4; i+=1)
    9. {
    10. for (t=0; t<=5; t+=1)
    11. {
    12. draw_text(x+(110*i),y+(20*t),string(global.goods[i,t]))
    13. }
    14. }
    15. //drawing rectangles over the drawn arrayvalues
    16. boxw = 110; //Box width
    17. boxh = 20; //Box height
    18. maxslotsx = i; //Rows
    19. maxslotsy = t; //Columns
    20. color = c_white; //set to c_red for red, c_green for green, etc.
    21. //Don't edit past this point
    22. totalmaxslots = (maxslotsx+1)*(maxslotsy);
    23. xw = (boxw*(t-2))-(maxslotsx*boxw);
    24. ix = 0;
    25. iy = 0;
    26. it = 0;
    27. while (it < totalmaxslots){
    28. if (ix == maxslotsx){
    29. it++;
    30. draw_rectangle(xw+(ix*boxw),boxh*iy,xw+((ix*boxw)+(boxw)),(iy*boxh)+boxh,true);
    31. iy++;
    32. ix = 0;
    33. } else if (ix != maxslotsx){
    34. it++;
    35. draw_rectangle(xw+(ix*boxw),boxh*iy,xw+((ix*boxw)+(boxw)),(iy*boxh)+boxh,true);
    36. ix++;
    37. }
    38. }
    Alles anzeigen


    Wenn jemand Verbesserungen hat, bitte immer her damit. Bin ja gerade am Anfang und will lernen :)
  • Ja coole Sache, ich dachte mir ja zuerst; du machst und denkst alles etaws zu kompliziert, aber du denkst anscheinend einfach wie ein Programmierer^^ (also so als ob du von C oÄ kommen würdest)

    mouse_check_button_released, gibt verändert den Wert nur nach dem Klick und nicht beim gedrückt haten.

    du kannst auch eine Klick Variable einfügen:

    GML-Quellcode

    1. if (mouse_check_button(mb_left) && click == 0)
    2. {
    3. click = 1;
    4. //wahlweise auch noch --> alarm[0] = 30;
    5. //code
    6. }
    7. if (mouse_check_button_released(mb_left))
    8. {
    9. click = 0;
    10. }
    11. /* --> alarm[0] Event
    12. click = 0;*/
    Alles anzeigen


    wenn du click in einem alarm alle soundsoviele steps auf 0 setzen lassen würdest, kannst du dann zB den Wert langsam hochticken lassen solange man die maustaste gedrückt hält und wenn man sie gleich wieder loslässt nur einmal.

    out now: KNOSSOS auf itch.io
    ancient-pixel.com <<< ich freue mich über einen Besuch! ^^
  • Nested Loop "Draw 2d array mit Rechtecken"

    Die Lösung des Mouseevents ist viel simpler gewesen anstatt "mouse_check_button" einfach "mouse_check_button_pressed" verwenden und es geht. Auch die negative Null hat sich wohl damit erledigt. Zumindest zeigt das das erste testen.

    Übrigens habe ich den Code nicht ganz selbst geschrieben, ich habe den für die Rechtecke im offiziellen GMC-Forum gefunden. Nicht das hier der Eindruck entsteht ich hätte mir das alles selbst und eigenständig erschlossen.

    Edit: Da ich nun endlich den Code des Loops und des Drawevents verstanden haben konnte ich den selbigen extrem kürzen. Daher füge ich den Code nun nochmals ein. Kann ja sein, dass jemand anderes ein ähnliches Problem hat.

    Spoiler anzeigen

    GML-Quellcode

    1. // i = the amount of x in the array
    2. // t = the amount of y the array
    3. // draw settings
    4. draw_set_color(c_black)
    5. draw_set_font(font_small)
    6. draw_set_halign(fa_center)
    7. draw_set_valign(fa_center)
    8. // adjustment for the boxsize
    9. boxh = 20
    10. boxw = 110
    11. // Loop
    12. for (i=0; i<=4; i+=1)
    13. {
    14. for (t=0; t<=37; t+=1)
    15. {
    16. draw_text(55+(boxw*i),10+(boxh*t),string(global.goods[i,t])); //The numbers in this line are for adjusting the drawing, otherwise the drawing is not complete insinde the room
    17. draw_rectangle(0+(boxw*i),0+(boxh*t),boxw+(boxw*i),boxh+(boxh*t),true)
    18. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von BJKraemer () aus folgendem Grund: Verbesserung des Drawevents