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.

Pyton
# 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:

Pyton
# 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:

  1. Opprette objektet
    ball1 = Ball(20) # Opprette objektet med størrelse 20
  2. Oppdatere objektet i spill-loopen
    ball1.update()

Under ser du et forslag til komplett kode med 3 forskjellige ball-objekter.

Pyton
# 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