Dashuang Pygame Einführungs-Tutorial Abschnitt 1 Grundkenntnisse

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.pyText, Inhalt wie unten

import pygame

pygame.init() # pygame 初始化,必须有,且必须在开头

# 创建主窗体, (400,200)会将窗体长设置为400,高设置为200
win = pygame.display.set_mode((400,200))

Ich habe das Formular hier benanntwin, was die Abkürzung von window (Fenster) ist.
In vielen Tutorials wird das Formular häufig als screen 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 Objekt pygame.time.Clock, mit dem die Häufigkeit der Zyklusaktualisierung gesteuert wird:
    Erstellen pygame.time.Clock Objekt,
    ruft die Methode tick() 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.pyDas 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

Fügen Sie hier eine Bildbeschreibung ein

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 Textaufforderung stop ... 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

  1. Schriftartobjekt erstellen
  2. Verwenden Sie Schriftartobjekte, um Textobjekte zu erstellen
  3. 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

Fügen Sie hier eine Bildbeschreibung ein

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

blitDer 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

Fügen Sie hier eine Bildbeschreibung ein

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

Fügen Sie hier eine Bildbeschreibung ein

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.pyWohnsitz

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>. ifif
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, windowDiese 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",
printDie Ausgabe wird geändert, um den durch den Tastendruck eingegebenen Text zu zeichnen.

Nach Renovierungsarbeiten003a.pyWie 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, wenn if 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

Fügen Sie hier eine Bildbeschreibung ein

Diese Übung ist sehr einfach, daher werden keine Eingabeaufforderungen gegeben.
(Machen Sie dieses Problem nicht kompliziert)






6 Referenzantworten

Erläuterung der Ideen:

  1. Erstellen Sie beispielsweise eine neue String-Variable und benennen Sie sieword
  2. Jede Buchstabentaste wird gedrückt, um der Zeichenfolge Buchstaben hinzuzufügenword
  3. Aktualisieren Sie den Bildschirm, um die Zeichenfolge anzuzeigenword

Yogo003b.pyNyoge

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
    pygameEs 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.pyist 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

Fügen Sie hier eine Bildbeschreibung ein

Das Koordinatenbeschreibungsdiagramm sieht wie folgt aus

Fügen Sie hier eine Bildbeschreibung ein

  • 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.

[Die Übertragung des externen Link-Bildes ist fehlgeschlagen. Die Quellseite verfügt möglicherweise über einen Anti-Leeching-Mechanismus. Es wird empfohlen, das Bild zu speichern und direkt hochzuladen (img-4JlcMY7x-1681531382992)(../imgs/1/9.png)]

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.pyNyoge

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

Fügen Sie hier eine Bildbeschreibung ein

Diese Übung ist schwieriger als die vorherigen.
Sie kann auch als außerschulische Übung durchgeführt werden

4 Ideenanalyse
  1. Zeichne ein Rechteck
  2. Bestimmen Sie in der Schleife, ob der Ereignistyp istMOUSEBUTTONDOWN und berechnen Sie dann, ob die Koordinaten im Rechteck liegen
  3. Aktualisieren Sie die Benutzeroberfläche (setzen Sie den Hintergrund zurück) und zeichnen Sie Rechtecke und Text
5 Referenzantworten

Yogo005b.pyNyoge

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

Fügen Sie hier eine Bildbeschreibung ein

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

Fügen Sie hier eine Bildbeschreibung ein

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.

  1. Wenn Sie der Meinung sind, dass drei Blöcke etwas kompliziert sind, können Sie zuerst einen implementieren und ihn dann auf drei erweitern.

  2. 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

Ich denke du magst

Origin blog.csdn.net/python1639er/article/details/130168175
Empfohlen
Rangfolge