Seite 1 von 2

Tutorial für Netzwerk-Spiel mit PureBasic

Verfasst: 19.11.2004 12:09
von Lebostein
Hallo,

ich möchte ein kleines Netwerkspiel schreiben, dass man in Echtzeit über Internet (bzw. lokales Netzwerk) gegeneinander spielen kann (im Stil von: kleine, lustige Männlein, die sich gegenseitig abballern, so ne Art Bomberman)

Ist so etwas mit den Standard-PureBasic-Befehlen zu realisieren? Hat jemand vielleicht so ein kleines Spiel mal programmiert? Gibts vieleicht irgendwo ein Tutorial (auf der PureArea hab ich noch nichts gefunden).

Ich kann mir vorstellen, dass es nicht ganz so einfach ist, mehrere Rechner über Internet zu syncronisieren. Ich hab mich bisher überhaupt noch nicht damit beschäftigt und suche nun irgendwas, um mich in die Materie ein bisschen reinzufizzeln, wenn möglich gleich in Verbindung mit PureBasic.

Danke für Tipps.

Verfasst: 19.11.2004 15:01
von bobobo
wie fast immer .. guck ins
Codearchiv dort unter Internet&Co

Verfasst: 19.11.2004 15:34
von Lebostein
bobobo hat geschrieben:wie fast immer .. guck ins
Codearchiv dort unter Internet&Co
Ist schon klar, aber mit den Codeschnipsel kann ich nicht viel anfangen. Was ich suche hab ich oben beschrieben...

-

Verfasst: 19.11.2004 15:55
von PMV
Hm, also zum ersten, es ist möglich, so etwas mit PureBasic zu programmieren.

Hm, Codeschnippsel sollten ausrechen, um dich mit den einzellnen nötigen Befehlen und Engines für so ein Spiel auseinander zu setzten.

Im grunde brauchste dafür nur wissen über die Netzwerklib von PB und wie man mit so was umgeht und natürlich mit Spielen selber.
Für die Netzwerklib könnteste dir vielleicht auch z.B. quellcodes von Chats ansehen. Bei Spielen kommts dann auch wieder drauf an, was dein Spiel können muss usw. . Also mit Codeschnippseln kann man sehr viel lernen. Dazu noch geziehlter als mit ganzen fertigen Spielen :wink: .

Und zum Thema "mehrere Rechner syncronisieren" ... es wird ein Spieler als Server definiert und bei diesem Connection dann alle und dort sollte nach möglichkeit dann so viel algemeines wie möglich berechnet werden. Und die Ergebnisse werden dann den Clientens gesendet. Schon sollte es gehen :wink:

MFG PMV

Verfasst: 19.11.2004 16:25
von Lebostein
Danke.

Hab ich dass so richtig verstanden:

Die ganzen Kollisionsberechnungen usw. finden alle auf dem Server statt. Die Clienten schicken mir praktisch nur ihre Eingabebefehle (zum Beipiel "Client 1 hat 'Feuertaste' betätigt") und ich als Server werte diese Befehle aus und schicke allen Clienten die neuen Positionskoordinaten bzw. die Information, ein neues Objekt 'Geschoss' zu erzeugen usw...

...oder sollte die Objektverwaltung nur auf dem Server ablaufen? Dass ich den Clienten dann praktisch nur die Positionen der aktuellen Sprites mitteile, dürfte doch die beste Lösung sein, oder? So dass quasi bei den Clienten überhaupt nichts berechnet wird.

Verfasst: 19.11.2004 16:36
von Lebostein
...aber entsteht dadurch nicht einer Verzögerung? Wenn ein Client 'Feuer' drückt, muss ja der Befehl erst zum Server gehen, der wertet das aus und schickt die Positionskoordinaten zurück. Angenommen es gibt 10 Clienten und ungefähr 50 Objekte fliegen durch die Luft und bewegen sich, dann hat der Server ja ordentlich zu tun...

...aber anscheinend mangelt es gerade bei mir an der Vorstellung, ein paar Bytes in wenigen Millisekunden über hunderte von Kilometerm auszutauschen... :D

Verfasst: 19.11.2004 16:47
von DarkDragon
Hab schon so ziemlich alles ausprobiert: Von der Methode die dir vorgeschlagen wurde, bis hin zu Threads. Nichts hat wirklich wahre Ergebnisse gebracht.

Verfasst: 19.11.2004 17:00
von Lebostein
Deshalb wäre es schön, mal ein funktionierendes Beispiel zu sehen. Ein paar Textzeilen hin und herschicken, gut, das ist kein Problem. Das hab ich mit Hilfe des Codearchivs auch schon getestet. Aber ein paar Objekte (geknüpft an Sprites) zwischen Server und Client zu handeln, so dass beide Seiten praktisch das gleiche Spiel bzw. Ablauf sehen, will von der Herangehensweise und dem Grundverständnis her noch nicht so in meinen Kopf....

PS: @DarkDragon: Hab grade dein Spiel Digital Soldiers entdeckt (aber noch nicht getestet). Wie hast du es denn dort 'gemacht' :)

Verfasst: 19.11.2004 17:56
von DarkDragon
Digital Soldiers ist mir zu lahm gewesen, deshalb hab ich das projekt abgebrochen. Ich habs genau wie in Paul's Webchat gemacht(such auf PureArea.net und PureProject). Der Server war simpel, beim Senden und empfangen hab ich immer 64 Bytes genommen. Bei den Schüssen bin ich dann mal hängengeblieben, habs dann aber doch noch geschafft. Das ganze Spiel ist aber sehr lahm und wirds wahrscheinlich auch sein, wenn die UDP Lib nicht funktioniert. Ich glaube aber auch, dass es mit TCP durch irgeneinen Trick ganz schnell gehen kann.

Verfasst: 19.11.2004 20:08
von PMV
Das was ich dir vorgeschlagen hab, war ne idee, allerdings bräuchte man dafür wirklich ne dicke leitung *gg* ... es kommt drauf an, was man möchte und wie gut das laufen soll.

Spielste Onlinespiel, dann kann man sich oft denken, wie das gehandhabt wird, in etwa ... Spiele ohne Kollisionsüberprüfung senden nur alle paar ms ihre position, so wie geschwindigkeit, driftwinkel ... so dass dann der Client das alles selber ausrechnet. Nehmen wir allerdings ein Rennspiel, das mit Kollisionsabfrage ist, sieht das schon was anders aus.

NFS U1 z.b. scheint (betonung auf scheint, ich kann das ja nicht wissen) das z.B. alles beim Client berechnen zu lassen. Hierdurch entstehen sogenante "Geisterautos" bei schlechterer verbindung. Der Server dient anscheinend nur zum datenaustausch. Die Daten selber berechnet dann der Client.
Man muss vermutlich für jedes Spiel das neu austesten, was am besten geeignet ist. Aber so kleinichkeiten, wie Feuertaste gedrückt ... das brauchste ja nicht. Das ginge zu weit.

Nehmen wir dein Bomberman clon, das sollte sogar mit ISDN Locker zu schafen sein. Der Server sendet am anfang die Karte (fals diese nicht scho jeder hat) und warten dann auf die Clients, das diese die Karte fertig geladen haben. Nun wird das Spiel frei gegeben und alle Clients senden brave ihre Position der Fiegur. Sollte nun einer eine bombe legen, wird dem Server mitgeteilt, wo eine neue Bombe gelegt wurde. Das muss der Server natürlich den Clients mitteilen. Der Server rechnet nun runter, bis zur explosion und sendet, dann den clients den befehl zur explosion. Da der Server alle Positonen hat, sollte dieser die Explosion selber berechnen, also welcher Spieler getroffen wurde, welche Blöcke weg gingen usw. ... so hat jeder gleiche Chancen ...

^^natürlich ginge das jetzt noch weiter, aber das war schon mal der Anfang. Ein paar kleinichkeiten müssten da noch überlegt werden. Aber ich denke, dass das so machbar ist. Bei nem kleinen Bomberman sollte es dann auch nicht so schlimm sein, wenn der Server die ganze Rechnelast bekommt ;) ... bei großen Sieht das dann schon anders aus. Aber bleiben wir bei den kleinen dingen

So, ich hoff die überlegung war nen anstoß genug ;) ...

MFG PMV

Edit: ich glaub, das kommt alles was gewusst herrüber ... ich bin zwar davon überzeugt, dass das, was ich sagt, stimmt, aber ich hab so was noch nicht selber programmiert. Sind alles Teoretische überlegungen, die ich mir mal bei längeren überlegungen über so was zusammen gereimt. hab <) Z.B. könnt ich nix darüber aussagen, wie viel an daten wirklich für die Netzwerkkarte anfallen, bis ich dazu komme, das aus zu testen, steht noch sehr viel vorher an :D *g