Sprint 7 ยท Methodes & self  ยท  US3: Methodes die het spel besturen

Als gamedeveloper, wil ik dat mijn speler, kogels en vijanden zichzelf besturen via methodes met parameters en returnwaarden, zodat de engine alleen nog de methodes hoeft aan te roepen.

Taak 2: Een kogel maken, een grens bewaken

Een methode kan twee dingen goed doen: een nieuw object maken en teruggeven, en een grens bewaken. Je gebruikt beide voor je speler: shoot() geeft een kogel terug en move() houdt de speler binnen het scherm.

Een methode die een nieuw object teruggeeft

Een methode kan een nieuw object maken en teruggeven met return. Elke aanroep levert een vers object op, los van alle andere.

class Label:
    def __init__(self, text):
        self.text = text


class Printer:
    def __init__(self):
        self.count = 0

    def make_label(self, text):
        self.count += 1
        return Label(text)        # een NIEUW Label, elke keer


printer = Printer()
a = printer.make_label("hi")
b = printer.make_label("hi")
print(a is b)         # False: twee verschillende objecten
print(printer.count)  # 2
De methode is een fabriek. De aanroeper bewaart het resultaat in een variabele. Gooit hij het weg, dan is het nieuwe object ook weg.

Zie een fabriek werken

>>> Oefenomgeving: Python REPL Simulator

Maak objecten en laat een waarde tegen een grens aanlopen.

  1. printer = Printer()
  2. a = printer.make_label("hi") โ€” de methode geeft een Label terug.
  3. b = printer.make_label("hi") โ€” nog een.
  4. a.text โ€” wat staat erin?
  5. a is b โ€” zijn het dezelfde objecten?
  6. printer.count โ€” hoeveel labels zijn er gemaakt?
  7. slider = Slider()
  8. slider.move(70)
  9. slider.move(70) โ€” nog eens. Wat verwacht je?
  10. slider.value โ€” waar blijft hij staan?
Python 3.11 REPL Simulator ยท typ een commando en druk op Enter. # class Label: def __init__(self, text): self.text = text # class Printer: make_label(text) geeft een nieuw Label terug # class Slider: move(step) houdt value tussen 0 en 100
>>> 
๐Ÿงฉ

Jouw opdracht: Player.shoot() en Player.move(direction, width)

Je speler krijgt twee nieuwe vaardigheden. Hij maakt zelf een kogel en hij blijft binnen het scherm. Je hebt twee classes nodig. Zet elke class in een eigen bestand, zoals je in sprint 6 zag. Je testscript komt in main.py.

  1. Maak in bullet.py een class Bullet met __init__(self, x, y) en de attributen self.x, self.y, self.width = 6, self.height = 12 en self.color = (255, 220, 0).
  2. Maak in player.py een class Player met __init__(self, x, y) en de attributen x, y, width = 40, height = 20 en speed = 5.
  3. Schrijf shoot(self). De methode maakt een nieuwe Bullet en geeft die terug. De kogel staat midden boven de speler: het midden van de speler min de halve breedte van de kogel, en self.y min de hoogte van de kogel.
  4. Schrijf move(self, direction, width). De speler verschuift met direction maal self.speed en blijft tussen 0 en width - self.width.
  5. Test in main.py: een speler op x = 0 die naar links gaat, een speler op x = 450 die naar rechts gaat (schermbreedte 480), en twee keer shoot().

Acceptatiecriteria

  • Player(220, 580).shoot() geeft een Bullet met x == 237 en y == 568.
  • Twee aanroepen van shoot() geven twee verschillende objecten (a is not b).
  • Player(0, 580).move(-1, 480) laat x == 0.
  • Player(450, 580).move(1, 480) geeft x == 440 (480 - 40).
  • De schermbreedte komt binnen via de parameter width, niet als vast getal in de methode.
  • Bullet en Player staan in eigen bestanden; player.py en main.py importeren wat ze nodig hebben.