Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 28-09-2005, 13:02   #1 (permalink)
Neuer User
 
Registriert seit: Feb 2004
Beiträge: 72
LoadVars und PHP für Spiel: Bin am verzweifeln!

Hallo!

Ich habe ein riesen Problem, an dem ich mich schon etliche Tage sitze und langsam aber sicher am verzweifeln bin... Auch stundenlanges Suchen bei Google und im Forum hat nix gebracht. Ich hoffe, Ihr könnt mir helfen!!

Eigentlich ist es ganz einfach, ich habe ein PHP-Skript, welches nach jeweils einer Zehntelsekunde einen Wert ausspuckt:
http://www.d-tect.us/experimente/wait_flash.php

Dieser Wert bzw. die Variable soll dann in Flash eingelesen werden, und zwar jeweils nach (ungefähr) einer Zehntelsekunde, so dass Flash ständig aktuelle Werte erhält und diese weiterverarbeiten kann.

... nämlich wie folgt:
Code:
&anzeige= Das ist der Inhalt nach 0.1 Sekunde(n) Skriptlaufzeit...
&anzeige= Das ist der Inhalt nach 0.2 Sekunde(n) Skriptlaufzeit...
&anzeige= Das ist der Inhalt nach 0.3 Sekunde(n) Skriptlaufzeit...
... und so weiter

Die Werte lese ich in Flash wie folgt ein:

Frame 1:
ActionScript:
  1. var sende_server = new LoadVars();
  2. var empfange_server = new LoadVars();
  3.  
  4. empfange_server.onLoad = function() {
  5.     _root.anzeige_var = empfange_server.anzeige;
  6. };
  7. empfange_server.load("http://www.d-tect.us/experimente/wait_flash.php");
Frame 2:
ActionScript:
  1. _root.anzeige_var = "Geladen: "+ empfange_server.getBytesLoaded() + "  Content: "+ empfange_server.anzeige;
Frame 3:
ActionScript:
  1. gotoAndPlay(2);

Und außerdem befindet sich ein dynamische Textfeld mit Instanznamen "anzeige_inst" und Variablennamen "anzeige_var" in allen drei Frames.

Hier ist die fla:
http://www.d-tect.us/experimente/index.fla

Mein Problem ist nun, dass momentan nur immer die letzte Zeile ausgegeben und an Flash übergeben wird, und nicht so, wie es im (zumindest meinem) Browser angezeigt wird.

Anscheinend wartet Flash, bis die Seite komplett geladen wurde. Gibt es einen Weg, die empfangenen Daten vorher schon abzugreifen?? Bzw. an den Inhalt des Buffers heran zu kommen??

Tausend Dank schonmal!
hyperframe ist offline   Mit Zitat antworten
Alt 28-09-2005, 17:51   #2 (permalink)
Neuer User
 
Registriert seit: Feb 2004
Beiträge: 72
Hab noch vergessen, den Link zu der nicht funktionierenden swf zu schicken:

http://www.d-tect.us/experimente/index.html
hyperframe ist offline   Mit Zitat antworten
Alt 28-09-2005, 18:04   #3 (permalink)
Banned
 
Benutzerbild von projecktx
 
Registriert seit: Sep 2003
Beiträge: 2.071
nurmal so damit es für dich verständlicher wird....

du befiehlst deinem flash werte für die variable "anzeige" auszugeben was es auch tut

nun schaust du dir die php datei im browser an wo dann auch brav die Variable "anzeige" alle 10/tel sekunde neu erittelt und ausgegeben wird.

nun läd flash dieses php da

und wartet natürlich bis alles angekommen ist

und gibt dann alles aus was angekommen ist

und angekommen ist "nur" die letzte zeile... nö stimmt nicht... du hast nur immer und imemr wieder die wvariable "anzeige" in dem php "überschrieben" bzw. neu gesetzt.

stells dir vor wie sone wartemarke im arbeitsamt... es ist im endefeckt egal ob herr müller oder frau maier die wartenummer 746 hat.... das wird dem Mitarbeiter des arbeitsamtes erst dann bekannt wenn nummer 746 aufgerufen wurde und sich vorstellt... ob die nummer nun 45862843652837645 andere leute vorher hatten ist dem mitarbeiter des AA recht egal wenn frau meier mit der wartenummer vor ihm sitzt ... wird auch nur "hallo frau maier" gesagt.

wenn du die selbe anzeige haben willst wie im browser musst du das xml object verwenden oder im php alle werte in ein array schreiben und dieses dann ans flash schicken (serializer) wenn du alle 10tel sekunde eine neu abfrage starten willst musst du das aus flash machen denn flash wartet bis alles angekommen ist und da du die variable immer wieder neu beschreibst.. bekommst du auch nur die letzte zeile..

weiss ja net wofür du es brauchst ...

Gruss Sascha
projecktx ist offline   Mit Zitat antworten
Alt 28-09-2005, 18:51   #4 (permalink)
Neuer User
 
Registriert seit: Feb 2004
Beiträge: 72
danke schonmal, für die antwort.

du hast vollkommen recht, und das leuchtet mir auch ein: dadurch, dass flash die daten erst am ende des lesevorganges überhaupt interpretiert, werden die variablen ständig ersetzt bzw. überschrieben.
und genau DAS ist ja auch mein problem, da ich ja nicht erst am ende, wenn die komplette seite geladen ist, die werte der variablen brauche, sondern schon zur laufzeit der übertragung....

und genau DAS wüsste ich sehr gerne: wie man quasi auf den puffer von flash zugreifen kann, um auch die -zeitlich gesehen- zwischenwerte der variable erfassen zu können...
hyperframe ist offline   Mit Zitat antworten
Alt 28-09-2005, 19:03   #5 (permalink)
Banned
 
Benutzerbild von projecktx
 
Registriert seit: Sep 2003
Beiträge: 2.071
Zitat:
Zitat von hyperframe
wie man quasi auf den puffer von flash zugreifen kann, um auch die -zeitlich gesehen- zwischenwerte der variable erfassen zu können...
per load befehl....

gar nicht

weder beim XML noch beim LoadVars objekt

Grund: die zur verfügung stehnden methoden onLoad und onData werden erst dann aufgerufen wenn das Objekt vollstänig geladen wurde.

was du möchtest wäre sowas wie datenstreaming das ginge nur mit einer socket connection...

...

was genau möchtest du denn machen, vielleicht gibt es alternativen (z.b. php ändern)

Gruss Sascha
projecktx ist offline   Mit Zitat antworten
Alt 28-09-2005, 19:48   #6 (permalink)
Neuer User
 
Registriert seit: Feb 2004
Beiträge: 72
Zitat:
Zitat von projecktx
was du möchtest wäre sowas wie datenstreaming das ginge nur mit einer socket connection...

hehe, sockets hatte ich mir auch schon überlegt, aber leider macht da mein provider nicht mit...
deswegen musste ich mir irgendwie anders helfen....

AAAAAALSO:
ich habe vor, ein spiel zu programmieren, bei dem ständig die spielstände an die clients übertragen werden müssen, so alle 0,5 bis 1 sekunden.
da das mit http-requests zu lange dauert und zu unsicher ist (z.b. wenn eine http-anforderung die andere "überholt"), wollte ich erst eine socket-verbindung aufbauen, was wie gesagt nicht geht.

und dann kam ich auf die (wie ich finde brilliante idee *hüstel* ;-), eine socketverbindung zu simulieren: der client schickt eine anfrage ganz normal per http an den server, und bekommt vom php-skript portionsweise die antwort zugeschickt.
das hat den vorteil, dass die datenverbindung ähnlich einer socket-verbindung solange offen steht, bis das ende des dokuments erreicht ist.

die antwort wären dann also die spielstände zu den jeweiligen zeitpunkten, die dann flash als frontend darstellt.
hyperframe ist offline   Mit Zitat antworten
Alt 28-09-2005, 20:14   #7 (permalink)
Banned
 
Benutzerbild von projecktx
 
Registriert seit: Sep 2003
Beiträge: 2.071
interessante idee mit einem haken, dein provider wird auch ein TimeOut drin haben so das nach 30 sekunden ladezeit auch schluss wäre..

Multiuser spiele (zumindest actionreiche) werden allesamt über eine socket conection betrieben...

es wird dir nichts anderes übrig bleiben entweder eine socket verbindung zu nehmen (providerwechsel oder upgrade des webspace packetes)

oder eigenstänidige http posts zu machen ... das mit dem überholen bekämst du mit eine art jobID hin .. indem du also z jeder anfrage ne id sendest und die ergebnisse in einer art stack array gespeichert werden so das man auf die daten über besagte job id zugreifen kann, das ganze dann in einem intervall


aaaabbbberrrrr.....

schau dir mal diesen freehoster an... www.w3z.de
der erlaubt meines wissens nach socket verbindungen ( ich hab da zumindest ein pop3 gateway das über php-sockets abfragen an die pop3 server stellte mal drüber laufen gehabt...

Gruss Sascha
projecktx ist offline   Mit Zitat antworten
Alt 28-09-2005, 21:06   #8 (permalink)
Neuer User
 
Registriert seit: Feb 2004
Beiträge: 72
Zitat:
Zitat von projecktx
interessante idee mit einem haken, dein provider wird auch ein TimeOut drin haben so das nach 30 sekunden ladezeit auch schluss wäre..
jup, dessen problem bin ich mir bewusst. deswegen würde das flash-script in ebensolchem zeitraum, beispielsweise 25 sekunden, einen neuen http-request senden, und dann 25 sekunden lang auf die antwort des servers "horchen", und kurz vor einem timeout erneut senden etc.

Zitat:
Zitat von projecktx
das mit dem überholen bekämst du mit eine art jobID hin ..
jap, sowas hatte ich mir auch überlegt:

flash liest in regelmäßigen abständen, ca. zweimal pro sekunde, eine txt-datei mit den aktuellen spielinformationen aus, (kein php-skript oder datenbankabfragen, um den server nicht so zu belasten).
in jeder txt-datei steht dann beispielsweise ein timestamp, sowas wie 20050928220015.
überholt nun eine neuere abfrage eine ältere, und kommt die ältere verspätet an, wird diese dann über den timestamp als alt identifiziert und einfach ausgefiltert. flash braucht dann nur zu fragen, ob 200509282205000 > 200509282205009 ist.

das müsste eigentlich klappen, oder?
hyperframe ist offline   Mit Zitat antworten
Alt 28-09-2005, 21:29   #9 (permalink)
Banned
 
Benutzerbild von projecktx
 
Registriert seit: Sep 2003
Beiträge: 2.071
jap müsste es, wäre dann aber auch an der grenze des möglichen...

das problem bei dem ganzen...was machst du wenn das php die datei gerade beschreibt?

dann kanns sein das da anstatt:

meinTimestap=76876542763458263
meinevar=meinwert

nur


meinTimestap=76876542763458263
meinevar=

steht

dann "updatest" du mit ner leeren variable


Gruss Sascha
projecktx ist offline   Mit Zitat antworten
Alt 28-09-2005, 21:40   #10 (permalink)
Neuer User
 
Registriert seit: Feb 2004
Beiträge: 72
Zitat:
Zitat von projecktx
dann "updatest" du mit ner leeren variable
hmm, stimmt, hatte ich so noch garnicht bedacht.
wie wäre es, wenn ich einfach den timestamp am schluss schreibe, und flash, falls es keinen gültigen timestamp durch eine unvollständige textdatei bekommt, diese anweisung ignoriert?
wäre auch nicht weiter wild, weil ja ne knappe sekunde später die nächste abfrage kommt...
dann wäre also das spiel ne sekunde lang nicht auf dem aktuellsten stand, was man _mal_ durchaus verschmerzen könnte *g*
hyperframe ist offline   Mit Zitat antworten
Alt 28-09-2005, 21:49   #11 (permalink)
Banned
 
Benutzerbild von projecktx
 
Registriert seit: Sep 2003
Beiträge: 2.071
kannst du gerne versuchen.. aber... multiuserspiele haben meistens den sinn das 2 leute dran teilnehmen .. wenn nicht sogar mehr...

was denkst du wie gross deine chancen sind eine ausgeschriebene gültige textdatei zu erhalten wenn sagen wir 8 spieler gleichzeitig und unsynchronisiert auf ein und die selbe textdatei zugreifen und das alle 0,5 sekunden, mal abgesehen davon das die datei dann wahrscheinlich auch genau so oft eu geschrieben wird....

schau dir doch einfach mal diverse flashchats an.. die einzigsten die ohne socket auskommen noch recht schnell sind und ohne probleme dieser art ausommen haben alle eine Datenbank im backend und arbeiten im push-pull betrieb mit loadVars.. aber selbst bei diesen wird die intervall zeit wenn kein push vorliegt auf 3 sekunden für den pull gestzt da sonst ab spätestens 5 chattern gleichzeitig schluss ist wenn der server lahm ist...

Gruss Sascha
projecktx ist offline   Mit Zitat antworten
Alt 28-09-2005, 23:07   #12 (permalink)
Neuer User
 
Registriert seit: Feb 2004
Beiträge: 72
ich versuchs einfach mal.. probiere gleich morgen mal eine umsetzung. halte euch auf dem laufenden...
hyperframe ist offline   Mit Zitat antworten
Alt 29-09-2005, 17:32   #13 (permalink)
Neuer User
 
Registriert seit: Feb 2004
Beiträge: 72
Ansonsten hätte ich noch ne andere idee: die koppelung von flash mit javascript.
die kommunikation zwischen beiden ist hier ganz gut beschrieben:
http://www.macromedia.com/cfusion/kn...fm?id=tn_15683

das ganze könnte dann so aussehen, dass ich eine html-seite mit zwei frames habe, im einen den flash-film, im andern ein vom server geladenes php-skript, welches javascript-befehle zum steuern des flash-filmes beinhaltet, und diese in kurzen, periodischen abständen neu ausgibt.
man würde also das empfangen der befehle bzw. spielinformationen dem browser überlassen, und nicht dem flash-film.

problematisch hierbei wäre, dass jeder browser anders reagiert, und man keine garantie hat, dass es einwandfrei läuft. manchmal funktionieren selbst innerhalb einer browserreihe javascript, und manchmal nicht. so isses mir jetzt passiert, als ich meine mozilla version 1.7.11 auf 1.7.12 upgegradet habe: das o.g. beispiel funzte nicht mehr(!). und was mit 1.7.12 klappte, ging nicht in opera und so weiter...
hyperframe ist offline   Mit Zitat antworten
Alt 29-09-2005, 23:07   #14 (permalink)
Neuer User
 
Registriert seit: Feb 2004
Beiträge: 72
hallo, nochmal!

Zitat:
Zitat von projecktx
kannst du gerne versuchen..
Habs jetzt mal ausprobiert: 20 simulierte user haben etwa eine halbe stunde lang jeweils ein textfile geschrieben und dann sechsmal auf das txt-file in 0,75 sekunden-abstand zugegriffen. die geladenen files habe ich überprüft.
beim überprüfen kam heraus, dass insgesamt 134mal falsch gelesen wurde.
das aber bei 33620 Lesevorgängen insgesamt!
Das sind also nur 0,4%, bzw. 4 falsche von 1000.
Bei einer spielfeld-refreshsrate von 0,75 sekunden bekommt man nur alle 3 minuten ein falsches, welches durch den timestamp dann ausgefiltert wird. an der stelle hat man dann halt eine kleine "lücke" von 1,5 sekunden....
damit kann ich leben, glaube ich
hyperframe ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 18:51 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele