Názory k článku Kolize spritů a naplánování operací v nástroji Pygame Zero

  • Článek je starý, nové názory již nelze přidávat.
  • 24. 11. 2020 8:09

    straka.milan
    Bronzový podporovatel


    Poznámka: důležité upozornění – volat lze pouze funkce bez parametrů a současně se nesmí jednat o uzávěry (což vyplývá z toho, že se jedná o funkce bez parametrů. Nelze ani použít funkce anonymní (lambda), pokud by se jednalo o uzávěr, což je poměrně velké omezení, které neumožňuje parametrizace.

    Tohle mě překvapilo, kromě serializace (kde třeba pickle serializuje jen top-level funkce odkazem na jméno) jsem měl pocit, že se používá koncept callable kde je to jen možné. Dokumentace https://pygame-zero.readthedocs.io/en/stable/builtins.html#clock o callbackup praví

    callback – A callable that takes no arguments.

    což zní rozumně; ale znamená to, že by měly fungovat jak closures (mimochodem closure nemusí mít parametry) tak lambda funkce.

    Aha, dokumentace také tvrdí

    Note that the Pygame Zero clock only holds weak references to each callback you give it. It will not fire scheduled events if the objects and methods are not referenced elsewhere. This can help prevent the clock keeping objects alive and continuing to fire unexpectedly after they are otherwise dead.

    The downside to the weak references is that you won’t be able to schedule lambdas or any other object that has been created purely to be scheduled. You will have to keep a reference to the object.

    což znamená, že closures a lambdy fungují, ale člověk si na ně musí sám udržovat referenci...

  • 24. 11. 2020 8:45

    Pavel Tišnovský
    Zlatý podporovatel

    Aha takže by to vlastně šlo obejít, zajímavé. Díky moc za doplnění.

    PS: já právě potřeboval udělat funkci, která vrátí zpátky barvu (=rastrový obrázek) jakéhokoli spritu, tak jsem zkoušel klasické lambdy (resp.tady to byly uzávěry), což nejde. A metody taky nejdou použít kvůli předávání `self` :-)

  • 24. 11. 2020 14:56

    Milan Straka
    Bronzový podporovatel

    Lambdy použit jde, ale je otázka, jak je nechat elegantně naživu. Když vlastně existují objekty pro sprites, asi by šlo udělat něco jako

    red_sprite = Actor("red.gif")
    red_sprite.reset_sprite = lambda: red_sprite.image = "red.gif"

    a pak použít red_sprite.re­set_sprite jako callback (s tím, že pokud red_sprite zanikne, automaticky je zrušen i ten naplánovaný callback).

    Jinak metody jdou použít s konkrétní instancí (takže dict.keys nejde, ale {}.keys už použít jde, za předpokladu, že ta instance bude "sama" žít).

  • 24. 11. 2020 17:11

    Wrána diskuze

    Poznámka: namísto termínu sprite se v dokumentaci k nástroji Pygame Zero setkáme se jménem actor, čemuž odpovídá i název příslušné třídy Actor.

    Obvykle to jsou dvě úplně oddělený věci jakože sprit je jenom obyčejnej tupej vykreslovací 'obrázek' zatimco actor kromě toho že bejvá součástí nějaký scény/scene managementu/scene graphu toho v sobě mívá hodně navíc a sprit muže/nemusí bejt jeho součástí. pygame zero lidi se asi jako v zájmu zjednodušení toho svýho engine rozhodli ty dva koncepty propojit do takový jedný jediný třídy :O :O

    v obyčejným pygame sprity maj hele
    ale zas tam nemaj actora :D :D