Gunnleggende spillutvikling i Pygame – Lagne egne klasser
Lage en ball-klasse
Lage en klasse og opprette et objekt fra denne klassen
Vi har nå klart å lage to baller på den “gamle” måten. Nå skal vi lage vår egen type objekt, en klasse. Hvis vi kaller denne klassen for Ball, så kan vi opprette nye baller på denne måten:
ball1 = Ball()
La oss sette i gang!
Først så “vasker” vi den gamle koden vår slik at vi har et utgangspunkt uten baller. I denne koden har jeg fjernet ball-objektene og alt som hørte til dem. Vi har altså bare et vindu, samt noen definerte farger og en fast oppdateringsfrekvens.
# 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 spill-variabler og objekter
GameOn = True # En variabel som brukes for å kontrollere om spillet skal fortsette å kjøre
klokke = pygame.time.Clock() # Oppretter klokke-objekt
FPS = 30 # Variabel som styrer oppdateringsfrekvensen
# 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
pygame.display.update() # oppdaterer displayet slik at alle objekter vises
klokke.tick(FPS)
# avslutter alle moduler i pygame
pygame.quit()
For å opprette en klasse som skal hete Ball, så starter vi med koden
class = Ball:
Jeg legger slike definisjoner i toppen av koden. Her kan jeg altså legge inn all kode som jeg vil at objekt-typen “Ball” skal inneholde.
Jeg kan også legge inn argumenter når jeg opprettet et ball-objekt; f eks ball1 = Ball(20). Her tenker jeg at “20” skal være størrelse på ballen. La oss lage en klasse:
# opprette objekt-type (class)
class Ball:
def __init__(self, size): # funksjon som kjøres hver gang det opprettes et nytt objekt
self.size = size
self.img = pygame.Surface((self.size,self.size))
pygame.draw.circle(self.img, BLUE, (self.size // 2, self.size // 2), self.size // 2) # Tegner sirkel
self.img.set_colorkey(BLACK)
self.rect = self.img.get_rect()
self.speed_x = randint(5,10)
self.speed_y = randint(5,10)
self.rect.center = (randint(50,450), randint(50,350)) # plassere rect tilfeldig
def update(self): # funksjon som skal oppdatere plassering og tegne ballen på den nye plassen
if self.rect.left <= 0 or self.rect.right >= WIDTH:
self.speed_x = -self.speed_x
if self.rect.top <= 50 or self.rect.bottom >= HEIGHT:
self.speed_y = -self.speed_y
self.rect.x += self.speed_x
self.rect.y += self.speed_y
main.blit(self.img, self.rect)
Denne koden oppretter en ny objekt-type, eller det vi kaller klasser i python. Klassen heter Ball, og det betyr av vi nå kan opprette så mange objekter vi ønsker av denne klassen. Alt jeg trenger å gjøre nå, er:
- Opprette objektet
ball1 = Ball(20) # Opprette objektet med størrelse 20 - Oppdatere objektet i spill-loopen
ball1.update()
Under ser du et forslag til komplett kode med 3 forskjellige ball-objekter.
# importere bibliotek og starte moduler
import pygame
from random import randint # importere funksjonen randint
pygame.init()
# opprette objekt-type (class)
class Ball:
def __init__(self, size): # funksjon som kjøres hver gang det opprettes et nytt objekt
self.size = size
self.img = pygame.Surface((self.size,self.size))
pygame.draw.circle(self.img, BLUE, (self.size // 2, self.size // 2), self.size // 2) # Tegner sirkel
self.img.set_colorkey(BLACK)
self.rect = self.img.get_rect()
self.speed_x = randint(5,10)
self.speed_y = randint(5,10)
self.rect.center = (randint(50,450), randint(50,350)) # plassere rect tilfeldig
def update(self): # funksjon som skal oppdatere plassering og tegne ballen på den nye plassen
if self.rect.left <= 0 or self.rect.right >= WIDTH:
self.speed_x = -self.speed_x
if self.rect.top <= 50 or self.rect.bottom >= HEIGHT:
self.speed_y = -self.speed_y
self.rect.x += self.speed_x
self.rect.y += self.speed_y
main.blit(self.img, self.rect)
# 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 spill-variabler og objekter
GameOn = True # En variabel som brukes for å kontrollere om spillet skal fortsette å kjøre
klokke = pygame.time.Clock() # Oppretter klokke-objekt
FPS = 30 # Variabel som styrer oppdateringsfrekvensen
# oppretter ball-objekter
ball1 = Ball(20)
ball2 = Ball(60)
ball3 = Ball(10)
# 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
ball1.update()
ball2.update()
ball3.update()
pygame.display.update() # oppdaterer displayet slik at alle objekter vises
klokke.tick(FPS)
# avslutter alle moduler i pygame
pygame.quit()

DigitAbel – for dypere læring