3. Het fruit#

Het bewegende mandje is klaar en nu kunnen we ons met het fruit gaan bezighouden, in eerste instantie alleen een rode appel. Deze moet op een random positie vanuit de bovenkant van het venster naar beneden vallen.

../_images/apple_red.png

De fruit sprite#

Voeg de volgende regels aan je programma toe:

fruitcatcher.py#
 1import random
 2
 3# Vensterinstellingen
 4WIDTH = 600
 5HEIGHT = 400
 6TITLE = 'Fruit Catcher'
 7MARGIN = 20
 8
 9# Sprite voor het mandje
10basket = Actor('basket')
11basket.speed = 5
12
13#Sprite voor het fruit
14fruit = Actor('apple_red')
15fruit.speed = 5
16
17# Initialisatie mandje
18def init_basket():
19    basket.x = WIDTH // 2
20    basket.bottom = HEIGHT
21
22# Draw() functie
23def draw():
24    screen.clear()
25    fruit.draw()
26    basket.draw()

Omdat de appel op een willekeurige plek bovenin het venster moet starten, hebben we de random module nodig, die we op regel 1 importeren.
Het is niet zo mooi als de appel de linker- of rechterrand van het venster raakt en daarom maken we op regel 7 een MARGIN constante aan met waarde 20. Deze constante geeft aan dat tussen de appel en de zijranden minstens 20 pixels afstand moet zitten. We gaan MARGIN straks gebruiken bij het bepalen van de startpositie.
Op regels 14 en 15 zie je dat een fruit variabele wordt aangemaakt, die we ook meteen van een speed variabele voorzien.
In de draw() functie voegen we op regel 25 de fruit.draw() aanroep toe, opdat de appel wordt getekend.

Startpositie#

Voor de basket sprite creëerden we een init_basket() functie om de startpositie te bepalen. Zoiets gaan we voor de fruit sprite ook doen.

  1. Voeg onder de init_basket() functie een init_fruit() functie toe.

  2. Voeg aan het hoofdprogramma de aanroep init_fruit() toe.

fruitcatcher.py#
# Initialisatie mandje
def init_basket():
    basket.x = WIDTH // 2
    basket.bottom = HEIGHT

# Initialisatie fruit
def init_fruit():
    pass

# Draw() functie
def draw():
    ...

# Update() functie
def update():
    ...

# HOOFDPROGRAMMA
init_basket()
init_fruit()
Opdracht 01

Vervang het pass keyword in de init_fruit() functie door twee regels waarmee je de startpositie van de appel instelt.

Voor de horizontale positie gebruik je de functie random.randint(start, stop). Deze functie genereert een willekeurige integerwaarde tussen start en stop. Bijvoorbeeld random.randint(3, 7) levert één van de getallen 3, 4, 5, 6, of 7 op.

fruit.x = random.randint(..., ...)

Voor de positie van de appel geldt dat die tussen de linker- en rechterkant van het venster moet zitten en minstens op een afstand MARGIN. Bedenk zelf tussen welke start en stop waarden de random horizontale positie van de fruit sprite dan moet zitten. Gebruik daarbij de onderstaande afbeelding.

../_images/margins.png

Test de juiste werking van de code voor de horizontale positie vóórdat je de verticale positie programmeert. Dan is de appel namelijk nog zichtbaar. Je kunt testen door aan de update() functie tijdelijk een regel toe te voegen waarin je init_fruit() aanroept. Daardoor wordt 60 keer per seconde de startpositie van de appel opnieuw ingesteld. Na het testen verwijder je deze aanroep weer.

# Update() functie
def update():
    # Keyboard events
    ...

    init_fruit()

Voor de verticale positie geef je de variabele fruit.bottom een zodanige waarde dat de sprite zich net boven de bovenrand van het venster bevindt, en dus nog niet zichtbaar is.

fruit.bottom = ...

Beweging#

Om de appel naar beneden te laten vallen, hoef je slechts één regel code aan de update() functie toe te voegen.

Opdracht 02

Voeg onder de huidige code in de update() functie een regel toe die de appel naar beneden laat bewegen met snelheid fruit.speed. Laat deze regel voorafgaan door een commentaarregel met toelichting.

# Update() functie
def update():
    # Keyboard events
    ...

    # Beweeg fruit
    ...

Als alles goed is gegaan, heb je nu een mandje dat kan bewegen en een appel die naar beneden valt. In het volgende deel ga je werken aan de score en het verliezen van levens.