Lekce 12 - Příkaz with

GML

Smysl příkazu <With>

Jak již bylo řečeno, je možné získávat a měnit hodnoty proměnných v jiných instancích. Ale v některých případech potřebuješ s jinými instancemi dělat mnohem víc než to. Například si představ, že chceš  posunout všechny míče o 8 bodů dolů. Můžeš si myslet, že toho dosáhneš pomocí následujícího kódu

ball.y = ball.y + 8;

Ale to není správně. Pravá strana rovnice vezme hodnotu svislé pozice prvního míče a přičte k ní 8. Následně se tato nová hodnota nastaví pro svislou pozici všech míčů. Takže výsledkem bude, že všechny  míče budou mít stejnou svislou pozici. Příkaz

ball.y += 8;

bude mít úplně stejný efekt, protože to je jenom zkrácený zápis toho prvního. Takže jak toho tedy dosáhnete? Právě pro tento případ je zde příkaz with. Jeho souhrnná forma je:

with (<výraz>) <příkaz>

<výraz> označuje jednu, nebo několik instancí. Můžeš zde použít ID instance, jméno objektu (pro označení všech instancí tohoto objektu), nebo jeden ze speciálních objektů (all = všechny, self = já, other = ten druhý, none = nikdo). <příkaz> je následně proveden pro každou z označených instancí, tak jako by to byla aktuální instance. Takže pro posunutí všech míčů o 8 bodů dolů napíšeš.

with (ball) y += 8;

Pokud potřebuješ vykonat několik příkazů, vlož je do složených závorek. Takže například pro přesunutí všech míčů na náhodnou pozici můžeš použít

with (ball)
    {
        x = random(room_width);
        y = random(room_height);
    }

Takže uvnitř těchto příkazů je(sou) označená(é) instance vnímána(y) jako aktuální (self) instance a pravá aktuální instance je vnímána jako ta druhá (other) instance. Například pro přesunutí všech míčů na pozici  stávající instance můžeš použít

with (ball)
    {
        x = other.x;
        y = other.y;
    }

Použití příkazu with je extrémně výkonné. Dovolte mi ještě několik příkladů. Pro zničení všech míčů použij:

with (ball) instance_destroy();

Jestliže exploduje bomba a ty chceš zničit všechny instance poblíž můžeš použít

with (all)
    {
        if (distance_to_object(other) < 50) instance_destroy();
    }

Napsal uživatel wix