Wie kann man folgendes am besten lösen ?

  • GM 8

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

  • Wie kann man folgendes am besten lösen ?

    Hallo :)

    Ich versuche gerade ein kleines Spiel zu programmieren. Jetzt komme ich gerade nicht weiter, weil ich nicht weiß wie man folgendes am besten lösen kann :

    Also ich habe vor eine kleine Verkehrssimulation zu machen. Autos die von A nach B fahren. Dabei muss der Spieler den Verkehr regeln indem man die Ampelkreuzungen schaltet. Genau da bekomme ich meine ersten Probleme.

    Ich habe meine erste Map als Background gemacht. Die Ampeln habe ich zu 95% transparent gemacht indem ich genau auf der Kreuzung ein identisches Objekt lege wie es auf dem Background ist. So verändert sich halt einmal die Ampel und einmal die Haltestriche um die Autos anhalten zu lassen ( das funktioniert auch wunderbar ). Jetzt habe ich vor mit einem Mausklick diese Ampel umschalten zu lassen. Wenn aber das Objekt nur die Ampel und den kleinen Haltestrich als sichtbar hat muss man auch genau auf diese kleinen Stellen klicken. Ich möchte aber, das man auf der ganzen Kreuzung klicken kann. :----S

    Wenn ich die Ampelkreuzung als ganzes Objekt zeichne, bleiben die Autos am Rande des Objektes stehen. Ein abändern der Collisionsmaske geht leider nicht so wie ich das hätte. Man kann lediglich eine Box machen wo eine Kollision zustande kommen kann. Wenn man zwei Boxen machen könnte wäre das Problem weg !

    Jetzt habe ich folgendes ausprobiert. Ich habe ein unsichtbares Objekt erstellt was die Kreuzung abdeckt und von den Autos ignoriert wird. Dann habe ich das Event :event_mouse: Left pressed gesetzt und dann folgenden Code geschrieben :

    Quellcode

    1. if (position_meeting(mouse_x,mouse_y,self)) && (mouse_check_button_pressed(mb_left))
    2. {
    3. wert1 = instance_nearest(mouse_x,mouse_y,Game_Kreuz3);
    4. show_question("Geklappt ! Es ist ID Nr." +string(wert1));
    5. wert2 = object_get_name(wert1.object_index);
    6. show_question("Objekt hat den Namen : " +string(wert2));


    Ich warte also bis ein Mausklick kommt auf diesem Objekt. Dann lasse ich mir die ID von der Ampel_Instance geben die am nächsten dran ist. Mittels der Texteinlage danach habe ich die Nr. kontrolliert die auch richtig ausgegeben wird. Dann speichere ich noch den Namen des Ampelobjektes der auch richtig gespeichert wird.

    Kann man nun mit diesen Werten sagen, das Objekt A ( also meine unsichtbare Kreuzung ) nun Objekt B ( meine Ampelkreuzung ) das Subimage auf 1 bzw 0 zu ändern ?

    Oder kann man das ganze viel leichter gestalten und ich denke zu kompliziert ? :D
  • Danke für deinen Tip. Nachdem ich mich mit Masken vertraut gemacht habe wurde getestet, aber leider ohne Erfolg ! ;(

    Wenn ich die ganze Kreuzung erstmal normal in die Map einbaue halten alle Autos von jeder Seite kommend an. Ich kann aber die Kreuzung egal wo anklicken und ich könnte damit umschalten. Das würde jetzt funktionieren.
    Wenn ich die ganze Kreuzung ohne Kollisionmaske setze fahren alle Autos hindurch, aber ich kann auch die Kreuzung nirgendwo mehr anklicken.
    Wenn ich jetzt eine Maske setze wo ich nur die Haltestriche als Kollision setze halten zwar jetzt die Autos auf der z.B. Seitenstraße an und die Hauptstrasse kann durchfahren, aber ich muss dann wieder genau auf die 2 Pixelbreite Haltestriche klicken, damit das Maus Pressed Event ausgelöst wird ! Der Rest der Kreuzung wird ignoriert !

    Das ist also vom Ergebnis leider genau das gleiche wie wenn ich Objekte bastel ohne Masken wo die Autos teilweise dann durchfahren sollen ( also einmal Haupt und einmal Seitestrasse ).

    Also entweder bin ich zu doof, oder das funktioniert nicht so wie ich das vorhabe. :(
  • Okay, ich versuchs mal kurz und einfach zu coden:

    Objekt Kreuzung (Mit der Maske die du mit der Maus auswählen kannst)
    Create event

    GML-Quellcode

    1. schalter = false;


    Step event

    GML-Quellcode

    1. if mouse_check_button_pressed(mb_left) && schalter == false;
    2. {schalter = true;}
    3. if mouse_check_button_pressed(mb_left) && schlater == true;
    4. {schalter = false;}
    5. if schalter == false;
    6. {
    7. object_set_solid(Seitenstraße,false); // Seitenstraße steht für dein Objekt mit der Maske an den die Autos stehen bleiben sollen Seitenstraße
    8. object_set_solid(Hauptstraße,true); // Hauptstraße steht für dein Objekt mit der Maske an den die Autos stehen bleiben sollen Hauptstraße
    9. }
    10. else
    11. {
    12. object_set_solid(Seitenstraße,true);
    13. object_set_solid(Hauptstraße,false);
    14. }
    Alles anzeigen


    Ich hoffe ich konnte dir helfen.
    Drei Arten von Männern versagen im Verstehen der Frauen:
    junge Männer, Männer mittleren Alters und alte Männer.

    irisches Sprichwort
  • :D
    Es sollte glaub ich dann so heißen

    GML-Quellcode

    1. if mouse_check_button_pressed(mb_left) {schalter = !schalter}
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Eigentlich nicht, da ich mouse_check_button_pressed abfrage und nicht den mouse_check_button alleine. Pressed ist ja eine einzelaktion oder nicht :whistling:
    Kann es leider grad nicht testen.

    Aber deine Lösung ist einfacher, ja :thumbsup:
    Drei Arten von Männern versagen im Verstehen der Frauen:
    junge Männer, Männer mittleren Alters und alte Männer.

    irisches Sprichwort
  • Es geht sogar noch kürzer:

    GML-Quellcode

    1. if mouse_check_button_pressed(mb_left) {schalter ^= 1}

    Funktioniert immer beim Switchen von 0 auf 1 und vice versa. Andere Werte kann man damit nicht verwenden, weil bitwise.
    Habe ich irgendwann einmal hier auf gm-d gefunden.^^
  • Danke euch für die weiteren Tips :)

    Habe leider noch keine Zeit gehabt weiter zu programmieren. Kann also noch nicht sagen, ob das so bei mir klappt.
    Hoffe das ich bald Zeit finde weiterzumachen. Melde mich dann wieder mit dem Ergebnis. ;)
  • Hallo :)

    Ich habe es endlich geschafft :D
    Zwar nicht so wie ihr vorgeschlagen habt ( habe ich natürlich ausprobiert, aber wollte nicht so hinhauen ), aber auf anderer Weise habe ich es nun geschafft.
    Wenn man jetzt weiß wie es geht ist es garnicht so schwer. ;)

    Ich habe es jetzt so gelöst

    GML-Quellcode

    1. // EVENT MOUSE PRESSED auf Kreuzung
    2. if (position_meeting(mouse_x,mouse_y,self)) && (mouse_check_button_pressed(mb_left))
    3. {
    4. wert1 = instance_nearest(mouse_x,mouse_y,object11); // <--- Hier wird die nächstgelegene Ampel ( heißt aktuell noch "object11" ) gesucht zur angeklickten Kreuzung. Eine ID wird ausgespuckt
    5. wert2 = object11.image_index; // <--- Hier wird von der Ampel die aktuelle Image Nr. ausgelesen
    6. if wert2 == 1
    7. {
    8. wert1.image_index = 0 // <--- Wenn Ampel Image auf 1 ( Hauptstrasse ) dann setze auf 0 ( Nebenstrasse )
    9. }
    10. else if wert2 == 0
    11. {
    12. wert1.image_index = 1 // <--- Wenn Ampel Image auf 0 setze auf 1
    13. }
    14. else
    15. {
    16. show_question("Es ist ein Fehler aufgetreten ! ( Nr. 1 )");
    17. }
    18. }
    Alles anzeigen


    Mal sehen, ob das ganze auch so funktioniert, wenn man mehrere Kreuzungen und Ampeln hat. Mit meiner ersten Testmap mit nur einer Kreuzung funktioniert das alles prima. :thumbsup:

    Vielen Dank für eure Denkanstöße und vielleicht kommt ja bald mein nächstes Problem. :whistling:
  • Benutzer online 1

    1 Besucher