Dieser Artikel ist der 14. Tagesartikel von Future Advent Calendar 2019. Der gestrige Artikel war von @RuyPKG Auch Neulinge wollen Spaß haben! ~ Vorbereitung der Protokolle ~.
Neulich stellte @shibukawa in einer internen Lernsitzung die Spiel-Engine vor, die der Grund für das Schreiben dieses Artikels war. Ich wollte eine Brettspiel-Benutzeroberfläche, die in Python implementiert ist, und es war schwierig, Bewegungen mit HTML-Ausdrücken auszudrücken. Deshalb habe ich mich für Pygame entschieden, eine Python-Spiel-Engine.
Eine plattformübergreifende Spiel-Engine, die auf Python ausgeführt werden kann. Wenn Sie den grafischen Teil des Spiels in Python schreiben können, ist dies sehr praktisch, da Sie die in Python geschriebene Spielelogik so wie sie ist einbetten können.
In Bezug auf dieses Pygame haben viele Leute, die Pygame kennen, möglicherweise gewechselt, da die Entwicklung 2009 vorübergehend eingestellt wurde und es eine Weile nicht mehr lief. Die Entwicklung für die Veröffentlichung von pygame2 wird jedoch 2019 aktiv sein, und diese Version von pygame2 wird voraussichtlich im nächsten Jahr veröffentlicht. Ab 2.0.0.dev6 wird auch python3.8 unterstützt und ich freue mich darauf. Ich denke, dass es in Zukunft Aufmerksamkeit erregen wird.
Wir werden mit dem Aufbau der Umgebung fortfahren, indem wir uns auf das offizielle Pygame Erste Schritte beziehen.
Installiere Pygame via Pip. Wenn Sie zu diesem Zeitpunkt die Version nicht angeben, wird die neueste stabile Version 1.9.6 enthalten sein. Seien Sie also vorsichtig. (1.9.6 unterstützt nur bis zu Python3.6)
pip install pygame==2.0.0.dev6
Viele Beispielspiele sind in Pygame enthalten. Lass es uns versuchen.
python -m pygame.examples.aliens
So etwas wie ein Invader-Spiel wurde ausgeführt! Eine Liste der Beispiele und welche Art von Spiel es gibt, finden Sie in README des Git-Beispielordners. Es ist also interessant, verschiedene Dinge auszuprobieren.
Während ich das Beispiel dekodiere, werde ich den Code selbst zeichnen. Dieses Mal werde ich ein Beispiel anstreben, das nur Zeichen in den Hintergrund schreibt.
Im Gegensatz zum statischen Bildschirm muss beim Zeichnen mit der Spiel-Engine der Bildschirm mit hoher Geschwindigkeit aktualisiert werden. Daher wird der Prozess wie folgt durchgeführt.
In der Spiel-Engine werden die auf dem Bildschirm angezeigten Objekte mithilfe von Sprites gezeichnet, sodass sie zum Zeitpunkt der Implementierung mithilfe einer Klasse gezeichnet werden, die die Sprite-Klasse erbt. Wenn Sie neugierig auf Sprites sind, schauen Sie sich diese an. Es ist interessant, weil es einen historischen Hintergrund wie die Geschichte der Hardware-Implementierung gibt, um das Zeichnen zu beschleunigen, aber ich denke, dass es kein besonderes Problem gibt, auch wenn Sie es nicht kennen.
import os
import pygame as pg
# game constants
SCREENRECT = pg.Rect(0, 0, 640, 480)
SCORE = 0
main_dir = os.path.split(os.path.abspath(__file__))[0]
def load_image(file):
""" loads an image, prepares it for play
"""
file = os.path.join(main_dir, "data", file)
try:
surface = pg.image.load(file)
except pg.error:
raise SystemExit('Could not load image "%s" %s' % (file, pg.get_error()))
return surface.convert()
class Score(pg.sprite.Sprite):
""" to keep track of the score.
"""
def __init__(self):
pg.sprite.Sprite.__init__(self)
self.font = pg.font.Font(None, 40)
self.font.set_italic(1)
self.color = pg.Color("white")
self.lastscore = -1
self.update()
self.rect = self.image.get_rect().move(10, 450)
def update(self):
""" We only update the score in update() when it has changed.
"""
if SCORE != self.lastscore:
self.lastscore = SCORE
msg = "Score: %d" % SCORE
self.image = self.font.render(msg, 0, self.color)
def main(winstyle=0):
pg.init()
# Set the display mode
winstyle = 0 # |FULLSCREEN
bestdepth = pg.display.mode_ok(SCREENRECT.size, winstyle, 32)
screen = pg.display.set_mode(SCREENRECT.size, winstyle, bestdepth)
# create the background, tile the bgd image
bgdtile = load_image("background.jpg ")
background = pg.Surface(SCREENRECT.size)
background.blit(bgdtile, (0, 0))
screen.blit(bgdtile, (0, 0))
pg.display.flip()
# Initialize Game Groups
all = pg.sprite.RenderUpdates()
# Create Some Starting Values
clock = pg.time.Clock()
global SCORE
if pg.font:
all.add(Score())
# Run our main loop whilst the player is alive.
while True:
all.clear(screen, background)
SCORE += 123456789
all.update()
# draw the scene
dirty = all.draw(screen)
pg.display.update(dirty)
# cap the framerate at 40fps. Also called 40HZ or 40 times per second.
clock.tick(40)
if __name__ == "__main__":
main()
Unter Daten muss ein Hintergrundbild (background.jpg) erstellt werden. Es ist etwas lang, aber wenn Sie das obige Beispiel ausführen, können Sie den Hintergrund zeichnen und die Zeichen wie unten gezeigt anzeigen.
Die Teile, die für die Spiel-Engine einzigartig sind, werden unten erklärt.
all = pg.sprite.RenderUpdates() #Erstellen einer Sprite-Gruppe
all.add(Score()) #Zur Sprite-Gruppe hinzufügen
all.update() #Massenaktualisierung der Sprite-Gruppe
all.draw(screen) #Sprite-Gruppe zeichnen
Pygame verfügt über eine Funktion, mit der Sie Sprites gruppieren können, sodass Sie alle Elemente des Bildschirms oder die Elemente einer bestimmten Gruppe (z. B. nur feindliche Charaktere) gleichzeitig aktualisieren und zeichnen können. .. Es gibt verschiedene Arten von Sprite-Gruppen, z. B. geordnete Gruppen und Gruppen für einzelne Sprites, und es ist am besten, sie je nach Zweck zu verwenden. Sie können die Liste unter Offizielle Dokumente überprüfen.
clock = pg.time.Clock() #Uhrengenerierung
clock.tick(40) #Verwenden der Uhr 1/Warten Sie auf die Verarbeitung, bis 40 Sekunden vergangen sind
Wenn Sie ein Objekt verschieben, müssen Sie warten, wenn der Vorgang zu früh abgeschlossen ist, um es unabhängig vom Gewicht des Prozesses mit derselben Geschwindigkeit zu verschieben. Um dies zu erreichen, verwendet Pygame ein Clock-Objekt. Erstellen Sie einfach ein Clock-Objekt und rufen Sie clock.tick () auf, und es wird für die Zeit entsprechend der Framerate aus dem vorherigen Aufruf in den Ruhezustand versetzt, was sehr praktisch ist.
Zusätzlich zu der diesmal eingeführten Zeichenfunktion Pygame
Es gibt verschiedene Funktionen wie. Es ist so praktisch, eine Benutzeroberfläche schreiben zu können, die in Python in Echtzeit aktualisiert wird, sodass ich nicht auf die offizielle Veröffentlichung von pygame2 warten kann!
Recommended Posts