Daten zerpflücken

Anfängerfragen zum Programmieren mit PureBasic.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Daten zerpflücken

Beitrag von cofter »

Hi nochmal und sorry für den blöden Titel. :oops:

Könnt ihr mir noch einen Tip geben wie ich die Daten am besten verarbeite?
Der Client schickt einen String "10165912z98px128py106 ".

10165912 = ClientID
Z98 = PlayerHöhe
px128 = PlayerX
py106 = PlayerY

Jetzt gibt es ja mehrere Methoden diesen auseinander zu nehmen.
FindString() oder StringField()

FindString() gibt mir die Position des gesuchten zurück,
StringField() zerlegt mir den String anhand eines Trennzeichens. zbsp. ","

Welche Methode würdet ihr empfehlen?
Ich habe jetzt mit StringField() schon herumprobiert aber weiss jetzt nicht wie ich die einzelnden Teile nun in einzelne Variablen packen kann. Damit die Koordinaten weitergeschickt werden können und somit jeder die Position des anderen sehen kann.

Ich hoffe ich nerve euch nicht und ihr könnt mir weiterhelfen.
:oops:

Edit:
Oder habe ich da einen komplett falschen Gedankengang gerade?

mfg
Cofter
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Also ich empfehle in jedem Fall StringField().

Da braucht der Sender nur den Daten, die er eh zusammenfügen muss, ein Komma zwischenhängen.
Wenn du stes die Daten nach demselben Schma sendest, kannst du ganz leicht die Daten wie folgt abfragen. Ich weise darauf hin, dass für die StringField()-Methode, kein px und py sondern nur Kommas in dem String vorkommen sollten!

"10165912z98px128py106" digitiert zu "1016591,98,128,106"

Code: Alles auswählen

empfangen$="1016591,98,128,106" ; wir haben den String 'empfangen'  ;-)


ClientID.l=Val(StringField(empfangen$, 1, ","))
z.l=Val(StringField(empfangen$, 2, ","))
px.l=Val(StringField(empfangen$, 3, ","))
py.l=Val(StringField(empfangen$, 4, ","))
So einfach ist das. Ich nehme immer Komma, weils einfach ein Muss ist, fnde ich, stattdessen könnte man auch ein Semikolon ";" nehmen. Es ist natürlich auch jedes andere Zeichen möglich, aber ich bevorzuge Komma bzw. Semikolon.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

benutz doch einfach ein einheitliches trennzeichen, oder verschicke gleich 4 longs
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Also die Variablen würd ich erst gar nicht als Text verschicken, da das umwandeln in diesen und das auslesen danach unglaublich viel Zeit beansprucht (soll ja scheinbar ein Spiel werden)
Warum sendest du nicht einfach die daten mit Senddata(), in einem selbst gebasteltem protokoll? (also 4byte ClientID (die du sowieso nicht senden musst)+2byte playerhöhe, ect.)
ungefär so:

Code: Alles auswählen

SendNetworkData(ClientID,@PlayerX,SizeOf(PlayerX))
SendNetworkData(ClientID,@PlayerY,SizeOf(PlayerY))
...
(Sizeof dann durch größe der Variable ersetzten, z.b. 2 für word.)
Und am anderen Ende dann eben

Code: Alles auswählen

*buffer=AllocateMemory(2);Speicher reservieren
ReceiveNetworkData(ClientID(),*buffer,2);Daten empfangen in den speicher hinein)
PlayerX=PeekW(*buffer);variable aus speicher kopieren (zur einfachen handhabung)
FreeMemory(*buffer);Speicher für andere Programme wieder freigeben
Wenn du mit Strukturen abbeitest kannst du natürlich auch gleich das ganze Element senden, aber ich glaube das das für den Anfang noch etwas zu viel wäre.
edit:man, bin ich langsam /:->
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Danke für die Beispiele.

Zu den Strukturen hätte ich noch eine Frage.
In der Hilfe steht das es nur statische Arrays unterstützt.
Wenn ich jetzt aber eine Struktur wo alle Spieler sind wie soll das dann gehen?
Da die Anzahl ja ständig variert.
Ich hoffe das ich mit den Struktures nicht soo große Probleme haben werde da diese mich doch stark an PHP5 Klassen (OOP) erinnern.
In der Hilfe habe ich gelesen das damit auch einfache Vererbung funktioniert.
Hört sich interessant an aber das mit den statischen Arrays finde ich nicht so toll. Oder könnte ich die Anzahl der Spieler die Online sind aus einer Datenbank lesen und aus dem Wert ein Array dimensionieren?
Sorry wenn ich soviel frage aber das Thema ist einfach super interessant für mich.
Und da ich schon seit einiger Zeit ein Konzept für ein Spiel habe interessiert es mich nochmehr. :)
Leider habe ich mir zuwenig Gedanken über die Kommunikation von Client <-> Server gemacht. Wo ich aber auch eine Ausrede habe. :mrgreen:
Ich bin bloss ein kleiner IAD und Screendesigner. :roll:

mfg
Cofter
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Statische Arrays? Das Zauberwort heist hier wohl linked Lists.
Ein kleines Pseudo-Beispiel:

Code: Alles auswählen

Structure PlayerStruct ;Erstellen der Struktur
  ClientID.l
  PlayerHoehe.b 
  PlayerX.w 
  PlayerY.w
EndStructure
NewList Player.PlayerStruct() ;Erstellen einer Linked List

AddElement(Players()) ;Hinzufügen eines Elements
Player()\PlayerX=123 ;belegen von ein Paar Variablen des elements player
Player()\PlayerY=456
AddElement(Player()) ;Noch ein Spieler
Player()\PlayerX=159
...

;Nun wird´s etwas schwieriger:
;Übermitteln des Elements:
SendNetworkData(ClientID,@Players(),SizeOf(PlayerStruct)); sendet das aktuelle Element

;und empfangen:
*buffer=AllocateMemory(SizeOf(PlayerStruct))
ReceiveNetworkData(ClientID,*buffer,SizeOf(PlayerStruct))
AddElement(Player());Hier fügen wir einen neuen Spieler hinzu
CopyMemory(*buffer,@Player(),SizeOf(PlayerStruct))
;man kann auch die Elemente von Player einzeln zuweisen
PlayerX=*buffer\PlayerX
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Ahhh, ok ich glaube ich habs verstanden.
Vielen Dank an euch. :)

Werde dann nochmal neu anfangen.
Glücklicherweise nicht ganz soviel Code. ^^

Dieses könnte ich dann auch mit einer MySQL-Db verbinden und mir dort diverse Attribute und Werte holen und somit die Elemente füllen oder?
Weil wenn ich die Daten jeweils Lokal speichere müsste ich diese gut verschlüsseln damit dann keiner Unfug treibt.
Aber das ist noch sehr weit vorgegriffen. :)

Ich warne euch schonmal vor... es werden sicher noch mehr Fragen kommen. :mrgreen:

Finde das Forum die Leute und die Hilfe die man hier bekomt super! :allright:

mfg
Cofter
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> In der Hilfe steht das es nur statische Arrays unterstützt.

innerhalb der Struct

die struct selber kann element beliebiger Arrays bzw. LinkedLists sein
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten