![]() |
Re: DXPlay
Noch was:
Ich denke wenn du keine dynamischen Arrays (oder Strings, ...) drinnen hast, kannst du auch auf das GetMem verzichten. Ich hoffe mich korrigiert jemand wenn ich mich irre.
Delphi-Quellcode:
procedure SendeKoordinaten(aX,aY: Integer);
var Msg: TDXPositionsMessage; // kein '^' mehr begin Msg.MessageType := DXPOS_MESSAGE; // vorher unter "const" einführen Msg.X := aX; Msg.Y := aY; // .... { The message is sent all. } DXPlay1.SendMessage(DPID_ALLPLAYERS, Msg, MsgSize); { The message is sent also to me. } DXPlay1.SendMessage(DXPlay1.LocalPlayer.ID, Msg, MsgSize); end; |
Re: DXPlay
//Edit
//Edit2 //Edit3 Quellcode von Senden sieht nun so aus(Ob das der Grund des Fehlers ist, weiss ich nicht):
Delphi-Quellcode:
Und das Empfangen sieht so aus:
procedure SendeKoordinaten;
var Send: ^TSend; MsgSize:Integer; begin New(Send); Send.X := (Form1.Edit1.Text); Send.Y := (Form1.Edit2.Text); MsgSize := SizeOf(TSend); Form1.DXPlay1.SendMessage(DPID_ALLPLAYERS, Send, MsgSize); Form1.DXPlay1.SendMessage(Form1.DXPlay1.LocalPlayer.ID, Send, MsgSize); end;
Delphi-Quellcode:
folgendes noch dazu:
procedure TForm1.DXPlay1Message(Sender: TObject; Player: TDXPlayPlayer;
Data: Pointer; DataSize: Integer); var s: string; begin SetLength(s, 2); StrLCopy(PChar(s), @TSend(Data^).X, Length(s)); //*Frage1 showmessage(s); //*Frage2 Memo1.Lines.Add(Format('%s> %s', [Player.Name, s])); end;
Delphi-Quellcode:
*Frage1: Is das das dann Send.X??
type
TSend = record x, y: String; end; *Frage2: Gibt irgendeine komischen Zeichen aus |
Re: DXPlay
Zitat:
Versuch doch mal mein Beispiel (Das, das ich zuletzt gepostet hab) und wenns nicht klappt, dann schreib mal den Fehler, der ausgegeben wird. |
Re: DXPlay
Das StrLCopy brauchst du nicht. Das braucht man nur um einen String zu verschicken. (Ein String hat keine feste Länge/Größe und wird deshalb als Array of Char übergeben. Dazu muss dann auch noch die Länge übergeben werden um den String wieder auszulesen)
In deinem Fall müsstest du die Position mit
Delphi-Quellcode:
auslesen können
TSend(Data^).X
|
Re: DXPlay
K, es geht nun alles. Naja, fast.
Kann man das nun irgendwie hinbekommen, dass es 1. Server gibt, der alle Daten auswertet und dann an die Clients weitergibt. Also: Man startet den Server. Is ein Programm, das eigentlich ganz leer sein kann (Also keine Buttons, DXDrawfläche etc.) Und als Client kann man sich NUR einloggen und bekommt dann die Daten zugeschickt(Also Spielerpositionen). Kann mir vielleicht jemand Ansetzte geben, wie ich das realisieren könnte?? |
Re: DXPlay
Im Prinzip ist das ja sogar einfacher, als das mit einem Programm zu regeln.
Zuerst erstellst du dir zwei Programme Server und Client Im Client läuft das eigentliche Spiel. Wenn sich bei einem Client irgendwas ändert (z.B. Die Position der Spielfigur) schickt er diese Änderung an den Server. Der wertet diese Meldung aus und schickt sie an alle Clients weiter, die das interessieren könnte. Diese müssen dann auf die Nachricht entsprechend reagieren (z.B. die Figur des Gegners verschieben). Wenn du schreibst in welchem von diesen Schritten du Schwierigkeiten hast, kann ich dir das auch ausführlicher schreiben. |
Re: DXPlay
Naja, das Problem bei mir ist folgendes:
Es soll ja ein Mehrspielermodus für mehrere (unbestimmte Zahl) werden.Das Auswerten und verschicken bekomme ich sicher hin, aber eines macht mir noch immer Probleme: Ein Spieler schickt Daten an den Server, der wertet diese aus und werden dann weitergeleitet. Wie kann ich das umsetzten, dass der weiss, welchen er es zuweissen kann. Ich habe mir folgendes gedacht:
Delphi-Quellcode:
Nun sendet ja jeder Client die Koordinaten des Spielers. Irgendwie weiss ich nicht, wie der das machen muss, dass er weiss, von wem er die Koordinaten bekommen hat und dann weiterschickt. Damit der zB. erkennt, welchem Mitspieler[x] er die Koordinaten geben muss. Ich weiss auch nicht, ob der Code eine sinnvolle Lösung darstellt.
TSpieler = class(TImageSprite)
public procedure DoMove(MoveCount: Integer); override; constructor Create(AParent: TSprite ); override; end; TMitspieler= class(TImageSprite) public constructor Create(AParent: TSprite ); override; end; var Spieler: TSpieler Mitspieler: array[0..10] of TMitspieler |
Re: DXPlay
Soweit ich weiß hat der Sender (From) eine Eigenschaft ID mit der du genau feststellen kannst, welcher Spieler die nachricht geschickt hat. Wenn das nicht klappt musst du eben selber so eine ID (beim einloggen vom Server aus) vergeben und mit der Nachricht mitschicken.
Im 1. Fall wäre das dann
Delphi-Quellcode:
und im 2.Fall so etwas wie
From.ID
Delphi-Quellcode:
TSend(Data^).ID
|
Re: DXPlay
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe das Problem, dass ich als Meldung immer "the message form is illegal" bekomme.
Wenn ich beim Client das Sender der Daten weglasse, dann tauch die Message nicht auf, aber das Problem dann zu beheben ist schwer, da ich nicht weiss, wo der Fehler dann wirklich passiert. Habe hier mal die beiden Datein angehängt. Vielleicht findet jemand den Fehler. Ich glaube, das einzig Wichtige sind nur 2 Sachen (Empfangen/Senden). Bei den anderen Sachen kann kein Fehler vorkommen //Edit:
Delphi-Quellcode:
Das gehört beim Client hin, nicht das, was ich geschrieben habe. Beim Empfangen gehört nur der innere Text hin!!!
procedure TForm1.DXPlay1Message(Sender: TObject; Player: TDXPlayPlayer;
Data: Pointer; DataSize: Integer); var i:integer; begin i:=TSend(Data^).Nr; Animation[i].X:=TSend(Data^).X; Animation[i].Y:=TSend(Data^).Y; end; |
Re: DXPlay
Das Problem ist vor allem, dass du deine Nachricht nur an dich selbst (LocalPlayer) und nicht an den Host schickst.
Wenn du die Nachricht nicht im Server auswerten willst, sondern nur an alle anderen Mitspieler weiterschicken willst (wie in deinem Programm) kannst du auch auf den Server verzichten und die Nachricht einfach an DPID_ALLPLAYERS schicken. Außerdem solltest du dir mal in der Delphi Hilfe den Abschnitt "Overview of pointers" durchlesen ("nil" -> F1) Da waren nämlich einige von den ^ an der falschen Stelle |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz