pygame
De essentiële dingen
Zoeken…
Tekening en een basisanimatie
Dit programma tekent enkele vormen en ' hallo wereld! en laat een afbeelding naar elke hoek van het venster gaan.
de volledige code:
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)
pygame en het venster instellen:
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')
de witte achtergrond tekenen:
In deze functie definieert u de kleur van de achtergrond.
screen.fill(white)
de groene veelhoek tekenen:
Hier definieert u het weergaveoppervlak, de kleur en de positie van elke hoek van de polygoon (x- en y-coördinaten), u kunt dat met de klok mee en tegen de klok in doen.
pygame.draw.polygon(screen, green, ((146, 0), (291, 106), (236, 277), (56, 277), (0, 106)))
de blauwe lijnen tekenen:
In deze functie definieert u het weergaveoppervlak, de kleur, het eerste en het laatste punt en de breedte van de lijn (als u geen breedte opgeeft, is dit slechts 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)
de blauwe cirkel tekenen:
In deze functie definieert u het weergaveoppervlak, de kleur, de positie, de straal en de breedte van de cirkel (als u een 0 geeft voor de breedte, is dit een gewone cirkel).
pygame.draw.circle(screen, blue, (300, 50), 100, 0)
de ellips tekenen:
In deze functie definieert u het weergaveoppervlak, de kleur, de positie, de horizontale grootte en de verticale grootte en de breedte.
pygame.draw.ellipse(screen, red, (300, 250, 80,80), 1)
de rechthoek tekenen:
In deze functie definieert u het weergaveoppervlak, de kleur, de positie en de horizontale en verticale grootte.
pygame.draw.rect(screen,red, (200, 150, 100, 50))
het definiëren van de tekst:
Eerst definieert u het type en de grootte van uw tekst met deze functie:
fontObj = pygame.font.Font('freesansbold.ttf', 32)
Vervolgens definieert u de eigenlijke tekst, als de tekst vetgedrukt is, de kleur en, indien gewenst, de kleur van de markering. U kunt dat doen met deze functie:
text = fontObj.render('Hello World!', True, green, blue)
Als je je tekst wilt markeren, moet je pygame dat vertellen met deze functie:
rect = text.get_rect()
En als u de positie van het midden van de tekst wilt definiëren, kunt u dat doen met deze functie:
rect.center = (200, 150)
de tekst tekenen:
Als u een markering en / of het midden hebt gedefinieerd:
screen.blit(text, rect)
Anders moet u de positie van de tekst definiëren, dus teken de tekst op deze manier:
screen.blit(text, (100,50))
het definiëren van de afbeelding:
Hier definieert u welke afbeelding u wilt gebruiken (als u het op deze manier doet, moet de afbeelding in dezelfde map staan als uw programmabestand), de startpositie (x en y) en de richting van de afbeelding.
image = pygame.image.load('image.png')
baddiex = 320
baddiey = 220
direction = 'left'
animeren van de afbeelding:
Met dit deel van de code controleren we de richting van de afbeelding, als het een hoek bereikt, zo ja, veranderen de richting, zo niet, teken de afbeelding 5 pixels verder in dezelfde richting.
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))
opmerking: mijn afbeelding is 20x20 pixels, ik gebruik if imagex == 360:
en if imagey == 260:
omdat mijn afbeelding zich dan 20 pixels vanaf de rand van het venster bevindt, net als de andere 2 hoeken. Als uw afbeelding een andere grootte heeft, moet u waarschijnlijk die cijfers wijzigen.
controleren op stoppen:
Hier controleren we of je het pygame-venster hebt gesloten, en zo ja, sluit het venster, als je dit niet ergens in je programma schrijft, kun je het venster waarschijnlijk niet sluiten.
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
update van het scherm:
Met deze functie update je het scherm zodat alles wat je hebt getekend zichtbaar wordt.
pygame.display.update()
FPS-instelling:
Met deze functie laat je pygame genoeg slapen om je FPS-instelling te respecteren.
fpsClock.tick(FPS)
Gebruik met PIL
Wanneer u zowel PIL als Pygame moet gebruiken omdat in beide functies ontbreekt, hebt u een manier nodig om te converteren tussen Pygame-oppervlakken en PIL-afbeeldingen, bij voorkeur zonder ze naar de schijf te schrijven.
Daarvoor kunt u de functies "tostring" en "fromstring" in beide bibliotheken gebruiken.
Conversie van PIL naar Pygame:
strFormat = 'RGBA'
raw_str = image.tostring("raw", strFormat)
surface = pygame.image.fromstring(raw_str, image.size, strFormat)
Conversie van Pygame naar PIL:
strFormat = 'RGBA'
raw_str = pygame.image.tostring(surface, strFormat, False)
image = Image.frombytes(strFormat, surface.get_size(), raw_str)