DETECTEUR AUTOMATIQUE DE MEDIA AS3 - AS2

cs_Girou Messages postés 1203 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 23 juillet 2009 - 5 sept. 2008 à 09:30
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 - 5 sept. 2008 à 14:16
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/47873-detecteur-automatique-de-media-as3-as2

pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
5 sept. 2008 à 14:16
ben le XML reste une base de donnée très accessible .. je m'en sert aussi pour les décors de jeux ...:p

Peg'
cs_ourso Messages postés 92 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 5 décembre 2010
5 sept. 2008 à 13:57
je n'ai qu'un mot à dire : Brillant !
cs_Girou Messages postés 1203 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 23 juillet 2009 2
5 sept. 2008 à 13:45
Pour ceux que cela intéresse, la traduction en AS2 de la fonction proposée par Pegase31 donne ceci :

import mx.xpath.XPathAPI;

var data:XML = new XML('<main><media ext="jpg" type="image"/><media ext="jpeg" type="image"/><media ext="png" type="image"/><media ext="flv" type="video"/><media ext="ai" type="null"/><media ext="pdf" type="download_file"/><media ext="mp3" type="musique"/></main>')

function mediaSetter(label:String):String {
var ext:String = label.split(".").pop().toLowerCase();
return(XPathAPI.selectSingleNode(data.firstChild, "/main/media[@ext='"+ext+"']").attributes.type);
}

L'utilisation du XML est une très bonne chose -> possible de charger dynamiquement la liste (donc pas besoin de recompiler si elle évolue) et dans ton idée de base de lancer le lecteur approprié, si celui-ci est aussi défini dans le xml, ou plus simplement défini en fonction du type de media (image -> image.swf) en chargeant dans un container le lecteur swf externe approprié on obtient une solution polyvalente et fortement evolutive sans toucher à l'animation de base.

function loadContent(_lien:String){
var lecteur:String=mediaSetter(_lien)
lecteur+=".swf?_media="+lien;
_container.loadMovie(lecteur)
}

Avantage de la méthode, il suffit d'adapter le XML et de créer les lecteurs 'externes'

@+
Girou
cs_ourso Messages postés 92 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 5 décembre 2010
5 sept. 2008 à 13:13
Oui c'est une bonne idée.
Je me suis penché mais pas assez sur l'XML dans as3... juste le loading et le parsage des infos...mais je dois pour mon dev recupérer un flux rss qui va influer sur l'aspect du site, et ton tuto devrait me concerner.
La doc que l'on trouve sur internet n'est pas toujours très limpide, notamment sur les conditions dans lesquelles les différentes utilisations sont recommandées (je parle d'XML list). Parfois en as une se met à faire des méthodes alors qu'elles existent déjà... C'est le problème du mécano !
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
5 sept. 2008 à 13:06
c'est l'E4X, il s'agit à peu près d'une requête lancée au XML qui ressort une "liste" (un XMLList", en fait) de ce que tu as demandé.
Dans le cas présent, une valeur d'attribut.

Si besoin, je ferais une source exemple de comment gérer ça ... c'est pas très compliqué

Peg'
cs_ourso Messages postés 92 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 5 décembre 2010
5 sept. 2008 à 13:05
Il en reste que si je mets tes modifs pegase... Le code n'est plus valable qu'en AS3... Dans ces temps de transitions autant que ça serve au plus grand nombre. Je ne rentre donc pas tes modifs pour la compatibilités mais je vais serieusement envisager ton point de vue pour mes futurs dev !
merci à tous pour votre participation... Donner c'est aussi recevoir !
cs_mouahaha Messages postés 209 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 6 avril 2009 1
5 sept. 2008 à 12:58
Très intéressante conversation, faut vraiment que je me plonge dans l'AS3, cette façon de gérer le XML a l'air pas mal... Merci Peg !
Et merci Ourso pour ta source ^^
cs_Girou Messages postés 1203 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 23 juillet 2009 2
5 sept. 2008 à 12:27
@Peg' : Y'a des jours ou tu m'énerve :o)

function mediaSetter(label:String):String {

var ext:String = label.split(".").pop(); A PLEURER DE SIMPLICITÉ... qu'est ce que je me suis em... avec des indexof moi

return(data.media.(@ext==ext).@type); Vu ma consommation de XML, faut VRAIMENT que je passe à l'AS3, Xpath pour AS2 c'est bien mais la syntaxe utilisant E4X c'est tout de même autre chose...

}

une remarque cependant : var ext:String = label.split(".").pop() va générer une erreur de compilation sous MTASC (probleme de typage)
alors que var ext:String = label.split(".").pop().toLowerCase() n'en génère pas... étonnant...

Et je ne trouve pas cela spécialement obscure comme notation.

@+
Girou
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
5 sept. 2008 à 12:20
non, en fait, c'est lors de mon test en XML : le string renvoyé ne peut pas être null s'il ne retrouve pas la référence, il faut le passer "manuellement".
Mais comme je t'ai fait ça "sous le coudee, j'ai confondu.

Peg'
cs_ourso Messages postés 92 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 5 décembre 2010
5 sept. 2008 à 12:18
mais pour cette histoire de variable null tu peux m'indiquer ou je peux trouver l'info ?
cs_ourso Messages postés 92 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 5 décembre 2010
5 sept. 2008 à 12:17
Disons un peu ésotérique plutôt, obscur c'est moral, t'as raison! C'est une question de préférence ensuite... Sans doute d'expérience aussi. Pour l'instant je préfère voir quelle instruction déconne quand la compilateur m'indique la ligne ou je me suis trompé :D.
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
5 sept. 2008 à 12:10
obscure ? non, c'est tout à fait faisable et trés simple.

Peg'
cs_ourso Messages postés 92 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 5 décembre 2010
5 sept. 2008 à 12:01
Ah ! une string ne peut pas être null en AS3?,mais pourtant, quand je compile cette fonction je ne reçois pas d'erreur...Celui-ci doit transformer la constante en string sinon il se mettrait à sonner non? je n'ai eu le souci ni en AS2 ni en AS3.
sinon le cas du xml à la place du switch me parait très interessante en effet. Tu as juste oublié de passer ta chaine en toLowerCase() pour la rendre compatible avec les extensions. Mais à ce moment il te faut encore rajouter une instruction sur la declaration de "ext" et ça devient peut être un peu obscur... label.split(".").pop().toLowerCase();
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
5 sept. 2008 à 11:32
J'allais faire la même remarque quand j'ai vu que ce cher Girou avait déjà relevé le soucis ..

Je me permettrais donc de corriger son code comme suit :
var extension:String = nom_media.split(".").pop(); //et ça tiens sur une ligne ;)

il y a une autre erreur dans ton code, mais uniquement en as3 : un String ne peut pas être "null" ...

Mais dans le cas de ce que tu veux faire, plus il y aura de médias et plus le code sera long.
Autant utiliser la puissance du XML dans le cas d'un AS3 comme suit :

var data:XML =
<main>
<media ext="jpg" type="image"/>
<media ext="jpeg" type="image"/>
<media ext="png" type="image"/>
<media ext="flv" type="video"/>
<media ext="ai" type="null"/>
<media ext="pdf" type="download_file"/>
<media ext="mp3" type="musique"/>
</main>

function mediaSetter(label:String):String {
var ext:String = label.split(".").pop();
return(data.media.(@ext==ext).@type);
}

voili !
cs_Girou Messages postés 1203 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 23 juillet 2009 2
5 sept. 2008 à 09:30
Salut,

C'est effectivement très utile comme fonction et j'ai développé le même concept que toi dans une application.
Cependant, dans ta fonction je vois un risque de problème : un nom de fichier contenant un point !

media_setter("ma.photo.jpg") va te retourner null et non "image" car splitted[1].toString().toLowerCase() va retourner "photo"

pour contourner ce problème, voici comment j'ai procédé (adapté à ton code) :

var ind:Number = nom_media.lastIndexOf(".");
var extension:String = nom_media.substr(ind + 1);

Ah aussi, dans ta liste de média tu as oublié, entre autre, le mp3 ;o)

@+
Girou
Rejoignez-nous