Logikproblem .... joa^^
Übersicht

MynBetreff: Logikproblem .... joa^^ |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Guten Abend liebe Community,
ich habe heute an meinem Projekt "Antaris" weiter gearbeitet und mit dem Multiplayer-Modus (An dem ich früher gescheitert war) angefangen. Ich habe es soweit fertig das es (bis jz) einen CLient gibt mit dem man sich mit einem anderen Spieler verbinden kann. Nach dem Verbinden werden dann die X u. Y Koordinatnen übertragen & empfangen. Das ganze läuft über UDP. Soo, nun mein eigentliches Problem: Antaris (das Spiel/meinProjekt) ist ein 2D Spiel in dem man seinen Charakter durch eine 2D Welt steuern kann. Beim laufen/bewegen verschiebt sich NUR der Hintergrund (die Karte/Map) und die eigentliche Spiel/Charakter Figur, oder ehr gesagt das BILD bleibt immer in der Mitte des Bildschirrms. Wie kann ich daraus jz einen Multiplayer-Modus machen? Also wie mache ich dass das Bild von SPieler 2 sich mit der Map hin und her bewegt wenn man selber läuft? Man müsste ja irgentwie von den Koordinaten von Spieler 2 die man empfängt was abziehen/aufrechen..... MMhmmm ich weiß nicht ob mir jemand mit dieser Erklärung helfen kann? Hoffe mir kann jemand auf die Sprünge helfen ^^ mfg Myn |
||
Toasty |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich weiß nicht, ob das die beste Lösung wäre, aber der Client muss auf jeden Fall seine Koordinaten an den 2.Client senden, damit der 2.Client weiß, wo der 1.Client sich befindet. Das gleiche auch beim 2.Client.
Probier dich einfach mal an einem Beispiel Programm mit 2 PCs ![]() Die beiden Clients nehmen die aktuelle Maus Position, senden sie dem anderen Client und stellen die empfangenen Koordinaten mit einem Punkt dar. Gruß Toasty |
||
@AMD Phenom BE X4 2,5Ghz(Overclocked 2,61Ghz); 4GB DDR2; 512MB nVidia GeForce 8400gs; Win7 Home Premium 64bit
Lua for President! |
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man muss die eigenen Koordinaten von denen des anderen Spielers subtrahieren, um die Zeichenkoordinaten zu erhalten. | ||
Starfare: Worklog, Website (download) |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
https://www.blitzforum.de/foru...hp?t=27433
Hatte das selbe Problem früher auch *hust* mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Myn |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey, danke schonmal.
Werde mit dem gewonnenen Wissen mal ein bisschen rumprobieren ;D +ToeB-> Da haste aber lange zurück geschaut, von 2008 , aber nützlich ![]() mfg Myn PS. Werde wahrscheinlich erst morgen zu einem Ergebnis kommen.. wenn ich noch Hilfe brauche meld ich mich hier wd ... //EDIT: Habe mein Client jetzt in mein Spiel eigebaut und mal bei mir auf dem PC 2mal gestartet(unterschiedlicher Port)... Bei mir hat das Empfangen von Daten eine Verzögerung von ca.20sec. was ja viel zu viel ist für ein RPG^^ Kann ich das irgentwie schneller hinbekommen? Die Daten werden mehrmals in der sec. gesendet... |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aber einen Tipp gebe ich dir trotzdem : Bewege den Spieler so, als ob die Umgebung feststeht, also
Code: [AUSKLAPPEN] PlayerX = PlayerX + Player_DIR_X
PlayerY = PlayerY + Player_DIR_Y Und auch alle anderen Sachen einfach so bewegen als ob die "Scroll-Map" gar nicht da wäre. Nur beim zeichen muss die Scroll-Variable bei allen Bildern, die auf der Beweglichen map gezeichnet werden sollen, berücksichtigt werden, bspw. auch der Player : Code: [AUSKLAPPEN] DrawImage PlayerImage, PlayerX - ScrollX, PlayerY - ScrollY
Dann kannst du auch einfach die PlayerX/Y Koordinaten senden, ohne groß rum rechnen zu müssen. Der Vorteil hierbei ist auch, das man die "Kamera", also das Scrollen, so einstellen kann dass sie auch hinter der Spieler herhängt. So : Code: [AUSKLAPPEN] ScrollX = ((PlayerX-GraphicsWidth()/2) - ScrollX) * MOVESPEED
ScrollY = ((PlayerY-GraphicsHeight()/2) - ScrollY) * MOVESPEED Wenn du MOVESPEED auf 1 setzt, ist die Kamera immer genau mittig auf dem Spieler, wenn du sie bspw. auf 0.1 setzt, dann zieht die Kamera der Bewegung den Spielers nach. mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Myn |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also erstelle ich eine X&Y Variable für die MAP... z.B. mapx &mapy
Dann gibt es noch die Spieler Koordinaten playerx & playery ... Wenn ich dann z.B. nach oben laufe If KeyDown(200) playery=playery+1 ...? Ich versteh dass nicht genau wie das gehen soll mit der map die sich NICHT bewegt sondern das Spielerbild...^^ Kannst du das vll. nocht etwas genauer erklären? Und was meinst du mit "Player_DIR_X" ? Wäre nett wenn du das genauer sagen könntest ;D |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay dann erklär ich dir das anders ^^
Stell dir mal vor du hättest einen festen Untergrund (->Map) und würdest nur den Spieler darauf bewegen, heißt, dass die Map vom Punkt (0,0) ausgeht (linke obere Ecke des Fensters) und der Spieler jetzt einfach darauf gemalt wird auf seine Position. Also wenn PlayerX = 100 und PlayerY = 200 ist, dann wird der Spieler auch auf X = 100 und Y = 200 gemalt. Das hat aber noch gar nichts mit dem Bewegen der Map zu tun ? Dazu komm ich jetzt. Du brauchst nämlich NUR beim zeichnen die Grafiken verschieben (anhand der Position des Spielers bspw.). Du musst also zwischen zwei Dingen unterscheiden, einmal, an welcher Position sich die Objekte (in dem Fall der Spieler und die Map) wirklich befinden, und an welcher Stelle sie gezeichnet werden. Und falls du das noch nicht verstanden hast, dann stell dir mal vor, du machst ein Spiel, auf dem die Spielerfigur sich auf einer Map bewegt, die genauso groß ist wie der Bildschirm. Wenn du jetzt einen Spieler darauf bewegen willst, dann machst du das ja mit zwei Variablen, eine X und eine Y. und an diese Positionen malst du dann den Spieler, die Map ab der Position (0,0). Du baust auch eine Kollisionsprüfung für die den Player und der Map ein, sodass der Spieler die unbegehbaren Felder nicht überqueren kann. Jetzt entschließt du dich aber, die Map zu vergrößern, und zwar doppelt so groß wie die alte Map. Jetzt kann der Spieler plötzlich außerhalb des Fensters (Sichtbereich) laufen. Was also tun ? Am besten die gesamten Bilder, die gemalt werden, so in die andere Richtung verschieben, dass der Spieler in der Mitte des Bildschirmes sichtbar ist. Um aber nicht alles umschreiben zu müssen (Kollisionen, Bewegung etc.), wendest du jetzt einen Trick an : Du verschiebst einfach den "Malbereich". Also alle Bilder die auf der Map gezeichnet werden sollen (Spieler, Schüsse, ...) verschiebst du einfach solange in die andere Richtung bis der Spieler in der Mitte ist. Dafür brauchst du zwei neue Variablen, z.B. MapX und MapY. Darin speicherst du jetzt, um wie viel Pixel der Spieler weg von dem Punkt (0,0) ist, also Code: [AUSKLAPPEN] MapX = PlayerX
MapY = PlayerY Jetzt brauchst du nur noch beim Malen die Positionen der Bilder, wo sie eigentlich wären, um diese Werte in die andere Richtung verschieben, das geht mit Code: [AUSKLAPPEN] DrawImage Bild_auf_der_Map, Eigentlich_Bild_X - MapX, Eigentlich_Bild_Y - MapY
Was dir dann auffallen würde, ist, dass der Spieler immer oben links ist. Warum das so ist, kannst du ja mal versuchen raus zu finden, allerdings kann ich dir sagen wie du es lösen kannst, du ziehst einfach die Hälfte der Fenstergröße von der Spieler Position ab, also Code: [AUSKLAPPEN] MapX = PlayerX - GraphicsWidth() / 2
MapY = PlayerY - GraphicsHeight() / 2 Es wird hinterher genauso aussehen wie es jetzt bei dir aussieht, ist aber 1. schöner Programmiert, 2. hast du es einfacherer mit den Berechnungen wie Kollisionen und 3. kannst du jetzt einfach die PlayerX/Y Position an andere Spieler senden und sowohl diese als auch du müssen vorher nichts umrechnen. Ist doch super oder ? ![]() Ich hoffe ich hab es jetzt einigermaßen verständlich erklärt ^^ mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
tim3333 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ah das hat mir auch geholfen! danke | ||
Myn |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
MMhmm ^^
Eigentlich_Bild_X ist doch die Playerx Variable... oder?^^ |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Myn :
Ja auch. Eigentlich_Bild_X/Y sind die Positionen, an denen die Dinge, die durch die Bilder visualisiert werden, auf der Virtuellen Ebene dargestellt werden, zieht man davon die MapX / MapY Positionen ab, so ergeben sich die Positionen für die Bildschirm-Position. mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Myn |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] Man muss die eigenen Koordinaten von denen des anderen Spielers subtrahieren, um die Zeichenkoordinaten zu erhalten.
So habe ich das gemacht(erstmal zum testen ;D), nur jz ist das Bild von Spieler 2 schneller wie die Map-Verschiebung... ?^^ Woran liegt das ..? Pls nochmal Hilfe ![]() mfg Myn |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das liegt warscheinlich an der Reihenfolge wie du alles Malst / Berechnest. Die Reihenfolge sollte sein :
![]() ![]() ![]() Wenn du es aber schon so gemacht hast, dann poste doch bitte den Code oder teil des Codes, dann wollte ich mehr sagen können ![]() mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Myn |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Naja, ich mach das im Moment so..
playerX &playerY bekommen oben bei der difinierung die Koordinaten von der Mitte des Bildschirrms, wo das Spieler Bild auch ist... Bei laufen werden einfach auf playerX oder playerY +/- 1 (nach links rechts+oben unten) gerechnet... die MAP ebenfalls mapx /mapy +/-1 ... Dann versendet der die playerX&playerY Koordinaten an den anderen und empfängt selber von SPieler 2 die x&Y Werte. Dann machen ich das so wie es ZaP geschrieben hat: Code: [AUSKLAPPEN] Man muss die eigenen Koordinaten von denen des anderen Spielers subtrahieren, um die Zeichenkoordinaten zu erhalten.
ALso: Code: [AUSKLAPPEN] DrawImage player2,playerx2-playerx1 , playery2-playery1
Würd mich wundern wenn es so funktionieren würde..(geht bei mir nicht^^) mfg Myn |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein was ZaP meinte wäre deine Möglichkeit, wenn du den Spieler weiterhin nur in der Mitte zeichnest ![]() mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
Myn |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mhmm, wenn ich es so machen läuft die figur von spieler 2 doppelt so schnell in die gegengesetzte Richtung wie ich laufe..? Also sie bewegt sich auch wenn ich laufe...
Wie muss ich das genau machen? |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Am besten schickst du mir morgen mal den Code über Icq oder so, weil ohne code kann ich dir das wirklich sehr schlecht sagen..
Oder Poste einfach mal die Teile des Codes wo der Spieler bewegt und wo alles gemalt wird ![]() mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Myn: Du musst NUR und AUSSCHLIESSLICH die Koordinaten aller Spieler untereinader übertragen. Der Rest ist simpelste Mathe, denn Du musst nur die Positionen untereinander subtrahieren. Wenn ein Spieler dem anderen entgegenläuft wird diese Geschwindigkeitsverdopplung automatisch auftreten. Mal dir doch einfach mal mit Papier und Bleistift so eine Situation auf, vor Bewegung und danach, erfasse die Koordinaten und versuche selbst den mathematischen Zusammenhang zu ermitteln. Es ist nicht wirklich schwer. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Myn |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@BladeRunner -> Das weiß ich auch was du da schreibst... aber da läuft bisschen mehr Fail..
Mit dem schneller laufen meine ich das wenn man sich bewegt das Bild von Spieler 2 nicht an einer Stelle bleibt (er bewegt sich ja nicht im Moment) sondern in eine Richtung doppelt so schnell läuft.. Außerdem startet das Bild von Spieler 2 auf den koordinaten 0 ,0 und nicht an dennen die zuerst empfangen werden... @ToeB -> PN |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn es wirklich nur um die Synchronisation von Spielerbewegungen auf einer Map untereinander geht ist es wie ich sagte. Simple Mathe, die man mit ein wenig zeichnen und nachdenken hinkriegen sollte. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group