Veckoutmaning: Litet spel på IPhone (1/7)

11 juli 2009

Ganska långt ned i en tråd på OpenTK.com* skrev jag (du får gissa mitt alias själv!) att två erfarenheter jag dragit när det gäller att ”slutföra projekt” är följande:

  1. Skriv ned ”visionen” först av allt (typ spelregler i ett brädspel)
  2. Tidbegränsa! (aka time-boxing)

Och nu ska jag leva som jag lär! Jag utmanar mig själv att, på time-boxen en vecka, bygga ett litet spel till IPhone.

Så idag har jag tänkt ihop en liten spelidé som jag presenterar med bild & regelbeskrivning.

Skydda fortet!

Skydda fortet!

Så till spelreglerna:

  • Spelet går ut på att skydda fortet i mitten av skärmen
  • Fortet attackeras av små fartyg som kommer inseglande
  • Till skydd har man en ”slangbella-kanon”
  • Man drar i kulan, och släpper för att avfyra!
  • Efterhand kommer det fler och snabbare segelfartyg
  • Så fort ett fartyg nuddar vid ön fortet står på, är spelet slut

Om jag skulle skriva en hiscore-lista är det antalet sekunder man lyckas försvara fortet som gäller som ”poäng”.

* OpenTK är ett multimediabibliotek för .NET, opensource! Det wrappar OpenGL, OpenAL så man kan skriva plattformsoberoende grafik- och ljudaccelererade spel i C#/Visual Basic.

Taggar: , , , ,


Objective-C: Objekt med enkel metod

30 maj 2009

I Objective-C särskiljer man på .h och .m filer. .h-filer innehåller gränssnitt till objekt, kallade interface. .m-filer innehåller implementationen av gränssnittet, kallad implementation. Det är precis enligt den gängse litteraturen! För en gångs skull! (Vanligare i programspråk är namnen ”klassdeklaration” eller ”typdeklaration” för .h-filens innehåll, och ”definition” för .m-filens innehåll)

Nåväl, jag ska exemplifiera dessa begrepp genom att visa ett minimalt objekt Simple. Simple innehåller bara ett meddelande ”Hello”, som inte tar några argument och inte heller returnerar något värde. Det enda Hello gör är att skriva ut ”Hello” med hjälp av printf.

Vi börjar med .m-filen, alltså implementationen:


@implementation Simple
-(void)Hello {
    printf(@"Hello!");
}
@end

Själva innehållet omsluts allstå av @implementation … @end. Objektnamnet följer direkt efter implementation, och sedan raddas meddelandeimplementationerna upp.

I vårat fall har vi bara meddelandet Hello. Hello returnerar inte något värde, därför skriver man -(void) före namnet. ‘void’ har alltså samma betydelse i ObjC som i vanlig C/C++. Minustecknet betecknar meddelandets början.

Därefter skrivs meddelandekroppen inom måsvingar, och vi skriver dit våran printf().

Vi vänder oss till .h-filen, som är något mer komplicerad.

@interface Simple : NSObject {
}

-(void)Hello;

@end

Även i detta fall används snabela och två nyckelord för att omsluta informationen: @interface .. @end.

Notera att efter Simple står det kolon NSObject. Detta betyder att Simple baseras på objektet NSObjekt, vanligt objektorienterat arv alltså.

De ensamna måsvingarna därefter betyder inget i detta exempel; däri ska man lägga medlemsvariabler för objektet, men några sådana har inte Simple.

Sedan kommer Hello som skrivs väldigt likt .m filen och precis som i C/C++ avslutas raden med semikolon.

Taggar: ,


Objective-C: Minsta möjliga nytta

28 maj 2009

Så jag försökte göra något ”nyttigt”: slå ihopa två strängar.

Det visade sig vara hyffsat krångligt att slå ihop två strängar; mitt naiva försök ”Olof”+”B” funkade inte. Till att börja med heter typen för strängobjekt NSString, inte ”string” som är populärt i andra spårk. NSString-klassen har en metod stringByAppendingString som tar ett argument, strängen att lägga till, och returnerar resultatet:

self.text = [@"ab" stringByAppendingString:@"12"];

‘self’ motsvarar ”this” i andra språk (self används ju i Python också så det känns lagom hemma), och text är alltså deklarerad så här:

NSString *string;

Förresten heter det inte ”metod” i ObjC, utan ”meddelande”. Det är från OO-rötterna i Smalltalk, där nomenklaturen objekt och meddelanden används flitigt.

De två vanligaste filtyperna i ObjC är ”.h” (interfacefiler) och ”.m” (implementationsfiler), jag tror det löst motsvarar .h och .c/.cpp i C/C++-världen. Java och C# är ju lyckligt förskonade den typen av uppdelning, med allt filjoximojs som följer därav. Får gå igenom interface och implementation i en annan postning; det är kul med så tydliga namn på saker i alla fall! Istället för att kalla saker ”klasser” som är lite halvkrångligt namn i min mening.

Taggar: ,


Objective-C: Hello World!

25 maj 2009

OK det här programmet måste man ju kunna i ett nytt språk. Och det visar sig vara busenkelt; nästan identiskt med C/C++:

#import <stdio.h>
int main() {
   printf("Hello world\n");
   return 0;
}

Enda skillnaden är användningen av ”import” istället för ”include”. Tydligen fungerar ”import” likt ”include med ifdefs’ runt” alltså inkluderad/importerad fil läggs till max en gång.
Taggar: ,


Objective-C: Stapplande steg

25 maj 2009

Jag håller på att lära mig Objective-C, som är en ”objektorienterad utökning av C”. Anledningen är att det används som programmeringsspråk i Apples IPhone.

Nåväl, jag tänkte dokumentera i korta inlägg medans jag lär mig koncept från språket, mest för min egen skull, men om det är till nytta för någon annan är det ju kul!

För det första verkar ObjC vara icke-skräpsamlande; man får skriva avallokering själv, till skillnad från i C# eller Java, men i likhet med C++:

void main()
{
   id printer = [[Printer alloc] init];
   [printer addStringValue:"Hello World!"];
   [printer print];
   [printer free];
}

‘alloc’ skapar ett objekt av typen Printer, och ‘free’ på sista raden avallokerar detta objekt. ‘id’ är typen för ett allmänt objekt i ObjC, ungefär som ‘object’ i C# eller void* i C++.

Nu ska jag läsa vidare…

Taggar: ,