php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.11.2011, 14:21  
Neuer Benutzer
 
Registriert seit: 25.11.2011
Beiträge: 12
PHP-Kenntnisse:
Fortgeschritten
perlfred befindet sich auf einem aufstrebenden Ast
Standard Multiplayer Spiel

Hallo PHP Forum!

Ich bin 50 Jahre alt und im Bereich Spiele-Programmierung (speziell BrowserGame) ein Anfänger. Normalerweise sind multidimensionale Datenbanken, WPF und C# meine Spielwiesen (Desktop+Server-Anwendungen). Jetzt hat mich aber mein Informatik studierender Sohn herausgefordert, auch mal das Terrain zu wechseln.

Mit PHP und mySQL kann ich umgehen auch Apache zu konfigurieren ist für mich kein Fremdwort.
So nun genug der Vorrede.

Da ich aus der Welt der Desktop-Applikationen komme, habe ich Vorstellungsschwierigkeiten mit dem Problem der Interaktion von Benutzern in einer Browser bassierenden Applikation.

Für den Anfang habe ich mir ein Kartenspiel ausergoren. Dabei tritt jedoch schon bald das Problem:

Wie erfährt Benutzer B, dass Benutzer A eine bestimmte Karte ausgespielt hat?

auf.
Meine ersten Überlegungen laufen darauf hinaus, dass sämtliche Benutzer-Aktivitäten in eine Datenbank geschrieben werden und alle Benutzer (eines Spiels) in einem pooling (1s) die Statuszustände auslesen und dann die Browser-Darstellung entsprechend angepasst werden.

Ist diese Vorgehensweise aber so auch wirklich praktikabel?

Fred.

PS:
Wenn ihr ein gutes Buch zu dieser Thematik (Online Multiplayer Spiele-Entwicklung) empfehlen könnt, wäre ich auch für jeden Hinweis dankbar.
perlfred ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 25.11.2011, 15:51  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.637
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Zitat:
Zitat von perlfred Beitrag anzeigen
Hallo PHP Forum!

Meine ersten Überlegungen laufen darauf hinaus, dass sämtliche Benutzer-Aktivitäten in eine Datenbank geschrieben werden und alle Benutzer (eines Spiels) in einem pooling (1s) die Statuszustände auslesen und dann die Browser-Darstellung entsprechend angepasst werden.

Ist diese Vorgehensweise aber so auch wirklich praktikabel?
Das ist eine der Möglichkeiten. Jedoch ist diese auf zweierlei Weise unperformant:

- Für ein Kartenspiel mag es reichen, aber denk mal an einen Chat, was dann mit deiner Datenbank passiert.
- Der Browser des Clients feuert sekündlich HTTP Anragen raus die ggf. ins Leere laufen (keine Rückgabe produzieren) und der Server muss diese bedienen

Alternativen:
Long-Polling: Dabei startet der Client einen Request der eine gewisse Zeit offen gehalten wird und nach Ablauf der Lebenszeit ohne Rückgabe geschlossen wird, oder vorher mit einer Rückgabe kommt sodass direkt ein neuer "wartender" Request gestartet werden kann (Facebook verwendet Long-Polling).
TCP-Sockets: Mit JavaScript ist es möglich in modernen Browsern eine TCP Socketverbindung zu einem Server aufzubauen. Somit kann der Server den Client banachrichtigen wenn eine Aktualisierung nötig ist und das ewige "Anfragen" entfällt.
Beispiele:
http://websocket.org/aboutwebsocket.html
http://code.google.com/p/jsxmlsocket/
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Alt 26.11.2011, 01:47  
Neuer Benutzer
 
Registriert seit: 25.11.2011
Beiträge: 12
PHP-Kenntnisse:
Fortgeschritten
perlfred befindet sich auf einem aufstrebenden Ast
Standard

Hallo Dark Guardian!

Endlich mal eine fundierte Antwort!!!

Eine TCP Socketverbindung, auf so etwas hatte ich gehofft )
Ich dachte zwar, das diese dann zwischen den Spielern eines Spiel's aufgebaut werden muss (in meinem Fall immer 4), aber wenn der Server die Koordination übernehmen kann, dann wird es auch so funktionieren.

Wie die Kommunikation jetzt praktisch realisiert werden kann werde ich vieleicht Googeln können, oder kannst du mir dazu auch ein Buch empfehlen?

Dank deiner Hilfe habe ich aber jetzt wenigstens einen Ansatzpunkt!

Also nochmals vielen Dank für deine Hilfe!

Fred.
perlfred ist offline   Mit Zitat antworten
Alt 26.11.2011, 03:12  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

Eventuell interessiert dich das als Applikationsbasis:
socket.io
nodejs

Falls du nach einem nodejs-Framework suchst:
expressjs

Als Grafikengine könntest du dir blender (graphik engine) und three.js (webgl runtime) anschauen, allerdings wird das auf absehbare Zeit vom IE boykottiert werden.

Natürlich kannst du auch mit c# oder c++ „rumhantieren“

Falls ich dein Interesse für javascript-basierte Erweiterungen/Module geweckt habe, gib Bescheid. Dann poste ich dir gern mehr.
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline   Mit Zitat antworten
Alt 28.11.2011, 08:44  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

zusätzlich gibt es noch nowjs es verwendet socket.io und ein longpooling für browser die es nicht unterstützen(die examples mal mit FF und IE vergleichen)
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 29.11.2011, 14:34  
Neuer Benutzer
 
Registriert seit: 25.11.2011
Beiträge: 12
PHP-Kenntnisse:
Fortgeschritten
perlfred befindet sich auf einem aufstrebenden Ast
Standard

Hallo rudygotya!

Danke für deine Beispiele!

Mir fehlen jedoch noch viele Zusammenhänge, welche ich gern irgendwo nachlesen würde. In den Beispiel(en) ist zB. einfach nur ein Script für den Server und ein für den Client angegeben. Wie (wo [cron-Task?]) "startet" man aber den Serverscript??? Wie du siehst, also noch ganz grundlegende Zusammenhänge.

Wie hast Du denn die Grundlagen zur Spieleprogrammierung "gelernt"???

Ob ich das Spiel mit JS oder etwas anderem programmiere, ist mir eigentlich egal. Für mich ist nur eine sauber Objektorientierung (Klassen, Vererbung...) wichtig. (wenn möglich)

Was ich bis jetzt an deinen Hinweisen nicht verstanden habe ist, wie kann man den mit C# MultiPlayer-Browserspiele programmieren??? (ergibt doch exe oder dll Dateien, womit ein WebServer nichts anfangen kann?)

Ist es mit JS möglich die gesamte Logik eines Browser-Spiels zu verarbeiten??

Also wie du siehst, habe ich die 10fache Menge an Fragen als an klaren Vorstellungen zur Umsetzung eines Multiplayer-Browser-Game.

So ein Anfänger Multiplayer-Browser-Spiel Tutorial wäre ja ganz, ganz toll!!! Damit meine ich aber nicht so ein Singel-User Flash/JS Spiel mit Erklärungen zu Scriptsprachen Grundlagen (die gibt es reichlich). Die Grafische Ausprägung kann ja simpel gehalten werden.

Also nochmals danke! für deine Bemühungen!

Fred
perlfred ist offline   Mit Zitat antworten
Alt 29.11.2011, 16:05  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

http://buildingbrowsergames.com/tutorials/ schau dir mal das an

MFG

EDIT: sorry dass ich einfach nur ein blöden link gepostet habe, aber es ist halt nicht alles auf einmal zu erklären. In normalen browsergames ist der Client, dein browser und server dein webserver. Die verbindung erfolgt meistens über HTTP. Du hast also nicht sowas wie eine server.exe die du starten musst damit deine client.exe sich mit dem server verbindet. Du hast ledeglich 2 möglichkeiten.

1) normalen HTML link erstellen, der einen php script aufruft
oder
2) einen Ajax request, der das gleiche macht nur im hintergrund, sprich die seite wird nicht neu geladen.

Damit Clients mit einander kommunizieren können, wird in meisten fällen eine Datenbank verwendet. eine direkte client zu client verbindung gibt es nicht(wenn man jetzt HTML5 außer acht lässt).

Mit JS ist es möglich die gesamte Logik eines Spiels zu verarbeiten, nur

1) wird JS nur in deinem Browser ausgeführt , der server kriegt nichts davon mit
2) JS skripte kann jeder sehen (sicherheite etc)
3) JS kann deaktiviert werden (wieder sicherheitslücke)
4) Kann kein sauberes OOP

in klassischen browserspielen verläuft das ganze etwa so:

Benutzer ruft im browser domain.xyz/index.php auf, der script prüft etwas macht paar dinge und erzeugt HTML/Javascript code.

Javascript Code ermöglicht dinge wie animation oder andere spezial effekte sowie Ajax requests.

Danach hat der Benutzer, weitere klick möglichkeiten, die zb einen Ajax request ausführen. Dabei wird ein weitere PHP Script im hintergrund geladen und das ergebnis dieses PHP Scripts(kann HTML Code oder XML code oder JSON sein) kommt zurück an den client und du müsstest das ergebnis auf der Client seite bearbeiten(zb das ergebnis in einem Bestimmten DIV element einblenden lassen). Außerdem speichert der PHP script dann werte in der Datenbank. Diese werte werden von anderen Browsern dann ausgelesen.

Als Beispiel, kannst du mal mein Spiel anschauen. http://cruel-online.de username: test, passwort: testing.

Nachdem du dort die Spielfigur ausgewählt hast, wirst du weitergeleitet zu der Karte, Ich erzeuge mit PHP das grundgerüst bzw den HTML code , anschließend sobald der HTML code von dem Browser dargstellt wird, wird Javascript automatisch gestartet. Dieser erzeugt weitere Divs in meinem Grundgerüst(einzelne elemente der Karte) und lädt zusätzliche informationen über Ajax nach(zb hintergrundbild einer Kachel) das ergebnis des Ajax requests erweitert mein HTML code.

Danach klickst du in irgend eine richtung und der Javascript code erzeugt weitere DIV elemente im HTML code und lädt bei bedarf weitere informationen zu den divs. zusätzlich wird ein anderer Ajax request ausgeführt der die neuen Position der Spielfigur in der Datenbank abspeichert.

Normalerweise müsste ich jetzt noch parallel alle paar sekunden wieder ein ajax request versenden um aus der Datenbank auszulesen, wo sich gerade andere spieler befinden und spieler in meiner nähe dann einbleden. jedoch ist dieser vorgehensweise nicht besonders performant also werde ich versuchen die tage nowjs einzubauen und websockets.

Du kannst dir das Firefox plugin Firebug installieren und dort die konsole aktivieren, dann siehste genau was wird beim Ajax request versendet, und was kommt als antwort zurück.



Hoffe ich konnte dir weiterhelfen
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen

Geändert von BlackScorp (29.11.2011 um 16:39 Uhr).
BlackScorp ist offline   Mit Zitat antworten
Alt 29.11.2011, 16:52  
Erfahrener Benutzer
 
Registriert seit: 29.10.2009
Beiträge: 113
PHP-Kenntnisse:
Fortgeschritten
mYkon befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
also werde ich versuchen die tage nowjs einzubauen und websockets.
Wieso nicht gleich socket.io? Das hat einige Fallbacks mehr.
mYkon ist offline   Mit Zitat antworten
Alt 29.11.2011, 16:56  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Zitat:
Zitat von mYkon Beitrag anzeigen
Wieso nicht gleich socket.io? Das hat einige Fallbacks mehr.
soweit ich das mitbekommen habe ist nowjs ein socket.io wrapper um es einfacher in den Client zu implementieren.. aber das ist jetzt eine andere geschichte

EDIT: @topic JS kann zwar kein sauberes OOP aber es gibt sowas wie Dart ob man es verwenden muss.. ich weis nicht
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen

Geändert von BlackScorp (29.11.2011 um 17:02 Uhr).
BlackScorp ist offline   Mit Zitat antworten
Alt 29.11.2011, 17:59  
Neuer Benutzer
 
Registriert seit: 25.11.2011
Beiträge: 12
PHP-Kenntnisse:
Fortgeschritten
perlfred befindet sich auf einem aufstrebenden Ast
Standard

Hallo BlackScorp!!

Vielen Dank für deine ausführliche Antwort!

Du hast meine Zuversicht für JS jetzt enorm gestärkt!

Das Zusammenspiel von HTML -> PHP -> AJAX mit JSON zur Umwandlung der JS-Objekte und die Verbindung zum WEB-Server sind mir jetzt (theoretisch!) erst einmal klar.

Die Beschreibung für dein Spiel läuft aber wieder auf das von mir eingangs erwähnte Pooling-Verfahren mit Datenbank hinaus, welches von DarkGuadian (sicher zu recht) als unperformat abgelehnt wurde.

Das Verfahren der Kommunikation über IO-Socket ist mir allerdings immer noch nicht klar. Du schreibst zwar, der Server ist mein WEB-Server, aber das ist erst einmal ein ganz normaler Appache WEB-Server der PHP und mySQL-Module geladen hat.
Ein Script kann dieser ja nicht automatisch ausführen, nur weil es auf der Platte des WEB-Servers liegt. Zusätzlich ist mir die Art und Weise der Kommunikation zwischen Client1 -> Server -> Client2 über WEB-Socket noch nicht klar. Selbst wenn Client1 auf einen Port xyz eine direkte Verbindung zum Server aufbaut, muss der "horchende" Server beim Eintreffen eines Paketes ja irgendetwas an Client2-ClientN senden und dazu muss auf dem Server ja irgendetwas (programmiertes) laufen. Kann mir da mal einer Licht in den Verständigungs-Tunnel bringen???
(Die normale Vorgehensweise bei "Servern" wie sendmail, fetchmail die auch auf (Standard)Ports lauschen sind mir schon bekannt, aber dort gibt es ja feste Kommandos die die Kommunikation mit dem Client regeln.)

Fred.

PS:
Danke auch nochmal für diesen sehr praktikablen Hinweis:
<< Du kannst dir das Firefox plugin Firebug installieren und dort die konsole aktivieren, dann
<< siehste genau was wird beim Ajax request versendet, und was kommt als antwort zurück.

PS2:
Die Tutorial's sehe ich mir natürlich auch genau an. Danke für den Link!
perlfred ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Hilfe bei Multiplayer Canasta Kruemmel Freizeit 0 09.09.2011 17:11
Würfel spiel tkb JavaScript, Ajax und mehr 1 22.03.2011 23:22
Verstärkung gesucht für ein Sci-Fi Space Multiplayer Game BlackOrbst Sonstige 0 08.12.2010 23:39
Verstärkung gesucht für ein Sci-Fi Space Multiplayer Game jastreb Sonstige 0 04.12.2010 12:58
Sci-Fi Space Multiplayer Game Programmierers gesucht jastreb Gewerblich 2 30.11.2010 23:52
Suche Spiel Programmierer Erik1234 Sonstige 2 12.04.2010 14:10
Suche Programmierer für Instant Messenger / social Network / multiplayer Arcade games JamesTCookie Sonstige 0 10.03.2010 13:59
Karten Spiel shocky PHP Tipps 2006 10 16.02.2006 11:56
Zahlen Raten Spiel PHP Tipps 2005-2 3 24.09.2005 17:25
die meisten Punkte pro Spiel abfragen Gumfuzi Datenbanken 10 05.04.2005 21:29
nächstes spiel anzeigen? PHP-Fortgeschrittene 3 19.09.2004 15:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
blender game ajax request, multiplayer über browser programmieren, html codes javascripts game effekte, grafisches multiplayer spiel tutorial, php script spiel, php script multiplayer games, welten mehrere browsergam, browser spiele in c, php spiele code, javascript multiplayer game tutorial, ajax script dartspiel zwei spieler, wie macht man ein multplayer spiel mit c#, multiplayer game script php, c# mehrspieler spiele programmieren, java script multiplayer game tutorial, php würfel script mit datenbankanbindung, multiplayer javascript spiel, jscript internet multiplayer tutorial, php5 websocket blender animation, c# multiplayer game

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:40 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum