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