Archive

Archives pour la catégorie ‘Code’

Calcul du framerate réel d’une animation

13/12/2007 4 commentaires

Parfois, avec Flash, il faut savoir réinventer la roue. Par exemple, lorsque l’on veut coder un moteur d’animation qui s’intègre au sein d’un système de rendu isométrique complexe, on aimerait à la foi pouvoir disposer d’un framerate le plus élevé possible, tout en jouant les animations au framerate dans lequel elles ont été réalisées.

Pour se faire, il faut obligatoirement passer par l’indispensable case du calcul du framerate en cours. Il existe peut-être des mondes merveilleux ou la valeur que l’on a entrée dans le champ « Nombre d’images par secondes » de l’IDE Flash est tout le temps vraie, mais il ne s’agit pas du notre.

Voyons différentes approches pour calculer un framerate.

Lire la suite…

Categories: Code Tags: , ,

Et boum !

12/12/2007 un commentaire

Un petit crash du player 9 !

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package net.tynambule.exp {
	import flash.display.MovieClip;
	import flash.display.LoaderInfo;
	import flash.display.Sprite;
	import flash.net.URLRequest;
	import flash.events.Event;
	import flash.display.Loader;
	[SWF(backgroundColor="#ffffff", frameRate="250", width="100", height="100")]
	public class MovieClipSpriteTest extends Sprite
	{
		public function MovieClipSpriteTest()
		{
			var l : Loader = new Loader();
			l.contentLoaderInfo.addEventListener(Event.INIT, onLoadInit);
			// Un SWF Flash 9/AS3 avec "Document class" défini à "MobileSprite"
			l.load(new URLRequest("swfexterne.swf"));
		}
		private function onLoadInit(e : Event) : void
		{
			var MobileSprite : Class = (e.target as LoaderInfo).applicationDomain.getDefinition("MobileSprite") as Class;
			var instance : MovieClip = new MobileSprite() as MovieClip;	// KA-BOOM
			this.addChild(instance);
		}
	}
}

Ce code fonctionne très bien si l’on utilise l’option « Linkage » d’un clip dans la bibliothèque, mais crash lamentablement si on place directement nos éléments sur la scène et que l’on défini une « Document class ». À noter que c’est l’instanciation de la classe récupérée qui foire, et non pas sa récuperation. Si l’on fait un describeType sur MobileSprite dans le code ci-dessus avant de créer l’instance, le retour est normal, il s’agit bien d’une classe qui étend bien MovieClip.

C’est pô bô. Allez, salut.

Categories: Code Tags: ,

Astro (Flash Player 10) : AS3, ECMA4

10/12/2007 Aucun commentaire

Astro, le nom de code du prochain player Flash (le dixième), ne cesse de se découvrir. On en est désormais certains, l’AS3 restera en vigueur pour cette release. L’AS4 reste à l’horizon, mais lointain. En revanche, certains ajouts sont faits à la structure du langage pour se conformer au standard ECMA-232 Rev 4, et entre nous, ça dépote.

Les tableaux typés

1
2
3
4
5
// Crée un tableau où tous les éléments doivent être de type String
var typedArray:[String] = new [String]("Pomme", "Poire", "Banane");
 
// Alternative en variable anonyme :
["Pomme", "Poire", "Banane]:[String];

Les génériques typés

1
2
3
4
5
6
7
8
9
10
11
// Crée un objet générique avec trois propriétés typées
{x:100, y:150, z:50}:{x:Number, y:Number, z:Number};
 
// Défini un type d'objet générique type
Point3D = {x:Number, y:Number, z:Number};
 
// Et hop, on utilise ce type générique
var myPoint:Point3D = new Point3D();
myPoint.x = 100;
myPoint.y = 150;
myPoint.z = 50;

L’opérateur ‘like’

1
2
3
4
5
// Retourne vrai, car ces deux objets ont des propriétés communes (x, y), ainsi que d'autres points communs
trace(instanceOfSprite like instanceOfMovieClip);
 
// Retourne également vrai, même si les deux classes n'ont aucun parent commun !
trace(instanceOfSprite like instanceOfPoint);

Les types mixtes

1
2
3
4
5
6
7
// Définition d'un type acceptant à la foi les valeurs de types Number et String
type MixedType = (Number, String);
 
// Petit test :
var mt1:MixedType = "Pomme"; // Fonctionne correctement
var mt2:MixedType = 12; // Fonctionne également
var mt3:MixedType = {x: 12, y: 15}; // Erreur de compilation, ni Number ni String !

Espérons que tout ceci rentre dans le planning d’Adobe pour Astro, sans quoi il va falloir être très patient pour l’AS4… Allez, salut !

Categories: Code Tags: ,

La métadonnée Embed en AS3

06/12/2007 3 commentaires

Il y a peu, le monde merveilleux de l’ActionScript 3 s’est ouvert à moi. Même si certaines choses sont un peu déroutantes, ayant parcouru un très long chemin en AS2 (raah, l’absence de constructeurs private/protected! Enfoirés de l’ECMA, laissez tomber cet héritage par prototype à la con!), certaines des nouvelles fonctionnalités tuent carrément.

Un truc qui m’avait toujours gonflé en AS2, c’est la liaison entre les assets et le code. Je codais sous Eclipse en compilant avec MTASC, et je modifiais mes assets sous Flash. Seulement, histoire de pouvoir les associer à une classe, je devais, au choix, mettre ma classe sous Flash (et me taper une compilation AS par Flash d’environs 30 minutes), ou faire une grosse méthode bourrine à coup de Object.registerClass.

C’était, avouons-le, pas super beau. Mais désormais, en AS3, les gens d’Adobe ont rajoutés des métadonnées merveilleuses qui permettent de faire ça tout seul, et bien plus encore.

Lire la suite…

Categories: Code Tags: , ,

Récuperation de l’ID d’une instance d’objet

02/11/2007 Aucun commentaire

Depuis PHP 5.2, il n’est plus possible de récupérer l’ID interne d’un objet via un cast en string sans avoir implémenté de méthode __toString sur ledit objet.

Ancienne méthode:

1
2
3
4
5
6
7
class foo {
    public function __construct() {
        echo "Hi, it's me!";
    }
}
$bar = new foo();
print $bar;

Auparavant, ce snippet renvoyait l’ID interne de l’objet. Désormais, et c’est plus propre comme ça, il lance une erreur fatale récuperable (« Catchable fatal error: Object of class foo could not be converted to string in filename on line n« ). Mais du coup, on perd un moyen simple et efficace de savoir à quelle instance d’un objet on a affaire, ce qui peut être très utile dans un processus de debug.

Fort heureusement, les gentils monsieurs de PHP ont implémenté une fonction qui permet de refaire la même chose: spl_object_hash() ! Hé ben voilà, le monde est sauvé. Allez, salut.

Categories: Code Tags: ,