PHP -> Flash Variablen übergeben
hallo... habe ein problem... ich habe ein bisschen mnit actionscript und php rumexperimentiert und das ist dabei rausgekommen:
dabei klappt die übertragung ganz gut, aber ich kann den wert nur direkt ausgeben, will ihn aber als variable speichern und dann verwenden... sozusagen so:
var antwort = ladeDatenVomServer(bla,bla,keks);
und dann das die funktion nen return liefert... das prob ist blos das erst die event handler die daten abfragen können aber diese können keinen retun machen(kann ihn dann nicht abfragen) wie kann ich das lösen?
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
package {
//flash.text
import flash.text.TextColorType;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
//flash.net
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.URLRequestMethod;
import flash.net.URLLoader;
//other
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite {
//Var set
public var exp:String;
public var level:String;
public var requestTextField:TextField;
//Var set with atr
public var server:String = "http://localhost";
public var user:String = "Admin";
//PHP-Connection
private var re:URLRequest;
private var vars:URLVariables;
private var loader:URLLoader;
private var resultVars:URLVariables;
private var url:String = server+"/request.php";
public function Main() {
drawUI();
var exp_textfield:TextField = new TextField;
requestTextField = exp_textfield;
exp_textfield.y = 20;
loadData("experience", "getExp");
addChild(exp_textfield);
}
//UserInterface
public function drawUI():void {
//Exp
var exp_ui:Sprite = new Sprite();
exp_ui.graphics.beginFill(0x444444,1);
exp_ui.graphics.drawRect(0,0,100,20);
exp_ui.graphics.endFill();
addChild(exp_ui);
//Level
var level_ui:Sprite = new Sprite();
level_ui.graphics.beginFill(0x444444,1);
level_ui.graphics.drawRect(0,21,100,20);
level_ui.graphics.endFill();
addChild(level_ui);
}
//TextField
public function text(text:String):void {
var myText:TextField = new TextField();
myText.text = text;
addChild(myText);
}
//Server request start
private function loadData(action:String, subaction:String):void {
re = new URLRequest(url);
loader = new URLLoader();
loader.addEventListener(Event.OPEN, loadDataStart);
loader.addEventListener(Event.COMPLETE, loadDataComplete);
vars = new URLVariables();
vars.user = user;
vars.action = action;
vars.subaction = subaction;
resultVars = new URLVariables();
re.data = vars;
re.method = URLRequestMethod.POST;
loader.load(re);
}
private function loadDataStart(e:Event):void{
trace("Starte...");
}
private function loadDataComplete(e:Event):void {
resultVars.decode(e.currentTarget.data);
requestTextField.text = resultVars.answer;
}
//Server request end
}
}
|
dabei klappt die übertragung ganz gut, aber ich kann den wert nur direkt ausgeben, will ihn aber als variable speichern und dann verwenden... sozusagen so:
var antwort = ladeDatenVomServer(bla,bla,keks);
und dann das die funktion nen return liefert... das prob ist blos das erst die event handler die daten abfragen können aber diese können keinen retun machen(kann ihn dann nicht abfragen) wie kann ich das lösen?
Hallo, ich bin leider durch dein Skript nicht komplett durchgestiegen. Was soll denn die loadData-funktion eigentlich genau machen?
Soweit ich das aber überblicke, sollten deine Variable in loader.data stecken und nicht einem der anderen Objekte, die du da verwendest. Allerdings mußt du dem loader noch sagen, dass du Variablen erwartest, also etwa mit
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
Zumindest brauchst der eventhandler kein return. Die Variablen stecken in deinem loader und darauf hast überall Zugriff.
Sollte das unklar bleiben, schau doch mal unter
http://www.adobe.com/livedocs/flash/9.0/…e=00000316.html
Soweit ich das aber überblicke, sollten deine Variable in loader.data stecken und nicht einem der anderen Objekte, die du da verwendest. Allerdings mußt du dem loader noch sagen, dass du Variablen erwartest, also etwa mit
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
Zumindest brauchst der eventhandler kein return. Die Variablen stecken in deinem loader und darauf hast überall Zugriff.
Sollte das unklar bleiben, schau doch mal unter
http://www.adobe.com/livedocs/flash/9.0/…e=00000316.html
doch!
wie gesagt: sobald die Daten geladen sind, hast du die Variablen in deinem loader.data
Das ist schon ein array, d.h.
loader.data['variablenname'] gibt dir die Variable. Was willst du mehr???
Willst du etwa den eventlistener umgehen?
Das wird nicht funktionieren und zwar aus gutem Grund: Angenommen, du baust eine Funktion, die die Daten anfordert, so lange wartet bis sie eingetroffen sind und dann das Ergebnis zurückgibt. Dann hättest du zwei Probleme:
1. Was ist, wenn kein Ergebnis kommt? Soll deine Anwendung stoppen? Flash stürzt schon so oft genug ab, das will man ja nicht noch provozieren, oder?
2. Und das hier ist der wichtige Punkt.. Du weißt ja nicht, wie lange es dauert, bis die Daten eintreffen. D.h. deine Anwendung würde so lange still stehen bis die Daten da sind. In dieser Zeit könnte der Benutzer die Maus nicht benutzen, keine weitere Eingabe machen, ein MovieClip im Hintergrund würde gestoppt etc.
Das ist der Grund, weswegen man für solche Zwecke eventhandler benutzt. Diese umgehen zu wollen, wäre wirklich nicht besonders schlau.
wie gesagt: sobald die Daten geladen sind, hast du die Variablen in deinem loader.data
Das ist schon ein array, d.h.
loader.data['variablenname'] gibt dir die Variable. Was willst du mehr???
Willst du etwa den eventlistener umgehen?
Das wird nicht funktionieren und zwar aus gutem Grund: Angenommen, du baust eine Funktion, die die Daten anfordert, so lange wartet bis sie eingetroffen sind und dann das Ergebnis zurückgibt. Dann hättest du zwei Probleme:
1. Was ist, wenn kein Ergebnis kommt? Soll deine Anwendung stoppen? Flash stürzt schon so oft genug ab, das will man ja nicht noch provozieren, oder?
2. Und das hier ist der wichtige Punkt.. Du weißt ja nicht, wie lange es dauert, bis die Daten eintreffen. D.h. deine Anwendung würde so lange still stehen bis die Daten da sind. In dieser Zeit könnte der Benutzer die Maus nicht benutzen, keine weitere Eingabe machen, ein MovieClip im Hintergrund würde gestoppt etc.
Das ist der Grund, weswegen man für solche Zwecke eventhandler benutzt. Diese umgehen zu wollen, wäre wirklich nicht besonders schlau.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »elchrz« (12. Oktober 2010, 00:37)
Spoiler
![]()
Quellcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59package { //flash.text import flash.text.TextColorType; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; //flash.net import flash.net.URLRequest; import flash.net.URLVariables; import flash.net.URLRequestMethod; import flash.net.URLLoader; //other import flash.display.Sprite; import flash.events.Event; public class Main extends Sprite { //Var set public var exp:String; public var level:String; public var requestTextField:TextField; //Var set with atr public var server:String = "http://localhost"; public var user:String = "Admin"; //PHP-Connection private var re:URLRequest; private var vars:URLVariables; private var loader:URLLoader; private var resultVars:URLVariables; private var url:String = server+"/request.php"; public function Main() { loadData("experience", "getExp"); trace(loader.data); } //Server request start private function loadData(action:String, subaction:String):void { re = new URLRequest(url); loader = new URLLoader(); loader.addEventListener(Event.OPEN, loadDataStart); loader.addEventListener(Event.COMPLETE, loadDataComplete); vars = new URLVariables(); vars.user = user; vars.action = action; vars.subaction = subaction; resultVars = new URLVariables(); re.data = vars; re.method = URLRequestMethod.POST; loader.load(re); } private function loadDataStart(e:Event):void{ trace("Starte..."); } private function loadDataComplete(e:Event):void { resultVars.decode(e.currentTarget.data); } //Server request end } }
[Starting debug session with FDB]
undefined
Starte...
Das gibt die Konsole aus... habe versucht einfach so drauf zuzugreifen, aber es klappt nicht...
man kann es aber nicht anders lösen oder? kann man es vllt durch regelmäßiges aktualisieren der gesamten userinterface lösen? oder wie kann man das??...
Hallo,
da ich ja immer noch nicht genau verstehe, was du eigentlich willst, ist es unheimlich schwer dir da zu helfen. Was genau ist dein Problem?
ärgerst du dich über das "undefined"? Das kommt von dem Aufruf von trace(loader.data); innerhalb der main(). Du versuchst auf loader.data zuzugreifen, obwohl die Serveranfrage zu diesem Zeitpunkt ja noch gar nicht beendet sein kann. Daher enthält auch loader.data keine Daten. Wie ich schon sagte, den eventlistener zu umgehen, kann nicht funktionieren.
Vielleicht wird es so klarer: Du steigst im Erdgeschoss in einen Fahrstuhl. Du drückst die 5. Du steigst wieder aus. Wundert es dich da, dass du immer noch im Erdgeschoss bist? Damit du auch im 5.Stock ankommst, mußt du warten, bis der Fahrstuhl losgefahren ist und im 5. Stock gehalten hat.
Dazu hast du einen eingebauten Eventlistener im Kopf, du steigst erst wieder aus dem Fahrstuhl, wenn du im 5.Stock bist. Genau das mußt du dem Computer nun sagen: Steige ein (loadData(...) ), drücke die 5 (loader.load(re)), kämm dir beim Fahrstuhlfahren die Haare ( alles was noch so in der main() steht), der Fahrstuhl fährt los (loadDataStart()), der Fahrstuhl ist im 5. Stock angekommen (loadDataComplete(e:Event)), steige aus und mache irgendwas in der 5. Etage (Inhalt von loadDataComplete()).
Wenn ich dir weiter helfen soll, müßte ich nun noch genauer wissen, was du machen willst. Normalerweise ist es nämlich kein Problem, sein Programm so zu strukturieren, dass bestimmte Dinge erst nach dem erfolgtem Eventhandlerrücklauf ausgeführt werden.
da ich ja immer noch nicht genau verstehe, was du eigentlich willst, ist es unheimlich schwer dir da zu helfen. Was genau ist dein Problem?
ärgerst du dich über das "undefined"? Das kommt von dem Aufruf von trace(loader.data); innerhalb der main(). Du versuchst auf loader.data zuzugreifen, obwohl die Serveranfrage zu diesem Zeitpunkt ja noch gar nicht beendet sein kann. Daher enthält auch loader.data keine Daten. Wie ich schon sagte, den eventlistener zu umgehen, kann nicht funktionieren.
Vielleicht wird es so klarer: Du steigst im Erdgeschoss in einen Fahrstuhl. Du drückst die 5. Du steigst wieder aus. Wundert es dich da, dass du immer noch im Erdgeschoss bist? Damit du auch im 5.Stock ankommst, mußt du warten, bis der Fahrstuhl losgefahren ist und im 5. Stock gehalten hat.
Dazu hast du einen eingebauten Eventlistener im Kopf, du steigst erst wieder aus dem Fahrstuhl, wenn du im 5.Stock bist. Genau das mußt du dem Computer nun sagen: Steige ein (loadData(...) ), drücke die 5 (loader.load(re)), kämm dir beim Fahrstuhlfahren die Haare ( alles was noch so in der main() steht), der Fahrstuhl fährt los (loadDataStart()), der Fahrstuhl ist im 5. Stock angekommen (loadDataComplete(e:Event)), steige aus und mache irgendwas in der 5. Etage (Inhalt von loadDataComplete()).
Wenn ich dir weiter helfen soll, müßte ich nun noch genauer wissen, was du machen willst. Normalerweise ist es nämlich kein Problem, sein Programm so zu strukturieren, dass bestimmte Dinge erst nach dem erfolgtem Eventhandlerrücklauf ausgeführt werden.
das ganze soll daten vom server abfragen, die vorher vom server gespeichet wurden. wie zumbeispiel spielwährung. da ich diese nicht nur anzeigen will, sondern auch teoretisch schon innerhalb der ersten sekunde nach dem spielstart mit ihr rechnen will ist das undefined relativ schlimm, dadurch würden rechenfehler entstehen, und vielleicht sogar auf dem server falsche daten gespeichert werden...
hoffe es wird verständlicher
hoffe es wird verständlicher
Hallo,
dann mußt du also sicherstellen, dass deine Rechnungen erst ausgeführt werden, wenn die Rückmeldung vom Server da ist.
Du könntest also beispielsweise eine Methode "rechnen()" schreiben und diese innerhalb des loadDataComplete-Eventhandlers aufrufen.
Damit wäre dann sichergestellt, dass erst gerechnet wird, wenn der Eventhandler aufgerufen wird und die Serverrückmeldung schon eingetroffen ist.
Du könntest auch das ganze Spiel erst starten sobald die Daten vom Server da sind und bis dahin einfach nur einen leeren Bildschirm oder einen Splashscreen anzeigen.
dann mußt du also sicherstellen, dass deine Rechnungen erst ausgeführt werden, wenn die Rückmeldung vom Server da ist.
Du könntest also beispielsweise eine Methode "rechnen()" schreiben und diese innerhalb des loadDataComplete-Eventhandlers aufrufen.
Damit wäre dann sichergestellt, dass erst gerechnet wird, wenn der Eventhandler aufgerufen wird und die Serverrückmeldung schon eingetroffen ist.
Du könntest auch das ganze Spiel erst starten sobald die Daten vom Server da sind und bis dahin einfach nur einen leeren Bildschirm oder einen Splashscreen anzeigen.
Ähnliche Themen
-
Flash »-
personalisierte Flash-Videos im Web
(3. Juni 2009, 12:24)
-
PHP »-
Array aus DB an Flash übergeben
(18. Januar 2005, 18:00)
-
(X)HTML & CSS & DHTML & Javascript »-
variable übergeben trotz timeout?
(17. August 2003, 21:39)
-
Flash »-
HILFE bitte >> actionscript für <input type="submit" name="action" value="Star">
(28. April 2003, 21:07)
-
PHP »-
Session-Id => Flash
(31. März 2003, 15:38)


