développement de jeux sur iPhone

Depuis son lancement, le 11 juillet dernier, l’AppStore comptabilise 500 millions d’applications téléchargées. Parmi les applications les plus demandées figurent les jeux suivis de près par l’entertainment, domaines très juteux pour Apple. A l’époque du lancement du store, Medialets estimait déjà le chiffre d’affaires de Super Monkey Ball à 4,9 millions de dollars en trois jours et celui de Bejeweled 2 à 3,4 millions de dollars.
Des chiffres plutôt impressionnants pour un hardware dont la vocation première n’était pas celle d’une console de jeux !

Pourtant, le smartphone a eu le vent en poupe dès ses débuts, aussitôt encouragé par Sega qui le comparait à une Dreamcast, Electronic Arts qui le considérait plus puissant qu’une DS ou Carmack qui vantait ses mérites en déclarant qu’à sa sortie le géant de Cupertino révolutionnerait le développement sur mobile.

Depuis les déclaration du responsable de produits Apple US Greg Joswiak à Stuff Magazine et celles de Steve Jobs au Wall Street Journal, il ne fait plus aucun doute qu’Apple compte truster le marché du jeu mobile.
Des initiatives comme le portage de Unity3D ou l’annonce de l’iControlPad confirment la tendance, et les rumeurs concernant le lancement d’un iPhone multi-core avec Firmware 3.0 et performances graphiques boostées pourraient définitivement enfoncer le clou.

Mais quelles sont les réelles perspectives d’un développeur de jeux iPhone en 2009 ?
Avec le professionnalisme qui le caractérise, Gamasutra répond à cette question dans un dossier de 4 pages. Je vous recommande sa lecture.

Sachez que de nombreux développeurs Flash (Keith Peters, Aral Balkan, Mike Chambers, Peter Elst, Mike Downey…) ont déjà viré leur cuti partiellement voire totalement pour certains, et que quelques tutoriaux commencent à fleurir sur le net.
Rappelons par contre que la sélection naturelle se fait dès l’entrée. Il faut disposer d’un Mac avec Leopard installé, et débourser la somme de 99 euros pour pouvoir publier sur le smartphone, même s’il est toujours possible de se contenter de l’émulateur pour commencer. Il vous faudra aussi dompter Xcode et maîtriser un minimum le tandem Objective C/Cocoa Touch. Ni plus ni moins !

Pour finir, une news intéressante qui s’adresse à ceux qui aimeraient mettre le pied à l’étrier. Simon Oliver, ancien développeur Flash (encore un décidément !) mais surtout brillant auteur de Rolando vient de publier un portage du Testbed de Box2D. Ce portage en Cocoa Touch fonctionne sur iPhone et iPod Touch et prend en charge l’écran tactile et l’accéléromètre. Le repository se trouve ici et les fichiers concernant l’iPhone dans le répertoire build. Voici une petite vidéo qui devrait finir de vous convaincre.

valse dorée avec Flash

Le golden globe du meilleur film étranger a été décerné ce week-end à Valse avec Bachir, le film d’animation d’Ari Folman, .

C’est dans une interview disponible sur Animation World Network que l’on apprend que le film a été réalisé en grande partie avec Flash, même si certains efforts niveau budget ont été consenti pour l’usage de l’animation traditionnelle. Et quand dans l’interview, AWN insinue « Beaucoup de gens déplorent le fait que Flash ne soit pas assez flexible pour de la production artistique », Ari répond avec humour: « A 600 dollars le logiciel, on ne peut que l’aimer ! ».

Cette interview corroborée par une consécration tamisera peut-être les perpétuels dénigrements de l’outil Flash en tant que logiciel d’animation.

Via popsci

Open Video Player en action

Open Video Player est un site communautaire soutenu par Akamai, leader mondial de diffusion de contenus.
Ce site se propose de partager les bonnes pratiques concernant le développement de players vidéo.

Cette initiative a déjà su s’entourer d’une liste de partenaires prestigieux avec en tête de liste Adobe et Microsoft. Les régies publicitaires ont répondu à l’appel bien sûr. On retrouve: 24/7 Real Media, BlackArrow, Eyewonder, OpenX, Panache, ScanScout et Smartclip.

Un framework open source décliné en deux versions (Silverlight 2.0 et Flash 9.0) est disponible sur le site. Il est utilisé par les non moins prestigieux Adobe TV, FWA Theater et New York Magazine.

La distribution Flash inclut les fonctionnalités suivantes: Connexions (Ondemand RTMP, Live RTMP et HTTP), containers audio et vidéo (H.264, VP6, FLV, AAC3 et MP3), détection de bande passante, prise en charge des firewalls, gestion avancée des cue points, bridage du data rate, contrôle du playback, gestion des MetaDatas, parsing Media RSS 1.1.2…

Ci-dessous, un petit test maison utilisant un connecteur 24/7 Real Media pour illustrer les possibilités d’intégration d’une régie publicitaire.

Pour l’exercice de style et proposer du contenu après la pub, j’ai modifié la classe AkamaiMediaRSS.
Après une succincte réécriture de la méthode parseXML, le player est capable de lire un flux RSS Seesmic et de prendre en charge une version raccourcie (pour l’occasion) de ma playlist utilisateur.
Que du bonheur !

Pour lancer l’exemple, il faut cliquer sur le gros bouton bleu, aimer la bière, les chutes et les brèves de comptoir.

[kml_flashembed movie="http://www.tweenpix.net/files/Akamai_Player_247.swf" width="330" height="280"/]

Via flashmagazine

Facebook – Flash Client Library

Today, I spent few hours to play with Facebook Javascript client library. While I was playing with it, I started to build a little library to fit my needs for a game project.
I built something compact, there’s only 2 classes at the moment (client class and its event class). Sobriety !
It uses a JavaScript proxy like FaceBookBridge library from ZeroFractal, but the approach is a bit different. That’s a matter a lot of design and code perspective. I wanted simplicity and visibility, like remoting API.
Let me show you !

You have to make direct method calls on the client (as you would with JavaScript library). It returns a responder instance on each call:

var responder : EventDispatcher = client.Friends.get() as EventDispatcher;

To get some request results, you can suscribe listeners (as many as you want) to any responder:

responder.addEventListener(FacebookClientEvent.ON_RESULT, onFriends);
responder.addEventListener(FacebookClientEvent.ON_FAULT, onError);

And guess what, results are encapsulated in events passed as arguments to your callback methods:

public function onFriends( e : FacebookClientEvent ) : void
{
	trace ( e.methodName + " call: " + e.result.length );
}

Clean and easy as I like it.
Last but not least, you got some errors reporting. I had hard time on this part, coz the JS implementation was acting weird. I’m not even sure at this time to have understood the whole error process. I must finalize this part, few errors aren’t caught at this time but every transaction is logged in firebug with Debug.dump JS calls.

public function onError( e : FacebookClientEvent = null ) : void
{
	trace ( "onGetInfoError(" + "method:" + e.methodName
				+ ", error_code:" + e.result.error_code
				+ ", error_msg:" + e.result.error_msg + ")" );
}

Here’s a short demo to end the teasing around this project.
In this example, client retrieves all the name and profile photos urls of a user friends list through 2 API calls.

package
{
	import com.bourre.facebookflashapi.FacebookClient;
	import com.bourre.facebookflashapi.FacebookClientEvent;

	import flash.display.Sprite;
	import flash.events.EventDispatcher;

	public class FacebookClientTest
		extends Sprite
	{
		protected var client : FacebookClient;

		public function FacebookClientTest()
		{
			client = new FacebookClient();

			var responder : EventDispatcher = (client.Friends.get() as EventDispatcher);
			responder.addEventListener(FacebookClientEvent.ON_RESULT, onFriends);
			responder.addEventListener(FacebookClientEvent.ON_FAULT, onError);
		}

		public function onError( e : FacebookClientEvent = null ) : void
		{
			trace ( "onGetInfoError(" + "method:" + e.methodName
						+ ", error_code:" + e.result.error_code
						+ ", error_msg:" + e.result.error_msg + ")" );
		}

		public function onFriends( e : FacebookClientEvent ) : void
		{
			trace ( e.methodName + " call" );

			( client.users.getInfo( {uids:e.result, fields:["name", "pic_big"]} )
			as EventDispatcher).addEventListener(FacebookClientEvent.ON_RESULT, onGetInfo);
		}

		public function onGetInfo( e : FacebookClientEvent ) : void
		{
			for each ( var o : Object in e.result )
				trace ( "Nom:" + o.name + ", Image:" + o.pic_big );
		}
	}
}

I will release the source code under an open source licence when it’ll be a bit more polished for people who want to try it, and maybe I’ll make a video tutorial, who knows !

Facebook et la plateforme Flash

Facebook est en pleine expansion. Hier, Inside Facebook publiait hier un bilan assez impressionnant: « 150 millions d’utilisateurs, c’est un nouveau cap majeur franchi pour Facebook, dont la croissance s’envole à la fois aux Etats-Unis et dans le monde. A ce rythme, Inside Facebook estime que Facebook devrait dépasser les 200 millions d’utilisateurs dès le mois d’avril, soit dans environ 90 jours.« .

Avec l’apparition en Juillet dernier de Facebook Connect l’interopérabilité applicative (Digg, Six Apart, Twitter, Apple, Kongregate, Seesmic, Vimeo…) bat son plein et les sollicitations de la bible du marketing sur Facebook ne laissent pas insensible le développeur Flash lambda (et surtout ceux qui l’emploient soit dit au passage). Maintenant, il se demande comment il va pouvoir rivaliser avec ses détracteurs ajaxiens et lancer la prochaine application hype qui fera baver son réseau dans une débauche d’effets multimédias dont lui seul a le secret. Il se pose la question phare: Quelles sont les possibilités d’intégrations de Facebook au sein du player Flash et par extension au sein de la plateforme Flash (Flex et Air) ?

J’ai fait quelques recherches, et je dois avouer que le terrain est encore assez vierge. Le web abrite quelques projets plus ou moins sérieux: Facebook AS2 Client, facebook-as3, facebookas3lib ou encore as3facebooklib.
La librairie la plus solide à ce jour est Facebook Actionscript API de Jason Crist qui propose une implémentation assez complète de l’API REST Facebook en ActionScript 3.0. On déplorera par contre l’activité en standby et la mauvaise qualité des exemples. Mais là où le bât blesse le plus, et c’est d’ailleurs l’inconvénient de la majorité des librairies Flash proposées, c’est la publication de la secret key dans le bytecode du swf. Cela rend la librairie inutilisable en l’état, du moins dans le cadre d’un projet sérieux quand on sait avec quelle facilité le code source d’une application Flash est décompilable.

En termes de sécurité, on préférera l’alternative intelligente FacebookBridge de ZeroFractal. Ce set de 3 classes déploit un proxy (par le biais d’ExternalInterface) qui permet à votre application Flash de communiquer avec la librairie client JavaScript de Facebook. Le seul inconvénient ici, c’est l’absence de typage dû à la communication avec JavaScript sous forme de boîte noire.

On en vient à se demander si la solution ultime ne serait pas un système capable d’intègrer la partie sécuritaire avec un proxy JavaScript (pour la prise en charge des cookies) et de proposer en aval une implémentation complète de l’API REST Facebook en ActionScript 3.0. Affaire à suivre !

Sigma Designs adopte la plateforme Flash

Après Intel, c’est au tour de Sigma Designs de faire l’annonce de l’intégration de la plateforme Flash dans le monde du digital home market.
Même s’il n’y a eu aucune annonce à la dernière keynote d’Apple concernant l’intégration du player Flash dans l’iPhone, on dirait bien que 2009 est partie pour mettre en lumière les fruits de l’Open Screen Project.

Via digitalmedianet.com

Flash embarqué sur les processeurs Intel Media CE 3100

Dans un précédent billet, je vous parlais de la stratégie d’Adobe avec Open Screen Project. La firme californienne continue son oeuvre invasive en signant un partenariat avec Intel pour porter la technologie Flash sur le processeur Intel Media CE 3100.

Selon William Leszinske Jr., le processeur CE 3100 devrait permettre d’utiliser les possibilités HD de Flash et délivrer aux utilisateurs une expérience Internet riche sur un écran de TV .
Sortie prévue, mi 2009.

Via RTTNews.com

in da mix

Voici mes derniers travaux en avant-première. Je vous en parlais pas plus tard qu’hier.

Il s’agit d’un petit moteur en full-flash de pseudo djaying que j’ai développé pour une campagne publicitaire Sony/RadioFG au sein de Periscope.

Ca se passe ici.

Plus tard, j’aimerais développer un mode recording avec backend MySQL et peut-être même décliner le moteur en application multi-users.

ps : Le contenu de certains tooltips est hors-champ, cela attendra lundi … ^^

on soundComplete(ment) à l'ouest

Je bosse depuis trois jours sur une application de mix online et j’ai donc naïvement tenté d’utiliser le callback onSoundComplete pour enchaîner mes loops en synchro. Autant dire que ce fut comme pisser dans un violon, onSoundComplete est totalement inutilisable dans ce contexte.

Pourquoi ?

Le broadcast de onSoundComplete est temporisé à intervalles réguliers 2048*1000/44100 = 46.43 ms, ce qui génère forcément une latence plus ou moins grande entre le moment où le son s’arrête et celui où l’événement est envoyé. Ce temps de latence peut donc atteindre les sacro-saintes 46.43 ms, un délai inacceptable pour une application de ce genre.

Ceci nous ramène à un précédent billet posté sur ce blog.

La plupart des applications de mix (comme Basement MX d’Andre Michelle) trichent en utilisant 8 canaux maximum et démarrent la lecture de toutes les loops en même temps (afin qu’elles soient synchrones) au lancement de l’application.

C’est en relisant l’article de Frank P. Baumgartner et en parlant avec Andre Michelle que j’ai réalisé que la solution idéale résidait à l’intérieur du nombre magique : 46.439909297052154195011337868441 qui représente la cadence en ms du buffer.

J’ai donc développé une classe AudioTrack qui permet d’ajouter à l’intérieur d’un stack des instances de l’objet Sound et de les jouer de manière synchrone en utilisant une horloge virtuelle (loop audio de 46.43ms) pour cadencer le tout.

Le principe au final consiste à avoir un offset de 50ms (minimum) de silence sur chaque son, démarrer leur lecture en retranchant la durée totale du son (précédemment joué) et la position en cours de la tête de lecture avant que le résultat soit inférieur à 46.43 ms et finalement utiliser ce résultat pour positionner la tête sur le son suivant (offset).

C’est exactement l’idée exposée par Frank P. Baumgartner que j’avais sous-estimé à tort à l’époque.

Le résultat est hallucinant de fluidité, mes sons n’ont jamais aussi bien bouclé entre eux et j’ai pu grâce à cette nouvelle classe construire une application permettant de mixer des loops à l’infini (au lieu de 8 ^^). AudioTrack envoit un événement « onNextLoop » à chaque changement de boucle et peut être instancié 8 fois pour utiliser tous les canaux du player.

Bientôt une démo en ligne ! ;)

Dernière mise en garde sur onSoundComplete, l’événement n’est pas broadcasté s’il n’y a pas d’audio device correctement installé sur la machine utilisateur. Cesar Tardaguila en parle ici.

Flash Team : What is Ellipsis?

On dirait bien que Mike Chambers passe aux aveux et devinez quoi … c’est sur Flash Team qu’il se confesse.

On apprend qu’Ellipsis est le nom de code du prochain update de Flash MX 2004. Il sera disponible gratuitement à la fin de l’été.

Mais quelles seront les réélles améliorations apportées par Ellipsis ?
- Performances, et utilisation des ressources.
- Documentation.
- Composants.

Mike ne manque pas de préciser au passage qu’une foule de bugs ne figurant pas dans ces trois catégories seront corrigés. Cadeau bonus !

A la question : « Ellipsis sera-t’il 100% full debugged ? », Mike répond non biensûr, mais précise que cette nouvelle release posera de solides fondations pour corriger les problèmes les plus délicats lors du prochain upgrade de Flash, ceux qui nécessitent une réécriture en profondeur du code.

Ca se passe ici.