AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DXPlay

Ein Thema von ISAS · begonnen am 6. Dez 2004 · letzter Beitrag vom 12. Dez 2004
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#11

Re: DXPlay

  Alt 7. Dez 2004, 23:24
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;
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von ISAS
ISAS

Registriert seit: 24. Sep 2003
Ort: Vietnam
205 Beiträge
 
Delphi 4 Standard
 
#12

Re: DXPlay

  Alt 8. Dez 2004, 11:41
//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
Signatur wurde auf Wunsch geändert. Deswegen einfach hier drauf klicken-> www.geggi.at.gg
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#13

Re: DXPlay

  Alt 8. Dez 2004, 17:29
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.
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#14

Re: DXPlay

  Alt 8. Dez 2004, 17:35
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
TSend(Data^).X auslesen können
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von ISAS
ISAS

Registriert seit: 24. Sep 2003
Ort: Vietnam
205 Beiträge
 
Delphi 4 Standard
 
#15

Re: DXPlay

  Alt 8. Dez 2004, 20:04
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??
Signatur wurde auf Wunsch geändert. Deswegen einfach hier drauf klicken-> www.geggi.at.gg
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#16

Re: DXPlay

  Alt 9. Dez 2004, 14:24
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.
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von ISAS
ISAS

Registriert seit: 24. Sep 2003
Ort: Vietnam
205 Beiträge
 
Delphi 4 Standard
 
#17

Re: DXPlay

  Alt 10. Dez 2004, 20:10
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.
Signatur wurde auf Wunsch geändert. Deswegen einfach hier drauf klicken-> www.geggi.at.gg
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#18

Re: DXPlay

  Alt 11. Dez 2004, 17:57
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
From.ID und im 2.Fall so etwas wieTSend(Data^).ID
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von ISAS
ISAS

Registriert seit: 24. Sep 2003
Ort: Vietnam
205 Beiträge
 
Delphi 4 Standard
 
#19

Re: DXPlay

  Alt 12. Dez 2004, 13:57
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!!!
Angehängte Dateien
Dateityp: zip server_169.zip (7,6 KB, 12x aufgerufen)
Dateityp: zip client_112.zip (11,4 KB, 11x aufgerufen)
Signatur wurde auf Wunsch geändert. Deswegen einfach hier drauf klicken-> www.geggi.at.gg
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#20

Re: DXPlay

  Alt 12. Dez 2004, 15:24
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
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz