Anpassung der Map

  • GM 8

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

  • Anpassung der Map

    Hallo alle zusammen!
    Ich bin gerade an einem neuen Projekt, bei dem die Welt von Spieler beliebig geändert werden kann.
    Wenn dies geschieht, sollen sich aber auch die Sprites änder, zb. die obere kante einer platform darzustellen.
    Dafür benutze ich momentan eine menge if abfragen. Bei vielen Objekten im raum wird das aber zu einer gewaltigen Performance Bremse.
    gibt es eine andere möglichkeit als das mit if's zu lösen?
    mein momentaner code sieht so aus:
    Spoiler anzeigen
    :event_step:

    GML-Quellcode

    1. var a , iid , xx , yy;
    2. xx=floor(x/16)
    3. yy=floor(y/16)
    4. image_speed=0
    5. //
    6. a[1]=ds_grid_get(variable_global_get("map_0"),xx-1,yy-1)
    7. a[2]=ds_grid_get(variable_global_get("map_0"),xx,yy-1)
    8. a[3]=ds_grid_get(variable_global_get("map_0"),xx+1,yy-1)
    9. a[4]=ds_grid_get(variable_global_get("map_0"),xx+1,yy)
    10. a[5]=ds_grid_get(variable_global_get("map_0"),xx+1,yy+1)
    11. a[6]=ds_grid_get(variable_global_get("map_0"),xx,yy+1)
    12. a[7]=ds_grid_get(variable_global_get("map_0"),xx-1,yy+1)
    13. a[8]=ds_grid_get(variable_global_get("map_0"),xx-1,yy)
    14. var i;
    15. i=1
    16. while(i!=9)
    17. {
    18. a[i]=string(a[i])
    19. i+=1
    20. }
    21. //Change Subimage
    22. //mitte
    23. if ( (a[2]!="0" && a[2]!="") && (a[4]!="0" && a[4]!="") && (a[6]!="0" && a[6]!="") && (a[8]!="0" && a[8]!="") )//oben,unten,links,rechts muss besetzt sein
    24. {
    25. image_index=0;//mitte
    26. exit;
    27. }
    28. //oben links
    29. if ( (a[8]="0" || a[8]="") && (a[2]="0" || a[2]="") && (a[4]!="0" && a[4]!="") )//links muss frei sein, oben auch, rechts besetzt, der Rest ist egal
    30. {
    31. image_index=1;//oben links
    32. exit;
    33. }
    34. //oben rechts
    35. if ( (a[4]="0" || a[4]="") && (a[2]="0" || a[2]="") && (a[8]!="0" && a[8]!="") )//rechts muss frei sein, oben auch, links besetzt, der Rest ist egal
    36. {
    37. image_index=3;//oben rechts
    38. exit;
    39. }
    40. //oben
    41. if ( (a[2]="0" || a[2]="") )//oben muss frei sein, der rest ist egal
    42. {
    43. image_index=2;//oben
    44. exit;
    45. }
    46. //links
    47. if ( (a[8]="0" || a[8]="") && (a[2]!="0" && a[2]!="") && (a[4]!="0" && a[4]!="") && (a[6]!="0" && a[6]!="") )//links muss frei sein, rechts & oben & unten besetzt der rest ist egal
    48. {
    49. image_index=8;//links
    50. exit;
    51. }
    52. //rechts
    53. if ( (a[4]="0" || a[4]="") && (a[2]!="0" && a[2]!="") && (a[8]!="0" && a[8]!="") && (a[6]!="0" && a[6]!="") )//rechts muss frei sein, links & oben & unten besetzt der rest ist egal
    54. {
    55. image_index=4;//rechts
    56. exit;
    57. }
    58. //unten links
    59. if ( (a[8]="0" || a[8]="") && (a[6]="0" || a[6]="") && (a[4]!="0" && a[4]!="") )//links & unten muss frei sein, rechts besetzt der rest ist egal
    60. {
    61. image_index=7;//unten links
    62. exit;
    63. }
    64. //unten rechts
    65. if ( (a[4]="0" || a[4]="") && (a[6]="0" || a[6]="") && (a[8]!="0" && a[8]!="") )//rechts & unten muss frei sein, rlinks besetzt der rest ist egal
    66. {
    67. image_index=5;//unten rechts
    68. exit;
    69. }
    70. //unten
    71. if ( (a[6]="0" || a[6]="") )//unten muss frei sein
    72. {
    73. image_index=6;//unten
    74. exit;
    75. }
    76. //trifft nichts des oberen zu? =mittelfeld!
    77. image_index=0;
    78. exit;
    Alles anzeigen


    Das muss doch irgendwie besser gehen oder?

    vielen dank schonmal im vorraus!
    mfg gmr_08
  • Ich hätte eine Möglichkeit die sehr viel schneller ist und einfach. Dazu bracht man jedoch 15 Bilder.

    GML-Quellcode

    1. var bildindex,xx,yy;
    2. xx=floor(x/16)
    3. yy=floor(y/16)
    4. bildindex = 0
    5. image_speed=0
    6. if(ds_grid_get(variable_global_get("map_0"),xx-1,yy)!="") bildindex += 1
    7. if(ds_grid_get(variable_global_get("map_0"),xx+1,yy)!="") bildindex += 2
    8. if(ds_grid_get(variable_global_get("map_0"),xx,yy-1)!="") bildindex += 4
    9. if(ds_grid_get(variable_global_get("map_0"),xx,yy+1)!="") bildindex += 8
    10. image_index = bildindex
    Alles anzeigen

    Es funktioniert im Bytesystem. Es prüft nur oben, unten und links, rechts da alles andere in diesem Fall überflüssig währe. Ansonsten bräuchte man 255 Bilder für jede Situation. Die Bilder müssen in die richtige Reihenfolge gebracht werden, welche sich ergeben. Einfach mal anstatt des Sprites den image_index drawen lassen, so kann man sehen welches Bild für diese Nummer benötigt wird.
  • Chris, Du bist Fantastisch, genau das habe ich gesucht :D!
    es geht nicht nur schneller, sonern ich kann nun auch noch mehr fälle abdecken, damit alles noch besser aussieht.
    Habe es aber noch damit verbunden, dass die maus eine bestimmte entfernung haben muss, so werden sie nur neu berechnet, wenn sie sich auch aufgrund von spieler Eingaben verändern.

    Darf man nochfragen wie man darauf kommt? wirklich komplett verstanden hab ichs aber noch nicht.

    Vielen Dank!
    lg gmr_08