Multiplayer-iPhone-Darkstar

Transcript

Multiplayer-iPhone-Darkstar
Multiplayer on-line: dall'iPhone a Darkstar
Stefano Linguerri
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Un po' di storia
25/01/1947: Un apparecchio chiamato "Cathode-Ray Tube Amusement
Device" viene brevettato in Ameria da Thomas T. Goldsmith, Jr. and Estle
Ray Mann. Il brevetto descrive la simulazione di un sistema di puntamento
missilistico per mezzo di tubi catodici
'50 - '60: Nascono i primi giochi nei laboratori universitari americani.
'70 - primi anni '80: Epoca d'oro dei videogiochi, escono titoli come: Space
Invaders, Asteroids, Galaxian, Pac-Man, Donkey Kong, Frogger, Galaga,
Pole Position, Mario Bros.
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Nascono le console e gli home computer
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Console portatili
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Anni 90: nuovi generi di giochi
Sparatutto in soggettiva
Wolfstein 3D e Doom della ID Software
Strategici in tempo reale
Dune 2 - Westwood Studios (1992)
Warcraft: Orcs & Humans - Blizzard
Entertainment. (1994, Multiplayer)
Age of Empires (1997, Multiplayer)
Command & Conquer - Westwood Studio
(1995, Multiplayer)
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
RPG dalla carta al digitale
Il multiplayer online era già iniziato negli anni '80 con:
●
MUD (Multi User Dungeon), giochi testuali
●
Rougelike, grafica con caratteri ASCII ispirati al gioco Rogue
Si giocava con il modem affettuando la connessione su determinate
BBS
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Massively Multiplayer online RPG
Il primo vero MMORPG è Neverwinter Nights di America Online (1991)
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Gli altri MMORPG
Ultima on-line della Origin Systems (1997)
EverQuest dei 989 Studios (sony 1999)
Final Fantasy XI Online della Square (2002)
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
World of Warcraft
11 milioni di giocatori in tutto il mondo
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Perchè il Multiplayer
Pronetics ha realizzato la versione per iphone di "Viva il Re!".
L'attuale versione permette solo di giocare con l'intelligenza artificiale.
La maggior parte dei feedback chiede il multiplayer online.
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Perchè Darkstar?
Strade possibili
La soluzione fatta in casa
Usare un prodotto esistente
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
I vantaggi
Darkstar è opensource.
E' sponsorizzato da SunMicrosytem.
Esiste la libreria client per iPhone:
http://code.google.com/p/idarkstar/
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Cominciamo dalla demo
Demo time
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Anatomia dell'applicazione
Le applicazioni si distribuiscono sotto forma di jar.
Insieme alla libreria dell'applicazione va rilasciato un file .boot che descrive la
configurazione.
Per far partire il server si esegue il comando di start di Darkstar dando come
parametro il file di boot della nostra implementazione:
java -jar bin/sgs-boot.jar [my-boot-file].boot
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Cosa va implementato lato server
La nostra applicazione lato server richiede l'implementazione dell'interfaccia:
com.sun.sgs.app.AppListener
E dei suoi due metodi:
public void initialize(Properties props)
public ClientSessionListener loggedIn(ClientSession session)
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Cosa ci mette a disposizione DarkStar
Autenticazione
Sessione Client
Canali
Task temporizzati
Persistenza
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Autenticazione
Autenticazione
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Autenticazione
Nei file di configurazione possiamo definire il nostro IdentityAuthenticator implementando
org.jk.utopia.server.application.authenticator.IdentityAuthenticator
In particolare il metodo authenticateIdentity che verrà invocato al momento di una
richiesta di login.
public Identity authenticateIdentity(IdentityCredentials credentials)
throws LoginException {
...
//useful stuff...
...
NamePasswordCredentials npc = (NamePasswordCredentials) credentials;
String userName = npc.getName().toLowerCase();
String password = new String(npc.getPassword());
...
//password check stuff...
...
return new IdentityImpl(userName);
}
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Sessione Server Side
Una volta effettuato il login con successo viene istanziata una sessione per l'utente.
Per gestire gli eventi della sessione si deve implementare l'interfaccia:
com.sun.sgs.app.ClientSessionListener
public interface ClientSessionListener
{
void receivedMessage(java.nio.ByteBuffer byteBuffer);
}
void disconnected(boolean forced);
Nel nostro AppListener riceveremo la callback per il login effettuato:
public ClientSessionListener loggedIn(ClientSession session) {
return new MyUserSessionListenerImpl(session);
}
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Sessione: Client Side
Per eseguire la connessione lato client
...
SGSContext *context = [[SGSContext alloc] initWithHostname:@"somehost" port:1139];
sgsMyDelegate = [MSGSMyDelegate alloc];
...
context.delegate = sgsMyDelegate;
SGSConnection *connection = [[SGSConnection alloc] initWithContext:context];
[connection loginWithUsername:@"aPlayer" password:@"apassword"];
...
Il nostro delegate implementerà i metodi:
- (void)sgsContext:(SGSContext *)context channelJoined:(SGSChannel *)channel forConnection:(SGSConnection *)connection;
- (void)sgsContext:(SGSContext *)context messageReceived:(SGSMessage *)msg forConnection:(SGSConnection *)connection;
- (void)sgsContext:(SGSContext *)context disconnected:(SGSConnection *)connection;
- (void)sgsContext:(SGSContext *)context reconnected:(SGSConnection *)connection;
- (void)sgsContext:(SGSContext *)context loggedIn:(SGSSession *)session forConnection:(SGSConnection *)connection;
- (void)sgsContext:(SGSContext *)context loginFailed:(SGSSession *)session forConnection:(SGSConnection *)connection withMessag
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Il minimo indispensabile
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Task
Task
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Task temporizzati
org.jk.utopia.server.application.task.Task
Va semplicemente implementato il metodo run()
Per farlo partire:
TaskManager taskManager = AppContext.getTaskManager();
MyTimedTask mytimedTask = new MyTimedTask();
taskManager.schedulePeriodicTask(mytimedTask, 100000, 1000);
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Canali
Canali
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Canali: Server Side
Lato server è possibile creare dei canali sui quali i giocatori possono scambiarsi
dei messaggi.
ChannelManager channelMgr = AppContext.getChannelManager();
Channel channel = channelMgr.createChannel(“General”,
new MyChannelListener(),
Delivery.RELIABLE);
Nella demo i client inviano la posizione del personaggio a tutti i giocatori
che hanno fatto la join sul canale
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Canali: Server Side
E' possibile avere un proprio ChannelListener sul canale implementando l'interfaccia:
com.sun.sgs.app.ChannelListener
public class MyChannelListener
}
implements ChannelListener, Serializable {
public void receivedMessage(Channel channel, ClientSession session, ByteBuffer message) {
//useful stuff
channel.send(session, message);
}
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Canali: Client Side
Si assegna un delegate al Channel
- (void)sgsContext:(SGSContext *)context channelJoined:(SGSChannel *)channel forConnection:(SGSConnection *)connection{
...
...
SGSMyChannelDelegagte *sgsMyChannelDelegate = [[SGSMyChannelDelegagte alloc] init];
channel.delegate = sgsMyChannelDelegate;
...
...
}
Si implementano i metodi
- (void)channel:(SGSChannel *)channel messageReceived:(SGSMessage *)message;
- (void)channelLeft:(SGSChannel *)channel;
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Il nostro protocollo
Darkstar da solo non basta per fare un gioco, va creato un protocollo applicativo che
permetta ai nostri client di saper effetturare un rendering del mondo virtuale e di
scatenare degli eventi in game.
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Il protocollo della demo
lilia:5,160,128
Il protocollo consiste in:
<Nome Personaggio> : <frame> , <ascissa> , <ordinata>
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Lo scambio dei messaggi
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Persistenza
Persistenza
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Persistenza
Per essere persistenti gli oggetti devono implementare ManagedObject and Serializable .
Utilizzando il DataManager è possibile alterare lo stato di un oggetto:
AnObject objectOne = new AnObject();
AppContext.getDataManager().setBinding(“aKey123”, objectOne);
...
AnObject objectTwo = (AnObject)AppContext.getDataManager().getBinding(“aKey123”);
Utilizzando il DataManager è possibile alterare lo stato di un oggetto:
AppContext.getDataManager().markForUpdate(anObject);
anObject.setValueA(“aValue A”);
anObject.setValueB(“aValue B”);
La persistenza è stata implementata con Berkeley DB
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Esempio di architettura
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Tipi di giochi implementabili
Classici a turni: Scacchi, carte, dama etc, etc.
Giochi da tavolo
RPG Multiplayer
Tamagotchi like con interazione tra utenti
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Business
Pay per content
Subscription
Puzzle pirates (Three rings)
230,000$ al mese
tramite “microtransazioni”
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Special thanks
Un grazie particolare a:
Venetia
Del progetto
Half-Kaizer Construction Project: http://www.pixelcocktail.com/HKCP/Gallery/
(http://www.hbgames.org/forums/viewtopic.php?f=159&t=39088&start=0)
Per il permesso di usare la grafica degli sprite della presentazione
E gli altri membri del team:
SHOWKAIZER, CERULEAN, SKYE, GRATHEO, BRITCHIK, KAZEN,FOMAR0153,
NPHYX, BERSERKER, DEEBS
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Special Thanks
Danc (www.lostgarden.com)
Per i tiles della mappa
http://www.lostgarden.com/2006/07/more-free-game-graphics.html
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Copyrigths
Wolfstein 3D, Doom © Id Software
Dune 2, Command & Conquer © Westwood Studios
Warcraft, World of Warcraft © Blizzard
Age of Empires © Ensemble Studios & Microsoft Game Studios
Neverwinter Nights © American On Line
Startrek online © Atari
Warhammer online © Electronic Arts
Puzzle Pirates © Three rings
Pet Society © Playfish
Viva il Re! © da Vinci Games
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Links
●
●
http://www.projectdarkstar.com/
http://code.google.com/p/idarkstar/
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Contatti
Follow me on twitter: http://twitter.com/eljeko
Linkedin: http://www.linkedin.com/in/linguerri
Mail: [email protected]
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010
Q&A
Q&A
Stefano Linguerri – Pronetics S.p.A.
Javaday IV – Roma – 30 gennaio 2010