Problem mit Types bei Erstellung von Charakteren

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: Problem mit Types bei Erstellung von Charakteren

BeitragSa, Jul 09, 2011 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich hab mir gedacht, dass ich mal sowas ähnliches wie einen 2D-Chat programmieren möchte.
Somit habe ich damit auch schon angefangen. Ich wollte das so machen, dass ich für jeden Client,
der neu dazu kommt einen Charakter erstellt wird und dessen Name per "Text" drüber steht und die auf einer Tilemap rumlaufen. Leider scheitere ich schon daran, für jeden Charakter der neu dazu kommt, einen Charakter zu erstellen. Ich weiß dass mir glaub ich irgendwann mal jemand gesagt hat, dass ich das mit Type machen muss. Jedoch wüsste ich jetzt nicht genau wie.. Mir schwirrt immer eins im Kopf rum.

Ich kann ja mit PLAYER.Charakter = New Charakter

.. einen neuen Charakter erstellen. Doch dann ist ja die Variable für den Player = PLAYER
Wie kann ich jetzt machen, dass die Variable den Namen des zuvor mit Input erstellten Namen hat.
Damit ich dann später machen kann:

PLAYER\PosX$ = ...
PLAYER\PosY$ = ...
PLAYER2\PosX$ = ...
PLAYER2\PosY$ = ...

Oder gibt es da irgendwie andere Möglichkeiten wie man das macht. Ich hab leider überhaupt keine Ahnung. Mein einziges Problem ist jetzt also, wie ich für jeden Client der dazu kommt ein Charakter mit eigener Variable erstellt wird. Damit ich die nachher einzelnt abbarbeiten kann.

Wie macht man sowas?? Bei den ganz großen Online Spielen wie WoW oder so...

Könnte mir jemand bitte einen kleinen Einblick geben.

PS: Das Type Tutorial von Robsite hab ich mir auch schon angeschaut.

LG Killerjo96
Mit freundlichen Grüßen: GearTechDE

Hubsi

BeitragSa, Jul 09, 2011 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Sowas in etwa?

BlitzBasic: [AUSKLAPPEN]
player.charakter=New charakter
player\name$=der_name_halt$
player\posx=... ; Warum hast Du hier Strings verwendet?
player\posy=...

; Schon wieder kommt einer dazu:
player.charakter=New charakter
player\name$=der_name_vom_neuen$
player\posx=...
player\posy=...


So macht ein Type-Konstrukt Sinn. Oder ich habe Dich völlig falsch verstanden Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jul 09, 2011 11:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, aber das problem ist doch, wenn ich dann die Koordinaten von denen bekommen, wird der eine player doch genau da hin gesetzt wo der andere auch ist, deswegen brauch ich ja verschiedene variablen... Ich bin auch nicch wirklich gut im beschreiben, was meine probleme angeht xD

ABer trotzdem danke.

PS: was mir noch eingefallen ist, kann ich es nich so machen, dass wenn ich den Namen anspreche auch die Position X und Y von dem Namen anspreche? also in etwa so:

Mein ganz normaler Player

Code: [AUSKLAPPEN]

Type Charakter

    Field Name$
    Field PosX$
    Field PosY$

End Type


Code: [AUSKLAPPEN]

Player.Charakter = New Charakter


Dann krieg ich z.B. die Koordinaten mit nem String.

Code: [AUSKLAPPEN]


PlayerData$ = NetMsgData$() ;der ist aufgeteil: Player.Charakter\Name$ + " " + X + " " + Y
Player.Charakter\PosX$ = X ;Vom Paket
Player.Charakter\PosY$ = Y ;Vom Paket



Sodass ich dann noch mache,

Code: [AUSKLAPPEN]

DrawImage Player,Player.Charakter\PosX,Player.Charakter\PosY


Ich glaube ich stell mir das i-wie zu kompliziert vor... Mein Problem ist nur die Variablen Deklaration...

Ich weiß nicht wie ich jeden Spieler auf seine Position X und Y ansrechen kann..
Mit freundlichen Grüßen: GearTechDE

BladeRunner

Moderator

BeitragSa, Jul 09, 2011 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Player.Charakter = New Charakter

Das Player in deinem Beispiel ist nur der Verweis auf eine einzelne Instanz des Types Charakter. BB speichert intern alle erstellten Instanzen ab und Du kannst sie per before,after,each etc. durchgehen.
D.h. deine Spielerdaten sind nicht mehr an eine feste Variable gebunden, sondern Du hast wahlfreien Zugriff auf alle erstellten Objekte eines Typs.
Beispiel:
Player.Charakter = New Charakter
player.name = "horst"
samePlayer = first Character
print sameplayer\name
Vorausgesetzt dies ist der komplette Code werden nun Player als auch SamePlayer auf dieselbe Instanz zeigen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Midimaster

BeitragSa, Jul 09, 2011 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst ganz einfach mehreren Playern verschiedene Variblennamen geben

BlitzBasic: [AUSKLAPPEN]
Player1.Charakter = New Charakter
Player1\Name = "Gerd"

Player2.Charakter = New Charakter
Player2\Name = "Uschi"

...


Nun kannst du später die Player auseinandernhalten, da ja die X-Koordinaten von Player 1 so sind:

BlitzBasic: [AUSKLAPPEN]
Player1\X


und die von Player2

BlitzBasic: [AUSKLAPPEN]
Player2\X


Willst Du sie anhand des Namens erkennen und auseinanderhalten, gehtst du so vor (angenommen NetName$ wäre der Name, der über die NetzNachricht empfangen wurde):

BlitzBasic: [AUSKLAPPEN]

If Player1\Name = NetName$ Then
.... tu irgendwas
EndIf
If Player2\Name = NetName$ Then
.... tu irgendwas
EndIf


So könntest Du z.b. aus deinerr Netzmessage den Namen heraustrennen und dann anhand des Namens den entsprechenden Player in deiner PlayerListe suchen.

Aber es würde auch das gehen:
BlitzBasic: [AUSKLAPPEN]
For locPlayer.Charakter = EachIn Charakter 
If locPlayer\Name = NetName$ Then
locPlayer\X=....
.... tu irgendwas
EndIf
Next


Hierbei übernimmt locPlayer die Funktion eines Platzhalters für alle derzeit existierenden Charakter.




Wenn Du eine größere Anzahl Spieler verwalten willst, und dabei Zugriff auf jeden einzelnen zu jeder Zeit behalten willst, dann ginge das auch mit Arrays:

BlitzBasic: [AUSKLAPPEN]
Dim Player.Charakter[10]
Player[0] = New Charakter
....
Player[1] = New Charakter



Wie du siehst, hast du mehrere Möglichkeiten die Player zu verwalten:

A.
mit individuellen Variablen: Player1

B.
mit Array Variablen: Player[0]

C.
mit FOR/EACH und PlatzhalterVariablen: locPlayer

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jul 09, 2011 12:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber ich kann doch kaum für was weiß ich wie viele Player (Bsp 2000) eine Variable erstellen. Wenn die am Anfang ihren Namen per PlayerName$ = Input("Dein Name: ") eintragen, wird mit CreateNetPlayer(PlayerName$) der Player erstellt.
Dann wird mit:

Player.Charakter = New Charakter

ein neuer Spieler erstellt.

Dann sollen direkt x und y koordinaten an den server versendet werden und der sendet die dann an alle weiter. Aber dafür müssen die anderen Clients ja auch den Player erstellen, der erstellt wurde, sodass man ihn dann als Tile Charakter sieht und sich entsprechend bewegt.
Es wäre doch unmöglich, immer eine Variable für jemanden zu erstellen der mit anderen zusammen spieln möchte..

Ich glaub ich versteh das i-wie falsch...

LG KIllerjo96
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSa, Jul 09, 2011 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Types brauchst du weder individuellen Variablen noch ein Array. Solange du nicht Delete aufrufst, bleiben die Einträge erhalten und mit for..Each kannst du jeden Eintrag der Reihe nach verarbeiten.
Was du senden musst, ist sowas wie ein Steuerzeichen, das den Clients mitteilt: Hier joint ein neuer Player, das sind die nötigen Informationen und die Clients machen das richtige damit.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jul 09, 2011 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Njaa, schon kla.. aber wie... ich glaub ihr versteht nich so ganz was ich meine...
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSa, Jul 09, 2011 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann versuch's nochmal zu erklären Wink
Schritt für Schritt und wo dann das Problem auftritt.

Neuer Client teilt dem Server mit, er möchte beitreten.
Server akzeptiert und schickt jedem Clienten die nötigen Infos.
Wo kommt da ein Problem mit Variablen auf?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragSa, Jul 09, 2011 13:52
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du weißt, dass 2000 Player gleichzeitig an dem Spiel teilnehmen werden, dann brauchst Du auch 2000 Player-Variablen, um sie alle zweifelsfrei auseinanderhalten zu können.

Dies geht dann natürlich nicht mehr über Player1 , Player2...

Vielleicht noch über Player[0] , Player[1] , ...

Eine Liste, wo du sie alle über einen Platzhalter locPlayer ansprichts, hat da ihre Vorteile, aber auch Nachteile.

Suchst Du einen, von dem Du via NetMessage nur den Namen weißt, dann bleibt dir nichts anderes übrig, als alle 2000 zu durchsuchen:

BlitzBasic: [AUSKLAPPEN]
Global DieserSpieler.Character
For locPlayer.Charakter = EachIn Charakter
If locPlayer\Name = SuchName$ Then
DieserSpieler = locPlayer
EndIf
Next
Print DieserSpieler\Name + " steht auf xPos " + DieserSpieler\X


Danach kannst du ihn unter DieserSpieler benutzen.


Bist Du sicher, dass alle 2000 gleichzeitig online sein werden?

Wieso denkst Du, dass es unmöglich wäre, immer eine Variable für einen neuen Mitspileler zu erstellen?

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jul 09, 2011 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ach ddas ist einfach Schwerpunkt zu beschreiben. also nochmal ganz ausführlich...

ich habe einen Server erstellt, der bei sich per print eine Nachricht ausgibt, wenn ein neuer Client gejoined hat. jetzt habe ich mir so auch schon einen Chat geschrieben der ganz gut funktioniert. jetzt wollte ich eine tilemap machen, wo am Rand Bäume sind, die eine Kollision vorbeugen. so hat man also eine Fläche von 20x20 Tiles. jetzt habe ich im Internet ein Charakter tileset gefunden. das hab ich dann eingebaut. rein theoretisch ist dann der Charakter schon erstellt. zwischendurch wird in der Main loop immer noch nach Aktualisierungen gesucht. also wenn dann ein Server die Nachricht bekommt, das ein neuer Spieler da ist, soll er das an alle clients weitersenden. die clients die dann diese Nachricht bekommen, sollen für den neuen Spieler einen neuen Spieler von dem tileset erstellen. deswegen die Types. aber wie kann ich jetzt die Koordinaten austauschen, damit die zum richtigen Spieler kommen und nicht irgendwie zum falschen...ndurch wird in der Main loop immer noch nach Aktualisierungen gesucht. also wenn dann ein Server die Nachricht bekommt, das ein neuer Spieler da ist, soll er das an alle clients weitersenden. die clients die dann diese Nachricht bekommen, sollen für den neuen Spieler einen neuen Spieler von dem tileset erstellen. deswegen die Types. aber wie kann ich jetzt die Koordinaten austauschen, damit die zum richtigen Spieler kommen und nicht irgendwie zum falschen...
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSa, Jul 09, 2011 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst einen Spieler über den Namen, eine ID, oder IP oder was auch immer eindeutig identifizieren können. Das muss mit den Koordinaten mit verschickt werden, damit der richtige Player angesprochen wird.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jul 09, 2011 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich benutze direct Play....
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSa, Jul 09, 2011 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Davon verstehe ich zugegebener maßen nichts, aber ich wäre mir ziemlich sicher, das du dich trotzdem selbst um den Versand von Nachrichten kümmern musst...
NetMsgData & NetMsgFrom sehen doch viel versprechend aus.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jul 09, 2011 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
ok ich probiers einfach nochmal und denk was drüber nach. wenn einer weiss ich vor zu gehen habe, der melde sich bitte.

danke

lg Killerjo96
Mit freundlichen Grüßen: GearTechDE

BladeRunner

Moderator

BeitragSa, Jul 09, 2011 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde dir empfehlen auf direct play zu verzichten - die Schnittstelle war schon bei Einführung ein Flop und ist heute quasi tot, und das nicht ohne Grund.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

GearTechDE

ehemals 'KillerJo96'

BeitragSo, Jul 10, 2011 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
joa schon, aber ees ist ja noch nicht verboten ^^ ausserdem für solche kleine Dinge ist es find ich noch gut geeignet also für mich. UDP ist bei mir halt so ne Sache, ich habe irgendwie nicht den Anreiz es zu lernen. aber setze mich langsam mal ran. danke für die Hilfe.

Lg Killerjo96
Mit freundlichen Grüßen: GearTechDE

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group