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