Aide - Recherche - Membres - Calendrier
Version complète : red5 - probleme shared object en AS3
Centre de Formation Flash - Forums Adobe Flash > Rich media et intégration > Flash Media Interactive Server et Flash Remoting
doudoumastarastafari
Bonjour j'ai la dernière version de red5 installée sur mon serveur et les bons droits (lecture/écriture) sur le dossier stockant les shared object et je travaille avec Flash CS3 (pas FLEX je ne sais pas si cela change quelque chose dans mon problème...)

Lord que j'essaye un morceau de code créant un shared object, changeant une variable dans ce SO, en AS2 je reçois bien l'événement onSync et le changement de valeur s'est bien effectué MAIS en AS3 je n'y arrive pas. Avez vous une piste?

Voici le morceau de code en as2:

Action Script



import mx.utils.Delegate;

function newMovement(evtObj:Object):Void{
trace(so.data.mousePosition.x);
//trace bien la nouvelle valeur affectée à "mousePosition"
}

var nc:NetConnection = new NetConnection();
nc.connect("mon_flux_rtmp");
var so:SharedObject = SharedObject.getRemote("testSO", nc.uri, false);
so.onSync = Delegate.create(this, newMovement);
so.connect(nc);
function releaseBtn():Void{
trace("releaseBtn");
so.data.mousePosition = {x: 50, y: 100};
}

btn.onRelease=Delegate.create(this,releaseBtn);



En AS3/FLASH CS3 par contre cela ne fonctionne pas.

Voici mon code en AS3 :

Action Script


import flash.net.NetConnection;
import flash.events.NetStatusEvent;
import flash.net.SharedObject;
import flash.events.SyncEvent;
import flash.net.ObjectEncoding;
import flash.events.AsyncErrorEvent;


function netStatusHandler(e:NetStatusEvent):void{
switch (e.info.code) {
case "NetConnection.Connect.Success" :
initRemote();
break;
}
}

function initRemote():void{
so= SharedObject.getRemote("testSo", nc.uri, false);
so.addEventListener(SyncEvent.SYNC, newMovement);
so.connect(nc);
this.addEventListener(Event.ENTER_FRAME, updatePosition);
}


function newMovement(e : SyncEvent):void{
trace("newMovement");
trace(so.data.mousePosition);
//la fonction newMovement n'est appelé qu'une seul fois
//le trace de "mousePosition" me renvoi toujours undefined quelque soit la méthode de changement de la valeur dans le So(setProperty,setDirty ou directement so.data.mousePosition= )
}




var nc:NetConnection = new NetConnection();
nc.client = this;
nc.connect("mon_flux_rtmp");
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
var so:SharedObject;


function updatePosition(e:Object):void{
//quelque soit la méthode pour changer la valeur de "mousePosition" cela ne fonctionne pas
//so.setProperty("mousePosition",{x: "testx", y: "testy"});
//so.setDirty("mousePosition");
so.data.mousePosition = {x: "testx", y: "testy"};
}



J'ai retourné le problème dans tout les sens mais je n'arrive pas à savoir ce qui ne fonctionne pas en AS3 et fonctionne en AS2. Je vous en supplie un peu d'aide serait le bienvenue pour me tirer cette énorme épingle du pied sad.gif
doudoumastarastafari
Bonjour,

personne n'a ne serait-ce qu'une piste car je n'ai toujours pas trouvé de solution à mon problème...
dada
Salut,

Si çà fonctionne en AS2, sûrement que ton serveur utilise le protocle AMF0 et non pas AMF3 comme c'est le cas par défaut avec l'AS3.
Essaye çà :

Action Script

var nc:NetConnection = new NetConnection();
nc.objectEncoding = ObjectEncoding.AMF0;
doudoumastarastafari
Merci beaucoup Dada pour m'avoir sorti cette grosse épine du pied!

Pour infos,

Action Script

var nc:NetConnection = new NetConnection(); 
nc.objectEncoding = ObjectEncoding.AMF0;


fonctionne sans problème dans l'IDE de flash lorsqu'on code directement dans une frame par contre dans le cas ou la NetConnection est utilisé dans une classe, flash sort une erreur (objectEncoding ne serait qu'une variable "read" et donc pas "write" donc impossible d'en changer la valeur) il faut donc utiliser :

Action Script


import flash.net.ObjectEncoding;
import flash.net.SharedObject;
import flash.net.NetConnection;

NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0;
SharedObject.defaultObjectEncoding = ObjectEncoding.AMF0;


De plus j'avais dans mon code dans une classe, qui s'exécutait en première, une NetConnection qui n'utilisait pas de SharedObject donc je n'avais pas besoin de préciser de protocole et seulement ensuite dans une seconde classe une autre NetConnection qui elle utilisait un SharedObject.

Il faut setter le protocole utilisé avant toutes NetConnection (donc dans mon cas avant même la première NetConnection même si elle n'utilise pas de SharedObject) sinon cela ne fonctionne pas.

Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.