Zum Hauptinhalt springen

Geschoss

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 vxv_x und vyv_y ausgerechnet werden. Bekannt sind die gewünschte Geschwindigkeit vv und der Winkel aa:

Im rechtwinkligen Dreieck können nun vxv_x und vyv_y mit den trigonometrischen Formeln berechnet werden:

vx=vsin(a)vy=vcos(a)v_x = v \cdot \sin(a)\qquad v_y = v \cdot \cos(a)

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 vyv_y 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()