Ankündigung

Einklappen
Keine Ankündigung bisher.

Multiplayer Spiel

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 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.

  • #2
    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".

    Kommentar


    • #3
      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.

      Kommentar


      • #4
        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.
        I like cooking my family and my pets.
        Use commas. Don't be a psycho.
        [URL="http://jscouch.de"]Blog[/URL] - [URL="http://coverflowjs.github.io/coverflow/"]CoverflowJS[/URL]

        Kommentar


        • #5
          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)
          apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

          Kommentar


          • #6
            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

            Kommentar


            • #7
              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
              apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

              Kommentar


              • #8
                also werde ich versuchen die tage nowjs einzubauen und websockets.
                Wieso nicht gleich socket.io? Das hat einige Fallbacks mehr.

                Kommentar


                • #9
                  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
                  apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                  Kommentar


                  • #10
                    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!

                    Kommentar


                    • #11
                      Zitat von perlfred Beitrag anzeigen
                      Das Verfahren der Kommunikation über IO-Socket ist mir allerdings immer noch nicht klar.
                      aalso um WebSockets zu realisieren benötigt man kein Apache server(es seidenn du willst dein script über URL aufrufen lassen), das was du brauchst ist eine server.js , diese Server.js wird mit dem Node programm gestartet(node muss bei dir auf dem server installiert sein, ab hier brauchst du also mindestens ein vserver mit ssh). danach läuft der server und lauscht auf port xyz. Als nächstes haste auf deinem Webspace(oder desktop) eine client.js, diese wird mit dem Programm Firefox.exe oder anderen gestartet. besser gesagt , firefox ruft client.html auf und die client.html führt client.js aus. die server.js weis dann :"aha hier ist ein neuer client -> dann tue irgendwas"

                      ein beispielcode findest du hier

                      http://nowjs.com/examples/map

                      der Serverside code muss du mit node starten, der clientside code commt in deine test.html rein(wobei du zusätzlich noch das jQuery framework auf der clientseite einbinden musst)

                      die nowjs hat eine superglobales object now dieses objekt kannst du mit funktionen auf dem server füttern , und die funktion steht dann dem client zur verfügung.

                      in dem oben geposteten beispiel gibt es dort die funktion updateActors, diese macht irgendwas auf dem server, aufgerufen wird die jedoch auf dem client.

                      wie da technisch die umstetzung stattfindet, weis ich auch nicht detailiert auf jedenfall muss auf deinem webserver.

                      denke nun ist alles klar

                      wichtig ist zu beachten dass es nicht so einfach geht mit nodejs auf mysql datenbank zu zugreifen, stattdessen nimmt man oft couchDB oder mongoDB es sind nosql datenbanken die Dateibasierend sind und nutzen das JSON format um daten zu speichern.

                      vielleicht solltest du erstmal die ajax variante nehmen und jede sekunde vom client, den server nach updates abfragen.

                      außerdem http://chat.nodejs.org/ kannst du hier die longpooling methode anschauen. Firebug mit console öffnen, da wirste sehen dass da ein ajax request ausgeführt wird der 30 sekunden wartet, es seidenn eine antwort ist angekommen, dann wird der ajax request abgebrochen.

                      https://github.com/ry/node_chat hier ist der quellcode dazu

                      Viel SPaß beim lernen

                      MFG
                      apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                      Kommentar


                      • #12
                        Ein Tutorial zu C# und Websockets kam heute per rss reingeflogen: working with websockets

                        Falls es doch nodejs werden soll:

                        Um nodejs produktiv laufen zu lassen, bietet sich forever an.

                        Hier ein paar Tutorials zu nodejs:
                        http://visionmedia.github.com/masteringnode/
                        http://ofps.oreilly.com/titles/9781449398583/
                        http://nodeguide.com/
                        http://nodetuts.com/

                        Für asynchrone Synchronität (Konzept der Deferreds/Promises - Synchronisieren von asynchron abhängigen Prozessen) bietet sich TameJS an. Ein wenig vergleichbar mit wie $.Deferred's von jQuery. Muss dir erstmal nichts sagen, einfach benutzen und genießen.

                        Um node-Module zu installieren, kannst du npm (node package manager) verwenden, ist mittlerweile im Core von nodejs gelandet und wird auch im windows binary mit ausgeliefert - allerdings ist die Windows-Portierung noch seeeeehr jung.

                        Ein express-Projekt anzulegen, funktioniert bspw. unter linux sehr einfach:

                        $: npm install -g express
                        #: express meinprojektname
                        #: cd meinprojektname
                        #: npm install -d
                        => loslegen. Unter Windows hab ich noch keinerlei nodejs-Erfahrung - viele nodejs-Module wirds noch nicht für windows geben.


                        Viele Grüße


                        Basti
                        I like cooking my family and my pets.
                        Use commas. Don't be a psycho.
                        [URL="http://jscouch.de"]Blog[/URL] - [URL="http://coverflowjs.github.io/coverflow/"]CoverflowJS[/URL]

                        Kommentar


                        • #13
                          Hallo BlackScorp!

                          Huchhhhhhhhhh, es gibt also ausser Datenbanken und dotNet noch Software?!!

                          Danke für deine fachkundige Hilfe! Ich habe bis jetzt niergens so eine klare, prägnante und einleuchtende Übersicht der Zusammenhänge zur Spiele-Programmierung gefunden! (1+2 Posting)

                          Das man dann im Detail noch zwei bis drei(hundert) Fragen hat ist klar, aber so kann man die Details wennigstens zuordnen.

                          Deine Beschreibung der Abläufe ist wirklich einleuchtend!!, nun muss ich ran, mit einfachen Beispielen, was umzusetzen.

                          Ich werde, genau wie du das vorschlägst, ersteinmal ein longpooling in Verbindung mit einer mySQL-DB umsetzen. Für das Kartenspiel wird das sicher reichen und für den Spiele-Einstieg ist das ganz sicher anspruchsvoll genug.
                          Die Socket-IO - Umsetzung reizt mich aber auch sehr! (Besonders weil du das schon so genau erklärt hast und die Beispiele vorliegen... Muss mal meinem Provider fragen, ob Inst. und Betrieb von node möglich ist.)

                          Bin ich für evt. Detailfragen bei der Umsetzung dann hier (PHP.de) richtig oder gibt es für JS geeignetere Foren?? (Noch könnt ihr überlegen, ob ihr so einen "Nerventot" nicht doch lieber wegschickt )

                          Also nochmals vielen Dank für die großartige Unterstützung!!!

                          Fred.

                          Kommentar


                          • #14
                            Zitat von perlfred Beitrag anzeigen
                            Die Socket-IO - Umsetzung reizt mich aber auch sehr! (Besonders weil du das schon so genau erklärt hast und die Beispiele vorliegen... Muss mal meinem Provider fragen, ob Inst. und Betrieb von node möglich ist.)
                            ich habe mich mal selbst damit ein wenig beschäftigt in letzten tagen, ich glaube du könntest node bei dir local installieren(und nowjs es ist ein node modul), firewall port 8080 freigeben und dyndns einrichten, dann node auf deinem PC installieren und server.js starten.

                            zumschluss in der html datei auf dein webserver folgenze zeile hinzufügen

                            <script type="text/javascript" src="http://testdomain.dyndns.org:8080/nowjs/now.js">

                            ich weis nicht genau ob es funktionieren wird aber kannst uns ja mal dann berichten
                            apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                            Kommentar


                            • #15
                              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)
                              longpolling ist auch der fallback von socketio, wenn alles andere scheitert, siehe https://github.com/LearnBoost/socket...ttp-polling.js
                              I like cooking my family and my pets.
                              Use commas. Don't be a psycho.
                              [URL="http://jscouch.de"]Blog[/URL] - [URL="http://coverflowjs.github.io/coverflow/"]CoverflowJS[/URL]

                              Kommentar

                              Lädt...
                              X