Søg på DotNyt:
Denne blog er flyttet til www.nielsbrinch.com


søndag den 10. juni 2007

OneOnOne - Et simpelt multiplayer-spil i Silverlight

skrevet af Niels Brinch

For at komme lidt rundt i hjørnerne af Silverlight har jeg besluttet jeg vil lave et lille simpelt multi-player-spil. Eller i hvert fald starte på det.

Det skal være et lille spil hvor man har hver sin lille mand og en bold som det gælder om at sparke ind i modstanderens mål.

Selve spillet skal selvfølgelig ske i en simpel Silverlight-klient som reagerer på spillerens tastetryk. Spillerne sidder ved hver sin computer og deres fælles spil skal styres via en webservice som kaldes igen og igen af hver spillers Silverlight-klient.

Ja, I har ret, det kommer ikke til at fungere særligt godt med en webservice. Der bør helst være en fast socket-forbindelse til den type spil. Men nu bliver det altså sådan. Det er som sagt bare for at få prøvet lidt forskelligt med Silverlight. Og for Silverlight tror jeg webservices kommer til at spille en altafgørende rolle.

Jeg starter med at oprette et Silverlight-projekt som hedder OneOnOneClient og en web application der hedder OneOnOneServer.

OneOnOneServer
Server-delen skal have en Web Service som OneOnOneClient kan kalde. Denne WebService skal i første omgang indeholde en metode som modtager et spillernavn og returnerer et "GameID". Når to spillere har det samme GameID kan spillet mellem de to personer gå igang.

Når spillet kører skal en metode kaldes igen og igen som modtager hvad spilleren har gjort (f.eks. trykket på venstre piletast) og returnerer hvor de to spillere og bolden nu befinder sig. Inklusive eventuelle ændringer som er forårsaget af hvad den anden spiller har foretaget sig.

De tre metoder på serveren ser sådan ud:

public string PleaseCreateGame(string playerName)
En spiller melder sig til at ville spille og modtager en streng som er en guid der enten identificerer et kommende spil eller et allerede oprettet spil, alt efter om en modstander allerede venter.

public bool IsGameReady(string gameId)
Herefter spørger klienten igen og igen om spillet er klar. Det er klar når der er to spillere. Hvis den aktuelle spiller er spiller nummer 2, vil dette metodekald svare 'true' med det samme.

public GameState Play(string gameId, short user, string action)
Når spillet er i gang kaldes denne metode igen og igen med spillets id, spilleren som har foretaget handlingen (1 eller 2) samt hvilken handling der er blevet foretaget. Metoden returnerer et "GameState"-objekt som hører til spillet og fortæller hvor bolden og de to spillere befinder sig lige nu.

OneOnOneClient
Dette er Silverlight-applikationen. Den viser en grøn firkant (banen), to spillere (firkanter) og en bold (en cirkel). Derudover viser den en mulighed for at indtaste sit navn og vente på at spillet kan gå i gang - hvilket kan ske når der melder sig en modspiller.

Bag scenen kaldes førnævnte webservice-metoder en hel masse gange. Det forsøges at samle al spil-logikken inde bag "Play"-metoden så Silverlight-applikationen kan holdes relativt uvidende om spillet.

1. Tegn
Det første jeg skal gøre er, at tegne de elementer jeg skal bruge, ved at redigere min Page.xaml.

Læs her hvordan

2. Flyt en spiller
Inden jeg begynder at sætte events på alting, skal jeg lige have styr på at flytte spillerne på skærmen. Det skal selvfølgelig ske på baggrund af tastetryk, men lige nu vil jeg bare flytte spiller 1 lidt frem.

Her er det lige lidt tricky.

Jeg kan let finde player1-objektet i min CodeBehind, men der er ikke umiddelbart nogen mulighed for at sætte X- og Y-koordinater på det. Efter en længere undersøgelse har jeg fundet ud af, man skal anvende en generisk "SetValue"-metode på objektet:

player1.SetValue(Canvas.LeftProperty, 10);

Med ovenstående flyttes player1 til 10 pixels fra venstre side.

3. Kommunikér med server

For at kunne gøre spillet til et multiplayer-spil skal hver spillers Silverlight-applikation kunne kommunikere med hinanden, hvilket skal ske via en fælles server.

Læs her hvordan

4. Reagér på brugerinput

Før det kan kaldes et spil, skal spillerne have mulighed for at vælge hvordan de skal bevæge sig. Dette gøres ved hjælp af tastaturet.

Læs her hvordan

5. Indtast oplysninger

Det skal være muligt at se hvem man spiller mod, derfor afkræves man at indtaste sit navn, før spiller kan starte. Dette gøres ved hjælp af en tredjeparts-komponent.

Læs her hvordan

6. Implementering

Det er fint spillet fungerer i mit lokale udviklingsmiljø, men det bør også kunne fungere på en offentligt tilgængelig server. Særligt når det er et online multiplayer-spil.

Læs her hvordan

 

Prøv det "færdige" spil her

0 kommentarer

0 Kommentarer:

Send en kommentar

<< Tilbage


 
Til forsiden

Niels Brinch