CHAMP DE VISION AVEC OBSTACLES - AS3

pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 - 6 sept. 2011 à 17:02
gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009 - 16 sept. 2011 à 13:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53560-champ-de-vision-avec-obstacles-as3

gremlins7 Messages postés 380 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 28 décembre 2009
16 sept. 2011 à 13:47
Ce code sent l'AS2 à plein nez, mais je préfère rester sur une note positive car en ce moment on peut pas dire qu'il y ai beaucoup de nouvelles sources de postées...
Je t'invite donc a regarder un peu l'AS3 en comment il s'organise. Il faut absolument se débarrasser de ses vieilles habitudes de codage AS2. Si on est à l'AS3 c'est pas pour rien !!!
tatactic Messages postés 20 Date d'inscription mardi 15 mars 2011 Statut Membre Dernière intervention 14 janvier 2012
14 sept. 2011 à 10:48
Oups, et j'oubliais je parlais de flash et pas de flash buider ou flex qui quand on crée un projet rend les choses évidentes...
Juste que dans flash on n'est pas obligé de créer un projet et on peut sans problème surcharger la classe principale spécifiée dans l'onglet propriétés de flash pro (ce qu'on voit souvent)...

Évidemment dans un autre éditeur on verra plus normalement :

//Application.as
package{
import flash.display.Sprite;
import classes.UneAppli;

public class Application extends Sprite{
public function Application(){
UneAppli.main();
}
}
}
//et dans UneAppli.as
package{
public class UneAppli{
public static function main(...args):void {
//code
}
}

}

// vite fait dans le browser... mais ça doit être juste.
un constructeur si nécessaire (pas forcément, vu que en théorie on aura des propriétés et méthodes static)

Désolé de ne pas avoir été clair là-dessus, j'ai remarqué ça ce matin!!!
Sinon oui, le commentaire n'avait pas sa place et au lieu d'AS4 je devais plutôt dire prochaine version de flash (qui sera peut-être AS4) :)
tatactic Messages postés 20 Date d'inscription mardi 15 mars 2011 Statut Membre Dernière intervention 14 janvier 2012
12 sept. 2011 à 14:24
Le bout de code (très maso je l'avoue!) on peut l'oublier en effet, c'et juste une façon d'illustrer une idée.
C'est long et inutile mais AS4 pourrait être plus strict afin d'éviter certaines choses.
Ou alors dans un environement de travail tomber enfin d'accord sur certaines habitudes à respecter pour ne pas avoir trop de mauvaises surprises lors de modifs un peu brutales quand on n'est pas là... :)
Il y a de plus en plus de graphistes qui se mettent à toucher à du code et ce n'est pas souvent très réutilisable, voir par moments assez cata ;)
Donc je sautais juste sur l'occasion pour dire qu'en effet je ne critiquais pas la source mais que j'étais d'accord avec le principe de "juste une traduction pour AS3", chose qui peut être assez gênante en prod.
Bon, pardon donc et autant pour moi :)
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
12 sept. 2011 à 12:25
En AS3, langage de typage fort, le typage est synonyme de performance ... il n'y a qu'à comparer un Vector et un Array sur de gros traitements pour s'en convaincre...

Peg'
aerolyte Messages postés 465 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 4 mai 2013 1
12 sept. 2011 à 12:15
Personnellement, je pense que c'est un avantage d'avoir la liberté ou non de typer.
Parfois il est meme indispensable de transtyper.
Le tout est d'avoir conscience de ce que cela implique ou non de le faire.

Quant au sérieux d'un language, ca me fait doucement rire, c'est plutot un qualificatif que l'on utilise pour un humain. Sans doute est-ce une marque de ce meme manque chez ces auteurs.

Quant l'obligation d'étendre (directement ou non) la class main avec un displyObject, je la comprend comme justement comme son affectation sur la scene permettant ainsi d'obtenir le "Stage".
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
12 sept. 2011 à 12:03
Effectivement, ton bout de code n'apporte pas grand chose au shmilblick .. il pourrit limite le visuel par sa longueur ...
L'import d'une classe principale n'ajoute rien aux performances de l'as3, et ce n'est qu'une façon plus claire de coder.

Le problème se situe au niveau de l'architecture de son code qui est bien trop AS2 et non pas à de simples détails qui n'apporteront rien à la performance de la source.

Peg'
tatactic Messages postés 20 Date d'inscription mardi 15 mars 2011 Statut Membre Dernière intervention 14 janvier 2012
12 sept. 2011 à 11:59
Oui, c'est théorique...
C'est juste que ça ne me semble pas évident de
- ne pas devoir construire le Stage
- d'avoir la classe principale qui doit étendre MovieClip d'office.
Par rapport à Java ça fait un peu drôle... C'est comme si la classe principale héritait d'office de Frame ou JFrame alors que bon...
Les éléments des Arrays pas typés en AS3 (équivalent à Vector)... D'où la vérification du typage des éléments fournis quand on fait un méthode(...args) où ...args n'est pas typé etc etc.
Bref juste une idée pour que AS3 soit plus strict lors de la prochaine version afin d'éviter à certains de coder parfois sans trop se soucier de trucs importants genre un throw qui ne doit pas spécialement avoir un catch...
Ce sont des petites choses qui font que certains ne prennent pas AS3 au sérieux (à tort selon moi) et qui donnent le loisir à certains de coder un peu à l'aveuglette.
aerolyte Messages postés 465 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 4 mai 2013 1
12 sept. 2011 à 11:45
Bonjour, je ne comprends pas bien des éléments de ton post, tatactic.

- l'as3, fonctionne bien sur une classe main et je ne rencontre pas de pb sur la verification des erreurs.
- il est tout a fait normal que la class main etendent un displayobject (Movieclip ou Sprite).

Et je ne saisie pas l'interet de ton bout de code
tatactic Messages postés 20 Date d'inscription mardi 15 mars 2011 Statut Membre Dernière intervention 14 janvier 2012
12 sept. 2011 à 11:15
Pas de classes des fonctions simplement arrangées pour que ça tourne en AS3 .. quel est l'intérêt final ?

Peg'
Si AS3 avait une classe main et vérifiait un peu plus les erreurs on n'aurait plus ce genre d'erreur non plus... Et moins de détracteurs pour flash en général.
Genre un exemple vite pondu et évidemment purement théorique quoiqu'il fonctionne:
package classes.main {
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.utils.getQualifiedSuperclassName;
// ???
import flash.display.MovieClip;
// ? abberation in AS3 ?
// The main class must extends flash.displayMovieClip
// to be the main MovieClip container
// a Main class should be welcome. as here bellow
// this will provide a more intuitive main Method like in java.

public class Appli extends MovieClip{

public static var application:Appli;
protected static var debug:Boolean = true;
protected static var classToString:String;
protected var instanceToString:String;
protected static const TAB:String = " ";
protected static const ARROW:String = TAB + "->" + TAB;
protected static const DEBUG_MODE_ON_MSG:String = ARROW + "Application is running in debug mode.";
protected static const DEBUG_MODE_OFF_MSG:String = ARROW + "Application debug mode is turned off.";
protected static const AS3_REM:String = "AS3 main class must extends flash.display.MovieClip";
protected static const PERSO_ERROR_CODE:int = 123123123;
// -----------------------------------------
// public "Appli"
// -----------------------------------------
public function Appli():void {
/** CONSTRUCTOR */
forceMain();
}
// -----------------------------------------
// public static void "main"
// -----------------------------------------
public static function main(...args):void{
args = toArrayOfString(args);
// force to type args as Array of String
log ("@args = " + args);
// Output @args in debug mode ON

classToString = getDefinitionByName(getQualifiedClassName(Appli)).toString();
application = new Appli();
log(application.toString() + " " + "object successfuly created");
}
// -----------------------------------------
// private static void "toArrayOfString"
// Check type of main(String[] string);
// -----------------------------------------
private static function toArrayOfString(args:Array):Array{
var argsArray:Array = new Array();
for (var n:int = 0; n < args.length; n ++){
try{
//log(getDefinitionByName(getQualifiedClassName(args[n])).toString());
if((getDefinitionByName(getQualifiedClassName(args[n])) == "[class String]")){
argsArray[n] = args[n]
}else{
var msg:String = "argument " + n + " is not a String.\n Fatal Error";
throw new Error(msg,PERSO_ERROR_CODE);
}
}catch(e:Error){
if(e){
throw new Error(e.message,e.errorID);
}
}
}
return (argsArray as Array);
}
// -----------------------------------------
// public static void "log"
public static function log(string:String):void{
if(debug == true){
trace(string);
}
}
// -----------------------------------------
// protected static Boolean "forceMain"
protected static function forceMain():Boolean{
try{
if(classToString == null){
throw new Error("Appli constructor must be called via the main Method",PERSO_ERROR_CODE);
}
}catch(e:Error){
throw e;
}
log(classToString + " " + "constructor called");
classToString = null;
return true;
}
// -----------------------------------------
// Boolean debugVersion setter and getter
// permit log action if set to true
// ommit them if set to false
public static function set debugVersion(bool:Boolean):void{
debug = bool;
}
public static function get debugVersion():Boolean{
return debug;
}
// -----------------------------------------
// String debug_status getter
// tells if the application is running in debug mode
// Output :
// -> Application is running in debug mode. (DEBUG_MODE_ON_MSG)
// or -> Application debug mode is turned off. (DEBUG_MODE_OFF_MSG)
//
public static function get debug_status():String{
var outputString:String = "";
switch (debugVersion){
case true:
outputString = DEBUG_MODE_ON_MSG;
return outputString;
break;
case false:
outputString = DEBUG_MODE_OFF_MSG;
return outputString;
break;
default:
var error:Error = new Error("Debug mode is not set.\nFatal ERROR.",PERSO_ERROR_CODE);
throw error;
break;
return error.message;
}
}
public override function toString():String{
// mark this method as override if this class extends MovieClip !
// unmark this method as override if this class DO NOT extends MovieClip !
return "[" + "object" + " " + "Appli"+ "]";
}
public function get objectToString():String{
var outputString:String = application.toString() + " extends ::" + getDefinitionByName(getQualifiedSuperclassName(Appli)) + " " + AS3_REM;
return outputString;
}
public static function get objectToString():String{
var outputString:String = getDefinitionByName(getQualifiedClassName(Appli)).toString() + " extends ::" + getDefinitionByName(getQualifiedSuperclassName(Appli)) + " " + AS3_REM;
return outputString;
}

}

}

Puis dans le FLA :
1 / Impossible de le lier via le panneau properties du fla.
2 / appel de main :
import classes.main.Appli;

/*
/* if Appli.debugVersion == true
/* permit log outputs
/* if Appli.debugVersion == false
/* ommit log outputs
*/
Appli.main("test","1");
trace(Appli.application);
/*
/* call the main method of void Appli
*/
trace(Appli.debug_status);
/*
/* trace the debug status by default;
/* output :
/* -> Application is running in debug mode.
*/
Appli.debugVersion = false;
/*
/* change the debug status by default;
*/
trace(Appli.debug_status);
/*
/* trace the new debug status;
/* output :
/* -> Application debug mode is turned off.
*/

trace(Appli.application.objectToString);
/*
/* output :
/* [object Appli]
*/
trace(Appli.objectToString);
/*
/* output :
/* [class Appli]
*/

/**
/* if "classes.main.Appli" extends MovieClip and
/* "classes.main.Appli" is specified in the
/* Class field of the properties pannel,
/* this will throw an Error.
/* Error: Appli constructor must be called via the main Method
/* at classes.main::Appli()
/*
/* (THIS FORCE THE CALL TO main method of the class)
/* force to call Appli like this :
/* - - - - - - - - - - - - - - - -
/* import classes.main.Appli;
/* Appli.main(String[] ...args);
*/
J'espère qu'Adobe fera un peu le ménage dans les codeurs en sortant AS4...
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
9 sept. 2011 à 18:35
Pour les perf, il y a de grandes chances, oui.
Mais c'est surtout pour la réutilisabilité de ton script que ça va avoir des répercutions.
Sans parler de la simplification du code que tu vas obtenir par la suite.

Peg'
t_naulet Messages postés 2 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 9 septembre 2011
9 sept. 2011 à 13:43
Le fichier enregistré CS4 est en ligne.
@Pegase31 : je ne suis vraiment pas un expert des classes AS3. Mais il va bien falloir que je m'y mette alors si j'ai un peu de temps, j'essaierai de transformer ce fichier... Est ce que tu sais si cela pourrait avoir des répercussions sur les performances du swf ?
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
7 sept. 2011 à 11:57
Le Code n'ayant rien de spécifique à cs5, il est possible d'exporter la source en cs4. Cs3 ne faisant pas parti des exports de la version cs5 (j'ai jamais compris pourquoi d'ailleurs).

Pourrais-tu faire cette manipulation ?

Peg'
t_naulet Messages postés 2 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 9 septembre 2011
7 sept. 2011 à 10:51
Désolé, c'est une version CS5...
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
7 sept. 2011 à 10:01
Pas compatible CS4 !
De plus semble n'être qu'une simple copie AS3 qui de plus selon Peg, est mal faite !
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
6 sept. 2011 à 17:02
Alors en voyant la source, je me suis dit "chouette, enfin un truc sympa qui rend bien et qui en plus à l'avantage de fonctionner parfaitement" ... Mais ..

Il y a toujours un "mais" dans ce cas, car c'est effectivement de l'AS2 traduit ...
Mais j'avoue ne pas bien saisir le but de l'avoir passé en AS3 si tu ne profites pas de la puissance de cette version de langage.

Quand je vois ça : "MovieClip.prototype.policier = function ()", ça me fait dresser les poils sur les bras ...

Comment dire sans te froisser ?
"Ben oui, mais NON, en fait ..."

Pas de classes des fonctions simplement arrangées pour que ça tourne en AS3 .. quel est l’intérêt final ?

Peg'
Rejoignez-nous