Vorwort
Dieses Tutorial befasst sich mit dem automatischen indexieren von Sprites in, z.B. einem Spiel wie Terraria.
Zu erwähnen ist, dass dies nicht über gm-objekte geschieht sondern über einen Array. Ansonsten ist es ihr herkömmlicher autotiler.
Notiz1: Der Code ist lange und sieht sehr Performance-unfreundlich aus, ist er aber nicht.
Notiz2: Funktioniert nicht direkt mit Objekten, kann aber ohne zu grossen Aufwand angepasst werden. (Ich schliesse aber Empfehlungen aus)
Notiz3: Dieser Autotiler funktioniert nicht in bit-weise, da Game Maker if-statements gegenüber normalen Berechnungen bevorzugt.
So soll es im Normalfall eine bessere Performance zeigen. (Nicht getestet für den Worst-case!)
Das Template
Als erstes muss ein Template erstellt werden. Damit meine ich den Sprite mit seinen Sub-images. Für das Tutorial ist ein Sprite mit 47 Sub-images zu verwenden, Index 0 bis 46.
Die Anordnung spielt eine grosse Rolle, sie sollte dem Beispiel entsprechen (Anti-kopier Qualität, aber hoffentlich erkennbar) der Abbildung unten:

Das Setup
Da es ein Script ist, muss es zuerst aufgerufen werden. Es soll in jeder Zelle des Arrays ausgeführt werden.
Der Algorithmus
Nun zum Code der diese Bildchen am richtigen Ort einsetzen soll:Der Algorithmus schaut alle Werte im Array um sich herum nach und vergleicht diese mit dem eigenen Wert. Der Algorithmus dieser Sache ist die Reihenfolge bei der diese Array-positionen angeschaut werden.Zur Zeit ist das der schnellste Weg ans Ziel:
Alles anzeigen
Bei Fragen und Feedback unbedingt melden.
Dieses Tutorial befasst sich mit dem automatischen indexieren von Sprites in, z.B. einem Spiel wie Terraria.
Zu erwähnen ist, dass dies nicht über gm-objekte geschieht sondern über einen Array. Ansonsten ist es ihr herkömmlicher autotiler.
Notiz1: Der Code ist lange und sieht sehr Performance-unfreundlich aus, ist er aber nicht.
Notiz2: Funktioniert nicht direkt mit Objekten, kann aber ohne zu grossen Aufwand angepasst werden. (Ich schliesse aber Empfehlungen aus)
Notiz3: Dieser Autotiler funktioniert nicht in bit-weise, da Game Maker if-statements gegenüber normalen Berechnungen bevorzugt.
So soll es im Normalfall eine bessere Performance zeigen. (Nicht getestet für den Worst-case!)
Das Template
Als erstes muss ein Template erstellt werden. Damit meine ich den Sprite mit seinen Sub-images. Für das Tutorial ist ein Sprite mit 47 Sub-images zu verwenden, Index 0 bis 46.
Die Anordnung spielt eine grosse Rolle, sie sollte dem Beispiel entsprechen (Anti-kopier Qualität, aber hoffentlich erkennbar) der Abbildung unten:
Das Setup
Da es ein Script ist, muss es zuerst aufgerufen werden. Es soll in jeder Zelle des Arrays ausgeführt werden.
Der Algorithmus
Nun zum Code der diese Bildchen am richtigen Ort einsetzen soll:Der Algorithmus schaut alle Werte im Array um sich herum nach und vergleicht diese mit dem eigenen Wert. Der Algorithmus dieser Sache ist die Reihenfolge bei der diese Array-positionen angeschaut werden.Zur Zeit ist das der schnellste Weg ans Ziel:
Quellcode
- ///scr_get_index(tile,x,y)
- var zero = argument0;
- var xpos = argument1;
- var ypos = argument2;
- var left = xpos-1;
- var right = xpos+1;
- var above = ypos-1;
- var below = ypos+1;
- //1+
- if (global.tiles[@ xpos, below] != zero)
- {
- //1-2+
- if (global.tiles[@ right, ypos] != zero)
- {
- //1-2-4+
- if (global.tiles[@ xpos, above] != zero)
- {
- //1-2-4-8
- if (global.tiles[@ left, ypos] != zero)
- {
- return (15);
- }
- else return (7);
- }
- else
- {
- //1-2-8
- if (global.tiles[@ left, ypos] != zero)
- {
- return (11);
- }
- else
- {
- //1-2-64
- if (global.tiles[@ left, above] != zero)
- {
- return (27);
- }
- else return (3);
- }
- }
- }
- else
- {
- //1-4+
- if (global.tiles[@ xpos, above] != zero)
- {
- //1-4-8
- if (global.tiles[@ left, ypos] != zero)
- {
- return (13);
- }
- else return (5);
- }
- else
- {
- //1-8+
- if (global.tiles[@ left, ypos] != zero)
- {
- //1-8-32
- if (global.tiles[@ right, above] != zero)
- {
- return (23);
- }
- else return (9);
- }
- else
- {
- //1-32
- if (global.tiles[@ right, above] != zero)
- {
- //1-32-64
- if (global.tiles[@ left, above] != zero)
- {
- return (43);
- }
- else return (21);
- }
- else
- {
- //1-64
- if (global.tiles[@ left, above] != zero)
- {
- return (25);
- }
- else return (1);
- }
- }
- }
- }
- }
- else
- {
- //2+
- if (global.tiles[@ right, ypos] != zero)
- {
- //2-4
- if (global.tiles[@ xpos, above] != zero)
- {
- //2-4-8
- if (global.tiles[@ left, ypos] != zero)
- {
- return (14);
- }
- else
- {
- //2-4-128
- if (global.tiles[@ left, below] != zero)
- {
- return (31);
- }
- else return (6);
- }
- }
- else
- {
- //2-8
- if (global.tiles[@ left, ypos] != zero)
- {
- return (10);
- }
- else
- {
- //2-64
- if (global.tiles[@ left, above] != zero)
- {
- //2-64-128
- if (global.tiles[@ left, below] != zero)
- {
- return (44);
- }
- else return (26);
- }
- else
- {
- //2-128
- if (global.tiles[@ left, below] != zero)
- {
- return (29);
- }
- else return (2);
- }
- }
- }
- }
- else
- {
- //4+
- if (global.tiles[@ xpos, above] != zero)
- {
- //4-8
- if (global.tiles[@ left, ypos] != zero)
- {
- //4-8-16
- if (global.tiles[@ right, below] != zero)
- {
- return (18);
- }
- else return (12);
- }
- else
- {
- //4-16
- if (global.tiles[@ right, below] != zero)
- {
- //4-16-128
- if (global.tiles[@ left, below] != zero)
- {
- return (37);
- }
- else return (17);
- }
- else
- {
- //4-128
- if (global.tiles[@ left, below] != zero)
- {
- return (30);
- }
- else return (4);
- }
- }
- }
- else
- {
- //8+
- if (global.tiles[@ left, ypos] != zero)
- {
- //8-16
- if (global.tiles[@ right, below] != zero)
- {
- //8-16-32
- if (global.tiles[@ right, above] != zero)
- {
- return (33);
- }
- else return (19);
- }
- else
- {
- //8-32)
- if (global.tiles[@ right, above] != zero)
- {
- return (22);
- }
- else return (8);
- }
- }
- //ONLY CORNERS
- else
- {
- //16+
- if (global.tiles[@ right, below] != zero)
- {
- //16-32
- if (global.tiles[@ right, above] != zero)
- {
- //16-32-64
- if (global.tiles[@ left, above] != zero)
- {
- //16-32-64-128
- if (global.tiles[@ left, below] != zero)
- {
- return (39);
- }
- else return (35);
- }
- else
- {
- //16-32-128
- if (global.tiles[@ left, below] != zero)
- {
- return (42);
- }
- else return (32);
- }
- }
- else
- {
- //16-64
- if (global.tiles[@ left, above] != zero)
- {
- //16-64-128
- if (global.tiles[@ left, below] != zero)
- {
- return (41);
- }
- else return (34);
- }
- else
- {
- //16-128
- if (global.tiles[@ left, below] != zero)
- {
- return (36);
- }
- else return (16);
- }
- }
- }
- else
- {
- //32+
- if (global.tiles[@ right, above] != zero)
- {
- //32-64
- if (global.tiles[@ left, above] != zero)
- {
- //32-64-128
- if (global.tiles[@ left, below] != zero)
- {
- return (40);
- }
- else return (46);
- }
- else
- {
- //32-128
- if (global.tiles[@ left, below] != zero)
- {
- return (38);
- }
- else return (20);
- }
- }
- else
- {
- //64+
- if (global.tiles[@ left, above] != zero)
- {
- //64-128
- if (global.tiles[@ left, below] != zero)
- {
- return (45);
- }
- else return (24);
- }
- else
- {
- //128+
- if (global.tiles[@ left, below] != zero)
- {
- return (28);
- }
- else return (0);
- }
- }
- }
- }
- }
- }
- }
Bei Fragen und Feedback unbedingt melden.