Jeux en Réseau sur Mobile
Transcription
Jeux en Réseau sur Mobile
Jeux sur mobiles ! Le modèle simple : "Téléchargement du jeu et/ou de niveaux de jeu "Jeu en local "Envoi du score vers un site web spécifique Jeux en réseaux sur plate-formes Mobiles ! Jeu à plusieurs "Tour par tour ou semi temps-réel "Chat "Via Bluetooth/WiFi ou GPRS/3G Patrice Torguet ! Vers les MMO sur Mobile : "Accès à certains aspects d’un MMO sur mobile "Exemple : #Gestion d’enchères #Gestion du portefeuille d’une entreprise virtuelle IRIT Equipe VORTEX 1 Jeux sur mobiles 2 Jeux sur mobiles ! Performances réseaux ! Programmation "2,5 G (GPRS, EDGE) #latence entre 3s et 900 ms #débit entre 40 et 200 Kbps #près d’un milliard de mobiles au monde "3 G (UMTS) #latence ~ 500 ms #débit entre 300 Kbps et 400 Kbps #environ 100 millions de mobiles dans le monde "3,5 G (HSDPA) #latence ~ 100 ms #débit entre 2 Mbps et 15 Mbps #moins d’1 million de mobiles dans le monde "WiFi/Bluetooth #latence < 1 ms en connexion directe #débit entre 1 Mbps et 74 Mbps #moins d’1 million de mobiles dans le monde "Java #Java ME (Micro Edition) de SUN "C/C++ #Brew (Binary Runtime Environment for Wireless) de Qualcomm #Autres : Symbian OS, Windows Mobile, ExEn, Mophun "Middleware réseau #Neutron de Exit Games 3 4 Java ME Java ME ! Avantage ! Les packages disponibles "java.lang : attention pas de Float et Double (mais réels en virgule fixe disponibles) "java.util : Hashtable, Vector, Random... "java.io : a peu près complet mais en lecture seule "javax.microedition.io : classes réseau #Attention : seule la gestion du protocole HTTP est requise par la norme "javax.microedition.lcdui : IHM pour mobile "javax.microedition.midlet : équivalent de la classe Applet pour JME "javax.microedition.rms : base de donnée pour stocker vos infos "bindings pour OpenGL ES "Développement unique pour de nombreuses plate-formes (http://wireless.java.sun.com/device/) "Emulateur permettant de tester les applications ! Inconvénient "Exécution plus lente ! Outils : "J2SE SDK pour compiler "Sun Java Wireless Toolkit "Eclipse ou un autre IDE ! MIDlet : c’est ce qui correspond à l’application ".jar : qui contient les .class et les ressources ".jad : (Java Application Descriptor) décrit votre application (nom, numéro de version, quel profil de Java ME vous demandez...) et généré par un outil spécial 5 Java ME 6 Java ME ! Utilisation de l’interface HttpConnection "1) Création de la connexion : #HttpConnection c = (HttpConnection) Connector.open(“http:// www.monserveur/mapage.php”); "2) Choix de la méthode de connexion (exemple POST) : #c.setRequestMethod(HttpConnection.POST); "3) Envoi d’en-têtes HTTP (au minimum le Content-Type) #c.setRequestProperty("Content-Type", "application/x-www-formurlencoded"); "4) Envoi de données #OutputStream os = c.openOutputStream(); #String params = "name=" + name; #os.write(params.getBytes()); "5) Réception de données #StringBuffer sb = new StringBuffer(); #InputStream is = c.openDataInputStream(); #int chr; while ((chr = is.read()) != -1) sb.append((char) chr); #System.out.println(sb.toString()); ! MIDlet "Une classe doit dériver de MIDlet et doit avoir #Un constructeur par défaut (sans paramètres) : c’est celui qui est appelé quand l’utilisateur choisit votre jeu dans la liste des applications java installées #startApp() : appelé juste après le constructeur #pauseApp() : appelé lors d’une demande de pause de l’environnement (lors de la réception d’un appel typiquement #destroyApp(boolean inconditionnel) : appelé lors de la fin de l’application (le booléen indique si l’application à le choix ou non de demander de ne pas s’arrêter - pour demander à l’utilisateur s’il veut vraiment terminer par exemple) "Autre classe importante : l’IHM qui doit dériver de Canvas et doit implémenter 3 méthodes #keyPressed(int keyCode) : indique qu’une touche a été appuyée #keyReleased(int keyCode) : indique qu’une touche a été relâchée #paint(Graphics g) : méthode qui dessine votre interface graphique 7 8 !"#$%&'()*%+*,-'*%./!'$0*$1,12%3*1#*4'22*1#*5"$(%,(1.#1$,"%.#*%.*1.!*%++*!'$06* 789:*;15".3*"#*!'#"3.'!*,%*'.-1.$'*('&'.<'*3'.'(1,"%.*+%(*%='(1,%(#>* !"#$%&'($)*+,-./$0,.-*123#$04521,4-$ #"3.12".3*",#*&12<'*".*!("&".3*?8@A*1.!*1<35'.,".3*!1,1*#'(&"$'#*<=,10'6* B-'*+%22%4".3*#$(''.#-%,#*"22<#,(1,'*,-'*,)='#*%+*CD*315'#*1&1"21E2'*%.*51##* !"#$%&'()*+%,-)./0%1)+1/-%2-)3/0%'*,%-/./*4/% 51(0',>*789:F/'.1E2'!*!'&"$'#*,%!1)6* $ !"#$%&'#()*($+&,-)./$*0$12$3,4#%$#5,6-#%$."#4$.*$6#$%*-7$,.$8*5%)7#(,6-/$")3"#($ (#.,)-$'()8#%$.",5$."#)($92$8*&5.#(',(.%:$0*($#;,4'-#:$,''(*;)4,.#-/$<=>?@@$0*($ &5-)4).#7$&%#$A%?$<B?@@$0*($,$92$3,4#?$C5$,$4*5."-/$6,%)%:$12$3,4#%$,(#$ !"#$%&'#()*($+&,-)./$*0$12$ 8&((#5.-/$'()8#7$,.$,''(*;)4,.#-/$<D?D@$A%?$<>?@@$0*($92?$E77).)*5,--/:$."#%#$12$ 3,4#%$#5,6-#%$."#4$.*$6#$ 3,4#%$7*$5*.$(#+&)(#$")3"F#57$#;'#5%)A#$G)(#-#%%$",57%#.%$*($%4,(.$'"*5#%$.*$ %*-7$,.$8*5%)7#(,6-/$")3"#($ '-,/?$H&((#5.-/:$4,%%$4,(I#.$G)(#-#%%$7#A)8#%$0(*4$*'#(,.*(%$-)I#$J#()K*5$ (#.,)-$'()8#%$.",5$."#)($92$ L)(#-#%%$,(#$%*-7$0*($,%$-)..-#$,%$<>M?MM$,57$%&''*(.$12$3,4#%?$E%$'()8#%$0*($ 8*&5.#(',(.%:$ ")3"F#57$",57%#.%$8*5.)5&#$.*$7#8-)5#:$.*7,/N%$")3"F#57$7#A)8#%$,(#$6#8*4)53$ des ! SDK pour développer en C et en C++ (avec limitations) pour plate-formes mobiles .*4*((*GN%$4)5)4&4$6,%#-)5#?$!"#$OPB=@@$)--&%.(,.#%$.")%$7#8-)5)53$'()8#$ 8&(A#?$E.$-,&58":$).$%*-7$0*($<=MM?MM?$!*7,/$).$%#--%$0*($<>M?MM?$E%$4*6)-#$7#A)8#$ 8*%.%$7#8-)5#:$%&6%8()6#(%$,(#$%"*G)53$,$G)--)535#%%$.*$',/$")3"#($'()8#$'*)5.%$0*($ ! http://brew.qualcomm.com $ 12$3,4#%:$,..#%.)53$.*$."#$A,-&#$."#/$'-,8#$*5$,$")3"#($+&,-)./$4*6)-#$3,4)53$ $ ! Avantages '9$06:&!0/$;*<<#-$=>?$@A$ '9$06:&!0/$>,."1$=,."1$&42-<$D$ #;'#()#58#?$ Brew "Plus rapide et plus puissant que JME - accès natif au hardware "Meilleure intégration avec OpenGL ES (3D) "Sockets UDP et TCP disponibles (éventuellement plusieurs) "Différents modes de commerce (vente unique, location par mois ou location par nombre d’accès) $ "Simulateur complet (gestion de SMS, données GPS, pilotable automatiquement) ! Inconvénients BC$'9$;4B,5#$ BC$'9$;4B,5#$ $ $ '9$06:&!0$;*<<#-$=>?$@A$I'9K$ X,Y*C$0,-."$634$)45J$I)*+#54J1K$ ;<'(+-% ;"#4:+5%;=>?1@AA% 7."B$% ;4-1"5C$ E-5,+,1#<$ ;4-1"5C$ LMNN$ /CD@% =9$ ECD@% @CD@% DMQN$ FC@@% =9$ GGCD@% DMQN$ HC@@% =9$ ICD@% HMNN$ R(*4$7#%)35$.*$7#'-*/4#5.:$."#$STUL$P,4)53$V)35,.&(#$V*-&.)*5$",%$6##5$ ."*&3".0&--/$7#A#-*'#7$.*$8(#,.#$,$%&'#()*($8*5%&4#($%#(A)8#$#;'#()#58#?$V)4)-,($ .*$."#$4,55#($)5$G")8"$V.,(6&8I%W$)%$,6-#$.*$'(*A)7#$,$8*4'-#.#$#;'#()#58#$0*($ A)%).*(%$.*$).%$'"/%)8,-$%.*(#$-*8,.)*5%$,57$8*44,57$'(#4)&4$'()8)53:$."#$STUL$ P,4)53$V)35,.&(#$V*-&.)*5$)%$7#%)35#7$.*$7*$."#$%,4#$0*($4*6)-#$3,4)53$6/$ '(*A)7)53$,$8,'.)A,.)53-/$)44#(%)A#$#;'#()#58#?$STUL$P,4)53$%##I%$.*$ )58(#,%#$8*5%&4#($-*/,-./$,57$."#$&%#$,57$'&(8",%#$*0$3,4#%$6/$#4'-*/)53$."(##$ &57#(-/)53$%.(,.#3)#%$.*$,8")#A#$.")%$3*,-?$ =9$ =9$ =9$ UMNN$ =9$ =9$ HC@@% =9$ /C@@% =9$ !$ une instance de structure qui représente l’applet grâce à la méthode AEEApplet_New $ "Exemple de structure : typedef struct_myapp { AEEApplet a; // obligatoire en 1er - représente l’héritage // variables spécifiques ici } myapp; "Lors de l’appel à AEEApplet_New on spécifie la taille de la structure applet et des pointeurs de fonctions pour traiter les événements et détruire l’applet. "Exemple d’utilisation d’une interface : IDISPLAY_Update (pMe->a.m_pIDisplay); "pMe est le pointeur vers l’instance de la structure applet, m_pIDisplay est un pointeur vers une interface IDisplay (fonctions d’affichage) et IDISPLAY_Update est une macro qui invoque la fonction pointée par Update de IDisplay ou d’une interface descendante. 6*.#$7$8$ "Tout fonctionne suivant ce concept : une structure stockant des pointeurs de fonctions (permet la simulation de l’héritage) ! Application (Applet) E-5,+,1#<$ E&34#5.$7)%8*A#(/$*0$."#$8,.,-*3$."(*&3"$,$-**%#$8*58#'.$*0$*G5#(%")'$ %&((*&57)53$3,4#%$*G5#7$,57$5*.$*G5#7?$S/$7)%'-,/)53$3,4#%$.",.$."#$ $ (identificateur de l’appli) "inclusion d’un fichier .bid qui stocke le ClassID%&6%8()6#($",%$,-(#,7/$6*&3".$,-*53$G)."$%)4)-,($3,4#%$.",.$(#4,)5$.*$6#$ '&(8",%#7:$."#$-)I#-)"**7$*0$."#$%&6%8()6#(N%$#;'-*(,.)*5$G).")5$."#$8,.,-*3$ "AEEClsCreateInstance : fonction obligatoire qui vérifie le ClassID et crée )58(#,%#%?$ ! Applet "OpenGL ES "Réseau (HTTP, TCP et UDP) "Gestion de fichiers "IHM (incluant un viewer HTML) "Gestion de bases de données génériques ou spécifiques (au mobile) "Gestion des sons "Animation 2D (sprites) "Cryptographie "Données GPS ! Concept d’interface &$'()*+% ,*-*'*."%&/%0120% 34(+5%-6$%7089%4*.:-(*+% !"#$% Q5$A)#G$*0$).%$)44#5%#$'*'&-,()./:$)5"#(#5.$7()A#$.*$8*5.)5&*&%-/$'&%"$."#$ ;*FF,R#$0-4SB4*3<,-.$I)*+#54J1K$ TMNN$ DMQN$ .#8"5*-*3/$#5A#-*'#:$,57$)58(#,%)53-/$G)7#%'(#,7$,7*'.)*5$,4*53$%#A#(,-$,3#$ EC@@% ;,<-,."1$%4S5,-.$I)*+#54J1K$ NMQN$ 3(*&'%:$3,4)53$,-%*$(#'(#%#5.%$."#$8*(5#(%.*5#$*5$G")8"$*."#($7,.,$%#(A)8#%$8,5$ 9 =##<$>43$0G##<P$;4F1$(*-1#<$ UDMQN$ 8MQN$ 6#$6&)-.?$!"#$4*5#.)K,.)*5$*0$3,4#%$#00#8.)A#-/$-,/%$,$0*&57,.)*5$0*($*."#($ I'9K$ 4*5#.)K#7$*00#()53%:$%&8"$,%$-*8,.)*5F6,%#7$%#(A)8#%:$4&%)8:$,57$7)(#8.F.*F @C@@% DMNN$ 8*5%&4#($%#(A)8#%?$ :3VF$W$'5R#F$I'9K$ Brew ! Bibliothèques disponibles B-'*+%22%4".3*,1E2'*#-%4#*,-1,*%.*-1.!#',#*4",-*$%5=1(1E2'*='(+%(51.$'* GH%,%(%21*IC*8?J8*1.!*K15#<.3*KLM/?NOO*721!'P>*=<E2"#-'(#*1('*1E2'*,%* =<#-*-"3-'(*=("$'#*E'$1<#'*%+*,-'*-"3-'(*Q<12",)*%+*315'#*51!'*=%##"E2'*E)*1* .1,"&'*=21,+%(5*2"0'*789:6*R.*#%5'*$1#'#>*,-')*$1.*'&'.*%++'(*315'#*,-1,*1('* .%,*1&1"21E2'*%.*#2%4'(*".,'(=(','!*=21,+%(5#*2"0'*S1&16*K<E#$("E'(#*1('*4"22".3*,%* =1)*+%(*,-'#'*-"3-'(*Q<12",)*'T='("'.$'#*1#*4'226* "Coût du compilateur et du programme TRUE BREW %341"#39$:-$;3+9<$'*3-#=$,-$%544=$>?$@A$)*+#54B1$ 9FG"*51$H$I)*+#54J1K$ (certification) %341"#3F$O-$93+FP$'*3-#<$O-$%544<$ I)*+#54J1K$ 51/%+6'78,-)./*%+'()*+%06749)6*% en Europe "Moins répandu que JME surtout ;(*4$7#%)35$.*$7#'-*/4#5.<$."#$ =>?@$A,4)53$B)35,.&(#$ B*-&.)*5$",%$6##5$."*&3".0&--/$ 7#C#-*'#7$.*$8(#,.#$,$%&'#()*($ 8*5%&4#($%#(C)8#$#D'#()#58#:$ Brew "Code exécutable "Ressources "MIF (fichier d’identification de l’application) 10 Brew ! Exemple de code réseau avec ISockPort (compatible IPv4 et v6) 6*.#$7$8$ "Création de socket (pIsockPort - de type ISockPort*) int result = ISHELL_CreateInstance( pMe->a.m_pIShell, AEECLSID_SOCKPORT, (void **)&pMe->pISockPort ); "Précision de l’adresse et du port du serveur (sa de type AEESockAddrStorage) pMe->sa.wFamily = AEE_AF_INET; pMe->sa.inet.port = HTONS( 12345 ); INET_PTON( pMe->sa.wFamily, “10.0.1.127”, &pMe->sa.inet.addr); "On peut choisir le réseau support (si plusieurs disponibles WLAN et UMTS par exemple) ISOCKPORT_SelectNetwork( pMe->pISockPort, AEE_NETWORK_WLAN ); "Ouverture du socket (on précise ici qu’on veut ouvrir une connexion TCP) pMe->wSockType = AEE_SOCKPORT_STREAM; ISOCKPORT_OpenEx( pMe->pISockPort, pMe->sa.wFamily, pMe->wSockType, 0 ); "Connexion du socket (éventuellement asynchrone : si le résultat est AEEPORT_WAIT on re-demandera une connexion plus tard) int result = ISOCKPORT_Connect( pMe->pISockPort, &pMe->sa ); "Ecriture (ici aussi c’est asynchrone donc on stocke les données et les indices - à écrire et écrit - dans la structure de l’applet) int result = ISOCKPORT_Write( pMe->pISockPort, pMe->pBuffer + pMe->written, pMe->toWrite - pMe->written ); 11 12 Neutron : un middleware réseau pour mobiles Autres outils/SDK ! Symbian OS : Système d’exploitation pour mobiles Nokia (la plupart) ainsi que les mobiles 3G de Samsung et Sony Ericsson ! Neutron 4.0 "mise en place de serveurs de jeu aux USA et en Europe "bibliothèques disponibles pour #Mobiles : JME, Brew, Flash Lite, Windows Mobile, RIM Blackberry #PC : Java, .Net, Flash "gestion multi-plate-forme, multi réseaux "gestion des abonnements et de la facturation "service après vente développeurs "Spécifique à ces mobiles, donc plus rapide et plus standard (pas de portage) ! Windows Mobile : Système d’exploitation de Microsoft pour les terminaux mobiles "Mêmes avantages/inconvénients que Symbian OS mais plutôt pour PDA et Smartphones haut de gamme. ! ExEn : Execution Engine de In-Fusio "Spécifique aux jeux (game engine) "Basé sur JME "Permet de ne pas avoir à faire de portage ! Ce qu’il gère "téléchargement de jeux et de données pour jeux "gestion des scores et des tournois/mise en relation de joueurs "multi-joueur par tour et semi temps-réel "chat intégré au jeu "multi-joueur et multi-plate-forme ! Mophun de Blaze Global "Similaire à ExEn (game engine) "Existe depuis longtemps, très sécurisé (piratage très difficile) mais peu performant 13 14