Pygame 3 ================================ Opgave 19 --------- In opgave 17 introduceerden we kogels. De kogel vertrekt echter niet van het midden van het ruimteschip. Pas de code aan, zodat de kogel vanuit het midden van het ruimteschip vertrekt. Opgave 20 --------- In onderstaande code introduceren we een vijand. .. image:: images/enemyship.png Net zoals voor de kogels en de speler, houden we ook voor het vijandelijke schip de positie en de verplaatsing bij in variabelen: - enemy_x: positie op de X-as (horizontaal) - enemy_y: positie op de Y-as (vertikaal) - enemy_x_change: verplaatsing op de X-as - enemy_y_change: verplaatsing op de Y-as .. literalinclude:: ex/opgave20.py Link naar :download:`opgave20.py ` Als het vijandelijke ruimteschip onderaan het scherm geraakt, blijft het ruimteschip zich verder naar onder verplaatsen. Erg veel nut heeft dit niet, aangezien het ruimteschip niet meer zichtbaar is voor de speler. Pas de code aan zodat het ruimteschip zich terug bovenaan het scherm bevindt zodra de Y positie van het schip zich buiten het scherm bevindt. Dus, zodra Y groter is dan de schermhoogte. .. image:: images/ship.png Opgave 21 --------- De aanpassing in opgave 20 zorgde ervoor dat het ruimteschip terug bovenaan het scherm verscheen. Hierdoor lijkt het alsof er een nieuwe vijand aankomt. Helaas komt de vieuwe vijand op exact dezelfde positie als de vorige vijand. Pas de code aan zodat de vijand telkens op een nieuwe willekeurige horizontale positie verschijnt met behulp van de `random.randint` functie. Opgave 22 --------- Ons ruimteschip kan nu schieten, er verschijnen ook vijanden, maar we kunnen de vijand helaas nog niet raken. .. literalinclude:: ex/opgave22.py Link naar :download:`opgave22.py ` In bovenstaand voorbeeld wordt code toegevoegd die telkens test of er een botsing plaatsvindt tussen de kogel en de vijand. Indien de kogel de vijand raakt, wordt "hit" op het scherm getoond. Hier zien we het stukje code dat deze test uitvoert: .. literalinclude:: ex/opgave22new.py Pas de code aan zodat er een explosie afgespeeld wordt, als de vijand geraakt werd. Opgave 23 --------- Je merkte vast dat de detectie van botsingen tussen kogels en vijanden niet erg nauwkeurig was. Soms raak je de vijand, maar verschijnt er toch geen "hit". Dit komt door het incorrect instellen van de rechthoek waarmee de botsing gedetecteerd werd. Pas de code uit opgave 22 aan zodat dit probleem verholpen wordt. Opgave 24 --------- Hoewel ons spel nog zeer eenvoudig is, gebruikt het enorm veel CPU-tijd. Dit komt omdat we onze while-lus voortdurend uitvoeren, zonder enige onderbreking. Dus, in plaats van het blitten van de sprites (tekeningen) aan een bepaalde framerate (b.v. 60FPS) doen we dit momenteel zo veel mogelijk. We passen de code nu aan zodat er na elke hertekening van het scherm gewacht wordt. De belasting van de CPU is nu aanzienlijk lager. .. literalinclude:: ex/opgave24.py Link naar :download:`opgave24.py ` Probleem is nu dat alle bewegingen veel trager verlopen. Dit komt doordat voor de aanpassing de code b.v. 1000 maal per seconde uitgevoerd werd, en nu maximaal 60 keer per seconde. Bijvoorbeeld, voor de vijand werd onderstaande code uitgevoerd:: enemy_y_change = 0.05 enemy_y += enemy_y_change Hierdoor zou de vijand zich 1000x0.05 pixels per seconde verplaatsen, dus 50 pixels per seconde. Met de aangepaste code verplaatst de vijand zich nu slechts 60x0.05 pixels per second, dus 3 pixels per seconde. Pas de code aan zodat zowel je eigen ruimteschip als de kogels als het vijandelijke ruimteschip vlotter bewegen.