netzwerk spiel
-
hallo, ich bin gerade dabei c++ zu lernen.
Ich möchte ein einfaches 2d spiel schreiben, das man im netzwerk
spielen kann.kennt ihr tutorials wo man netzwerk programmierung lernen kann?
mfg
-
hallo, ich bin gerade dabei c++ zu lernen.
Dann bleib erst mal dabei, es zu lernen.
Ich möchte ein einfaches 2d spiel schreiben, das man im netzwerk spielen kann.
Also ein Multiplayer-Modus?
kennt ihr tutorials wo man netzwerk programmierung lernen kann?
Lerne erstmal die Grundlagen zu Ende, dann kannst du dich an Netzwerk-Programmierung heranwagen.
Die bekannteste API dafür wird wohl Boost.Asio sein. Dafür gibt es auch Tutorials. Wenn du aber Netzwerk-Programmierung im Allgemeinen lernen willst... solltest du vielleicht einen Schritt vorher anfangen.
-
Lerne zuerst C++ richtig, sonst wirst du später ständig Lücken haben, die dich wahnsinnig viel Zeit und Nerven kosten. Mindestens ein paar Monate solltest du bei Konsolenprogrammen bleiben, bevor du dich an das komplexe Gebiet der Spieleprogrammierung wagst.
Anschliessend kannst du dir SFML anschauen, dabei gibts auch einen Netzwerkteil.
-
Nexus schrieb:
Lerne zuerst C++ richtig, sonst wirst du später ständig Lücken haben, die dich wahnsinnig viel Zeit und Nerven kosten. Mindestens ein paar Monate solltest du bei Konsolenprogrammen bleiben, bevor du dich an das komplexe Gebiet der Spieleprogrammierung wagst.
Das sehe ich nicht so. Es kann sehr helfen, ein Ziel als Motivation zu haben, man sollte sich aber bewusst machen, dass es nichts wird und sollte nicht zögern, zwischendurch alles wegzuschmeißen und mit dem neuen Wissen neu anzufangen und man sollte auch bereit sein, das ganze Projekt irgendwann aufzugeben.
Von komplizierten Themen, wie Netzwerke rate ich auch ab, denn dafür braucht man wirklich viele Grundlagen, viel Wissen, dass man wenig auf andere Gebiete anwenden kann, und außerdem enthalten Netzwerke oft ziemlich viele "unsaubere" Konvertierungen, casts, etc.
Für Spiel ist es schon kompliziert genug, erstmal die grundlegenden Klassen zu schreiben, Dateien einzulesen und Bilder anzuzeigen. Ein Netzwerk kann man als letztes nachrüsten, dafür muss aber erstmal die Grundlage bestehen.
-
ich möchte mich mit den grundlagen der netzwerkprogrammierung
beschäftigen, weil mich das sehr interessiert
wie sollte man da am besten anfangen?
-
Ich lass mal einen Link auf POCO da, die haben unter anderem eine (relativ) einfach benutzbare, portable Netzwerkbibliothek. Der wichtigste Link zum Lesen ist dann dieser hier.
Ich würde an deiner Stelle erstmal damit anfangen, kleine Nachrichten übers Netz zu schicken, um ein Gefühl dafür zu kriegen, wie Datenübertragung im Netzwerk funktioniert und welche Protokolle wofür sinnvoll sind. Vielleicht ein kleines HTTP-Server/Client-Paar schreiben, mit dem du...weißnich...Glückskeksnachrichten verteilen kannst. Oder Bruce-Schneier-Facts. Irgendwas in der Art.
Wenn du in Richtung Spiele gehen willst, wirst du dir um eigene Netzwerkprotokolle Gedanken machen müssen, d.h. was du wie in einer Form überträgst, dass du wenig Latenz hast und die Spieler trotzdem synchron bleiben. Es wäre aus meiner Sicht sinnvoll, die Grundlagen zu beherrschen, bevor man mit so was anfängt; sonst gibt es nicht nur viel Frust, sondern man reimt sich auch viel falsch zusammen und muss es mühsam wieder verlernen. Bis zu einem gewissen Grad wird das sowieso passieren, aber man kann und sollte das begrenzen, indem man sich erstmal kleinere Brocken und ein Lernfeld zur Zeit herausnimmt.
Mein Rat ist: Taste dich langsam vor, und geh die Dinge einzeln an, bevor du sie kombinierst. Durch den Anfang mit langweiligen Hallo-Welt-Programmen und Taschenrechnern muss man sich ein bisschen durchbeißen, aber recht bald wirst du in der Lage sein, ein Text-Snake oder -Tetris zu schreiben. Die Spiellogik von Snake ist denkbar simpel und ideal als Einstieg geeignet. Wenn du das einmal hast, kannst du ein schönes Grafikfrontend dafür bauen. Dann vielleicht den Server, den ich oben beschrieben habe, und wenn du soweit bist, kannst du daran gehen, das Tron-Motorradspiel mit Netzwerksupport zu bauen.
Das ist jetzt nur eine von vielen möglichen Vorgehensweisen. Ich hoffe, die Idee ist verständlich -- man nähert sich einem großen, komplexen Problem am besten, indem man es in einfachere, kleinere Probleme zerlegt und sie einzeln löst.
-
Schaue nach Socket Programmierung [1][2].
Client in Python3
import socket # import socket library client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # create socket client.connect((socket.gethostname() , 50007)) # connect socket as client to server with IP of localhost and port 50007 while True: data = input("Send: ") # receive user input client.sendall(data.encode("utf-8")) # send user input, encoded in UTF-8, to connected server if data == "Bye!": break client.close() # close connection to server
Server in Python3
import socket # import socket library server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # create socket server.bind((socket.gethostname() , 50007)) # set socket connection data to IP as localhost and port 50007 server.listen(1) # begin listening for incoming connections (with 1 place reserved in queue) client, address = server.accept() # wait for receiving one socket of a connection wishing client while True: data = client.recv(64) # receive 64 bytes from client if data: print(str(address) + ": " + data.decode("utf-8")) else: break server.close() # end listening
Client schrieb:
pythonw -u "client.py"
Send: Hello world!
Send: Foo
Send: Bye!
Exit code: 0Server schrieb:
pythonw -u "server.py"
('192.168.178.34', 53541): Hello world!
('192.168.178.34', 53541): Foo
('192.168.178.34', 53541): Bye!
Exit code: 0
-
tori1117 schrieb:
grundlagen der netzwerkprogrammierung
Dann guck dir die SOCKETS API an. Entweder Berkeley Sockets (Unix) oder WinSock (Windows). Sind beide sehr ähnlich aber halt nicht 100% gleich.
Das ist die grundlegendste Sockets API die es überhaupt gibt. Da lernst du wie das mit Netzwerk überhaupt funktioniert. Andere APIs wie Boost.ASIO oder diverse Sockets Klassen in anderen Sprachen sind im Prinzip nur Wrapper um die Sockets Funktionen. Die grundlegenden Konzepte bleiben die selben.
Was sich natürlich (z.T. massiv) unterscheidet ist wie die einzelnen Funktionen heissen und aufgerufen werden. Speziell wenn es um asynchrone Aufrufe geht.
Du kannst natürlich auch eine High-Level API ala Boost.ASIO, die POCO Netzwerkklassen, Qt Netzwerkklassen etc. verwenden. Wie gesagt, die grundlegenden Konzepte sind gleich. Allerdings kann es etwas schwierig sein da direkt einzusteigen, weil einem eben die ganzen Grundlagen fehlen. Je nachdem wie gut diese Grundlagen in der Doku der High-Level API dokumentiert kann das dann eine kleine oder grössere Hürde sein.
ps: Ich würde dir aber empfehlen auf jeden Fall die ersten Schritte zu machen ohne dabei ein Spiel zu programmieren. Beides zusammen ist ziemlich sicher zu viel, dann kommst du nicht weiter, verlierst den Spass und schmeisst es irgendwann ganz hin.
Mach lieber erstmal einfache kleine Test-Programme. Ne kleine Konsolen-Mode Serverapplikation und nen ebenso kleinen Konsolen-Mode Client dazu, und damit ein paar Daten rumschicken. Nur zum Ausprobieren.
Dann kannst du da Schrittweise mehr Funktionen einbauen. Und wenn du das Gefühl hast das einigermassen intus zu haben, dann mach ein kleines Test-Projekt für ein Spiel. Mit irgend einer einfachen Grafik- oder Game-Engine (SFML, Cinder, ...). Und wenn du das wiederrum einigermassen gut intus hast, dann kombiniert die beiden.
-
danke für die tipps
-
Vor den grundlegenden Sockets ( z.b. WinSock ) sollte man keine Angst haben. Hatte ich auch, hab mich lange gesträubt, mich dann aber überwunden und mich damit beschäftigt. Es gibt diverse Beispielsourcen im Netz, die dir helfen können, den Umgang mit Sockets zu erlernen. Ist wirklich nicht schwer, aber man sollte schon einige Erfahrungen in C++ und C haben.
D.h. lerne erstmal C++ und auch C und dann beschäftige dich mit Grafik und Sockets und evtl. auch Threads und allem was dazu gehört. Spannend werden Sockets auch erst dann, wenn man effizient höhe Datendurchsätze bewältigen will
-
Marthog schrieb:
Das sehe ich nicht so. Es kann sehr helfen, ein Ziel als Motivation zu haben, man sollte sich aber bewusst machen, dass es nichts wird und sollte nicht zögern, zwischendurch alles wegzuschmeißen und mit dem neuen Wissen neu anzufangen und man sollte auch bereit sein, das ganze Projekt irgendwann aufzugeben.
Die Realität sieht leider anders aus. Schau dir ein beliebiges Spieleentwickler-Forum an: Sehr viele Anfänger können kaum C++ und scheitern andauernd an trivialen Problemen aufgrund mangelnder Sprachkenntnisse. Sie verschwenden tagelang mit Debugging, Experimenten, Warten auf Antworten im Forum -- aber Hauptsache, sie haben ein wenig Zeit mit dem Lesen der Theorie "gespart". Traurigerweise sieht es bei einigen Fortgeschrittenen nicht mal viel besser aus: C++-Stil der 90er, kein Plan von RAII, und so fort... Die Argumentation ist jeweils "es reicht doch, um Spiele zu machen".
Eine Bibliothek wie SFML kann man nicht vernünftig benutzen, wenn man nicht wenigstens die C++-Grundlagen beherrscht. Klar muss man dazu nicht jedes Detail der Sprache kennen und lernt während der Entwicklung eigener Projekte weiter.
Marthog schrieb:
Von komplizierten Themen, wie Netzwerke rate ich auch ab
Es stimmt, dass Netzwerkprogrammierung relativ viele Low-Level-Kenntnisse erfordert, die bei Spielen anfänglich umgangen werden können. Dennoch wird die Komplexität von Spielen oft unterschätzt, gerade wenn man zuvor nie etwas in die Richtung gemacht hat. Siehe dazu auch But can you make Pong?
-
Seien wir mal ehrlich, ein Grossteil der Komplexitaet ruehrt doch daher, dass TCP konzeptuell einfach scheisse ist.
-
Kellerautomat schrieb:
Seien wir mal ehrlich, ein Grossteil der Komplexitaet ruehrt doch daher, dass TCP konzeptuell einfach scheisse ist.
Stimmt. Die Wissenschaftler hinter TCP haben das Protokoll primär aus Langeweile derart komplex gestaltet. Ist wahrscheinlich deswegen, dass sich TCP in der Welt kaum bewährt hat
-
Lies dir einfach mal die Beschreibung von SCTP durch, dann wird dir erst bewusst, wie kaputt das Internet ist.
-
Natürlich gibt es etliche Probleme, gerade im Bezug auf Sicherheit. Aber ich wage zu bezweifeln, dass ein Protokoll, welches dies alles zusätzlich berücksichtigt, viel simpler aufgebaut wäre.
-
Darum gehts nicht. Niemand will einen reinen Datenstrom, das macht einfach keinen Sinn. Nicht mal bei FTP.
-
eventuell SFML, liefert 2D, Sound und Netztwerk
-
Kellerautomat schrieb:
Niemand will einen reinen Datenstrom, das macht einfach keinen Sinn.
Was willst du denn sonst? Die Datentypen mitschleifen, die dann vom Layer drunter geparst werden müssen?
Außerdem ist TCP dafür da, dass die Daten korrekt ankommen. Wenn das nicht gewollt ist (Stichwort Streams) oder reicht, dann nimmt man halt was anderes (UDP zum Beispiel).
-
nwp3 schrieb:
Kellerautomat schrieb:
Niemand will einen reinen Datenstrom, das macht einfach keinen Sinn.
Was willst du denn sonst? Die Datentypen mitschleifen, die dann vom Layer drunter geparst werden müssen?
Außerdem ist TCP dafür da, dass die Daten korrekt ankommen. Wenn das nicht gewollt ist (Stichwort Streams) oder reicht, dann nimmt man halt was anderes (UDP zum Beispiel).http://en.wikipedia.org/wiki/Head-of-line_blocking
http://en.wikipedia.org/wiki/SCTP
-
Die bekannteste API dafür wird wohl Boost.Asio sein.
Nein, ist es nicht.
Ansonsten: http://beej.us/guide/bgnet/