J'ai découvert récemment le clip de la chanson "Unintended" de Muse.
Hormis la beauté de la chanson, j'ai beaucoup accroché sur l'effet donné à la
vidéo dans le clip.
Bon, ben il ne restait plus qu'à le reproduire dans Flash...
14 septembre 2009
Par -Alexandre LEGOUT aka LAlex- le 14 septembre 2009, 02:37
J'ai découvert récemment le clip de la chanson "Unintended" de Muse.
Hormis la beauté de la chanson, j'ai beaucoup accroché sur l'effet donné à la
vidéo dans le clip.
Bon, ben il ne restait plus qu'à le reproduire dans Flash...
3 septembre 2008
Par -Alexandre LEGOUT aka LAlex- le 3 septembre 2008, 15:41
Les bindings sont un aspect de Flex bien séduisants car il permettent de refléter automatiquement la modification du contenu d'une variable vers une autre. Seulement, lorsqu'ils sont utilisés intensément, ils peuvent également devenir un goulot d'étranglement en terme de performances.
Pour éviter cela, la solution est plutôt simple, et nécessite de savoir comment fonctionne la balise [Bindable] et comment elle est utilisée par le framework Flex...
20 juin 2008
Par -Alexandre LEGOUT aka LAlex- le 20 juin 2008, 13:45
Je suis actuellement en train de me bruler les neurones sur un éditeur,
permettant entre autres de modifier un visuel à la souris. De quoi devoir
replonger dans nos bonnes vieilles notions de trigo.
J'en profite donc pour donner ici 2-3 astuces
Pour passer d'un point (x, y) à un autre (x', y') en lui appliquant une
rotation d'angle a, l'équation est la suivante:
x' = x*cos(a) - y*sin(a)
y' = x*sin(a) + y*cos(a)
Ce qui nous donne un petite méthode AS3:
public function rotatePoint(point : Point, angle : Number, isRadian : Boolean = false) : Point {
if (ang == 0) return point.clone();
var radAngle : Number = isRadian ? angle : angle * Math.PI / 180;
var angleCos : Number = Math.cos(radAngle);
var angleSin : Number = Math.sin(radAngle);
return new Point(point.x * angleCos - point.y * angleSin, point.x * angleSin + point.y * angleCos);
}
Notez que l'on peut passer cette méthode un angle en degré (par défaut) ou en radians.
L'AS3 nous fournit une méthode toute prête: Math.atan2. Elle prend
en paramètre les coordonnées du vecteur (j'utilise un point dans l'exemple) et
retourne un angle en radian (d'où le flag isRadian de la méthode
précédente).
Notez bien que la coordonnée 'y' est le premier argument
(chez moi, FDT m'affiche 'x' en premier, je me suis fait avoir au début)
var vector : Point = new Point(mouseX, mouseY);
var angRadian : Number = Math.atan2(vector.y, vector.x);
Selon les besoins, il peut être nécessaire d'utiliser systématiquement un angle entre 0 et 360, ou entre -180 et 180. Avec les modulos, cela peut se faire facilement:
// Get a random number between -1500 and 1500
var angle : Number = Math.random() * 3000 - 1500;
// Normalize angle between 0 and 360
var angleIn360 : Number = ((angle % 360) + 360) % 360;
// Normalize angle between -180 and 180
var angleIn180 : Number = ((angle % 360) + 540) % 360 - 180;
---
Voilà pour les ch'tites astuces de l'oncle LAlex ![]()
31 mars 2008
Par -Alexandre LEGOUT aka LAlex- le 31 mars 2008, 17:30
L'équipe d'envrac avait prévenu, mais je suis en train de doucement glisser vers la dépendance au JSFL...
Un p'tit langage qui permet de scripter l'IDE et ainsi de raccourcir
drastiquement les taches répétitives, c'est quand-même du pain béni pour peu
qu'on prenne le temps de s'y pencher. Pas encore interessé aux panneaux
"custom", j'ai pondu quelques petites déclinaisons d'un script inspiré par une
ancienne collègue - si tu te reconnais, un paquet de Carambars
- et qui
facilite grandement l'intégration timeline/code (un petit article prévu la
dessus dés que je lève un peu la tête des mes projets et que je me défénéantise
en ce qui concerne ce blog).
Bref, ceci est un ensemble de 4 scripts JSFL qui font le tour des instances nommées dans un clip, et affiche dans le panneau de sortie les déclarations AS3 de celles-ci : je ne parlerais pas ici de la quasi obligation morale qui nous incombe à tous de décocher la case "Déclarer automatiquement les instances etc..." si vous êtes pas des trouillards... :p
18 mars 2008
Par -Alexandre LEGOUT aka LAlex- le 18 mars 2008, 20:09
... qu'y disent! Eh ben, non madame, c'est bien pour les codeurs aussi!
Prenons totalement au hasard un exemple de petite classe utilitaire de debug
pour afficher le framerate et la mémoire utilisée: et bien c'est quand-même
bien plus pratique de déposer un petit composant sur sa scène plutôt que de se
frapper un 'new FramerateViewer()' dans une DocumentClass quand-même... Et ca
se fait tout aussi vite!
Et que même si on veut mettre une icone et tout et tout, ca prend bien 2mn de
plus! ![]()
Allez, l'exemple en pratique: Framerate.swc ![]()
PS: Merci famfamfam pour l'icone
25 février 2008
Par -Alexandre LEGOUT aka LAlex- le 25 février 2008, 12:58
Ca y est! Les blougs du monde entier l'ont déjà dit, le Flex 3 SDK, première release OpenSource de Flex et Adobe AIR, la saint graal gratuit des développeurs de RDA (Rich Desktop Applications, bande d'inclutes), sont sortis!
Tout ca semble extremement prometteur.
Je ne vais pas faire la liste des features, mais juste mettre le doigt sur un
enorme point positif de cette release: la disponibilité des sources de la classe WebService de Flex! Le passage a l'AS3 avait tout
simplement zappé cette classe dans Flash CS3.
Maintenant, reste à voir s'il est possible de se servir de celle-ci sans se
trimbaler la moitié du framework Flex...
Si je trouve le temps de faire des tests, j'en donnerai le resultat ici...
![]()
21 février 2008
Par -Alexandre LEGOUT aka LAlex- le 21 février 2008, 20:02
L'algorithme A* (A-star) connait de nombreuses implémentations. La plupart utilisent une grille (tableau à deux dimensions) en tant que carte. Etant à la base des jeux "tile-based", celles-ci suffisent la plupart du temps à la grande majorité des jeux. Seulement cela impose un certain nombre de contraintes, notamment en terme de dimensions des "obstacles", mais aussi en terme de performances: l'algorythme se basant sur des noeux (nodes), une grille de 40/40 offre 1600 cases (maximum, l'A* n'étant pas exhaustif), ce qui est déjà bien important...
J'ai voulu essayer de me baser plutôt sur un bitmap, simple (pour l'instant), une couleur étant celle du sol, l'autre celle des obstacles :
20 février 2008
Par -Alexandre LEGOUT aka LAlex- le 20 février 2008, 19:57
Un appel à une méthode paut parfois avoir besoin d'un certains nombre "d'options", comme c'est le cas pour la méthode Array.sort par exemple.
Il existe alors plusieurs possibilités, la plus simple étant de proposer un certain nombre de paramètres booléens facultatifs, avec des valeurs par défaut. Le problème est tout d'abord que cela alourdit considérablement le code, mais aussi que rajouter une option supplémentaire modifie la signature de la méthode: si on travaille avec des interfaces, bonjour la galère).
Bref, il existe aussi la possibilité de passer un seul entier, qui sera la
somme de puissances de 2. En gros, cela permet d'avoir, en binaire, une suite
de 0 et de 1, chacun correspondant à l'activation (ou pas) d'une option.
Voyons comment cela fonctionne concrètement avec l'exemple de
Array.sort
7 janvier 2008
Par -Alexandre LEGOUT aka LAlex- le 7 janvier 2008, 19:37
Le nouvelle gestion des TextField avec AS3 est assez géniale je dirais: plus de propriété html, et une gestion commune entre le texte "classique" associé aux TextFormat et le texte HTML. Du coup, on peut manipuler indifféremment le HTML ou les TextFormat, la modification de l'un sera reportée sur l'autre, comme on peut le voir via le code suivant:
// Crée le champ texte
var tField:TextField = new TextField;
tField.text = "LAlex";
// Crée le format (couleur rouge)
var tFormat:TextFormat = new TextFormat();
tFormat.color = 0xFF0000;
// Applique sur les deux premiers caractères
tField.setTextFormat(tFormat, 0, 2);
// Affiche le resultat HTML de tout ca
trace(tField.htmlText);
<P ALIGN="LEFT"><FONT FACE="Times Roman" SIZE="12" COLOR="#FF0000" LETTERSPACING="0" KERNING="0">LA<FONT COLOR="#000000">lex</FONT></FONT></P>
Bon, aprés on va pas chipoter sur la cohérence du formatage HTML, évidemment il y a mieux, mais le tout est d'avoir notre correspondance TextFormat/HTML...
Bref, tout ceci étant fait, si on veut obtenir le copie conforme d'un texte dans un autre, il suffit alors de copier le htmlText du premier sur le second, sans se préoccuper des TextFormat? Eh bien pas forcément...
17 décembre 2007
Par -Alexandre LEGOUT aka LAlex- le 17 décembre 2007, 13:04
L'AS3 nous a amené les classes internes (mot-clé internal) qui nous permettent d'encapsuler un certain nombre de fonctionnalités dans une classe disponible uniquement à la classe publique qui l'utilise. Bien pratique, cela évite les classes trop longues, et grâce à l'héritage (une classe interne peut en étendre une autre), cela peut aussi éviter l'utilisation d'un trop grand nombre de if, et donc abaisser la complexité du code.
Cela peut aussi permettre de disposer d'une classe qui n'est pas instanciable depuis l'extérieur. Seulement, il peut parfois être utile d'accéder à une instance de ces classes, et là, la solution c'est tout simplement les interfaces...
3 décembre 2007
Par -Alexandre LEGOUT aka LAlex- le 3 décembre 2007, 15:55
Actuellement en train de travailler sur un séquenceur de différents types d'action, incluant notamment les interpolations, j'en viens à re-développer une classe de Tween, incluant les améliorations standards des TweenEngine en circulation sur la toile (tween de plusieurs propriétés par exemple).
Tout d'abord, il faut savoir qu'un tween a un principe tout simple: je veux qu'une propriété numérique d'un objet (le plus souvent un objet visuel, comme un Sprite par exemple) évolue entre une valeur de départ et une valeur d'arrivée sur une durée précise. Une équation est utilisée afin de déterminer l'évolution de cette valeur, la plus simple étant une équation linéaire (on partage la distance en intervalles réguliers).
Pour cela, il existe trois méthodes:
30 octobre 2007
Par -Alexandre LEGOUT aka LAlex- le 30 octobre 2007, 16:50
Je me rend compte carrément tard par rapport au temps depuis lequel j'utilise les Tweens, mais aviez-vous remarqué que la classe fournie par Adobe dans Flash CS3 (fl.transitions.Tween) émettait l'évènement de fin (TweenEvent.MOTION_FINISH) une frame trop tard? La raison est simple, le test effectué pour détecter la fin est strict:
if (t > this.duration) {
Il suffirait d'un '>=' à la place pour modifier cela, mais à ce moment là la fonctionnalité de boucle zapperais une frame avant de boucler...
Les Tweens de Flex et des "tween engines" que j'ai vu en AS3 (TweenLite et Tweener) n'ont pas ce défaut par contre...
27 juillet 2007
Par -Alexandre LEGOUT aka LAlex- le 27 juillet 2007, 18:44
Aprés maintenant quelques un grand nombre de lignes de code en AS3, j'ai noté quelques comportements bizarres...
public class ClassUtils
{
public static function getConstructor(o : *) : Class {
var clname:String = describeType(o).@name.toXMLString();
var claz:Class = getDefinitionByName(clname) as Class;
return claz;
}
}
// Voir plus bas pour les différentes interfaces
package {
import flash.display.Sprite;
import itf.IDataSet;
import itf.IList;
import cl.DataSet;
public class ASPlayground extends Sprite
{
public function ASPlayground()
{
var ids:IDataSet = new DataSet;
trace(ids.getLength()); // Erreur du compilateur: Référence ambiguë à getLength.
trace((ids as IList).getLength()); // Marche bien !
}
}
}
package itf
{
public interface IList
{
function getLength() : int;
}
}
package itf
{
public interface ICollection
{
function getLength() : int;
}
}
// Cette interface sert au typage
package itf
{
public interface IDataSet extends IList, ICollection
{
}
}
// Implémentation de IDataSet
package cl
{
import itf.IDataSet;
public class DataSet implements IDataSet
{
public function getLength():int
{
return -1;
}
}
}
Rien de bien gênant, mais ca peut parfois être troublant! ![]()
6 avril 2007
Par -Alexandre LEGOUT aka LAlex- le 6 avril 2007, 16:40
Ayant eu besoin de m'assurer qu'une classe (instance de Class) hérite d'une
autre, j'ai cherché un bon moment à reproduire mes anciennes habitudes issues
de l'AS2, à savoir utiliser les bons vieux prototypes agrémentés d'une touche
de "is" histoire de faire plus actuel... ![]()
Autant vous le dire tout de suite: ca ne donne rien! ![]()
Il faut donc se tourner vers les excellentes fonctions de reflexion que nous
fournis l'AS3 pour arriver à son bonheur, en agrémentant ca de E4X! ![]()
import flash.utils.describeType;
import flash.utils.getQualifiedClassName;
public function inherit(childClass:Class, parentClass:Class) : Boolean {
return describeType(childClass).factory.extendsClass.(@type==getQualifiedClassName(parentClass)).length() > 0;
}
Et wala! ![]()