Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi DXPlay (https://www.delphipraxis.net/35412-dxplay.html)

ISAS 6. Dez 2004 19:12


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:

Nils_13 6. Dez 2004 19:15

Re: DXPlay
 
Hast du schon bei Google gesucht?

Wenn nicht kann ich dir nicht helfen :(

Maximus 6. Dez 2004 19:19

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

Flogo 6. Dez 2004 19:41

Re: DXPlay
 
Bei den Samples von DelphiX sind auch 2 Chats dabei. Das sollte dir auch ein wenig beim Einstieg helfen

ISAS 7. Dez 2004 12:54

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!!!

ISAS 7. Dez 2004 15:17

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.

ISAS 7. Dez 2004 17:48

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)

JamesTKirk 7. Dez 2004 18:23

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.

Flogo 7. Dez 2004 18:56

Re: DXPlay
 
Der Record TDXChatMessage ist der Typ, der zwischen Client und Server verschickt wird.

die Grundstruktur ist einfach nur:

Delphi-Quellcode:
type
  TDXChatMessage = record
    MessageType: DWORD;
  end;
Der MessageType gibt an, welche Nachricht grade verschickt wird / ankommt.
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;

Flogo 7. Dez 2004 22:20

Re: DXPlay
 
Als Antwort auf deine PN (dann könnens auch andere lesen):


Das Versenden wäre dann:

Delphi-Quellcode:
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;
Das ganze ist nur aus dem Beispiel rauskopiert und angepasst
... und damit ungetestet.

Flogo 7. Dez 2004 22:24

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;

ISAS 8. Dez 2004 10:41

Re: DXPlay
 
//Edit
//Edit2
//Edit3

Quellcode von Senden sieht nun so aus(Ob das der Grund des Fehlers ist, weiss ich nicht):

Delphi-Quellcode:
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;
Und das Empfangen sieht so aus:

Delphi-Quellcode:
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;
folgendes noch dazu:

Delphi-Quellcode:
type
  TSend = record
    x, y: String;
  end;
*Frage1: Is das das dann Send.X??
*Frage2: Gibt irgendeine komischen Zeichen aus

Flogo 8. Dez 2004 16:29

Re: DXPlay
 
Zitat:

Zitat von ISAS
MessageType: DWORD; { MessageType is absolutely necessary. }

Genau das (Der MessageType) fehlt in deinem Code noch.
Versuch doch mal mein Beispiel (Das, das ich zuletzt gepostet hab) und wenns nicht klappt, dann schreib mal den Fehler, der ausgegeben wird.

Flogo 8. Dez 2004 16:35

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:
TSend(Data^).X
auslesen können

ISAS 8. Dez 2004 19:04

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??

Flogo 9. Dez 2004 13:24

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.

ISAS 10. Dez 2004 19:10

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:
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
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.

Flogo 11. Dez 2004 16:57

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:
From.ID
und im 2.Fall so etwas wie
Delphi-Quellcode:
TSend(Data^).ID

ISAS 12. Dez 2004 12:57

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:
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;
Das gehört beim Client hin, nicht das, was ich geschrieben habe. Beim Empfangen gehört nur der innere Text hin!!!

Flogo 12. Dez 2004 14:24

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

ISAS 12. Dez 2004 17:45

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!!!

Flogo 12. Dez 2004 21:56

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