Gunnleggende spillutvikling i Pygame – Legge til innhold
Legge til innhold
Legge til et rektangel som en "header" i vinduet
Innholdet i programvinduet er ofte objekter som er hentet fra pygame-biblioteket. Dette kan være linjer, rektangler, sirkler, bilder, tekstbokser, lyder osv. La oss starte med å tegne programvinduet i mainloop, og sette en bakgrunnsfarge og tegne et rektangel som en header:
# importere bibliotek og starte moduler
import pygame
pygame.init()
# sette størrelse og opprette vindu-objekt (main)
WIDTH = 500
HEIGHT = 400
main = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Min tittel") # setter tittel på vindu
GameOn = True # En variabel som brukes for å kontrollere om spillet skal fortsette å kjøre
# starter mainloop, og den kjører så lenge GameOn er True
while GameOn:
for event in pygame.event.get():
if event.type == pygame.QUIT: # Hva skjer om brukeren har trykket på X øverst i vinduet?
GameOn = False
# tegne opp vinduet
main.fill((255,153,0)) # Setter en bakgrunnsfarge i vinduet
pygame.draw.rect(main, (0,0,0),(0,0,WIDTH,50)) # Tegner et rektangel fra (0,0) som er 50 høyt
pygame.display.update() # oppdaterer displayet slik at alle objekter vises
# avslutter alle moduler i pygame
pygame.quit()
Her ser man at vinduet tegnes opp i mainloop’en. Det betyr at vinduet tegnes opp veldig mange ganger hvert eneste sekund. En raskere PC vil tegne opp vinduet raskere enn en treg PC, og dermed kanskje tegne opp dette vinduet flere tusen ganger hvert eneste sekund. Det er denne funksjonaliteten vi utnytter når vi skal lage animasjoner. La oss prøve å legge inn et objekt som vi etterhvert kan begynne å animere. På linje 20 og 21 ser du også hvordan man kan legge til en farge i pygame. Dette blir en litt uoversiktlig måte å gjøre det på, så vi lager noen konstanter som beskriver farger også:
Legge til en "ball"
Vi kunne lagt til en “ball” på flere måter:
- Vi kan tegne en sirkel
- Vi kan importere et bilde fra en ekstern fil
- Vi kan opprette en “surface” som vi tegner på
Hver av disse har sine fordeler og bakdeler. Dersom vi bare tegner en sirkel, så får vi ikke ballen vår til å oppføre seg som et eget objekt. Det vil si at ballen vil ha noen begrensninger når vi skal begynne å animere eller når vi skal lage duplikater av den. Vi skal senere se hvordan vi importerer bilder, men nå skal vi opprette en “surface”, som vi i ettertid kan behandle som et eget objekt.
Vi starter med å lage oss en liten tegneflate, altså det som pygame kaller en surface:
ball = pygame.Surface((40, 40))
Vi har nå opprettet en tegneflate som heter “ball”. Vi har ikke tegnet noe enda. La oss tegne en sirkel på denne tegneflaten:
pygame.draw.circle(ball, RED, (20, 20), 20)
Denne kommandoen tegner en sirkel på tegneflaten “ball”, som er rød, senter i punktet (20,20) med radius 20. Legg merke til bruken av farge. RED må defineres som en rgb-farge tidligere i koden. Jeg pleier å lage en en liten oversikt over farger i toppen av koden min:
# importere bibliotek og starte moduler
import pygame
pygame.init()
# sette størrelse og opprette vindu-objekt (main)
WIDTH = 500
HEIGHT = 400
main = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Min tittel") # setter tittel på vindu
# definere farger
RED = (255, 0, 0)
ORANGE = (255, 153, 0)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
# oppretter ball-objekt
ball = pygame.Surface((40, 40))
ball.set_colorkey(BLACK)
pygame.draw.circle(ball, RED, (20, 20), 20)
GameOn = True # En variabel som brukes for å kontrollere om spillet skal fortsette å kjøre
# starter mainloop, og den kjører så lenge GameOn er True
while GameOn:
for event in pygame.event.get():
if event.type == pygame.QUIT: # Hva skjer om brukeren har trykket på X øverst i vinduet?
GameOn = False
# tegne opp vinduet
main.fill(ORANGE) # Setter en bakgrunnsfarge i vinduet
pygame.draw.rect(main, BLACK, (0,0,WIDTH,50)) # Tegner et rektangel fra (0,0) som er 50 høyt
main.blit(ball, (250, 200))
pygame.display.update() # oppdaterer displayet slik at alle objekter vises
# avslutter alle moduler i pygame
pygame.quit()
Her ser du hvordan dette programmet ser du. Vi har klart å lage et vindu med oransje bakgrunn, svart header, og med en rød ball. Allikevel er det et lite problem. Som du ser, så er ikke tegneflaten vår transparent. Vi må fortelle programmet, dersom vi ønsker en transparent farge i tegneflaten.
MEN….vi har klart å lage en ball, og vi har plassert ballen med kommandoen “blit”. La oss prøve å få bakgrunnen (den svarte fargen) transparent. Vi gjør det ved å fortelle hvilken farge som skal være transparent:
ball.set_colorkey(BLACK)
DigitAbel – for dypere læring