Automatisch erkennen wie groß ein Objekt ist

  • GM 8

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

  • Automatisch erkennen wie groß ein Objekt ist

    Hallo nochmal :)

    Folgendes möchte ich erreichen aber schaffe es nicht alleine. Ich möchte eine Plattform in den Raum setzen, welche sich selbst "bemalt".

    Also ich habe die unbemalte Plattform (schwarzes Rechteck) als solides Objekt im Raum stehen und diese soll nun selbst erkennen können, ob sich eine weitere Plattform daneben befindet. Daraufhin soll sie die Ecken und Längen (welche als Sprite vorliegen) an die eigenen Seiten malen.

    Probiert habe ich schon:

    GML-Quellcode

    1. if(place_free(x+1,y)) {draw_sprite(spr_pf_a1_3,0,x+sprite_width,y);}


    Wie geht man da am besten vor?

    Zusätzlich: Es sind insgesamt neun Bilder, die als Muster zum Objekt dienen..

    -Ecke links
    -Länge oben
    -Ecke rechts
    -Länge rechts
    -Ecke unten rechts
    -Länge unten
    -Ecke unten links
    -Länge links
    -Mittelstück

  • Probier es mal mit collision_rectangle oder collision_point aus. Falls diese Funktionen eine Kollision finden, dann geben sie dir auch zurück welche Instanz es genau ist. Wenn keine Kollision vorliegt gibt sie noone zurück.

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
  • Verstehe nicht ganz wie mir das helfen soll ^^

    Ich habe es jetzt mal so geregelt:

    GML-Quellcode

    1. if(place_free(sprite_width,y)) {draw_sprite(spr_pf_a1_3,0,x+32,y-80);} else {draw_sprite(spr_pf_a1_2,0,x,y-80);}
    2. //Zeichnet die obere rechte Ecke falls sich kein weiteres Objekt auf der rechten Seite befindet
    3. //Falls doch, wird stattdessen die obere Länge gemalt
    4. if(place_free(sprite_width,y)) {draw_sprite(spr_pf_a1_4,0,x+32,y-32);} else {draw_sprite(spr_pf_a1_9,0,x,y-32);}
    5. //Das gleiche für die Mitte
    6. if(place_free(sprite_width,y)) {draw_sprite(spr_pf_a1_5,0,x+32,y+32);} else {draw_sprite(spr_pf_a1_6,0,x,y+32);}
    7. //Und für die untere rechte Ecke


    Das ist nun die rechte Seite des Objektes und sieht folgendermaßen aus.




    Wenn ich das ganze jetzt aber mit der unteren Seite beginnen möchte, funktioniert die Umsetzung nicht mehr.
    Wie kann man das vereinfachen?
  • mar96k schrieb:

    Wenn du die größe oder Maske deines Objektes wissen willst und keine modifiezierten sprite einstellungen gemacht hast dann kannst du dafür die variable sprite_width bzw sprite_height benutzten. Jede Instanz hat diese Variable bereits.

    Ich denke mal er will blöcke in den Raum setzen, die dann automatisch erkennen an welcher Position sie stehen. Sprich: es sollte so wie im angehängten Bild sein. Falls du es so haben möchtest hab ich dir hier ein example gepastelt. Ist zwar nichts kommentiert, sollte aber klar sein. Falls sich die Plattform ändert setzt du einfach die Variable "global.wall_check" auf "false".


    MfG Rodrog

    Edit: Natürlich kannst du auch kompliziertere "Formen" darstellen lassen, jedoch müsstest du dann dein Tileset erweitern, da du aber nur ein Quadrat bzw. Rechteck hattest hab ich nicht mehr gemacht. So ziemlich alle möglichkeiten sind eig. hier: (Bild 2, ist von mir)
    Es könnte natürlich sein das manche Blöcke doppelt sind, aber das hab ich nicht wirklich beachtet ;D
    Bilder
    • png_example_block.png

      4,57 kB, 336×444, 106 mal angesehen
    • ts_environment_grass.png

      2,19 kB, 256×256, 107 mal angesehen
    Dateien
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.

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

  • Danke Rodrog!

    Genau so hatte ich mir das vorgestellt. So ganz habe ich den Code noch nicht verstanden aber ich bin ihn auch nur mal überflogen.
    Ich werde mir das demnächst mal genauer ansehen und dann noch mal schreiben, ob alles klar ist.

    Vielen Dank noch mal :)
  • Also hab mir das nochmal kurz angeguckt und hab es hier ein wenig kommentiert. Zumindest den kompliziertesten Teil.

    GML-Quellcode

    1. //Es wird überprüft ob Rechts (r = right) oder Links (l = left) oder Oben (u = up) oder Unten (d = down) ein Object vom Typ obj_wall ist.
    2. //Das heißt falls rechts ein Objekt wäre und links nicht, aber dafür unten wieder aber oben nicht wäre es so:
    3. //r = true;
    4. //l = false;
    5. //d = true;
    6. //u = false;
    7. //Daraus kann ich erkennen welches Sprite angewendet werden soll und man kann alle möglichkeiten durchgehen, welche sprite genutzt werden muss.
    8. r = place_meeting(x+16,y,obj_wall);
    9. l = place_meeting(x-16,y,obj_wall);
    10. d = place_meeting(x,y+16,obj_wall);
    11. u = place_meeting(x,y-16,obj_wall);
    12. if(r && l && d && u) {
    13. sprite_index = spr_wall_middle;
    14. } else if(r && !l && d && !u) {
    15. sprite_index = spr_wall_corner01;
    16. } else if(!r && l && d && !u) {
    17. sprite_index = spr_wall_corner02;
    18. } else if(r && !l && !d && u) {
    19. sprite_index = spr_wall_corner03;
    20. } else if(!r && l && !d && u) {
    21. sprite_index = spr_wall_corner04;
    22. } else if(r && l && d && !u) {
    23. sprite_index = spr_wall_border01;
    24. } else if(r && !l && d && u) {
    25. sprite_index = spr_wall_border02;
    26. } else if(!r && l && d && u) {
    27. sprite_index = spr_wall_border03;
    28. } else if(r && l && !d && u) {
    29. sprite_index = spr_wall_border04;
    30. }
    Alles anzeigen


    Falls du es noch nicht verstehst versuch ich es genauer zu erklären.

    MfG Rodrog
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • So wird das leider nichts (Zumindest mit meiner Methode). Du musst die Sprites vollenden. Jedes Sprite muss 64*64px groß sein und ein Part sein. Ich denke man könnte das bestimmt anders lösen, aber dazu fehlt mir derzeit die Motivation und auch die Zeit um das zu basteln, bzw. alles zu überlegen. Vllt. mach ich das mal aber diese Woche sieht leider schlecht aus. Ich hoffe du verstehst es jetzt wie mein System eig. funktioniert.

    MfG Rodrog
    Dateien
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Ich hab schon eine Idee wie man sowas lösen könne. Jedoch würde das dauern, da ich mir noch nicht wirklich sicher bin.
    Eine Frage hab ich aber. Soll deine Textur dann so aussehen (in deinem Beispiel):

    Ich weiß es stimmt nicht ganz, aber ist ja nur zur Überlegung ^^ Oder hat dein Muster dann den Rand auch noch?

    MfG Rodrog
    Bilder
    • muster.jpg

      19,75 kB, 32×32, 207 mal angesehen
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Also ich würde gerne mehrere Texturen verwenden. Klar sollten diese dann den Rand der gruppierten Plattform übernehmen.
    Sodass ich bspw. (wie im Bild oben) vier Objekte in den Raum setze, welche dann zu einer ganzen Plattform werden und diese dann wiederum eine Textur trägt.
    Nebenbei bemerkt, die Texturen verlaufen alle nahtlos miteinander.
  • Lunatic447 schrieb:

    Also ich würde gerne mehrere Texturen verwenden. Klar sollten diese dann den Rand der gruppierten Plattform übernehmen.
    Sodass ich bspw. (wie im Bild oben) vier Objekte in den Raum setze, welche dann zu einer ganzen Plattform werden und diese dann wiederum eine Textur trägt.
    Nebenbei bemerkt, die Texturen verlaufen alle nahtlos miteinander.

    Das gruppieren ist aber kein großes Problem. Jedoch die Textur zu geben ist ein wenig komplexer.
    Wäre es möglich mir 1 bzw. 2 Texturen zu zeigen um mir ein Bild davon zu machen?

    MfG Rodrog
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Klar, hier!
    (Die optimale Größe wäre 64x64px aber 32x32px ist auch möglich wie man im Beispiel hier erkennen kann.)
    Bilder
    • txtr_a_32x32.png

      4,01 kB, 32×32, 160 mal angesehen
    • txtr_a_64x64.png

      7,06 kB, 64×64, 171 mal angesehen
    • txtr_b_64x64.png

      4,41 kB, 64×64, 169 mal angesehen
  • Habs zwar hinbekommen, aber da können gruppierten objekten nur texturen zugewissen werden, aber ohne Rand! Ich kanns dir zwar geben, wirst du aber leider nicht verstehen, da es recht kompliziert programmiert ist. Für was brauchst du das überhaupt?

    MfG Rodrog
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Ok aber wenn die Maske, sprich der Rand von der gruppierten Plattform nicht mit einbezogen werden kann, dann lohnt sich das für mich nicht so ganz.
    Wäre aber schön wenn du das script dennoch hier posten könntest :)

    Für was brauchst du das überhaupt?

    Es würde auf eine einfache Weise mehr Variation in mein Spiel einbringen. Ich könnte mir das mühselige einfügen hunderter Bilder ersparen.

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

  • Es ist bestimmt ausbaufähig und der Code ist schrecklich geschrieben. Ich denke es ist fast unmöglich den Code genau zu verstehen wenn man ihn nicht kennt ;DD normal veröffentlich ich so einen schrecklichen Code nicht ;DD ^^ Ach und ich würd es nochmal ganz anders machen ^^

    Aber dennoch. Hier: Viel Spaß damit ^^

    MfG Rodrog
    Dateien
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Es kommt drauf an wie du es umsetzen willst. Ich könnte alles in ein Objekt schmeißen und die Scripte weglassen. Dann ist es aber so dass du für jede Texture ein extra Objekt brauchen würdest. (Ich hoffe du verstehst was ich meine)

    Ich hab noch eine Frage: Wie sind deine Blöcke angeordnet? weil dann könnte ich sogar einen Rand einbauen.

    Sind sie so (Kreise sind Blöcke):

    OOO
    OOO
    OOOOOO
    OOOOOO

    Oder können sie nur so sein:
    OOO
    OOO

    Also quasi keine zusammengesetzen Flächen.

    MfG Rodrog
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.