![]() |
DXPlay
So, jetzt hab ich schon einige Stunden gesucht und nichts, rein gar nichts über DXPlay gefunden :evil: . Ich will ein Netzwerkspiel programmieren. Die Komponenten von Delphi Server und Client sind zwar recht schön und gut, aber nicht besonders ausgereift. Deswegen denke ich mir, wenn ich schon ein Spiel mit DelphiX programmiere und das netzwertauglich sein sollte, DXPlay genau die richtige Komponente sein muss. :-D
Gibt es irgendwo Tutorials für DXPlay? Ganz einfache: zB ein Programm, wo man mit Spielern hin und hergeht. Es gibt einen Server und Clients. Nun kann man sich beim Server einloggen und dann herumgehen. Ein total simples Netzwerkspiel. Wenn ich das hätte, dann wär der Rest total leicht. :wink: Wenn es nichts im Internet gibt, dann kann mir vielleicht einer hier weiterhelfen, ist sicher nicht nur für mich nützlich. Thnx, Robs!!! :mrgreen: |
Re: DXPlay
Hast du schon bei Google gesucht?
Wenn nicht kann ich dir nicht helfen :( |
Re: DXPlay
Hallo,
Früher auf der Seite von Delphi-Treff gabs mal ein Tutorial bezüglich DX, da wurde auch der DXPlay Komponenten erklärt, und wie man ihn einsetzt. Aber seit Delphi-Treff und Delphi-Source zusammen sind gibts das Tutorial nicht mehr. Eventuell hat es noch irgendjemand, musst eben mal herumfragen. Ansonsten Google ... MFG Maximus |
Re: DXPlay
Bei den Samples von DelphiX sind auch 2 Chats dabei. Das sollte dir auch ein wenig beim Einstieg helfen
|
Re: DXPlay
Naja, gegooglet habe ich ja auch schon. Werd mal die von delphi source anfragen und die 2 Chatprogramnme anschaun.
Frage, wo sind die beiden Programme drinnen?? //Edit Habe sie schon gefunden!!! |
Re: DXPlay
Naja, einfach sind die Chatprogramme nicht zu verstehen. Werd glaub ich noch die ganze Nacht an dem stitzen. Das Schwierige ist, die Sach für ein Spiel zu machen. Habe leider jetzt nur einen Computer und hoffe, dass mein Vater früh von der Arbeit kommt, damit ich das mit seinem Laptop zusätzlich noch ausprobieren kann. Dann kommt natürlich noch dazu, dass er nicht einfach nur msges hin und her schicken soll. Bei einem Spiel wird ja immer nur ein String geschickt, aber der soll geordnet sein. Wie zB Spielerpositionen. Das wird dann sehr kompliziert, wenn das irgendwie verschachtelt ist und kostet sicher auch viel Rechenzeit.
|
Re: DXPlay
So, aeigentlich versteh ich nun alles, ausser:
type TDXChatMessage = record MessageType: DWORD; { MessageType is absolutely necessary. } Len: Integer; C: array[0..0] of Char; end; Für was man Len und C braucht is mir nicht klar. Len is die Länge, aber wieso muss ich das kürzen oder was?? Der Code is bei dem DelphX Netzwerk Beispiel gleich ganz oben (Chat1) |
Re: DXPlay
Des Len und C hat was mit dem SrtLCopy(oder so) zu tun. Laut einem Freund von mir hat das was mit Byteverschiebung zu tun. Ich werd mal schauen, ob ich was näheres dazu rausfinde und melde mich wieder.
Wenn du nur einen PC hast kannst du übrigens folgenden Trick benutzen: Starte einmal das Programm (zum Beispiel von Delphi aus) und gib die ganzen Informationen die DXPlay will ein. Danach startest du die Anwendung zum zweiten Mal (z.B aus dem Explorer) und gibst unter dem Punkt 'Join' die IP 127.0.0.1 ein und du hast ein Netzwerk auf einem PC. (Zum Programieren ist das praktisch, vor allem, wenn man kein Netzwerk hat!) Die IP wurde übrigens mal auf Delphi-Praxis erwähnt. |
Re: DXPlay
Der Record TDXChatMessage ist der Typ, der zwischen Client und Server verschickt wird.
die Grundstruktur ist einfach nur:
Delphi-Quellcode:
Der MessageType gibt an, welche Nachricht grade verschickt wird / ankommt.
type
TDXChatMessage = record MessageType: DWORD; end; In diesem Fall wird MessageType immer auf ChatNachricht gesetzt. Alles andere ist der Inhalt. Im Beispiel: Len: Anzahl der Zeichen in der Nachricht C: Die Nachricht selber. wenn du jetzt zB die Position deiner Spielfigur verschicken willst, sollte das ganze so aussehen:
Delphi-Quellcode:
type
TDXPositionsMessage = record MessageType: DWORD; // <--- Im Programm hier eine Konstante für "Position" reinschreiben x, y: Integer; end; |
Re: DXPlay
Als Antwort auf deine PN (dann könnens auch andere lesen):
Das Versenden wäre dann:
Delphi-Quellcode:
Das ganze ist nur aus dem Beispiel rauskopiert und angepasst
procedure SendeKoordinaten(aX,aY: Integer);
var Msg: ^TDXPositionsMessage; MsgSize: Integer; begin MsgSize := SizeOf(TDXPositionsMessage); GetMem(Msg, MsgSize); try 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); finally FreeMem(Msg); end; end; ... und damit ungetestet. |
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 |
Re: DXPlay
Doch, ich will ja meine Daten beim Server auswerten lassen. Das Problem ist, dass es ja nur folgende Möglichkeiten gibt, Datein zu senden:
Entweder an alle Spieler oder an dich selbst. Ich will aber dem Server diese Daten schicken und der soll die dann an alle anderen weiterschicken!!! |
Re: DXPlay
hmm ok dann musst du wohl die ID des Hosts im Client speichern.
Die Möglichkeit, die mir dazu einfällt ist beim starten des Clients die Eigenschaft Players mit einer for-Schleife und der Funktion isHost zu durchsuchen und die richtige ID zu Speichern. Du solltest dir aber mal überlegen, ob du die Auswertung nicht auch im Client machen kannst. Was genau willst du denn auswerten? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 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