Posts Tagged ‘pygame’

Resurs-cachning i python

november 10, 2013

I Pixel Wizard instansieras nya objekt relativt ofta under spelets gång, eldbollar och andra magier som spelaren skapar och projektiler som fiender skjuter iväg. Objekten skapas raskt men när grafik och ljud laddas märks en tydlig prestandaminskning. För att komma runt detta skrev jag ett mycket enkelt system för att cacha ljud och grafik:

"""Resource loader for images and sound"""

import pygame
import re

resource_dict = {}

def load(filename):
    if not filename in resource_dict:
        if re.match(".+\.wav", filename):
            r = pygame.mixer.Sound(filename)
        elif re.match(".+\.png", filename):
            r = pygame.image.load(filename)
        resource_dict[filename] = r
    return resource_dict[filename]

def clear():
    resource_dict = {}

Koden ovan utnyttjar pythons dictionary datatyp för att enkelt med väldigt få rader kod bygga ett caching system. resource_dict är en dictionary där en sökväg/filnamn används som nyckel och värdet är ett objekt som innehåller en referens till ett objekt för datat som filen innehåller.

load() kontrollerar ifall sökvägen filename är en nyckel i resource_dict, om den finns returneras objektet som är kopplat till nyckeln. Ifall den inte finns laddas datat från filen (en kontroll ifall det är en bild eller en ljudfil görs) och sökvägen läggs in i dictionaryn tillsammans med det nya objektet, efter detta returneras objektet.

clear() nyttjar pythons garbage collector och tar helt enkelt bort referensen till objektet, när alla andra referenser till objektet har tagits bort kommer det raderas automatiskt.

Detta system gör också att samma grafik inte laddas in flera gånger även om ett det finns 17 kopior av en fiende refererar grafiken (och ljuden) till ett och samma objekt.

Flera monster men ett grafikobjekt

Flera monster men ett grafikobjekt

Annonser

Pixel Wizard

oktober 27, 2013

(ber om ursäkt för hackigheten i videon, nånting gick inte bra när jag laddade upp den på youtube)Pixel Wizard är mitt metroidvania-inspirerade plattformspel som jag nyttjar för att utöka mina python-kunskaper.

Spelet är skrivet i python med pygame-modulen för grafik, ljud och hantering av joypad/tangentbord. Jag började projektet för mer än ett år sedan och har arbetat på det i perioder, fördelen med att använda python är att det går förhållandevis snabbt att lägga till saker. Existerande klasser kan utökas och garbage collection och dictionaries kan användas för att snabbt ge resultat. Nackdelen är att det aldrig blir lika snabbt som ett spel skrivet i c++ men det viktiga är inte resultatet utan att göra det och att jag lär mig nya saker.

Jag har i många fall inte varit så noga med att tänka igenom saker och ting utan att bygga nytt och när det sedan finns städa upp. Denna filosofi ger snabba resultat men det har lämnat mycket kod som är halvt odokumenterad och som är i behov av att städas, men eftersom jag är ensam i projektet fungerar det bra.

Det som har tagit mycket mer tid än jag räknat med är att skapa grafik (byggblock, fiender och annat) och bygga nivåer. Koden är enkel men sedan krävs det att prova en hel del för att förstå hur det hela fungerar rent spelmässigt. Kikar men på grafiken så syns det att det är något av en amatör bakom penseln men det är kul och jag tror jag blir bättre på att pixla grafik och animera.

Projektet är fortfarande roligt och jag kommer arbeta vidare på det som ett hobby-projekt under lediga stunder. Förhoppningsvis kommer jag att lägga upp ett par ytterligare blogg-poster angående olika delar i arbetet och tekniker jag använder.

Alla kommentarer är välkomna!