Home » Categories » AS3

Astuce pour la détection des touches du téléphone

Avec AIR 2.5, il est possible de détecter les boutons BACK, MENU et SEARCH du téléphone.

Pour ce faire, il faut appliquer un écouteur sur l'évènement KEY_DOWN du clavier :

 

stage.addEventListener( KeyboardEvent.KEY_DOWN, onKeyDown);

private function onKeyDown( pEvt: KeyboardEvent ):void
{
    switch( pEvt.keyCode )
    {
        case Keyboard.BACK:
            // sur la pression du bouton retour
            break;
        case Keyboard.MENU:
            // sur la pression du bouton menu
            break;
        case Keyboard.SEARCH:
            // sur la pression du bouton recherche
            break;
    }
}

 

Cependant, avec le code précédent, une pression sur un des trois bouton va quitter l'application AIR.

Pour éviter cela, il faut utiliser la méthode preventDefault sur l'évènement du clavier :

 

case Keyboard.BACK:
    // sur la pression du bouton retour
    pEvt.preventDefault();
    break;

Lire la suite >>


Utilisation de l'accéléromètre

Depuis la disponibilité du Flash Player 10.1 et de AIR 2.0, nous pouvons accéder à l'accéléromètre.

Plusieurs jeux et applications, principalement sur téléphone mobile l'utilise déjà depuis un certain temps.

Voici comment l'utiliser.

 

La classe Accelerometer se trouve dans le package flash.sensors :

 

import flash.sensors.Accelerometer;
import flash.events.AccelerometerEvent;

 

La classe Accelerometer fournie une variable permettant de déterminer si la fonction est prise en charge par l'appareil, ce qui permet, dans le cas contraire, ajouter un controle différent (clavier par exemple).

 

if (Accelerometer.isSupported)
    trace('Accelerometer supported');
else
    trace('Accelerometer not supported');

Lire la suite >>


Coloration Flex 4 pour gedit

Gedit étant mon éditeur préféré, il se devait d'y avoir un fichier de coloration pour AS3 et MXML.

En cherchant un peu, j'ai trouvé les fichiers de coloration pour Flex (comprenant bien évidement AS3 et MXML) ici.

Seul souci, lors du passage à Flex 4, le code compris dans les balises < fx:Script > apparait surligné en rouge :

 

 

Pas très joli me direz-vous.

Pour modifier ce petit désagrément, il suffit de rajouter le code suivant :

Lire la suite >>


Création d'une librairie d'icone

Lorsque nous développons une application sous Flex, nous avons souvent besoin d'utiliser des icones.
La solution la plus simple évidement est la suivante :
 

< mx:Button label="Delete" icon="@Embed(source='assets/images/delete.png')"/>


Mais lorsque cet icone apparait plein de fois dans l'application, on ne va pas la réimporter à chaque fois, sinon le code va vide devenir lourd, et ça pour rien.
 
La meilleure solution, est de créer une classe qui va ne s'occuper que de ça. Nous allons l'appeler IconLibrary (original non ?)
 

package fr.revolugame.assets  
{
    /**
     * Les icones utilisées dans l'application
     */
    [Bindable]
    public final class IconLibrary
    {
        [Embed(source="assets/images/delete.png")]
        public static const DELETE:Class;
        
        // ...
    }
}


Et lorsque nous voulons l'utiliser dans un mxml :
 

< ![CDATA[
    import fr.revolugame.assets.IconLibrary;
]]>

< mx:Button label="Delete" icon="{IconLibrary.DELETE}"/>
 


Cela permettra d'avoir un code nettement plus propre et probablement moins lourd sur de grosses applications.
 
Si nous voulons encore plus optimiser la chose, il est recommandé de compiler cette librairie dans un swc et de l'importer ensuite dans notre application. Car de ce fait, nous n'aurons pas besoin de recompiler toutes les icones a chaque fois, et pourrons réutiliser cette librairie dans d'autre application.

Lire la suite >>


Découper une zone d'image en AS3

Voici une petite astuce qui permet d'optimiser une application Flash. Plutôt que d'importer les images en MovieClip, ce qui se veut être couteux en terme de performance, il vaut mieux passer par la classe Bitmap et la classe BitmapData pour récupérer les pixels souhaités pour ensuite les afficher. Et par la même occasion, faire une seule requête sur le serveur est moins couteux (par exemple si vous avez une application nécessitant beaucoup de pictogrammes).
Voici comment faire.

Tout d'abord, il faut importer l'image de la bibliothèque :
[Embed(source = 'monImage.png')] private var MonImg:Class;
var pic : Bitmap = new MonImg();
Maintenant que nous avons notre image au format Bitmap, nous pouvons travailler dessus.
var bmp1 : BitmapData = pic.bitmapData; // récuperation des données
var bmp2 : BitmapData = new BitmapData(18, 16, true); // création de données, avec la taille de l'image finale
var rect : Rectangle = new Rectangle(0, 0, 18, 16); // création de la zone de découpage
var pt : Point = new Point(0, 0); // création du point de fixation de la zone découpée sur la nouvelle image
bmp2.copyPixels(bmp1, rect, pt); // on copie les pixels dans la nouvelle zone
var bmp : Bitmap = new Bitmap(bmp2); // création de notre nouvelle image

Et voilà, nous pouvons maintenant utiliser notre image comme nous le souhaitons, en l'ajoutant à la liste d'affichage par exemple.

Lire la suite >>


Utiliser l'API YouTube en AS3

L'API YouTube permet de lire des vidéos stockées sur YouTube.com directement dans vos applications Flash. Elle permet également de personnaliser l'apparence du lecteur. Voici une brève introduction.
La documentation officielle est présente ici.

Récupération de l'API

Pour pouvoir utiliser l'API dans votre application, il est nécessaire de faire une requete pour recuperer le swc sur le serveur de YouTube. Pour ce faire :

_loader = new Loader();
_loader.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInit);
_loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3"));

Utilisation de l'API

Une fois que la librairie à été chargéé, nous pouvons la récuperer et ajouter les écouteurs sur les différentes actions :

private function onLoaderInit(event:Event):void {
    addChild(_loader);
    _loader.content.addEventListener("onReady", onPlayerReady);
    _loader.content.addEventListener("onError", onPlayerError);
    _loader.content.addEventListener("onStateChange", onPlayerStateChange);
    _loader.content.addEventListener("onPlaybackQualityChange", onVideoPlaybackQualityChange);
}

Une fois que notre lecteur est prêt, nous pouvons charger et lancer la vidéo :

private function onPlayerReady(event:Event):void {
    // Récupération de l'API youtube.
    _player = _loader.content;
    // On lance notre vidéo à partir de son identifiant
    _player.loadVideoById(VIDEO_ID);
    // On définie la taille de la vidéo
    _player.setSize(480, 270);
}

Lire la suite >>


Optimisation d'une zone de texte

La classe TextField permet d'ajouter du texte dans une application Flash, zone de texte ou zone de saisie. Mais lorsqu'on souhaite utiliser beaucoup d'occurrence de celle-ci, et des les animer, il se peut que les performances en prennent un gros coup. Pour optimiser tout ceci, il suffit de passer par la classe Bitmap.

La classe Bitmap permet, quand à elle, de représenter des objets d'affichage. Elle va donc nous permettre de transformer nos textes en images. Voici comment faire :

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.text.TextField;

var monTexte : TextField = new TextField();
monTexte.text = "Hello World";
monTexte.autosize = flash.text.TextFieldAutoSize.LEFT;

var bmp : BitmapData = new BitmapData(monTexte.width, monTexte.height);
bmp.draw(monTexte);

var bitmap : Bitmap = new Bitmap(bmp);
addChild(bitmap);

Une petite optimisation qui peut vraiment être utile lors du développement de grosses applications utilisant beaucoup de zone de texte.

Lire la suite >>


La classe PopUp

Dans ce tutoriel, nous allons voir comment développer une classe permettant de créer une fenêtre disposant d'un bouton de fermeture et du système de Drag and Drop.

La partie graphique

Pour commencer, notre classe a besoin de plusieurs paramètres, tel
que son parent, sa couleur, ou encore son contenu.

Voici la signature de notre classe :

public function PopUp(_parent:Stage, _color:uint, content:MovieClip):void

Dans le constructeur, nous instancions les différentes parties de notre fenêtre, puis nous dessinons le cadre et l'entête.

Lire la suite >>


Utiliser les curseurs natifs du système dans vos applications

Le Flash Player 10 intègre une nouvelle fonctionnalité particulièrement intéressante.
En effet, nous pouvons modifier le curseur de la souris en utilisant la propriété cursor de la classe flash.ui.Mouse.

Pour ce faire, nous devons lui attribuer une des constantes de la classe flash.ui.MouseCursor :
  • MouseCursor.AUTO : l'état par défaut
  • MouseCursor.ARROW : le curseur représentant la flèche
  • MouseCursor.BUTTON : le curseur en forme de main appuyant sur un bouton
  • MouseCursor.HAND : le curseur en forme de main réalisant un glissement
  • MouseCursor.IBEAM : le curseur en I de sélection de texte

Voici un petit exemple :
import flash.ui.Mouse;
import flash.ui.MouseCursor;

Mouse.cursor = MouseCursor.HAND;
L'utilisation de cette classe simplifie le changement de curseur à l'exécution, ce qui permet une meilleure intégration et utilisation de votre application par les utilisateurs qui retrouverons le confort d'utilisation de leur système.

Lire la suite >>


Faire une scrollbar en AS3

Dans ce tutoriel, nous allons voir comment créer une classe réutilisable pour faire une scrollbar horizontale. Elle permettra de déplacer un contenu dynamique (texte, image, ...).

 

Aspect visuel : la classe graphics

Comme nous souhaitons avoir une classe entièrement réutilisable, il nous faut pouvoir ajouter des éléments graphiques indépendamment du projet en cours. Pour cela, nous allons utiliser la classe graphics qui va nous permettre de dessiner les composants.

 

Pour cela, nous avons besoin de plusieurs paramètres : la largeur et la hauteur de notre scrollbar. Ces deux valeurs seront des attributs de notre classe. Voici notre fonction qui s'occupe de dessiner :
private function draw():void {
    var bg : Shape = new Shape();
    bg.graphics.beginFill(_bgColor);
    bg.graphics.lineStyle(0x000000);
    bg.graphics.drawRect(0, 0, _largeur, _hauteur);
    bg.graphics.endFill();
    addChild(bg);
} 
Et maintenant celle qui dessine le scroller (élément qui nous permet de déplacer le contenu) :
private function drawScroller():void {
    // petite vérification, pour ne pas dessiner de scroller s'il n'y en a pas besoin               
    if (_scrollContent.height > _hauteur) {
        var coeff : Number = _scrollContent.height / _hauteur;
        var tmp_scroll_height : Number = _hauteur / coeff; // pour verif que le scroller n'est pas trop petit
        if (tmp_scroll_height < 20) tmp_scroll_height = 20;
               
        _scroller = new Sprite();
        _scroller.graphics.beginFill(0x000000);
        // on dessine notre rectangle avec un petit décalage
        _scroller.graphics.drawRect(2, 2, _largeur - 4, tmp_scroll_height);
        _scroller.graphics.endFill();
               
        _scroller.addEventListener(MouseEvent.MOUSE_DOWN, dragOn);
        _scrollContent.parent.stage.addEventListener(MouseEvent.MOUSE_UP, dragOff);
               
        addChild(_scroller);
        _scroller.buttonMode = true;
               
        // rectangle qui correspond à la trajectoire du scroller
        rect_scroller = new Rectangle(0, 0, 0, _hauteur - _scroller.height - 4);
    }
} 

Lire la suite >>


Quelques bonnes pratiques en ActionScript3

Voici quelques bonnes pratiques nécessaire à adopter lors de développement d'application en ActionScript3.

Tout d'abord, il est nécessaire de toujours typer ses variables afin d'optimiser les performances et garantir une meilleure gestion des erreurs à la compilation et  à l'exécution. Par exemple, préférer

var i : int = 0; 

à

var i = 0;

Par contre, si une variable peut contenir n'importe quel type de données, nous pouvons utilisez le type *.

Lorsque vous utilisez une boucle, il est préférable de passer par une variable de référence, pour éviter que la machine virtuelle ne réévalue la longueur à chaque itération. Exemple :

Lire la suite >>


Mettre une image en noir et blanc

Pour rendre une image en noir et blanc sans passer par la création d'une nouvelle image, il faut utiliser la propriété filters d'un objet d'affichage. Il faut lui passer en paramètre un tableau de ColorMatrixFilter, qui permet d'appliquer une transformation de matrice aux couleurs RVBA (Rouge, Vert, Bleu et Alpha) sur l'image d'entrée afin d'obtenir un résultat intégrant un nouvel ensemble de valeurs.

Cette classe permet d'effectuer des modifications de saturation et des rotations de teinte, de définir la luminance de l'alpha et de produire d'autres effets. Vous pouvez appliquer le filtre à tout objet d’affichage (autrement dit, aux objets héritant des propriétés de la classe DisplayObject), tels que MovieClip, SimpleButton, TextField et Video, ainsi qu’aux objets BitmapData.

Autant vous dire qu'on peut faire ce qu'on veut à partir de cette fonction.
var a : Array< Float > = new Array();

a = a.concat([0.3086, 0.6094, 0.0820, 0.0, 0.0]); // rouge
a = a.concat([0.3086, 0.6094, 0.0820, 0.0, 0.0]); // vert
a = a.concat([0.3086, 0.6094, 0.0820, 0.0, 0.0]); // bleu
a = a.concat([0.0, 0.0, 0.0, 1.0, 0.0]); // alpha

var filtre : ColorMatrixFilter= new ColorMatrixFilter(a);
monClip.filters = [filtre];

Lire la suite >>


AS3 : Passer un paramètre à un listener

Qui n'a jamais eu envi de passer un paramètre lors d'un évènement dans une application Flash ?
Voici la solution !

Prenons par exemple, un évènement clic. Nous avons alors un écouteur de ce type :
addEventListener(MouseEvent.CLICK, maFonction);
Avec la fonction :
private maFonction(e:MouseEvent):void {
    ... 
}
Maintenant, pour passer un paramètre :
addEventListener(MouseEvent.CLICK, function(e:*):void { maFonction(e, maVar) });

private maFonction(e:MouseEvent, maVar:String):void {
    trace(maVar);
}

Lire la suite >>


Changer la couleur d'un élément en AS3

Il peut s'averer nécessaire de changer la couleur d'un élément dans un jeu par exemple pour différencier deux éléments selon les joueurs.
Voici comment faire sans créer plusieurs images de couleurs différentes.
// récupération de la couleur de départ de l'objet
var myColor:ColorTransform = myObject.transform.colorTransform;
// on lui affecte maintenant la couleur qu'on souhaite
myColor.color = 0x000000; // la valeur hexa de ma couleur
// puis on l'applique à notre objet
myObject.transform.colorTransform = myColor;
Si vous souhaitez utiliser les couleurs RGB, il faut créer une instance de la classe colorTransform en lui passant les paramètres RGB de votre couleur :
myColor : ColorTransform = new ColorTransform(0,0,0,1,redValue,greenValue,blueValue,0);
myObject.transform.colorTransform = myColor;
Avec redValue, greenValue et blueValue des variables Float (haXe) ou Number (AS3).

Lire la suite >>


Faire un dégradé en Flash

Voici une méthode relativement simple pour faire un dégradé en Flash. D'une part ça coute moins en terme de ressource qu'une image, et d'autre part ce n'est pas compliqué a faire.
Nous allons voir la version haXe. Pour la version AS3, c'est la même, à l'exception de la syntaxe de certaine classes, ou types.

Voici le fonctionnement :
/**
 * Création d'un rectangle contenant un dégradé
 */
var degrade : Shape = new Shape();
// Bordures du rectangle
degrade.graphics.lineStyle(2, 0x0043AB);
			
// Matrice de transformation du dégradé
var matrice:Matrix = new Matrix();
matrice.createGradientBox(250, 50); // largeur et hauteur du dégradé
	
degrade.graphics.beginGradientFill(GradientType.LINEAR, [0xA7C04A, 0xAD7FA8], [1, 1], [0, 255], matrice);
degrade.graphics.drawRect(0, 0, 250, 50);
		
degrade.graphics.endFill();
		
addChild(degrade);

La méthode beginGradientFill nécessite quelques paramètres :
  • le type de dégradé (LINEAR ou RADIAL)
  • le tableau des couleurs
  • le tableau des opacités de chaque couleur
  • le tableau de positionnement des couleurs
  • la matrice de transformation de type flash.geom.Matrix (optionnelle)

Lire la suite >>


Charger une librairie externe en AS3

Il est souvent utile dans les projets flash d'utiliser des librairies externes. Voici le code nécessaire au chargement de l'une d'entre elles en ActionScript3.

Seulement quatre classes sont nécessaires pour utiliser notre librairie :
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.system.ApplicationDomain;
Création des variables :
var loader : Loader = new Loader();
var request : URLRequest = new URLRequest("lib.swf"); // chemin

// création de l'ecouteur de fin de chargement
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);

// chargement de la lib
loader.load(request);
Et pour terminer, l'utilisation d'une classe présente dans cette librairie.
Il existe deux manières de le faire, les voici :
private function onComplete(event:Event):void {
	// 1ere solution
	var maRessource : Class = loader.contentLoaderInfo.applicationDomain.getDefinition("maRessource") as Class;
	var monClip = new maRessource();
	
	// 2eme solution
	ApplicationDomain.currentDomain.getDefinition("maRessource");
	var monClip : maRessource = maRessource(event.target.content);
}

Lire la suite >>


Lecteur vidéo avec Flex

Dans ce tutoriel, nous verrons comment réaliser un joli lecteur vidéo très simplement grâce aux nombreuses classes présentes dans le framework Flex.

 

La structure de notre application

Ce projet est composé de deux fichiers :
  • VideoPlayer.mxml
  • stylePlayer.css
Rentrons dans le vif du sujet en voyant la structure de notre mxml :
< ?xml version="1.0" encoding="utf-8"?>
< mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="512" height="408" layout="absolute" >
   
    < mx:VideoDisplay id="video" width="512" height="384" autoPlay="false" source="mavideo.ext"
        playheadUpdate="updatePlayer()" />
Tout d'abord, nous créons un composant VideoDisplay qui contiendra notre vidéo. Nous lui donnons une taille fixe pour éviter les redimentionnements hasardeux.
L'attribut autoPlay peut être défini à true ou false, dans le cas où l'on souhaite lancer la lecture de la vidéo au chargement de l'application ou non.
S'en suis la source de notre vidéo, ou plus exactement l'emplacement de notre fichier vidéo.
Pour terminer, nous ajoutons un évenement qui nous permettra de gérer l'avancement de notre vidéo.
 
Nous allons maintenant définir un bloc qui contiendra les boutons et les détails de notre lecteur.

Lire la suite >>


Barre de chargement en Flash9

Commencons par le code

var root : MovieClip = flash.Lib.current; 
root.stop();
root.loaderInfo.addEventListener (ProgressEvent.PROGRESS, function(event:ProgressEvent)
{
    var pcent:Float=event.bytesLoaded/event.bytesTotal*100;
    trace("Chargement : "+pcent+"%");
    if(pcent==100) root.gotoAndStop(2)
}
);

Quelques explications :

Le stop() est la pour arreter l'avancement de l'animation.
On place ensuite un écouteur sur la progression total du chargement du swf, quand celui ci est terminé (égal à 100), on lance le reste de l'animation.

Dans l'exemple, on utilise la methode trace(), mais bien évidemment, vous pouvez créer une barre, ou n'importe quoi pour visualiser le chargement. Il suffit juste d'utiliser la variable pcent.

Lire la suite >>


Créer un menu personnalisé pour le clic droit Flash9

Vous souhaitez enlever, voir personnaliser le menu qui apparait par defaut lors d'un clic droit ?

Alors voilà comment il faut faire. C'est relativement simple, mais fort utile.


Tout d'abord, voici comment l'enlever :

var menu = new flash.ui.ContextMenu();
menu.hideBuiltInItems();
flash.Lib.current.contextMenu = menu;

Et maintenant, pour ajouter un nouvel élément :

var nouvelItem = new flash.ui.ContextMenuItem("Texte a afficher", true, true, true);
// on ajoute une action sur le bouton
nouvelItem.addEventListener(flash.events.ContextMenuEvent.MENU_ITEM_SELECT, function(e){ flash.Lib.getURL(new flash.net.URLRequest("http://revolugame.com"), "_self"); } menu.customItems.push(nouvelItem);
Rien de très compliqué.

Lire la suite >>


Showing - of Articles | Page of