För några dagar sedan började jag pula med ett litet ramverk för att skapa 2D-spel i Java. Med ramverk menas i det här sammanhanget ett ”bibliotek” med färdig kod med generell funktionalitet, som kan återanvändas gång på gång och därmed förkorta startsträckan för utvecklaren. Men, tänker kanske en och annan läsare, sådana finns väl redan? Och visst, det finns en hel uppsjö av ramverk (ofta kallas de spelmotorer) för både 2D- och 3D-spel, varav många är helt fritt tillgängliga.

Men jag vill alltså skapa ett alldeles eget, om än ett mycket litet och enkelt med bara en handfull klasser. Mycket för mitt höga nöjes skull, men också för att det kan vara väldigt lärorikt om man som jag har begränsade kunskaper om spelprogrammering. Trots att jag bara precis har börjat har jag redan lärt mig mer om AWT och Swing, två Javabibliotek som används för att skapa grafiska program, och saker som flertrådiga program och dubbelbuffring.

Och så har jag lärt mig en hel del om spelloopar, och insett att detta ämne är en hel vetenskap som både vållar hett engagemang och bryderier hos programmerare världen över. Spelloopen är själva motorn i ett datorspel. Den ser bland annat till så att alla objekt i spelet uppdateras och ritas ut på skärmen i en mycket snabb takt, i regel tiotals gånger i sekunden. Det finns mängder av olika tekniker och algoritmer som används i spelloopar. De mest sofistikerade varianterna använder ett så kallat deltavärde för att uppdatera spelet ”olika mycket” beroende på hur mycket tid som har förflutit sedan förra uppdateringen, eller försöker förutsäga objektens rörelser med så kallad interpolation i syfte att animationerna ska bli jämnare.

I en lång rad forumtrådar och blogginlägg diskuteras frågan hur den perfekta spelloopen egentligen ska utformas. Själv lutar jag för närvarande åt en ganska simpel variant, som uppdaterar spelet och ritar grafiken en gång per varv och sedan ”sover” olika mycket beroende på hur lång tid operationerna tog. Resultatet blir att varje loopvarv tar (nästan) precis lika lång tid. En perfekt loop? Inte om du frågar mer ambitiösa spelprogrammerare. Men den passar fint för mina syften – att skapa enkla små 2D-spel med något att styra (t ex ett rymdskepp), något att undvika (aliens) och något att skjuta med (laserkanon).

spaceinvaders

Börjar du själv bli sugen på att skapa ett Javaspel från grunden? I så fall har jag några bra tips till dig. I denna tutorial, som nog kräver vissa förkunskaper i programmering, bygger du steg för steg en variant av det klassiska arkadspelet Space Invaders (se ovan). Förutom spelloopar berörs grundläggande saker som dubbelbuffring, händelselyssnare och kollisionshantering. Om du vill fördjupa dig i loop-frågan ligger två av de mest läsvärda texter som jag har stött på här och här. Killer Game Programming in Java är en bok som visserligen har många år på nacken, men som behandlar spelloopar på ett utförligt och intressant sätt. Och på Java-Gaming.org finns mängder av tutorials, artiklar och inlägg om spelprogrammering i Java.

Tycker du att Java verkar vara för krångligt för dig? Då vill jag som vanligt slå ett slag för det mer nybörjarvänliga alternativet Ruby. Jag har tidigare skrivit om hur man skapar ett (mycket simpelt) Rubyspel till exempel här och här, och på denna sajt ligger min egen tutorial riktad till barn och unga.

Ha så kul, lycka till och hör av dig om du stöter på problem.

/Mats

Annonser