2022-02-14: Pygame ======================== .. sectnum:: Herhaling ------------- Vorig jaar gebruikten we Pygame om een eenvoudige side-scrolling game te implementeren. In onderstaand stukje code herhalen we de belangrijkste concepten: .. literalinclude:: ./examples/pygame/pygame01_one_bullet.py :language: python :linenos: Variabele duplicatie per kogel ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Stel nu dat we gelijktijdig twee kogels willen kunnen schieten: .. literalinclude:: ./examples/pygame/pygame02_two_bullets.py :language: python :linenos: Stel nu dat je 5 kogels willen kunnen schieten: .. literalinclude:: ./examples/pygame/pygame03_5_bullets.py :language: python :linenos: Stel nu dat je 100 kogels willen kunnen schieten... Het mag duidelijk zijn dat dit niet de correcte aanpak is, omdat je enorm veel code dient te schrijven of dupliceren. Lijsten van kogels ^^^^^^^^^^^^^^^^^^ We losten dit vorig jaar op, door een lijst van kogels bij te houden. Deze lijst bevat per kogel een lijst. Stel dat we bijvoorbeeld 3 kogels afvuurden terwijl de speler op positie (100, 240) stond. Je zou dan deze lijst met kogels hebben: .. literalinclude:: ./examples/pygame/pygame04a_list_of_bullets.py :language: python :linenos: Waarschijnlijker zouden de coordinaten van de kogels niet allemaal hetzelfde zijn: .. literalinclude:: ./examples/pygame/pygame04b_list_of_bullets.py :language: python :linenos: Een voorbeeld van de code die gebruik maakt van een lijst van kogels: .. literalinclude:: ./examples/pygame/pygame04_many_bullets.py :language: python :linenos: Een probleem met deze code is echter, dat de code voor de kogels verspreid zit over de hele broncode. Introductie vijanden ^^^^^^^^^^^^^^^^^^^^ Als we nu een vijand introduceren, zien we dat de code voor het bijhouden van de positie van de vijand, het tekenen van de vijand, etc sterk lijkt op de code die gebruikt werd voor dezelfde functionaliteit van de kogels: .. literalinclude:: ./examples/pygame/pygame05_enemy.py :language: python :linenos: Stel nu dat je meerdere vijanden wil tonen? Je zou net zoals voor de kogels lijsten van vijanden kunnen bijhouden. .. literalinclude:: ./examples/pygame/pygame06_enemies.py :language: python :linenos: Als we ook willen bijhouden of de vijanden nog leven wordt dit: .. literalinclude:: ./examples/pygame/pygame07_enemies_alive.py :language: python :linenos: Introductie classes ^^^^^^^^^^^^^^^^^^^^ Zoals we reeds eerder aangaven, zit de code voor de kogels verspreid over heel de code. We introduceren nu een "Bullet" class, waarin we alle code van de Bullet groeperen. .. literalinclude:: ./examples/pygame/pygame08_class.py :language: python :linenos: Opgave: Enemy class ^^^^^^^^^^^^^^^^^^^ Introduceer een class Enemy gelijkaardig aan de class Bullet. Inheritance ^^^^^^^^^^^^^^^^^^^^ We zien nu dat de code van de Enemy class grotendeels gelijk is aan de code van de Bullet class. We dienen code duplicatie te vermijden, dus we introduceren een nieuwe class Entity die de gemeenschappelijke code bevat van Bullet en Enemy. Zie ook https://mosa.issaris.com/2020/prog2/slides/classes2.html Opgave: Entity class ^^^^^^^^^^^^^^^^^^^^ Introduceer een class Entity gelijkaardig aan de class Bullet. .. literalinclude:: ./examples/pygame/pygame10_entity_class.py :language: python :linenos: