Fragen zu bestimmten Funktionen

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

  • Fragen zu bestimmten Funktionen

    Gibt es den bestimmte Funktionen welche prüfen ob:

    a) alles gleich ist, bspw. wenn ich jetzt 4 Kugeln habe, welche per klick Ihre Farbe ändern und sobald die Farbe gleich ist, ich einen Punkt erhalte

    b) ob sich alle Objekte in einem bestimmten Bereich befinden

    c) mir den Raum automatisch mit Objekten bspw. verschiedener Farben füllt und dann in einer Variablen oder ähnlichen berechnet, wie viele von jeder Art vorhanden sind, bspw: 4 Rote, 5 Gelbe. 3 Blaue usw.
  • a) Dafür brauchst du nur == und && verknüpfen:

    GML-Quellcode

    1. //zB so:
    2. if( kugel0.color == kugel1.color && kugel1.color == kugel2.color && kugel2.color == kugel3.color){
    3. // do smth
    4. }


    b) Sowas gibt es, aber die Funktion arbeitet aber nur mit einem Object: die collision_circle, collision_line, collision_rectangle etc functions. Die geben zB true aus, wenn ein objBall innerhalb des rectangles ist. Da du wissen willst ob alle obj_ball s drinnen sind musst du deine balls irgendwo abspeichern. zB in einem array und dann pro ball im array schaun ob er im rectangle ist.

    GML-Quellcode

    1. //die betreffenden object kommen in ein array
    2. ballArray[0] = instance_create(10, 10 , obj_ball);
    3. ballArray[1] = instance_create(60, 70 , obj_ball);
    4. //allIn ist erstmal true und falls ein ball nicht im rectangle ist wird allIn false und wir müssen warten bis alle bälle drin sind
    5. var allIn = true;
    6. //wir gehen durch alle Bälle die im array sind und checken ob sie im rectangle enthalten sind
    7. for(var i = 0 ; i < ballArray.length ; i += 1){
    8. if ( collision_rectangle(50, 50, 200, 100, ballArray[i], false, true) == false ){
    9. //wenn der i-vielte ball nicht im rectangle ist brechen wir ab
    10. allIn = false;
    11. i = ballArray.length;
    12. }
    13. }
    14. if(allIn == true){
    15. //do smth; youve won
    16. }
    Alles anzeigen


    3) wie beim array, kannst du dein array oder mehrere arrays mit den bällen füllen, dann in einem for-loop durch das array gehen und zählen wieviele von welcher farbe da sind in dem du den namen des objects oder deine farbvariable vergleichst.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Pupinoobie schrieb:

    Also zu a)

    Ich mach das immer so, dass ich bspw. 4 verschiedene Objekte habe(Rot, Gelb, Blau, Grün) und bei jedem Mausklick darauf switchen die hin und her.

    Also aus Rot wird Gelb aus Gelb wird Blau usw.

    Da benötige ich sicherlich ein unsichtbares Objekt, welches reagiert wenn bspw. alles auf obj.rot ist?
    Ich habe für solche Sachen immer ein Controller-Objekt. Das darf bei mir nicht fehlen. Alles allgemeine, was sich nicht spezifisch auf ein bestimmtes Objekt bezieht, packe ich dort rein (sofern es sinnig ist)
    Ebenfalls fungiert das bei mir als Init-Objekt, wo ich bspw. globale Variablen reinpacke und erstmal alles einlese, bevor ich mit Objekten arbeite. Das ist für mich sauberer, damit ist nämlich sichergestellt, dass es nicht zu irgendwelchen Variablen-Fehlern kommen kann, also dass er irgendwas nicht kennt.

    Demnach würde ich dir auch empfehlen ein extra Objekt für diese Angelegenheit zu erstellen. Es muss nichtmal ein Controller Objekt für das gesamte Spiel sein, du kannst ja auch für bestimmte Teilbereiche wie bspw nur für den Farbcheck ein extra Objekt erstellen, womit du das alles steuerst.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von icqgamer ()

  • Da gibts verschiedene Lösungsansätze...
    Gehen wir mal von insgesamt 3 Farben aus.


    Eine davon ist folgende: Du machst 3 Sprites mit jeweils 3 Images (0-2)

    Sprite_1 Image_0: Pilz Rot, Hut Rot
    Sprite_1 Image_1: Pilz Rot, Hut Blau
    Sprite_1 Image_2: Pilz Rot, Hut Grün

    Das müsstest du dann im Draw-Event natürlich so anpassen, dass nicht die ganze Zeit die Animation abgespielt wird vom Sprite, sondern nur ein bestimmtes Image angezeigt wird. Hierfür empfielt es sich eine Variable zu haben, die Image-Index steuert (bspw. img = 0 / 1 / 2)

    draw_sprite(sprite_index, image_index, x, y)
  • Um Objektgruppen zusammenzufassen kannst du ein parentobjekt erstellen. in deinen "child"objekten kannst du dann das objekt als parent auswählen. Somit kann obj_pilz_blau und obj_pilz_gruen unter par_pilz zusammengefasst werden
    "with (par_pilz){}" würde dann den Code beispielsweise in jedem dieser childs ausführen. Funktioniert auch für Kollisionen oder ähnliches.

    Wenn du aber nur das reine Aussehen ändern willst, reicht es bspw wie oben erwähnt die bilder als subimages in ein sprite spr_pilz zu speichern und den image_speed = 0 zu setzen (im Init). Wenn du das Objekt in den Raum platzierst kannst du per rechtsklick "creation code" auswählen um sozusagen ein zusätzliches custom Init zu haben was nach dem regulären init ausgführt wird. Da kannst du dann einfach image_index = 2 etc setzen und somit mit nur einem objekt mehrere darstellungen haben zu können.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Also ich habe das jetzt so gemacht, 1 Sprite mit 3 Farben (Rot, Gelb, Blau),

    3 Objekte mit dem Sprite im Raum platziert und in "Maus Links gedrückt Event": image_index += 1 geschrieben, nun tut sich bei jedem Mausklick darauf die Farbe um 1 verschieben,

    Nur das mit der if-Abfrage ob alles gleich ist funktioniert nicht, weder:

    if (pilza.color == pilzb.color && pilzb.color == pilzc.color)
    {
    instance_destroy()
    }

    noch:

    if (pilza.image_index == pilzb.image_index && pilzb.image_index == pilzc.image_index)
    {
    instance_destroy()
    }
  • Die color variable gibt es standardmäßig noch nicht, die müsstest du erst selbst erstellen, aber den image_index abzufragen ist schon der richtige weg.
    In welchem Object steht denn die if Abfrage momentan drinnen?

    Weil instance_destroy() zerstört nur das object das gerade die if abfrage macht. Also zb dein controller object wenn du dort die abfrage machst und nicht die Pilze.
    Um Alle Pilze zu zerstören musst du sowas machen:

    GML-Quellcode

    1. with(obj_pilz){
    2. instance_destroy();
    3. }

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Die kommt wasl daher, dass der Pilz B versucht Pilz As image_index abzufragen, der aber gar nicht mehr existiert, weil er sich schon gelöscht hat.
    Deswegen solltest du ein controller object verwenden, dass nachsieht, welche Pilze existieren (instance_exists(obj) ) und diese dann vergleicht und mit with(obj) dann das destroy event im jeweiligen Pilz auslöst. :)

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Bei den funktionen kannst du nur einen object namen angeben. with führt etwas in allen objecten mit dem Namen aus und instance_exists gibt true zurück falls mindestens ein object mit dem Namen existiert.

    Wie @Rhazul erwähnte ist das ein Fall für parent objects. PilzA, B und C haben dann als parent das object par_pilz ausgewählt und alle deine Abfragen richten sich an par_pilz egal ob es ein A, B oder C Pilz ist.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Habe 3 Pilze(Rot,Gelb,Blau) und einen Papapilz,

    Dazu kommt noch ein Controllerobjekt, im Stepevent von Diesem habe ich mittlerweile folgenden Code:

    if instance_exists(p)
    {
    if (a.image_index == b.image_index && b.image_index == c.image_index)
    {
    with(p)
    {
    instance_destroy()
    }
    }
    }

    Es wird kein Fehler mehr angezeigt, aber ich bin mir sicher das etwas falsch ist, da die Pilze von vornherein gelöscht sind.
  • GML-Quellcode

    1. PIndex = noone;
    2. matching = true;
    3. with (par_pilz) {
    4. if (PIndex == noone) {
    5. PIndex = image_index;
    6. }else{
    7. if (image_index != PIndex) {
    8. matching = false;
    9. break;
    10. }
    11. }
    12. }
    Alles anzeigen
    Wir gehen also durch jedes Pilzobjekt, wenn es das erste Objekt ist speichern wir dessen image_index, danach vergleichen wir mit diesem (PIndex). Wenn alle Obbjekte durchgelaufen sind und den gleichen Index haben ist matching = true, sonst = false und er bricht ab sobald ein Pilz ein anderes image hat.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Danke habe ich ausprobiert, jetzt kommt die Fehlermeldung genau andersherum, erst war das Problem das pilz.a schon gelöscht war bevor es zum vergleichen geht, jetzt ist es pilz.c der nicht mehr vorhanden ist ...,

    Ich habe es mal so ausprobiert:

    Pilz a, b, c,
    - mit jeweils den gleichen Sprite, welcher 3 verschiedene Farben beinhaltet und alle im Papapilz
    - im Create Event:

    randomize()

    image_index = choose(0,1,2)

    wodurch random ne Farbe festgelegt wird,


    Im Controllerobjekt:

    if (a.image_index == b.image_index && b.image_index == c.image_index)
    {
    with(p)
    {
    instance_destroy(p)
    }
    }

    Wenn ich es so mache werden auch alle Pilze zerstört, aber kurz darauf kommt dann die Fehlermeldung.
  • ist ja auch quatsch du musst einfach nur meinen code im Controller Step ausführen und danach dann halt schreiben was passieren soll

    GML-Quellcode

    1. if (matching) {
    2. with (par_pilz) {
    3. instance_destroy()
    4. }
    5. }
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel: