Delphi-PRAXiS
Seite 2 von 3     12 3      

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

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:02 Uhr.
Seite 2 von 3     12 3      

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