pygame
Niezbędniki
Szukaj…
Rysunek i podstawowa animacja
Ten program rysuje kształty i witaj świecie! ”i pozwól obrazowi przejść do każdego rogu okna.
pełny kod:
import pygame,sys
from pygame.locals import *
pygame.init()
FPS = 30 #frames per second setting
fpsClock = pygame.time.Clock()
#set up the window
screen = pygame.display.set_mode((500,400), 0, 32)
pygame.display.set_caption('drawing')
#set up the colors
black = ( 0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = ( 0, 255, 0)
blue = ( 0, 0, 255)
imageImg = pygame.image.load('baddie.png')
imagex = 320
imagey = 220
direction = 'left'
fontObj = pygame.font.Font('freesansbold.ttf', 32)
text = fontObj.render('Hello World!', True, green, blue)
rect = text.get_rect()
rect.center = (200, 150)
# the main game loop
while True:
screen.fill(white)
# draw a green polygon onto the surface
pygame.draw.polygon(screen, green, ((146, 0), (291, 106), (236, 277), (56, 277), (0, 106)))
# draw some blue lines onto the surface
pygame.draw.line(screen, blue, (60, 60), (120, 60), 4)
pygame.draw.line(screen, blue, (120, 60), (60, 120))
pygame.draw.line(screen, blue, (60, 120), (120, 120), 4)
# draw a blue circle onto the surface
pygame.draw.circle(screen, blue, (300, 50), 100, 0)
# draw a red ellipse onto the surface
pygame.draw.ellipse(screen, red, (300, 250, 80,80), 1)
# draw a red rectangle onto the surface
pygame.draw.rect(screen,red, (200, 150, 100, 50))
# draw the text onto the surface
screen.blit(text, rect)
if direction == 'right':
imagex += 5
if imagex == 320:
direction = 'down'
elif direction == 'down':
imagey += 5
if imagey == 220:
direction = 'left'
elif direction == 'left':
imagex -= 5
if imagex == 20:
direction = 'up'
elif direction == 'up':
imagey -= 5
if imagey == 20:
direction = 'right'
screen.blit(imageImg, (imagex, imagey))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
fpsClock.tick(FPS)
konfigurowanie pygame i okna:
import pygame,sys
from pygame.locals import *
pygame.init()
#set up the window
screen = pygame.display.set_mode((500,400), 0, 32)
pygame.display.set_caption('drawing')
rysowanie białego tła:
W tej funkcji określasz kolor tła.
screen.fill(white)
rysowanie zielonego wielokąta:
Tutaj definiujesz powierzchnię wyświetlania, kolor i położenie każdego rogu wielokąta (współrzędne xiy), możesz to zrobić zgodnie z ruchem wskazówek zegara i przeciwnie do ruchu wskazówek zegara.
pygame.draw.polygon(screen, green, ((146, 0), (291, 106), (236, 277), (56, 277), (0, 106)))
rysowanie niebieskich linii:
W tej funkcji definiujesz powierzchnię wyświetlania, kolor, pierwszy i ostatni punkt oraz szerokość linii (jeśli nie podasz szerokości, to tylko 1).
pygame.draw.line(screen, blue, (60, 60), (120, 60), 4)
pygame.draw.line(screen, blue, (120, 60), (60, 120))
pygame.draw.line(screen, blue, (60, 120), (120, 120), 4)
rysowanie niebieskiego koła:
W tej funkcji określasz powierzchnię wyświetlania, kolor, pozycję, promień i szerokość koła (jeśli podajesz 0 dla szerokości, jest to zwykły okrąg).
pygame.draw.circle(screen, blue, (300, 50), 100, 0)
rysowanie elipsy:
W tej funkcji określasz powierzchnię wyświetlania, kolor, pozycję, rozmiar poziomy oraz rozmiar pionowy i szerokość.
pygame.draw.ellipse(screen, red, (300, 250, 80,80), 1)
rysowanie prostokąta:
W tej funkcji określasz powierzchnię wyświetlania, kolor, pozycję oraz rozmiar poziomy i pionowy.
pygame.draw.rect(screen,red, (200, 150, 100, 50))
definiowanie tekstu:
Najpierw definiujesz typ i rozmiar tekstu za pomocą tej funkcji:
fontObj = pygame.font.Font('freesansbold.ttf', 32)
Następnie definiujesz rzeczywisty tekst, jeśli tekst jest pogrubiony, kolor i, jeśli chcesz, kolor oznaczenia. Możesz to zrobić za pomocą tej funkcji:
text = fontObj.render('Hello World!', True, green, blue)
Jeśli chcesz zaznaczyć swój tekst, musisz powiedzieć pygame, że za pomocą tej funkcji:
rect = text.get_rect()
A jeśli chcesz zdefiniować pozycję środka tekstu, możesz to zrobić za pomocą tej funkcji:
rect.center = (200, 150)
rysowanie tekstu:
Jeśli zdefiniowałeś oznakowanie i / lub środek:
screen.blit(text, rect)
W przeciwnym razie musisz zdefiniować pozycję tekstu, więc narysuj tekst w ten sposób:
screen.blit(text, (100,50))
definiowanie obrazu:
Tutaj definiujesz, którego obrazu chcesz użyć (jeśli zrobisz to w ten sposób, plik obrazu musi znajdować się w tym samym katalogu co plik programu), pozycję początkową (xiy) oraz kierunek obrazu.
image = pygame.image.load('image.png')
baddiex = 320
baddiey = 220
direction = 'left'
animowanie obrazu:
Za pomocą tej części kodu sprawdzamy kierunek obrazu, jeśli osiągnie róg, jeśli tak, zmień kierunek, jeśli nie, narysuj obraz o 5 pikseli dalej w tym samym kierunku.
if direction == 'right':
imagex += 5
if imagex == 360:
direction = 'down'
elif direction == 'down':
imagey += 5
if imagey == 260:
direction = 'left'
elif direction == 'left':
imagex -= 5
if imagex == 20:
direction = 'up'
elif direction == 'up':
imagey -= 5
if imagey == 20:
direction = 'right'
screen.blit(imageImg, (imagex, imagey))
Uwaga: Mój obraz ma wymiary 20 x 20 pikseli, używam if imagex == 360:
i if imagey == 260:
ponieważ wtedy mój obraz znajduje się 20 pikseli od krawędzi okna, podobnie jak pozostałe 2 rogi. Jeśli obraz ma inny rozmiar, prawdopodobnie będziesz musiał zmienić te liczby.
sprawdzanie wyjścia:
Tutaj sprawdzamy, czy zamknąłeś okno gry, a jeśli tak, zamknij okno, jeśli nie napiszesz go gdzieś w swoim programie, prawdopodobnie nie będziesz mógł go zamknąć.
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
aktualizacja ekranu:
Dzięki tej funkcji aktualizujesz ekran, aby wszystko, co narysowałeś, stało się widoczne.
pygame.display.update()
Ustawienie FPS:
Dzięki tej funkcji każesz pygame spać wystarczająco, aby twoje ustawienia FPS były przestrzegane.
fpsClock.tick(FPS)
Korzystanie z PIL
Gdy musisz używać zarówno PIL, jak i Pygame, ponieważ brakuje w nich obu funkcji, potrzebujesz sposobu na konwersję między Pygame Surfaces i PIL Images, najlepiej bez zapisywania ich na dysku.
W tym celu można użyć funkcji „tostring” i „fromstring” zawartych w obu bibliotekach.
Konwersja PIL do Pygame:
strFormat = 'RGBA'
raw_str = image.tostring("raw", strFormat)
surface = pygame.image.fromstring(raw_str, image.size, strFormat)
Konwersja Pygame do PIL:
strFormat = 'RGBA'
raw_str = pygame.image.tostring(surface, strFormat, False)
image = Image.frombytes(strFormat, surface.get_size(), raw_str)