Network Pong
Network Pong
Hallo...
wollt mal mein Network Pong vorstellen, nicht weil es so extrem geil ist, sondern eher, weil ich hoffe, daß doch noch irgendeiner auf 'ne Idee kommt, wie man es Internet-tauglich machen kann momentan läuft es unter LAN ganz gut, aber übers Internet kann man's getrost vergessen - zu langsam...
Also wenn jemand was weiß, bitte Bescheid sagen ansonsten ist es für 'ne kleine spaßige Runde im LAN ja dennoch ganz gut zu gebrauchen...
www.christian-gleinser.de/prog/Network%20Pong%206.exe
Kann auch demnächst mal den Source posten, vielleicht weiß ja einer Rat... bin hier aber momentan in der Schule, daher nur mal die EXE.
Bedienung: einer macht Server, einer macht Client, der Server startet das Spiel dann mit der Leertaste. Schläger wird mit Pfeil hoch und Pfeil runter bedient. Leider muß der Client bei Spielstart sehr flott reagieren, aber ich hab grad leider nicht die Möglichkeit, das zu ändern (werde wohl die Geschwindigkeit der Schläger noch erhöhen).
Viel Spaß
wollt mal mein Network Pong vorstellen, nicht weil es so extrem geil ist, sondern eher, weil ich hoffe, daß doch noch irgendeiner auf 'ne Idee kommt, wie man es Internet-tauglich machen kann momentan läuft es unter LAN ganz gut, aber übers Internet kann man's getrost vergessen - zu langsam...
Also wenn jemand was weiß, bitte Bescheid sagen ansonsten ist es für 'ne kleine spaßige Runde im LAN ja dennoch ganz gut zu gebrauchen...
www.christian-gleinser.de/prog/Network%20Pong%206.exe
Kann auch demnächst mal den Source posten, vielleicht weiß ja einer Rat... bin hier aber momentan in der Schule, daher nur mal die EXE.
Bedienung: einer macht Server, einer macht Client, der Server startet das Spiel dann mit der Leertaste. Schläger wird mit Pfeil hoch und Pfeil runter bedient. Leider muß der Client bei Spielstart sehr flott reagieren, aber ich hab grad leider nicht die Möglichkeit, das zu ändern (werde wohl die Geschwindigkeit der Schläger noch erhöhen).
Viel Spaß
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46
- Wohnort: Luxemburg
- Kontaktdaten:
Hmmm, habs mir jetz ned angeguggt, aber was ne möglichkeit sein könnte um das ganze über i-net spielbar hinzubekommen:
Anstatt die Koords des Balles zu senden, sende einfach die richtung + geschwindigkeit des balles. Das ganze nach jeder kollision. Der Rest wird jeweils local berechnet.
Also Quasi so:
Der Server registriert eine kollision des balles mit dem schläger des players. Er sendet an den client die neue richtung des balles + die aktuelle geschwindigkeit. Der Client erhält die Daten, berechnet die Bewegung des Balles und checkt gleich mal, ob in naher zukunft eine Kollision mit ner Wand stattfindet. Wenn dem so ist, berechnet er das natürlich gleich mit. Ansonsten wird gewartet, bis der ball wieder eine Richtungsänderung erfährt. Dann beginnt das ganze wieder von vorne.
Sollte eine kollision mit ner Wand stattfinden, kannste ja auch die daten sicherheitshalber nochmal wechselweise kontrollieren, ob auch jeder die selben hat.
Aber im Prinzip brauchste ned viel mehr hin oder her schicken solange das spiel läuft. Klar kannste ab und an sicherheitshalber wie gesagt die koords bzw richtung etc. überprüfen, aber mehr jetz auch ned (zumindest was den ball angeht). Genauso verfährste effektiv mit den schlägern:
Wird die bewegungsrichtung des schlägers geändert, wird an den anderen Spieler eben die richtung + Geschwindigkeit übergeben und eben auch nur dann, wenn eine Änderung stattgefunden hat.
Bei Pong sollte es noch recht einfach sein das ganze zu synchronisieren, da man die meisten Daten einfach local berechnen kann, bzw. recht wenige Infos von der anderen Seite benötigt.
Was du auf jedenfall machen solltest (falls nicht schon geschehen): Das ganze Zeitkritisch programmieren. Sprich so, dass das ganze auf jedem rechner, egal wie schnell oder langsam immer gleich schnell läuft. Bei zu langsamen rechnern ruckelts halt dann, aber die Zeitgleichheit ist mehr als wichtig.
Wie gesagt, ich habs mir ned angesehen, weiss ned was du bereits drin hast, wie du die pakete übermittelst etc. Nur ich denke mal, dass mit dieser Methode das ganze durchaus spielbar sein dürfte, solange die Pings nicht zu hoch sind. Notfalls kannste ja auch die Fluggeschwindigkeit des Balls herabsetzen, dann biste auch nimmer so krass an die Pings gebunden. Prinzipiell solltest du halt schauen dass du die anzahl der Pakete die für einen flüssigen Ablauf benötigt werden möglichst gering hältst. Das schaffste mit der oben beschriebenen Methode imho eigentlich ganz gut.
Kann dir allerdings keinen Erfolg garantieren, aber nachdem in der PB-Lounge ein ähnliches Thema diskutiert wird, habe ich mir einfach mal die Tipps angeschaut und auf dein Projekt umgelegt. Bin aber zuversichtlich dass es klappen wird
Würd mich freuen wenns hinhaut
Viel Erfolg!
RaVeN
Anstatt die Koords des Balles zu senden, sende einfach die richtung + geschwindigkeit des balles. Das ganze nach jeder kollision. Der Rest wird jeweils local berechnet.
Also Quasi so:
Der Server registriert eine kollision des balles mit dem schläger des players. Er sendet an den client die neue richtung des balles + die aktuelle geschwindigkeit. Der Client erhält die Daten, berechnet die Bewegung des Balles und checkt gleich mal, ob in naher zukunft eine Kollision mit ner Wand stattfindet. Wenn dem so ist, berechnet er das natürlich gleich mit. Ansonsten wird gewartet, bis der ball wieder eine Richtungsänderung erfährt. Dann beginnt das ganze wieder von vorne.
Sollte eine kollision mit ner Wand stattfinden, kannste ja auch die daten sicherheitshalber nochmal wechselweise kontrollieren, ob auch jeder die selben hat.
Aber im Prinzip brauchste ned viel mehr hin oder her schicken solange das spiel läuft. Klar kannste ab und an sicherheitshalber wie gesagt die koords bzw richtung etc. überprüfen, aber mehr jetz auch ned (zumindest was den ball angeht). Genauso verfährste effektiv mit den schlägern:
Wird die bewegungsrichtung des schlägers geändert, wird an den anderen Spieler eben die richtung + Geschwindigkeit übergeben und eben auch nur dann, wenn eine Änderung stattgefunden hat.
Bei Pong sollte es noch recht einfach sein das ganze zu synchronisieren, da man die meisten Daten einfach local berechnen kann, bzw. recht wenige Infos von der anderen Seite benötigt.
Was du auf jedenfall machen solltest (falls nicht schon geschehen): Das ganze Zeitkritisch programmieren. Sprich so, dass das ganze auf jedem rechner, egal wie schnell oder langsam immer gleich schnell läuft. Bei zu langsamen rechnern ruckelts halt dann, aber die Zeitgleichheit ist mehr als wichtig.
Wie gesagt, ich habs mir ned angesehen, weiss ned was du bereits drin hast, wie du die pakete übermittelst etc. Nur ich denke mal, dass mit dieser Methode das ganze durchaus spielbar sein dürfte, solange die Pings nicht zu hoch sind. Notfalls kannste ja auch die Fluggeschwindigkeit des Balls herabsetzen, dann biste auch nimmer so krass an die Pings gebunden. Prinzipiell solltest du halt schauen dass du die anzahl der Pakete die für einen flüssigen Ablauf benötigt werden möglichst gering hältst. Das schaffste mit der oben beschriebenen Methode imho eigentlich ganz gut.
Kann dir allerdings keinen Erfolg garantieren, aber nachdem in der PB-Lounge ein ähnliches Thema diskutiert wird, habe ich mir einfach mal die Tipps angeschaut und auf dein Projekt umgelegt. Bin aber zuversichtlich dass es klappen wird
Würd mich freuen wenns hinhaut
Viel Erfolg!
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Genauso hab ichs erstmal vor - daß nicht ständig Datenpakete gesendet werden, sondern wirklich nur dann, wenn es tatsächlich nötig ist. Ich glaub, mit der momentanen Lösung ist die Leitung mehr oder weniger verstopft
Es muß dann aber auch noch dafür gesorgt werden, daß es auch wirklich synchron läuft. Daher muß vor dem Spiel ein kurzer Verbindungstest gemacht werden. Gibt es eine Möglichkeit, über PB den Ping zu ermitteln?
Es muß dann aber auch noch dafür gesorgt werden, daß es auch wirklich synchron läuft. Daher muß vor dem Spiel ein kurzer Verbindungstest gemacht werden. Gibt es eine Möglichkeit, über PB den Ping zu ermitteln?
Bei spielen denke ich ist es seeehhhr wichtig UDP statt TCP zu verwenden, leider kann das Purebasic nicht von alleine aber auch hier für gibt es eine Userlib, damit geht es bestimmt. Mfg Niklas
www.KoMaNi.de
Eine kleine Gruppe von Hobby Programmierern, die gerade einen Instant Messenger natürlich in PureBasic schreiben.
Eine kleine Gruppe von Hobby Programmierern, die gerade einen Instant Messenger natürlich in PureBasic schreiben.
-
- Beiträge: 243
- Registriert: 29.08.2004 12:46
- Wohnort: Irgendwo im nirgendwo
- Kontaktdaten:
Da gebe ich dir nicht recht, denn die spezifikation für UDP besagt, das die datenpackete in umgekerter reihenfolge, garnicht oder mehrfach ankommen können und das manuel zu managen halte ich nur wegen des geringeren Pinges für Spiele nicht so ideal.Nik hat geschrieben:Bei spielen denke ich ist es seeehhhr wichtig UDP statt TCP zu verwenden
Ja, giebt es (siehe purearea.net in den Userlibs->UDPNetwork) und es funktioniert auch.Nik hat geschrieben:...aber auch hier für gibt es eine Userlib, damit geht es bestimmt.
Man kann in seiner eigenen Aplikation ein PING Datenpacket zum Clienten schicken, der schickt so schnell wie möglich ein PONG Datenpacket zum Server zurück und so kennt der Server den Ping des Spielers und kann ihm seine Ping zeit senden.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
>> der schickt so schnell wie möglich ein PONG Datenpacket zum Server zurück
So ist also der Spielname entstanden
So ist also der Spielname entstanden
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46
- Wohnort: Luxemburg
- Kontaktdaten:
Richtung/Speed übertragen ist schon ganz gut, allerdings sollte man als Cheating-Schutz noch 2 Dinge einbauen:
1.) Das Senden der Daten erfolgt auch nach dem "Ping-Pong"-Prinzip, d.h. wenn PC A Richtung und Speed gesendet hat, dann muss er mit dem Senden warten bis PC B seinerseits die entsprechenden Daten geschickt hat. Sonst könnte ja jemand, der cheaten will, das ganze einfach nachbauen, und während des Fluges die Richtung nochmal ändern. Die Berechnung von "Abprallern" oben und unten an den Grenzen des Spielfelds übernimmt der PC, der den Ball geschossen hat. Ausserdem werden, falls der PC, der den Ball "empfangen" soll, meldet, er habe den Ball gekriegt, die Berechnungen von beiden PCs verglichen, und bei Nichtüberstimmung eine Fehlermeldung ausgegeben und das Spiel neu gestartet. (Punkte können jedoch erhalten bleiben)
2.) ein maximaler Speed-Wert. Wird dieser überschritten, so wird der Spieler, der den Ball weggeschossen hat, automatisch als Cheater identifiziert.
nur mal mein unqualifizierter Senf...
PS: wenn was nicht stimmen sollte (falsch oder unlogisch ist eurer Meinung nach), dann sagts mir bitte. Ich bin auf dem Gebiet nämlich noch weniger als ein Greenhorn, und stecke meine Nase nur mal wieder in Dinge rein, von denen ich gar keine Ahnung hab... Ich böser Theoretiker...
1.) Das Senden der Daten erfolgt auch nach dem "Ping-Pong"-Prinzip, d.h. wenn PC A Richtung und Speed gesendet hat, dann muss er mit dem Senden warten bis PC B seinerseits die entsprechenden Daten geschickt hat. Sonst könnte ja jemand, der cheaten will, das ganze einfach nachbauen, und während des Fluges die Richtung nochmal ändern. Die Berechnung von "Abprallern" oben und unten an den Grenzen des Spielfelds übernimmt der PC, der den Ball geschossen hat. Ausserdem werden, falls der PC, der den Ball "empfangen" soll, meldet, er habe den Ball gekriegt, die Berechnungen von beiden PCs verglichen, und bei Nichtüberstimmung eine Fehlermeldung ausgegeben und das Spiel neu gestartet. (Punkte können jedoch erhalten bleiben)
2.) ein maximaler Speed-Wert. Wird dieser überschritten, so wird der Spieler, der den Ball weggeschossen hat, automatisch als Cheater identifiziert.
nur mal mein unqualifizierter Senf...
PS: wenn was nicht stimmen sollte (falsch oder unlogisch ist eurer Meinung nach), dann sagts mir bitte. Ich bin auf dem Gebiet nämlich noch weniger als ein Greenhorn, und stecke meine Nase nur mal wieder in Dinge rein, von denen ich gar keine Ahnung hab... Ich böser Theoretiker...
„Warum siehst du den Splitter im Auge deines Bruders, aber den dicken fetten schwarzen Zensurbalken vor deinem Auge bemerkst du nicht?“