| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #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... Die Werte lese ich in Flash wie folgt ein: Frame 1: ActionScript:
ActionScript:
ActionScript:
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! |
| | |
| | #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 |
| | |
| | #3 (permalink) |
| Banned 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 |
| | |
| | #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... |
| | |
| | #5 (permalink) | |
| Banned Registriert seit: Sep 2003
Beiträge: 2.071
| Zitat:
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 | |
| | |
| | #6 (permalink) | |
| Neuer User Registriert seit: Feb 2004
Beiträge: 72
| Zitat:
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. | |
| | |
| | #7 (permalink) |
| Banned 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 |
| | |
| | #8 (permalink) | ||
| Neuer User Registriert seit: Feb 2004
Beiträge: 72
| Zitat:
Zitat:
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? | ||
| | |
| | #9 (permalink) |
| Banned 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 |
| | |
| | #10 (permalink) | |
| Neuer User Registriert seit: Feb 2004
Beiträge: 72
| Zitat:
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* | |
| | |
| | #11 (permalink) |
| Banned 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 |
| | |
| | #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... |
| | |
| | #14 (permalink) | |
| Neuer User Registriert seit: Feb 2004
Beiträge: 72
|
hallo, nochmal! Zitat:
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 | |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |