Schuss auslösen
Ein Geschoss ist ein Aktor, der sich nicht von Anfang an bewegt. Der Aktor muss sich somit merken, ob er schon «existiert». Dies kann erreicht werden, indem eine Variable geschoss.aktiv
definiert wird:
geschoss = Actor("laser")
geschoss.aktiv = False
Der Schuss wird nur gezeichnet, wenn er aktiv ist:
def draw():
if geschoss.aktiv:
geschoss.draw()
Wenn der Schuss ausgelöst wird, wird er «aktiviert». Der Schuss wird an die Stelle gesetzt, wo sich das Objekt befindet, welches den Schuss abgibt:
def schiesse():
geschoss.x = raumschiff.x
geschoss.y = raumschiff.y
geschoss.vx = 2
geschoss.vy = 0
geschoss.aktiv = True
Schussrichtung
Damit sich der Schuss in die richtige Richtung bewegt, müssen die horizontale und vertikale Geschwindigkeit des Geschosses und ausgerechnet werden. Bekannt sind die gewünschte Geschwindigkeit und der Winkel :
Im rechtwinkligen Dreieck können nun und mit den trigonometrischen Formeln berechnet werden:
Um die trigonometrischen Funktionen in Python verwenden zu können, muss das Modul math
importiert werden:
import math
Ausserdem muss der Richtungswinkel des Raumschiffs von Grad nach Radiant umgerechnet werden:
a = math.radians(raumschiff.angle)
Nun können die trigonometrischen Formeln umgesetzt werden. Es muss beachtet werden, dass in Pygame Zero im Gegensatz zur Mathematik die y-Achse nach unten zeigt. Deshalb wird der Wert von negiert.
geschoss.vx = v * math.cos(a)
geschoss.vy = -v * math.sin(a)
Vollständiges Beispiel
import pgzrun
import math
WIDTH = 1600
HEIGHT = 1200
hintergrund = Actor("weltraum")
raumschiff = Actor("raumschiff")
raumschiff.x = WIDTH / 2
raumschiff.y = HEIGHT / 2
geschoss = Actor("laser")
geschoss.vx = 0
geschoss.vy = 0
geschoss.aktiv = False
def draw():
hintergrund.draw()
raumschiff.draw()
if geschoss.aktiv:
geschoss.draw()
def schiesse():
geschoss.aktiv = True
geschoss.x = raumschiff.x
geschoss.y = raumschiff.y
geschoss.angle = raumschiff.angle
a = math.radians(raumschiff.angle)
v = 3
geschoss.vx = v * math.cos(a)
geschoss.vy = -v * math.sin(a)
def on_key_down(key):
if key == keys.SPACE:
schiesse()
def update():
geschoss.x = geschoss.x + geschoss.vx
geschoss.y = geschoss.y + geschoss.vy
if keyboard.a:
raumschiff.angle = raumschiff.angle + 2
if keyboard.d:
raumschiff.angle = raumschiff.angle - 2
pgzrun.go()
Geschoss