Der Autor stellt sich vor: Da Shuangge, Der kleine UP-Besitzer der Station b, 1 am 1 Programmierlehrer
In diesem Abschnitt werden die wichtigsten Punkte behandelt: Text, Grafiken, Tastatur- und Mausereignisse und dynamische Anzeige.
1. Implementieren Sie grundlegende Fenster
0 – Neue Datei erstellen
Neukonstruktion001.py
Text, Inhalt wie unten
import pygame
pygame.init() # pygame 初始化,必须有,且必须在开头
# 创建主窗体, (400,200)会将窗体长设置为400,高设置为200
win = pygame.display.set_mode((400,200))
Ich habe das Formular hier benannt
win
, was die Abkürzung vonwindow
(Fenster) ist.
In vielen Tutorials wird das Formular häufig alsscreen
bezeichnet.
Führen Sie es jetzt aus001.py
und Sie werden ein kleines Fenster finden, das blinkt.
Darüber hinaus müssen wir natürlich über diese Themen nachdenken
1 Wie pflege ich dieses Fenster?
Implementiert durch while-Schleife
Das heißt, fügen Sie am Ende zwei neue Zeilen hinzu
while True:
pass
2 So aktualisieren Sie
Eine einfache Schleife friert einfach die Schnittstelle ein. Wie kann ich sie aktualisieren?
Verwenden Sie die Anweisung pygame.display.update()
im Schleifenkörper, um die Schnittstelle zu aktualisieren
ändertwhile
die Schleife in
while True:
pygame.display.update()
3 Aktualisierungshäufigkeitsgrenze
- Wenn die Aktualisierungsfrequenz des Zyklus nicht kontrolliert wird, wird die Schnittstelle schnell aktualisiert und bleibt hängen. Was soll ich tun?
Pygame verfügt über ein spezielles Objektpygame.time.Clock
, mit dem die Häufigkeit der Zyklusaktualisierung gesteuert wird:
Erstellenpygame.time.Clock
Objekt,
ruft die Methodetick()
des Objekts auf. Der Funktionsparameter ist die Anzahl der Aktualisierungen pro Sekunde,
die festgelegt werden soll die Zykluszeit. Aktualisierungsfrequenz pro Sekunde, genannt Bildrate (FPS)
Weitere Details zu pygame.time.Clock finden Sie in der offiziellen Dokumentation unter https://www.pygame.org/docs/ref/time.html#pygame.time.Clock
ändertwhile
die Schleife in
# 用于控制循环刷新频率的对象
clock = pygame.time.Clock()
while True:
clock.tick(60) # 控制循环刷新频率,每秒刷新60次
pygame.display.update()
4 Grundfenster
Nachdem alles oben Genannte abgeschlossen ist001.py
Das Gesamtbild sieht wie folgt aus
import pygame
pygame.init() # pygame初始化,必须有,且必须在开头
# 创建主窗体, (400,200)会将窗体长设置为400,高设置为200
win = pygame.display.set_mode((400,200))
# 用于控制循环刷新频率的对象
clock = pygame.time.Clock()
while True:
clock.tick(60) # 控制循环刷新频率,每秒刷新60次
pygame.display.update()
Führen Sie dieses Mal aus001.py
, und Sie erhalten das einfachste Fenster.
Der Effekt ist wie folgt
Zu diesem Zeitpunkt gibt es ein weiteres Problem mit dem Fenster, nämlich dass die Schaltfläche zum Schließen nicht empfindlich ist und leicht hängen bleiben kann.
Wir werden uns später im Abschnitt über Tastatur- und Mausereignisse mit diesem Problem befassen.
Verwenden Sie zu diesem Zeitpunkt die laufende Beenden-Schaltfläche von Pycharm, um das Fenster zu beenden.
Schaltfläche „Beenden“ während der Ausführung: Wenn Sie das Programm ausführen, wird die Textaufforderungstop ...
angezeigt, wenn Sie mit der Maus über das rote Quadrat in der unteren linken Ecke fahren.
Das Schließen dieser Methode führt dazu, dass im Konsolenfenster ein Fehler gemeldet wird. Ignorieren Sie ihn daher vorerst.
2. Text anzeigen
1 Grundtext anzeigen
Das Zeichnen von Text erfordert normalerweise drei Schritte
- Schriftartobjekt erstellen
- Verwenden Sie Schriftartobjekte, um Textobjekte zu erstellen
- Platzieren Sie das Textobjekt irgendwo im Fenster
Kopieren Sie den ersten Teil der Codedatei und nennen Sie ihn 002a.py
,
, bevor Sie die Schleife while
hinzufügen Folgen Sie dem dreizeiligen Code, um den Text anzuzeigen.
# 新建字体对象,SysFont的第一个参数是字体名,设置为None会使用默认字体,
# 第二个参数是字体大小(尺寸size)
font = pygame.font.SysFont(None, 24)
# 用刚新建的字体对象,创建文本对象,
# render的第一个参数是文本(字符串类型),
# 第二个参数为是否设置光滑边缘,一般设置为True就好
# 第三个参数为文本颜色
text = font.render('hello world', True, "green")
# 将文本展示在指定位置,blit的第一个参数是文本对象,
# 第二个参数是坐标(左上角的横坐标,纵坐标)
win.blit(text, (40, 20))
Der Laufeffekt zu diesem Zeitpunkt ist wie folgt
Der dritte Parameter des Farbwerts
render
ist der Farbwert
. Es gibt viele Möglichkeiten, den Farbwert von Pygame zu schreiben, was sehr flexibel ist. < a i=3> Hier werden Zeichenfolgen verwendet, und hier sind einige häufig verwendete Farbnamen (es gibt viele vollständige, hier sind nur einige einfache, die man sich leicht merken kann)
[
# 红,橙,黄,绿,蓝,青,紫
"red", "orange", "yellow", "green", "blue", "cyan", "purple",
# 黑,灰,白
"black", "gray", "white"
]
2 Koordinaten
blit
Der zweite Parameter von sind die Koordinaten,
die Abszisse und Ordinate der oberen linken Ecke des zu zeichnenden Objekts, also (x, y).
Die Pygame-Schnittstelle verwendet die obere linke Ecke des gesamten Formulars als Ursprung.
Die horizontale rechte Richtung ist die positive x-Achsenrichtung und die vertikale nach unten Richtung ist die positive Richtung der y-Achse.
Erweitern Sie hier das obige Beispiel, zeichnen Sie noch ein paar Texte und zeigen Sie diese an verschiedenen Positionen an, um die entsprechenden Effekte zu spüren.
Fügen Sie den folgenden Code nach dem vorherigen Code hinzu (while
vor der Schleife)
text2 = font.render('hello world', True, "yellow")
text3 = font.render('hello world', True, "white")
win.blit(text2, (200, 20))
win.blit(text3, (40, 100))
Der Laufeffekt zu diesem Zeitpunkt ist wie folgt
Das Koordinatendiagramm sieht wie folgt aus
Fügen Sie hier eine Bildbeschreibung ein
Der vollständige Code lautet derzeit wie folgt (Kommentare entfernt)002.py
import pygame
pygame.init()
win = pygame.display.set_mode((400,200))
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 24)
text = font.render('hello world', True, "green")
win.blit(text, (40, 20))
text2 = font.render('hello world', True, "yellow")
text3 = font.render('hello world', True, "white")
win.blit(text2, (200, 20))
win.blit(text3, (40, 100))
while True:
clock.tick(60)
pygame.display.update()
3 Unterrichtsübungen
So zeigen Sie mehrzeiligen Text an
Zeigen Sie beispielsweise das folgende Gedicht an
I've saved the summer
And I give it all to you
To hold on winter mornings
When the snow is new
I've saved some sunlight
If you should ever need
A place away from darkness
Where your mind can feed
Dieses GedichtIch habe den Sommer gerettet stammt aus dem People's Education Press High-School-Wahlfach Englisch,
Ein Gedicht aus Einheit 2 Gedichte (sollte Seite 16 sein).
Der Text besteht aus insgesamt fünf Absätzen, die ersten beiden Absätze sind hier Auszüge.
Der ursprüngliche Autor des Gedichts ist Rod McKuen
Referenz: High School English Elective Six Electronic Textbook
Der Effekt nach dem Zeichnen ist wie folgt
Zwischen den beiden Absätzen gibt es eine zusätzliche Trennung (denken Sie darüber nach, wie mit dieser Trennung umgegangen wird).
Hier wird die Schriftart "Arial"
verwendet
Wenn nicht, verwenden Sie die vorherige Standardschriftart.
4 Tipps
Programmierdenken: Komplexes vereinfachen.
Wenn Sie auf wiederholte Vorgänge stoßen, überlegen Sie, wie Sie diese vereinfachen können.
Es ist sehr mühsam, die Schreibposition Zeile für Zeile festzulegen.
Prägnanter und effizienter ist die Verwendung einer Schleife.
。
。
。
。
。
。
Konkret werden mehrere Textzeilen in eine Liste eingefügt und der Text in einer Schleife aus der Liste abgerufen, während seine Position berechnet wird.
。
。
。
。
。
。
Wie geht man intelligenter mit der Trennung zwischen zwei Absätzen um?
Wenn Sie zwei Schleifen schreiben, ist das tatsächlich problematisch.
Es gibt auch ein Gefühl von Diskontinuität und Unterbrechung in der Logik.
。
。
。
。
。
。
Diejenige, die mehr trennt, wird als Leerzeile verstanden. Verwenden Sie eine leere Zeichenfolge, um eine Zeile zu belegen.
。
。
。
。
。
。
5 Referenzantworten
Neubaudatensatz002b.py
Wohnsitz
import pygame
pygame.init()
win = pygame.display.set_mode((350,350))
clock = pygame.time.Clock()
lines = [
"I've saved the summer",
"And I give it all to you",
"To hold on winter mornings",
"When the snow is new",
"",
"I've saved some sunlight",
"If you should ever need",
"A place away from darkness",
"Where your mind can feed",
]
font = pygame.font.SysFont("Arial", 24)
# 起始的横纵坐标
sx = 50 # 开头是对齐的,所以每行的横坐标都是这个
sy = 40 # 纵向是一行一行的,每行的纵坐标都要在这个基础上做计算
for i in range(len(lines)): # 遍历索引,以知道是哪一行
line = lines[i] # 通过索引取到对用的行
text = font.render(line, True, "white")
yi = sy + i * 30 # 计算对应的纵坐标,索引即行号,30是行高
win.blit(text, (sx, yi))
while True:
clock.tick(60)
pygame.display.update()
3. Tastatur- und Mausereignisse
1 Lösen Sie das Verzögerungsproblem
Im Allgemeinen gibt es keine Verzögerung, wenn Sie diese Fensterschließfunktion erneut implementieren.
Diese Funktion muss am Anfang importiert werden sys
, das heißt, am Anfang den folgenden Code hinzufügen
import sys
Fügen Sie dann den folgenden Code in den Schleifenkörper (den Anfang) ein.
# 获取所有事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 判断当前事件是否为点击右上角退出键
pygame.quit()
sys.exit() # 需要提前 import sys
Zu diesem Zeitpunkt wird die Benutzeroberfläche dieses spezielle Problem mit dem Feststecken nicht mehr haben.
Gleichzeitig kann die Schaltfläche „Schließen“ in der oberen rechten Ecke der Benutzeroberfläche normal funktionieren.
Durch Klicken auf die Schaltfläche in der oberen linken Ecke wird ein Ereignis vom Typ pygame.QUIT
generiert.
2 Tastenereignisse auf der Tastatur
Durch Drücken der Tastatur wird auch ein Ereignis vom Typ generiertpygame.KEYDOWN
Fügen Sie nach ein neues hinzu, um festzustellen, ob es sich um ein Schlüsselereignis handelt. Wenn ja, drucken Sie es aus aus < /span>. if
if
event
Kopieren Sie die vorherige002a.py
-Datei hierher und benennen Sie sie um in003a.py
.
Nach der Änderung sieht seine while
Schleife wie folgt aus
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 判断当前事件是否为点击右上角退出键
pygame.quit()
sys.exit() # 需要提前 import sys
if event.type == pygame.KEYDOWN:
print(event)
clock.tick(60)
pygame.display.update()
Drücken Sie zu diesem Zeitpunkta
,s
,d
, linke Pfeiltaste, rechte Pfeiltaste, Konsolenausgabe Wie folgt
<Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 4096, 'scancode': 4, 'window': None})>
<Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 4096, 'scancode': 22, 'window': None})>
<Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 4096, 'scancode': 7, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 1073741904, 'mod': 4096, 'scancode': 80, 'window': None})>
<Event(768-KeyDown {'unicode': '', 'key': 1073741903, 'mod': 4096, 'scancode': 79, 'window': None})>
Sie können sehen, dass jedes Ereignis unicode
, key
, mod
, scancode
, window
Diese Attribute.
Die ersten beiden sind wichtiger und die letzteren werden vorerst nicht benötigt.
unicode
: Schlüsseltext, also der entsprechende Buchstabe.
Funktionstasten haben keinen Text (also leere Zeichenfolgen)key
: Die Auswirkung der Schlüsselnummer (ID) ist relativ kompliziert, Sie müssen sich sie also nicht merken.
Es gibt einen einfachen Weg, damit umzugehen. Das werde ich tun Erklären Sie es bei Bedarf in Zukunft.
3 Eingabe und Anzeige
Hier können wir den Text der Schaltfläche anzeigen
Den Originaltext zeichnen und löschen"hello world"
,
print
Die Ausgabe wird geändert, um den durch den Tastendruck eingegebenen Text zu zeichnen.
Nach Renovierungsarbeiten003a.py
Wie unten
import pygame
import sys
pygame.init()
win = pygame.display.set_mode((400,200))
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 24)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 判断当前事件是否为点击右上角退出键
pygame.quit()
sys.exit() # 需要提前 import sys
if event.type == pygame.KEYDOWN:
text = font.render(event.unicode, True, "green")
win.blit(text, (40, 20))
clock.tick(60)
pygame.display.update()
Drücken Sie zu diesem Zeitpunkt auf den Buchstaben und der neue Buchstabe wird auf dem Formular angezeigt.
Zu diesem Zeitpunkt tritt ein neues Problem auf: Wenn Sie die Tasten weiterhin drücken, werden die Buchstaben überlappend gezeichnet, was das klare Sehen erschwert.
4 Aktualisieren Sie den Hintergrund
Wenn wir möchten, dass der Inhalt an derselben Position nicht überschrieben wird, müssen wir den zuvor gezeichneten Inhalt bereinigen.
Dies erfordert häufig eine Aktualisierung des Hintergrunds.
Die Hintergrundaktualisierung von Pygame erfolgt durch Neuzeichnen des Hintergrunds zu Beginn jedes Zyklus.
Jede Zeichnung überschreibt den zuvor gezeichneten Inhalt, sodass der Inhalt möglicherweise neu gezeichnet werden muss.
Der Code zum Festlegen des Hintergrunds ist sehr einfach.
Verwenden Sie einfach die Methode fill
für das Formularobjekt,
der einen Parameter erhält, nämlich den Hintergrundfarbwert.
win.fill("black")
Es sollte jedoch beachtet werden, dass die Platzierung dieses Codes an verschiedenen Orten unterschiedliche Auswirkungen hat.
wird vor der while-Schleife platziert, was bedeutet, dass der Hintergrund nur einmal gezeichnet wird und durch später gezeichnete Dinge verdeckt wird.
Wenn es in einer While-Schleife platziert wird, wird der Hintergrund für jeden Frame gezeichnet und der Inhalt des vorherigen Frames wird für jeden Frame gelöscht. Es wird im Allgemeinen verwendet, um Elemente zu überschreiben, die Sie möchten löschen.
Auch die Position, die wir hier setzen, ist sehr speziell. Sie muss am Anfang des Schlüsselurteils stehen.
Das heißt, nach if event.type == pygame.KEYDOWN:
und nach dem Hinzufügen lautet das Urteil wie folgt
if event.type == pygame.KEYDOWN:
win.fill("black")
text = font.render(event.unicode, True, "green")
win.blit(text, (40, 20))
An dieser Stelle können Sie einen Buchstaben drücken, um einen Buchstaben anzuzeigen.
Wenn wir es am Anfang der gesamten
while
-Schleife platzieren, erscheint der Buchstabe der Schaltfläche nur für einen Moment, da das Urteil nur einmal gefällt wird, wennif
wird einmal gedrückt. Dadurch wird nur ein Frame angezeigt und der nächste Frame wird überschrieben und aktualisiert.
5 Wörter-Schreibübungen
Im obigen Beispiel wird bei der Eingabe eines Buchstabens ein Buchstabe angezeigt und der vorherige Buchstabe verschwindet.
Jetzt hoffe ich, dass alle eingegebenen Buchstaben zusammen angezeigt werden,
wenn man zum Beispiel ständig auf der Tastatur drückt "w
, < a i=4>, , . sind auf dem Bildschirm zu sehen (Wie unten gezeigt). Und jedes Mal, wenn Sie eine weitere Buchstabentaste drücken, wird ein weiterer Buchstabe auf dem Bildschirm angezeigt"o"
"r"
"d"
word
Diese Übung ist sehr einfach, daher werden keine Eingabeaufforderungen gegeben.
(Machen Sie dieses Problem nicht kompliziert)
。
。
。
。
。
。
6 Referenzantworten
Erläuterung der Ideen:
- Erstellen Sie beispielsweise eine neue String-Variable und benennen Sie sie
word
- Jede Buchstabentaste wird gedrückt, um der Zeichenfolge Buchstaben hinzuzufügen
word
- Aktualisieren Sie den Bildschirm, um die Zeichenfolge anzuzeigen
word
Yogo003b.py
Nyoge
import pygame
import sys
pygame.init()
win = pygame.display.set_mode((400,200))
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 24)
# 1. 新建一个字符串变量
word = ""
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
# 2. 每按一个字母按键,将字母添加到字符串`word`中
word += event.unicode
# 3. 刷新屏幕,展示字符串`word`
win.fill("black")
text = font.render(word, True, "green")
win.blit(text, (40, 20))
clock.tick(60)
pygame.display.update()
Einige Schüler möchten möglicherweise die Buchstaben des Wortes einzeln zeichnen.
Das würde das Problem unnötig verkomplizieren.
Es ist nicht so, dass es nicht realisiert werden kann, aber es wird zu viel zusätzlichen Aufwand erfordern.
Es ist auch schwierig, darüber zu sprechen.
4. Zeichnen Sie die Kacheln
Neben der Anzeige von Text ist das Zeichnen verschiedener Grafiken am häufigsten.
Tatsächlich wird die Anzeige von Text und Grafiken als Zeichnen betrachtet, und einige Syntaxen haben dies auch getan Ähnlichkeiten.
1 Grundlegende Blockzeichnung
- Zeichnen Sie ein Rechteck
# 新建矩形
rect1 = pygame.Rect(100, 20, 200, 60)
# 绘制矩形
pygame.draw.rect(win, "red", rect1)
DavonRect(left, top, width, height)
akzeptiert vier Parameter,
die Abszisse und Ordinate des oberen linken Scheitelpunkts, die Breite des Rechtecks und die Höhe des Rechtecks.
kann auch in der Form Rect((left, top), (width, height))
geschrieben werden.
pygame.draw.rect(surface, color, rect)
Beim Empfang von drei Parametern
Der erste Parameter gibt an, auf welcher Schnittstelle gezeichnet werden soll
Der zweite Parameter gibt die Farbe an, in der gezeichnet werden soll
Der dritte Parameter ist ein rechteckiges Objekt.
- Zeichne einen Kreis
# 绘制圆形
pygame.draw.circle(win, "blue", (100, 150), 50)
pygame.draw.circle(surface, color, center, radius)
Wenn vier Parameter empfängt
, haben die ersten beiden Parameter die gleiche Bedeutung wie pygame.draw.rect
und der dritte Parameter
Geben Sie die Koordinaten des Kreismittelpunkts an (ein Tupel bestehend aus horizontalen und vertikalen Koordinaten)
Der vierte Parameter gibt den Radius des Kreises an
- Dreiecke zeichnen
pygame
Es gibt keine spezielle Methode zum Zeichnen von Dreiecken, aber es gibt Methoden zum Zeichnen von Polygonen.
Hier behandeln wir Dreiecke als Polygone mit drei Scheitelpunkte. Das ist es.
# 三个顶点的横纵坐标
points = [
(300, 100),
(250, 200),
(350, 200),
]
# 用三个顶点去绘制多边形,即可得到三角形
pygame.draw.polygon(win, "green", points)
pygame.draw.polygon(surface, color, points)
Der dritte Parameter gibt die Scheitelpunktkoordinaten des Polygons an,
Das Format ist im Allgemeinen eine Liste, jedes Element in der Liste ist eine Scheitelpunktkoordinate des Polygons, < a i =2> Es gibt mehrere Scheitelpunkte, und wenn sie gezeichnet werden, handelt es sich um Polygone.
- Zeichnen Sie Liniensegmente
# 指定起点与终点的坐标
start = (100, 240)
end = (300, 240)
# 根据起点与终点坐标绘制线段
pygame.draw.line(win, "white", start, end)
pygame.draw.line(surface, color, start_pos, end_pos)
Der dritte Parameter sind die Startpunktkoordinaten und der vierte Parameter sind die Endpunktkoordinaten.
- Vollständiger Code
Der vollständige Code zu diesem Zeitpunkt004a.py
ist wie folgt
import pygame
import sys
pygame.init()
win = pygame.display.set_mode((400,300))
clock = pygame.time.Clock()
# 新建矩形
rect1 = pygame.Rect(100, 20, 200, 60)
# 绘制矩形
pygame.draw.rect(win, "yellow", rect1)
# 绘制圆形
pygame.draw.circle(win, "blue", (100, 150), 50)
# 三个顶点的横纵坐标
points = [
(300, 100),
(250, 200),
(350, 200),
]
# 用三个顶点去绘制多边形,即可得到三角形
pygame.draw.polygon(win, "green", points)
# 指定起点与终点的坐标
start = (100, 240)
end = (300, 240)
# 根据起点与终点坐标绘制线段
pygame.draw.line(win, "white", start, end)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
clock.tick(60)
pygame.display.update()
Der Zeicheneffekt ist wie folgt
Das Koordinatenbeschreibungsdiagramm sieht wie folgt aus
- Breite angeben
Die oben genannten vier Zeichenfunktionen
pygame.draw.rect(surface, color, rect)
pygame.draw.circle(surface, color, center, radius)
pygame.draw.polygon(surface, color, points)
pygame.draw.line(surface, color, start_pos, end_pos)
können auch erweiterte Parameter angebenwidth
, < a i=4> Wenn angegeben, wird die Form zu einem Rand, d. h. es erfolgt keine Polsterung.
Fügen Sie im vorherigen Code am Ende der Klammern jeder Zeichenfunktion, width=5
hinzu, und der Zeicheneffekt ist wie folgt.
2 Zeichenübungen
Nutzen Sie das oben erlernte Wissen, um die folgende Grafik zu zeichnen
Der Hintergrund hier verwendet"lavender"
die Farbe (Lavendel).
Tatsächlich können Sie frei mit Farbe und Größe spielen. Der Hauptzweck besteht darin, die Berechnung von Koordinaten zu üben.
3 Tipps
Verwenden Sie die obere linke Ecke als Mittelpunkt des Kreises, horizontal nach rechts als positive x-Achsenrichtung
Vertikal nach unten als positive y-Achsenrichtung, erstellen Sie eine Ebene rechteckiges Koordinatensystem zur Berechnung der Koordinaten.
。
。
。
。
。
。
4 Referenzantworten
Das Koordinatenberechnungsdiagramm sieht wie folgt aus
Yogo004b.py
Nyoge
import pygame
import sys
pygame.init()
win = pygame.display.set_mode((400,350))
clock = pygame.time.Clock()
win.fill("lavender")
# 绘制屋顶
points = [
(200, 50),
(60, 150),
(340, 150),
]
pygame.draw.polygon(win, "black", points)
# 绘制房子主体(大矩形)
rect1 = pygame.Rect(100, 150, 200, 150)
pygame.draw.rect(win, "black", rect1, width=5)
# 绘制门(小矩形)
rect2 = pygame.Rect(180, 220, 40, 80)
pygame.draw.rect(win, "black", rect2)
# 绘制窗户
pygame.draw.circle(win, "black", (140, 200), 30, width=5)
pygame.draw.circle(win, "black", (260, 200), 30, width=5)
# 绘制地平线
start = (0, 300)
end = (400, 300)
pygame.draw.line(win, "black", start, end, width=5)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
clock.tick(60)
pygame.display.update()
5. Mausereignisse
1 Grundlegende Einführung
Es gibt drei Arten von Mausereignissen (bitte hinzufügen pygame.
, bevor Sie sie verwenden)
- MAUSEMOTION: Mausbewegung
- MOUSEBUTTONUP: Maus (nach dem Drücken) wird losgelassen (springt nach oben)
- MOUSEBUTTONDOWN: Maus gedrückt
Häufig verwendete Attribute für diese drei Arten von Ereignissen sind:
- pos: die Position der Maus, genauer gesagt ein Tupel bestehend aus horizontalen und vertikalen Koordinaten
Attribute, die nur in den letzten beiden vorhanden sind
(MOUSEBUTTONUP und MOUSEBUTTONDOWN haben sie, MOUSEMOTION nicht)
- Schaltfläche: entsprechende Schaltfläche.
MOUSEMOTION, Mausbewegung kann nicht einer einzelnen Taste zugeordnet werden.
Das ist immer noch etwas abstrakt und schwer zu verstehen. Nehmen wir ein Beispiel.
2 Mausklicks
Hier ist ein kleines Beispiel eines Mausklicks und der Konsole, die die Mauskoordinaten anzeigt.
Die Benutzeroberfläche sieht komplett schwarz aus und es wird nichts anderes angezeigt oder gezeichnet.
import pygame
import sys
pygame.init()
win = pygame.display.set_mode((400,300))
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
print(event.pos)
clock.tick(60)
pygame.display.update()
Wenn Sie zu diesem Zeitpunkt mit der linken Maustaste klicken (eigentlich gilt das Gleiche auch für das Klicken mit der rechten Maustaste), sehen Sie, dass die Konsole ein Datentupel ausgibt (ein Klick gibt eines aus). Dieses Tupel ist die Position der Maus beim Klicken.
Ich habe dreimal geklickt und die Konsolenausgabe ist wie folgt
(165, 141)
(61, 98)
(261, 125)
Tatsächlich besteht der neue Code darin nur aus zwei Zeilen
if event.type == pygame.MOUSEBUTTONDOWN:
print(event.pos)
3 Rasterübungen
Zeichnen Sie ein kleines Quadrat in die Schnittstelle (die Größe ist beliebig, füllen Sie die Schnittstelle nur nicht aus)
Bestimmen Sie, ob die Maus in das Quadrat fällt
Quadrat Platzieren Sie einen Text unter dem Feld.
Wenn sich die Maus im Feld befindet, wird der Text angezeigt."in"
Wenn sich die Maus nicht im Feld befindet, Der Text wird angezeigt"out"
Der Referenzeffekt ist wie unten dargestellt
Diese Übung ist schwieriger als die vorherigen.
Sie kann auch als außerschulische Übung durchgeführt werden
4 Ideenanalyse
- Zeichne ein Rechteck
- Bestimmen Sie in der Schleife, ob der Ereignistyp ist
MOUSEBUTTONDOWN
und berechnen Sie dann, ob die Koordinaten im Rechteck liegen - Aktualisieren Sie die Benutzeroberfläche (setzen Sie den Hintergrund zurück) und zeichnen Sie Rechtecke und Text
5 Referenzantworten
Yogo005b.py
Nyoge
import pygame
import sys
pygame.init()
win = pygame.display.set_mode((400,300))
clock = pygame.time.Clock()
# 画矩形
left, top, width, height = 100, 50, 200, 100
rect1 = pygame.Rect(left, top, width, height)
# 建立字体
font = pygame.font.SysFont(None, 24)
# 建立显示对应的文本字符串
info = "out"
while True:
# 刷新界面(重置背景)
win.fill("black")
pygame.draw.rect(win, "yellow", rect1)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 判断事件类型
if event.type == pygame.MOUSEMOTION:
px, py = event.pos
# 判断坐标是否在矩形中
if left <= px <= left + width and top <= py <= top + height:
info = "in"
else:
info = "out"
# 绘制文本与矩形
text = font.render(info, True, "green")
win.blit(text, (150, 200))
clock.tick(60)
pygame.display.update()
6. Übungen nach dem Unterricht
1 Zeilenweise Anzeige
In der kleinen Übung oben zeigen wir ein englisches Gedicht.
Hier werden wir also eine weitere Textanzeige chinesischer Poesie erstellen,
Aber die Poesie wird Zeile für Zeile, Schritt für Schritt angezeigt.
(Klicken Sie mit der Maus, um die nächste Zeile anzuzeigen)
Das Gedicht lautet wie folgt:
竹枝词
唐·刘禹锡
山桃红花满上头,
蜀江春水拍山流。
花红易衰似郎意,
水流无限似侬愁。
Der fertige Anzeigeeffekt ist wie folgt
Die Schriftart hier ist kursiv"kaiti"
Die Hintergrundfarbe ist die vorherige Lavendelfarbe"lavender"
Die Textfarbe ist Rot"red"
Die Länge und Breite des Fensters beträgt 300 und die Schriftgröße beträgt 24.
Diese können auch flexibel an die eigenen Bedürfnisse angepasst werden.
In der Mitte von befindet sich eine Trennlinie. Es ist keine besondere Verarbeitung erforderlich. Sie können noch ein- oder zweimal klicken.
Für die chinesische Anzeige ist eine entsprechende Schriftartenunterstützung erforderlich. Wenn Sie feststellen, dass die Schriftart auf Ihrem Computer dies nicht unterstützt,
können Sie das vorherige englische Gedicht verwenden.
Um eine ansprechende Wirkung zu erzielen, ist das Design hier mittig ausgerichtet. Die zentrierte Ausrichtung ist etwas kompliziert.
Hier sind einige Tipps zur Mitte -alignment
Wenn Sie es unverständlich oder problematisch finden, können Sie es in Ruhe lassen. Sie können es auch linksbündig mit den vorherigen englischen Gedichten ausrichten.
Tipps zur zentrierten Ausrichtung
Für durch Schriftarten gerenderte Textobjekterender
kann
verwendet werden < a i=4>Methode zum Ermitteln der Länge und Höhe des Textesget_size()
text = font.render(line, True, "red")
text_width, text_height = text.get_size()
Überlegen Sie, wie Sie die Mittenausrichtung berechnen müssen
2-Quadrat-Klickanzahl
Implementierung einer Klickzählfunktion, da im vorherigen Teil 5 eine Quadratübung implementiert wurde,
Es ist zu einfach, hier ein einzelnes Quadrat zu implementieren< a i =2> Daher ist es etwas schwieriger, die Klickzahl von drei Quadraten zu erreichen.
Das ist wie unten gezeigt
Zeichnen Sie drei Quadrate, ich habe hier Lila, Grün und Gelb gewählt
Der Text unten zeichnet die Anzahl der Klicks auf das Quadrat auf (hier müssen Sie sich keine Gedanken über die linke und rechte Maustaste machen). , sie zählen alle),
Im Bild wurde fünfmal auf das violette Quadrat, zwölfmal auf das grüne Quadrat und nullmal auf das gelbe Quadrat geklickt.
-
Wenn Sie der Meinung sind, dass drei Blöcke etwas kompliziert sind, können Sie zuerst einen implementieren und ihn dann auf drei erweitern.
-
Fortgeschrittenes Denken (Schwierigkeit): Überlegen Sie, wie Sie eine Schleife implementieren, die geschrieben werden kann, um die Erweiterung der Anzahl der Quadrate zu erleichtern. wie zum Beispiel die Erweiterung auf 5 oder 7 oder sogar 9.
(Nach der Implementierung müssen Sie nur ein paar Codes ändern, um mehr anzuzeigen)
Es wird empfohlen, dass Sie fortgeschrittenes Denken ausprobieren, nachdem Sie die Basisversion implementiert haben.
Mehr Farben
https://www.pygame.org/docs/ref/color_list.html