Archive for september, 2014

pickle

september 25, 2014
Dillinlagda gurkor*

Dillinlagda gurkor*

Till mitt lilla spel ville jag lägga in möjligheten att spara och ladda spel och funderade länge på hur man gjorde det på bästa sätt. Jag hittade efter ett tag pickle i pythons standardbibliotek som visade sig vara ett enkelt sätt att hantera detta på.

Det pickle-modulen gör är att serialisera python-objekt till en fil. Med detta menas att pickle omvandlar objektet till en serie bytes som sedan kan skrivas till fil. Man kan jämföra det med att i C dumpa en struct via

typedef struct {
int pos[2];
int size[2];
char name[256];
} data_t

data_t d;
write(file, d, sizeof(d));

Detta fungerar för struct:ar som enbart innehåller data, men innehåller den referenser blir det hela mer komplicerat och kräver särskild implementation. Eftersom python ser allt som objekt, blir Pickle lite mer intelligent och serialiserar all data som lagras i objektet samt alla andra objekt som objektet hänvisar till (rekursivt hela vägen ner till basobjektet object) samt funktionerna (kod är också objekt) som ingår i objektet.

För att spara all data i mitt spelarobjekt räcker det med

pickle.dump(player, open(player.save_slot + "/player.data", 'wb'))

vilket ser ganska enkelt ut, tyvärr finns det komplikationer. När jag försökte detta första gången fick jag följande felmeddelande

TypeError: can’t pickle Surface objects

Detta beror på att objektet måste ha bland andra metoderna __getstate__() och __setstate__() för att läsa ut samtliga objekt i objektet och pygame-objekten saknar detta (åtminstone Surface och Sound och i dessa fall är det nog vettigt att hantera utanför pickle pga. datamängden).

För att gå runt det här problemet måste de felande objekten raderas från listan av objekt som sparas och sedan manuellt återställas när objekten laddas in igen. Detta görs genom att implementera en egen variant av __getstate__() och __setstate__():

def __getstate__(self):
print 'getting state!'
state = dict(self.__dict__)
#remove unpicklables
state = {s:state[s] for s in state if s != pygame.Surface and s != pygame.Sound}
return state

def __setstate__(self, state):
self.__dict__ = state
self.a = animate.animationGroup()
self.restore_unpicklables()

När pickle.dump sparar objektet anropas mitt objekts __getstate__() och innan uppslagsverket med alla objekt returneras plockas alla objekt som inte kan serialiseras bort (här pygame.Surface-objekt och pygame.Sound-objekt). När sedan objektet skall återställas kallar pickle.load()__setstate__() för att återställa objektets interna uppslagsverk anropas funktioner för att återskapa de borttagna objekten.

Det här metoden att hantera sparfiler på har både brister och fördelar men fungerar bra under utvecklingen och tog en halvtimme att skriva ihop. Den stora fördelen var att jag snabbt kunde komma igång och få någonting som fungerar. Den stora nackdelen är att spelarobjektets blir exakt som det var när det sparades och ifall variabler eller nya funktioner tillkommit kommer dessa saknas vilket kan leda till strul. Sedan bör man nämna att picklade objekt är relativt osäkra i och med att allt lagras i ett helt öppet format och inga kontroller genomförs innan datan laddas in.

* Bilden kommer härifrån, rekommenderas för inspiration för heminlagda gurkor!

Annonser

Sommarsummering

september 7, 2014

Semestern började med vansbrosimmningen och gick sedan mycket snabbt. Mycket hanns med men vila var det lite brist på. Universum gjorde sitt bästa för att kompensera med värme men det visade sig snabbt att detta inte var vidare lyckat. Bilen rullade ca 320 mil och jag hann både se höga kusten och uppleva den ultimata köupplevelsen på Gröna Lund. Vi hann ha det rätt fint värmen till trots och det hjälpte mycket att sova i tält så nätterna blev uthärdliga.

Utsikt över Ulvön

Utsikt över Ulvön

Direkt efter semestern åkte jag på jobbresa till Florida för att validera en produkt mot vår partners skrivare. Florida är på tok för varmt och fuktigt i Juli för att man ska kunna uthärda utomhus i många minuter. Det blev mest att jobba och sova. En halvdag ledigt fick jag iallafall och gick en sväng på stranden.

När jag återvände från landet i väst (USA, inte Norge) packade vi oss ombord på ett tåg och åkte upp till Dalarna för att se Kraftwerk uppträda på Dalhalla. Innan föreställningen hade vi lyxen att bli bjudna på fördring vid ett par bekantas husvagn på parkeringen. Bandet levererade och körde samtliga klassiker till publikens stora jubel.

Kraftwerk

Kraftwerk

Dalhalla är en riktigt häftig plats och det förgyllde nog upplevelsen avsevärt.

Efter Kraftwerk-konserten följde en lugn tid fram till Kalabalik på Tyrolen. En festival med synth och EBM-musik förlagd på en upprustad folkpark i Blädinge utanför Alvesta. Banden var för mig som vanligt i helt okända men många var riktigt bra. Planet, Video Look och Koloroïd imponerade mest. Sedan spelade också det fantastiska bandet Playa Del Igles som sjöng om bilar eller att bada eller nått.

Playa del Igles på Scen

Playa del Igles på Scen

Vi hade också riktigt tur med tältgrannar, ett gäng trevliga filurer dök upp kring vårt tält medan vi var borta och hade annat för oss.

Vid ingången lirade enmansbandet Anders Flanderz.

Vid ingången lirade enmansbandet Anders Flanderz.