Isometric: place_meeting

  • GM 8
  • Isometric: place_meeting

    Hallo gm-d,

    Seit langem hängen ich wieder einmal, bei einem, für mich nicht, simplen Problem... Ich baue gerade ein Straßennetz in mein Spiel ein, welches durch place_meeting bestimmte variablen verändert.
    Spoiler anzeigen

    GML-Quellcode

    1. if (place_meeting(x+32,y-16,obj_road)) {oben=1;} else {oben=0;}
    2. if (place_meeting(x-32,y-16,obj_road)) {links=1;} else {links=0;}
    3. if (place_meeting(x+32,y+16,obj_road)) {rechts=1;} else {rechts=0;}
    4. if (place_meeting(x-32,y+16,obj_road)) {unten=1;} else {unten=0;}
    5. if (oben==1 && unten==1 && links==0 && rechts==0) {image_index=0}
    6. if (oben==0 && unten==0 && links==1 && rechts==1) {image_index=1}
    7. if (oben==1 && unten==0 && links==1 && rechts==0) {image_index=3}
    8. if (oben==1 && unten==0 && links==0 && rechts==1) {image_index=4}
    9. if (oben==0 && unten==1 && links==0 && rechts==1) {image_index=5}
    10. if (oben==0 && unten==1 && links==1 && rechts==0) {image_index=6}
    11. if (oben==1 && unten==0 && links==1 && rechts==1) {image_index=7}
    12. if (oben==1 && unten==1 && links==0 && rechts==1) {image_index=8}
    13. if (oben==0 && unten==1 && links==1 && rechts==1) {image_index=9}
    14. if (oben==1 && unten==1 && links==1 && rechts==1) {image_index=10}
    15. if (oben==0 && unten==0 && links==0 && rechts==0) {image_index=11}
    Alles anzeigen


    Da das Spiel in der isometric ansicht liegt, funktioniert einfach nix.Die Spirtes ändern sich nicht nur nicht richtig, sonder auch nicht anliegende Straßen verändern sich. Hierzu noch ein Example in Anhang.

    LG Afroman
    Dateien
    • city.zip

      (12,53 kB, 170 mal heruntergeladen, zuletzt: )

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

  • Also ich hab das auch einmal gemacht und ich hab jede menge if abfragen für die einzelnen Fälle geschrieben. nur links, nur rechts, links und oben, etc und dann das subimage danach auswählen lassen.

    Das hat muss ich sagen aber auch nicht zu Hundert Prozent funktioniert, T Kreuzungen zB. Und weils bei mir keine echten Straßen waren sondern nur ausgetretene Wege, hab ichs ganz anders gelöst^^

    Aber ich würde dir empfehlen die Abfragen aller Möglichkeiten einzeln durchzugehen ohne den Variablen-Zwischenschritt. Der Code wird länger, aber es sollte das Problem lösen.

    out now: KNOSSOS auf itch.io
    ancient-pixel.com <<< ich freue mich über einen Besuch! ^^
  • Hm, alles mit if zulösen hab ich auch schon probiert... das eigentliche problem sind die place_meeting Abfrage... den egal wie ich die Werte ändere, er erkennt immer die falschen Straßenteile. Ich hab es jetzt soweit geschafft, das immer wenn ich einen abstand dazwischen lasse, dass es richtig angezeigt wird, aber sobald ich direkt daneben baue, wird es falsch angzeigt.
    LG Afroman
    Dateien
    • Road.zip

      (13 kB, 153 mal heruntergeladen, zuletzt: )
  • Für das straßennetzt und alle anderen Tileset abfragen gebe ich immer etwas anders vor.


    Du hast den ersten Schritt gemacht und fragst erst mal alle Positionen rundum die zu prüfende Straße ab.

    Heist du du hast 4 werte die entweder 0 oder 1 sind.

    Jetzt mach daraus einen Code.
    zb heist wenn überall eine Straße angrenzt, kommt ja der wert 1 bei allen heraus.
    Heist das wäre der Code 1111.

    Must dir natürlich eine reihnfolge ausdenkene. ich mach das immer wie der DIrectionwert . Als osten norden west süden.

    nun must du eine switch-anweisung machen in der alle möglichkeiten drin stehen.

    und aus gegeben werden. hier mal eine komplex Version. Wenn du natürlich diagonal straßen drin haben willst, wird es noch komplexer.
    Hier mal ne komplet kopie vom aufbau




    //Flesen Kreuzung / Mitte / Einzelstein

    if ds_grid_get(controller.level_grid,argument0+1,argument1)>0 then v1=1 else v1=0
    if ds_grid_get(controller.level_grid,argument0,argument1-1)>0 then v2=1 else v2=0
    if ds_grid_get(controller.level_grid,argument0-1,argument1)>0 then v3=1 else v3=0
    if ds_grid_get(controller.level_grid,argument0,argument1+1)>0 then v4=1 else v4=0
    if ds_grid_get(controller.level_grid,argument0+1,argument1-1)>0 then v5=1 else v5=0
    if ds_grid_get(controller.level_grid,argument0-1,argument1-1)>0 then v6=1 else v6=0
    if ds_grid_get(controller.level_grid,argument0-1,argument1+1)>0 then v7=1 else v7=0
    if ds_grid_get(controller.level_grid,argument0+1,argument1+1)>0 then v8=1 else v8=0
    crypt= string(v1)+string(v2)+string(v3)+string(v4)+string(v5)+string(v6)+string(v7)+string(v8)
    //show_message(string(crypt))
    switch crypt
    {
    case "11110000":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,3*16,2*16,16,16,argument0*16,(argument1*16),-3)}break;//Gerad x
    case "11111111":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,1*16,1*16,16,16,argument0*16,(argument1*16),-3)}break;//Gerad x
    case "00000000":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,6*16,0*16,16,16,argument0*16,(argument1*16),-3)}break;//Einzelstein
    case "11111101":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,6*16,1*16,16,16,argument0*16,(argument1*16),-3)}break;//Kurve innen Links unten
    case "11111011":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,6*16,2*16,16,16,argument0*16,(argument1*16),-3)}break;//Kurve innen Links oben
    case "11111110":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,6*16,3*16,16,16,argument0*16,(argument1*16),-3)}break;//Kurve innen rechts unten
    case "11110111":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,6*16,4*16,16,16,argument0*16,(argument1*16),-3)}break;//Kurve innen rechts oben
    case "11111001":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,7*16,1*16,16,16,argument0*16,(argument1*16),-3)}break;//T Offen Links
    case "11110110":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,7*16,2*16,16,16,argument0*16,(argument1*16),-3)}break;//T offen rechts
    case "11111100":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,7*16,3*16,16,16,argument0*16,(argument1*16),-3)}break;//T offen unten
    case "11110011":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,7*16,4*16,16,16,argument0*16,(argument1*16),-3)}break;//T offen oben
    case "11110101":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,2*16,3*16,16,16,argument0*16,(argument1*16),-3)}break;//Knochen \
    case "11111010":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,2*16,4*16,16,16,argument0*16,(argument1*16),-3)}break;//Knochen /
    //3 Stücke 00,10,01,11 Kanten seiten wie bei Polygonen
    case "11110001":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,0*16,3*16,16,16,argument0*16,(argument1*16),-3)}break;//00
    case "11110010":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,1*16,3*16,16,16,argument0*16,(argument1*16),-3)}break;//10
    case "11111000":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,0*16,4*16,16,16,argument0*16,(argument1*16),-3)}break;//01
    case "11110100":{tile_layer_delete_at(-3,argument0*16,(argument1*16));tile_add(tile_hill,1*16,4*16,16,16,argument0*16,(argument1*16),-3)}break;//11
    }
    Meine Signatur hat kein Visum für das GM Forum erhalten.