Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

21

01.02.2010, 11:15

alles was in heikos buch vorkommt sollte auch im großen handbuch erklärt werden. trotzdem solltest du alles lesen weil heiko ziemlich viel ausgelassen hat um einen überblick zu ermöglichen. ausserdem schadet es nicht eine sache auf zwei verschiedene arten erklärt zu bekommen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

22

01.02.2010, 11:28

Ok, es ist gleich fertig, könntest du mir vielleicht nicht trotzdem
beim jetztigen Problem helfen, oder ist das zu schwer, das ich
das erstmal liegen lassen sollte..?

Weil ich wollt unbedingt die Sache durchziehen, und ich finde
das Spiel lässt sich so langsam sehen... Was hätte
ich den machen müssen...?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

23

01.02.2010, 11:39

ich hab eine klasse client von sf::thread erben lassen, ihm eine schleife gegeben und die daten in eine liste bzw. einem vector schreiben lassen, die sich dann der hauptthread abgeholt hat. das könnte man natürlich auch mit callbacks machen.

abhängig von der komplexität und art des servers werden entweder die daten gleich nach dem empfangen an alle anderen clients geschickt oder erst verarbeitet und im nächsten frame alle daten gemeinsam abgeschickt.
im zweiten fall sollte der server als eigenständiges programm, welches natürlich auch mit hilfe eines threads in den client eingebaut werden kann, verstanden werden.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

24

01.02.2010, 11:42

Zitat von »"NachoMan"«

ich hab eine klasse client von sf::thread erben lassen, ihm eine schleife gegeben und die daten in eine liste bzw. einem vector schreiben lassen, die sich dann der hauptthread abgeholt hat. das könnte man natürlich auch mit callbacks machen.

abhängig von der komplexität und art des servers werden entweder die daten gleich nach dem empfangen an alle anderen clients geschickt oder erst verarbeitet und im nächsten frame alle daten gemeinsam abgeschickt.
im zweiten fall sollte der server als eigenständiges programm, welches natürlich auch mit hilfe eines threads in den client eingebaut werden kann, verstanden werden.


...ich les das buch... :lol:
Vielen Dank trotzdem! :D

Das Spiel mach ich dann halt im singel player modus zuende. :)

25

01.02.2010, 12:29

Grob sollte es so aussehen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
while(GameloopRunning){
// handle events


// get other Player positions


// do game stuff


// handle player input


// send new position

}


Du brauchst also einen Thread der permanent auf neue Daten wartet und sie irgendwo in deinem Programm (am besten eine eigene Klasse) speicher. Das musst du natürlich synchronisieren.
Dann kannst du in deiner Hauptschleife immer die aktuell gespeicherte Position zu jedem Spieler von deiner Klasse auslesen und damit arbeiten. Am ende der Schleife sendest du ein Paket mit den neuen Daten deines Spielers.

Das sind aber jetzt nur die minimalistischsten Basics. Wenn du das so implementierst und es über das Internet ausprobierst (oder WLAN) wirst du ein Ruckeln und Springen der Spielfiguren bemerken. Das liegt an der verzögerten Übertragung der Pakete.

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

26

01.02.2010, 12:58

Zitat von »"NachoMan"«

danach kannst du dich daran machen deinen programmierstil zu verbessern:
http://www.amazon.de/Effektiv-programmie…65015365&sr=8-1


Kann ich persönlich auch nur empfehlen. Habe vor Jahren mal eine Version von diesem Buch gelesen und selbst wenn man schon sehr lange mit C++ gearbeitet hat, gab einem das Buch dennoch den einen oder anderen Denkanstoß.

LG
Alyx

27

08.05.2010, 09:58

Hallo,

Ich bins mal wieder, ich bin kurz vorm explodieren vor frust.
Ich hab wirklich alles versucht was man nur versuchen kann, nachdem ich in
meinem buch das kapitel über threads zuende gelesen hab, hab ich mich gleich dran gemacht.
Doch irgendwie funktioniert es nicht. Und ich weiß echt nicht mehr woran es liegen kann.

Ich öffne zwei instanzen von dem Spiel auf mein Computer (ich habs auch versucht mitn freund, ging aber auch nicht)
dann verbinde ich mich mit mir selbst, und dann passiert rein nix mehr, davor bevor ich den Code 1000 mal umgeändert
hab wurde wenigstens ein Fenster minimiert, das war wenigstens ein lebenszeichen.

Also ich machs so, ich hab zwei Threads einmal ServerEmpfangen und einmal ClientEmpfangen
wenn man Client wählt dann läuft der Client Thread und bei Server der Server Thread.
In dem Thread gibts eine while schleife die die ganze Zeit die Daten Receiven soll, das ganze mit Packet.
Und dann hab ich noch eine normale Funktion die einfach die Daten sendet, doch genau dort ist glaub ich
das Problem, weil die Funktion nur einmal ausgeführt wird, und mit ner while schleife stürzt das Spiel ab,
also hab ich noch die Thread ServerSenden und ClientSenden gemacht, mit ner while schleife verbunden,
jetzt stürzt das spiel nicht ab aber es passiert auch nix sonderliches, ich hab gemerkt das bei dem Server
die Text ausgabe "true" ausgegeben wird, damit wollt ich gucken ob überhaupt der Schleifen inhalt
ausgeführt wird, aber bei Client wird "true" nicht ausgegeben... Und ich verlier echt gerade alle meine nerven
ich sitzt vielleicht schon weiß weiß ich wie lange dran und finde echt nicht die lösung.

Hier der wichtigste Quellcode Teil: http://www.copypaste.at/1164
Die Variable "wennbewegengleichsenden" hab ich davor benutzt, aber das hat
entweder zum Absturz geführt oder garnicht funktioniert, hab ich jetzt einfach mal im Quellcode Teil gelassen
wird aber eig. garnicht benutzt im derzeitigen Quellcode.

Aja, übrigens hab ich natürlich davor einen Chat mit Threads gebaut um das ganze besser zu verstehen
und zu testen, das hatte wunderbar funktioniert.

Es wäre toll wenn mir jemand sagen kann was ich falsch mache.
Liegts daran das eine while schleife fehlt, liegts daran das ich Client und Server auf meinem System
öffne und die Zugriffs schwierigkeiten haben, liegts daran das die funktionen keinen Zugriff auf die Orginal
Werte der Klasse haben, soll ich Zeiger benutzen (?), oder an was liegts... ?

Vielen Dank schonmal!
Liebe Grüße Genro!

Werbeanzeige