Problem mit Direct Play - unknown hat die Sitzung verlassen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Nooby

Betreff: Problem mit Direct Play - unknown hat die Sitzung verlassen

BeitragDo, Jul 19, 2007 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Moinmoin,
ich habe zu Übungszwecken angefangen ein Chatprogramm über per Direct Play zu programmieren. Es klappt auch ganz gut, bis auf ein ärgerliches, wichtiges Detail: Wenn ein Spieler die Session verlässt, wird nicht angezeigt, welcher es ist. Es steht lediglich da, dass "unknown" die Sitzung verlassen hat. Confused Ist das normal und man kann es umgehen, oder ist das ein Fehler von BP, der vielleicht schon durch ein Update behoben wurde, oder sollte man generell die Finger von Direct Play lassen und andere Methoden benutzen?

Ich habe hier den Code für mein Programm:
Code: [AUSKLAPPEN]
Global hauptfenster = CreateWindow("Chatmaster",50,50,700,600,0,33)
DisableGadget hauptfenster
Global  senden_button = CreateButton("Senden",3,567,70,30,hauptfenster)
Global  ende_button = CreateButton("Ende",78,567,70,30,hauptfenster)
Global  chat_label = CreateLabel("",3,25,500,500,hauptfenster,3)
Global  senden_textfield = CreateTextField(50,530,400,20,hauptfenster)
Global  eingabefenster = CreateWindow("Name",50,50,175,65,hauptfenster,33)
Global   eingabe_textfield = CreateTextField(5,5,165,20,eingabefenster)
ActivateGadget eingabe_textfield
Global   ok_button = CreateButton("OK",5,30,80,30,eingabefenster,65536)
Global   abbrechen_button = CreateButton("Ende",90,30,80,30,eingabefenster)

timer = CreateTimer(10)

PauseTimer timer

Global name$
Global chat$
Global texteingabe
Global identity
Global spielercheck

Type spieler
 Field nummer
 Field name
End Type


Repeat

 Delay 10

 event=WaitEvent()

 Select event
  Case $101
   Goto escape
  Case $803
   StopNetGame
   End
  Case $401
   Select EventSource()
    Case senden_button
     If TextFieldText(senden_textfield) <> ""
      senden
      SetGadgetText(senden_textfield,"")
      SetGadgetText(chat_label,chat$)
     EndIf
    Case ende_button
     StopNetGame
     End
    Case abbrechen_button
     .escape
     If GadgetText(abbrechen_button)="Ende"
      End
     Else
     
     EndIf
    Case ok_button
     If TextFieldText(eingabe_textfield) <> "" Then Goto ok
    Case eingabe_textfield
     If EventData() = 13 And TextFieldText(eingabe_textfield) <> ""
      .ok
      name = TextFieldText(eingabe_textfield)
      HideGadget eingabefenster
      EnableGadget hauptfenster
      ActivateWindow hauptfenster
      ActivateGadget senden_textfield
      check = StartNetGame()
      If Not check Then End
      identity = CreateNetPlayer (name$)
      ResumeTimer timer
     EndIf
    Case senden_textfield
     If EventData() = 13 And TextFieldText(senden_textfield) <> ""
      senden
      SetGadgetText(senden_textfield,"")
      SetGadgetText(chat_label,chat$)
     EndIf
   End Select
  Case $4001
   If RecvNetMsg()
    abfrage
    SetGadgetText(chat_label,chat$)
   Else
    spielercheck=1
   EndIf
  Case $804
   ActivateGadget senden_textfield
 End Select

Forever

;************************************************************************
Function abfrage()

 typ=NetMsgType()
 absendernr=NetMsgFrom()
 absender$=NetPlayerName(absendernr)
 neuenachricht$=NetMsgData()
 If typ > 99
  Select typ
   Case 100
    If spielercheck Then neuenachricht$ = absender$ + " ist der Sitzung beigetreten."
    neu.spieler = New spieler
    neu\nummer=absendernr
    neu\name=absender$
   Case 101
    neuenachricht$ = absender$ + " hat die Sitzung verlassen."
   Case 102
    neuenachricht$ = "Damit sind sie nun der Host."
;   Case 200
;    Cls
;    Text 0,0,"Ein Fehler ist aufgetreten und die Sitzung musste beendet werden."
;    Flip
;    WaitKey
;    Goto Ende
  End Select
 Else
  neuenachricht$ = "<" + absender$ + "> " + neuenachricht$
 EndIf
 If chat$ = ""
  chat$ = neuenachricht$
 Else
  chat$ = chat$ + Chr(13) + neuenachricht$
 EndIf

End Function

;************************************************************************
Function senden()

 SendNetMsg(1,TextFieldText(senden_textfield),identity)
 neuenachricht$ = "<" + name$ + "> " + TextFieldText(senden_textfield)
 If chat$ = ""
  chat$ = neuenachricht$
 Else
  chat$ = chat$ + Chr(13) + neuenachricht$
 EndIf

End Function


Es ist vielleicht ein bisschen unübersichtlich, aber es geht auch nur um die Funktion "Abfrage" und es soll ja auch nur zum testen sein. Ich habe trotzdem den ganzen code geschickt, damit es ausführbar ist.

BITTE HELFT MIR!
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

Silver_Knee

BeitragFr, Jul 20, 2007 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
hihi die sache ist die: wenn die message gesendet wird hat der spieler bereits das Spiel verlassen... danach fragst du den namen ab und natürlich ist der dann unbekannt(= unknown) was du machen musst ist alle spielertypes durchsuchen, da du sowieso den type des Spielers löschen musst, und dort den namen des spielers auslesen:
Code: [AUSKLAPPEN]
For s.spieler = Each Spieler
 if s\nummer=absendernr Exit;bei dem exit bleibt s erhalten
Next
neuenachricht$ = s\name + " hat die Sitzung verlassen.";den namen vom sspielertype nehmen da der andere "<unknown> ist"
Delete s;Spielertype löschen da er sonst nur speicher blockiert....

Nooby

BeitragFr, Jul 20, 2007 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok klingt logisch...
Die adresse wird zwar gesendet, aber der Name existiert dann nicht mehr.
Also muss ich den Namen für die Adresse selber speichern.
So richtig? Very Happy
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

Nooby

BeitragFr, Jul 20, 2007 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm der hat den Beitrag irgendwie 2 mal gesendet...
also bearbeite ich diesen hier einfach mal. So.
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/
 

Dreamora

BeitragFr, Jul 20, 2007 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie meinst du genau?

Du musst eigentlich wie oben erwähnt deine Spieler irgendwie verwalten die Online sind, am besten mit Types.

Dort steht dann die Verbindungsnummer, Namen und vermutlich einige andere Dinge drin (zb position und so), damit diese Daten mit anderen mitspielern geteilt werden können vom server / host
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Nooby

BeitragFr, Jul 20, 2007 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja damit hatte ich ja schon angefangen, aber ich wusste nicht, dass der Name beim verlassen verloren geht.
Also ich denke das ist jetz geklärt.
Danke! Very Happy
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group