• Accueil
  • Musique
  • Photos
  • warpdesign.fr
Bleu Orange Vert Rose Violet

Un jeu en HTML 5 / JavaScript / CSS

Posté dans Techno, Xperiments le Samedi 10 juillet 2010 par leo Mots-Clés: css3, html5, in the mood for life, javascript, js, mobile, palm, pixi, pre, safari, transitions, trip-hop, triphop, warpklondike, wax, wax tailor, webkit, webos
10 juil

Espion(s)
Intéressé par le développement sur Palm/webOS, j’ai commencé par faire un petit POC sur la possibilité de développer un petit Solitaire en HTML 5 / JavaScript. Voici quelques remarques (générales) sur le développement de jeux CSS/Html5/JavaScript.

This or That ?

La principale difficultée réside dans la variable this, qui peut prendre n’importe quelle valeur en JavaScript. Dans tout autre language (Java, Cpp,…), this fera toujours référence à l’objet en cours. En JavaScript, ce n’est pas aussi simple: this dépend en fait du contexte d’appel de la méthode, ce contexte pouvant être modifié par l’utilisation de apply.

Comme je sens que vous commencez à tourner de l’oeil, prenons un exemple:

function monConstructeur()
  {
     this.monAttribut = 'yop !';
  }
 
  monConstructeur.prototype = {
     maMethode: function()
     {
        console.log(this.monAttribut);
     }
  }
  var monInstance = new monConstructeur();
 
  // 'yop !'
  monInstance.maMethode();
 
  // undefined
  setTimeout(monInstance.maMethode, 1000);

A 1ère vue, les deux appels devraient tous les deux afficher ‘Yop !’, et pourtant, le 2ème appel affichera undefined, parce que this, dans ce cas précis, fera référence à l’objet global (ie: window), et non pas à notre instance. Mais ?! Pourquoi ?!! La valeur de this dépend en fait de l’invocation.

Il existe en réalité 4 patterns d’invocation de méthode en JavaScript, et la valeur de this en dépend:

1. Le pattern d’invocation de méthode

Dans le cas d’invocation de méthode, this fait référence à l’objet contenant la méthode:

var monObjet = {
     monAttribut: 'yop !',
     maMethode: function() { return this.monAttribut; }
  }; 
 
 // 'yop !'  
 monObjet.maMethode();

2. Le pattern d’invocation de fonction

Dans le cas d’une invocation de fonction, this ne devrait pas être défini, et fait pourtant référence à l’objet global. C’est une erreur de conception du language qui se verra corrigée dans la prochaine version de ECMAscript.

var maFonction = function() { return this.location; }
  // Object
  maFonction();

3. Le pattern d’invocation de constructeur

function monConstructeur(){
  this.monAttribut = 0;
}
 
var monInstance = new monConstructeur();

Lors de l’appel d’une fonction construteur préfixé par new, un nouvel objet est créé, avec un lien masqué vers le prototype de la fonction, et this est automatiquement lié à ce nouvel objet.

4. Le pattern d’invocation avec apply

La valeur de this lors de l’appel d’une fonction étant quelque peu aléatoire, il est possible de forcer la valeur de this à l’aide de apply.

Function.apply(valeurThis, ArrayArguments);

Les frameworks JavaScript fournissent généralement une méthode permettant de facilement modifier la valeur de this pour l’appel d’une fonction. Il est donc facile de régler le problème précédent.

Par exemple, avec le framework Prototype (utilisé dans le framework MVC de Palm: Mojo), on pourrait utiliser bind:

setTimeout(monInstance.maMethode.bind(monInstance), 1000);

Ou, en utilisant jQuery (1.4+):

setTimeout(jQuery.proxy(monInstance.maMethode, monInstance), 1000);

Transitions CSS

Depuis la sortie de l’iPhone il y a 3 ans Apple a introduit et ne cesse de pousser les transitions CSS, beaucoup plus adaptées à la puissance limitée (tout est relatif ;) ) des smartphones. Avant l’arrivée des transitions, pour animer des objets HTML, on utilisait les frameworks tels jQuery. Par exemple, pour déplacer un objet de 100px vers la droite, on peut faire avec jQuery:

$('#foo').animate({left: '100px'}, 1000);

Le problème, lorsque l’on se place dans le contexte des smartphones est que tout est effectué par le processeur. La puissance de ces machines étant relativement limitée, et la batterie de courte durée, cette méthode n’est pas utilisable. Les transitions CSS (disponibles sur tous les navigateurs modernes, ce n’est pas (plus) une exclusivité webKit: Firefox, Opera, webKit) permettent de définir des animations à l’aide des CSS. Quelle est la différence me direz-vous ? La principale différence est que les animations effectuées via des transitions CSS sont accélérées graphiquement et permettent donc de libérer le processeur et, théoriquement, d’utiliser moins de batterie.

Les transitions étant encore en plein développement, les spécifications ne sont pas finales et chaque navigateur les implémente donc à l’aide d’un préfixe: -o- pour Opera, -moz- pour Firefox et -webkit- pour les navigateurs utilisant webkit (Safari, Chrome, OWB,…). Plusieurs manières permettent d’animer un objet à l’aide des transitions.

1. Animation des propriétés
Pour un sélecteur (CSS) donné, il est possible de choisir quelle(s) propriété(s) sera/seront animée(s). Par exemple, pour animer notre bloc #foo, on utiliserait les CSS suivants:

#foo{
   -webkit-transition-property:left;
   -webkit-transition-duration:1000ms;
 
   -o-transition-property:left;
   -o-transition-duration:1000ms;
 
   -moz-transition-property:left;
   -moz-transition-duration:1000ms;
}

La modification de la propriété left de l’objet #foo sera alors automatiquement animée, et de durée 1000ms.

2. Animation
Il est aussi possible de créer des animations relativement complexes, à l’aide de keyframes, par exemple (ici pour webkit):

@-webkit-keyframes 'zoomIn' 
	{
		0%{
			opacity:0;
			-webkit-transform: scale(1.0);
		}
		25%{
			opacity:1;
		}
		100%{
			opacity:0;
			bottom:20px;
			-webkit-transform: scale(3.0);
		}
	}

Ici nous définissons une animation nommée « zoomIn », et 3 « étapes ». Le passage à ces 3 étapes sera automatiquement animé.

Pour utiliser cette animation, il suffit ensuite de faire:

#foo.animate{
   -webkit-animation: zoomIn .4s ease-in;
}

Lorsque l’objet #foo aura la classe ‘animate’, il jouera automatiquement l’animation zoomIn, pendant 0.4sec, en utilisant la fonction ease-in. Cette fonction définit la vitesse de l’animation au cours du temps: ease-in étant la valeur par défaut.

3. aller plus loin
Il est possible d’utiliser le JavaScript pour spécifier des fonctions callback à exécuter à la fin d’une transition. On peut ainsi définir des animations assez complexes, complexes dans tous les sens du terme: le code définir devient vraiment très complexe, et surtout on mélange maintenant simples propriétés d’affichage avec l’animation. Je conseille d’ailleurs, dès le début, de séparer les transitions CSS, des propriétés CSS classiques.

Et j’attends avec impatience le premier SDK permettant de développer ces animations CSS, parce que actuellement, ces transitions, aussi puissantes soient-elles sont très très difficilement accessibles, et totalement impossibles à débugger…

Alors: qui sera le 1er ? Adobe ? Apple ? Google ?

Un WebKit, des WebKit

WebKit, le moteur utilisé actuellement dans Safari (y-compris la version iPhone), Chrome, le navigateur d’Android, le futur navigateur de BlackBerry, etc… n’a pas (scoop ! :) ) été créé par Apple mais est basé sur le projet KHTML, du groupe KDE. Ce moteur très performant a été adapté sur de nombreuses plateformes et chaque plateforme apporte ses modifications et restrictions. Ainsi, WebKit utilisé dans Safari 5 supporte des fonctionnalités non présentes dans Chrome (exemple: -webkit-backface-visibility), le navigateur de Palm/webOS ne supporte pas les box-shadow ni les gradients, etc…

Contrairement à ce que l’on pourrait donc croire, l’utilisation de WebKit simplifie sans aucun doute le travail des développeurs des systèmes, mais en aucun cas celui des développeurs Web, puisque toutes ces différences doivent être prises en compte pour obtenir un site/une application multi-plateformes.

Attention donc: il existe des WebKit, pas un seul ;) Même si la base est évidemment la même, le résultat final sera probablement différent selon les plateformes.

- Tester et télécharger WarpKlondike
- Télécharger la version webOS pour votre Palm Pré ou Pixi
- Plus d’informations sur les transitions: Apple Developer Site

leave it!Wax Tailor  [ Trip-Hop ]
Ambiance: Zen
Albums: The train, leave it, In the mood for life
A écouter: This Train

Laisser un message

Temps à Paris  Paris, °C

By Myself

  • Instant Photo
    Coucher de Soleil sur le Puy de Dôme... ce qu'on ne voit pas sur la photo c'est qu'il y avait un petit barbecue improvisé... en pleine nature :)
    Bon, alors on arrive à la gare vers 19h45, on a le train qui part à 20h27... Qu'est-ce qu'on fait ?

On va se poser à la brasserie du coin... seulement ca fait un peu limite lol Alors on se retrouve à finir les pizzas sur le quai de la gare... ;)
    Un petit nain se cache sur cette photo :)
  • Articles Récents
    • Cher Orange…
    • Test du Nokia Lumia 800
    • La folie HP Touchpad!
    • Test de Windows Phone 7
    • Guerre dans la vallée: Google vs Apple
    • Migration jQuery ↔ Prototype
  • Music on Air
     No music on air ! (something's wrong ;))
  • Derniers Commentaires
    • Test du Nokia Lumia 800  {2}
      Yapiroo, Apollo de MWP
    • La folie HP Touchpad!  {3}
      beri, admin, denicfr
    • Coût d'un SMS  {5}
      Whitopet-web, LIL JON, Da Sexy President [...]
  • Catégories
    • Cinéma
    • Design
    • Divers
    • Inspiration
    • Musique
    • Réflexion
    • Techno
    • Voyages
    • Xperiments
  • Historique
    • février 2012
    • janvier 2012
    • août 2011
    • janvier 2011
    • août 2010
    • juillet 2010
    • juillet 2009
    • mars 2009
    • février 2009
    • janvier 2009
    • janvier 2008
    • septembre 2007
    • août 2007
    • juillet 2007
    • juin 2007
    • mai 2007
    • février 2007
    • janvier 2007
  • Recherche




  • Accueil
  • Musique
  • Photos

© Copyright warpdesign.fr. Tous droits réservés.
Design par FTL Thème Wordpress créé par Smashing Magazine

Retour en haut