chat

Anfängerfragen zum Programmieren mit PureBasic.
Gast

chat

Beitrag von Gast »

ich bin dabei ein chat programm zu schreiben für z.b. lan´s, und habe es so gemacht das sich jeder eine schriftfarbe aussuchen kann, und meine frage ist jetzt, wie kann ich es machen das die entsprechende farbe bei den anderen teilnehmern auch angezeigt wird ?
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Hast du bereits funktionen integriert wie kicken, bannen, raum eröffnen oder irgendetwas in dieser Art? Sprich irgendeinen Befehl der nur vom Server verarbeitet wird, nicht aber den anderen usern angezeigt wird?
Wenn ja, ists denkbar einfach:
Der user der seine Farbe geändert hat schickt den Farbwert an den server, dieser versendet ihn weiter an alle andere Clients, welche wiederum ihrerseits intern dem user in der Liste diesen Farbwert hinzufügen in einem speziellen Flag.
Dazu solltest du vllt. für jeden user eine Structure haben, bzw. ne allgemeine user structure wo eben solche dinge vermerkt sein können.

Schreibt dann der user mit dem gänderten Farbwert etwas, wird vom client nur noch überprüft ob er eine andere Farbe verwendet, wenn ja, wird diese einfach angewendet.

Warum ich gefragt habe ob du auch andere Befehle verarbeitest (also kicken etc)?
Weil ich dann davon ausgehe dass du zumindest so eine Art Protokoll verwendest, was dafür am praktikabelsten ist. :)

Ich hoffe ich konnte weiterhelfen :)



Mfg
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Gast

Beitrag von Gast »

ich habe keinen server sondern nur clienten und benutze für den chat UDP, ist zwar nicht so sicher aber für lan´s reicht es.

aber ich weiß nicht ich die farben versende oder die werte wieder auslese, und anwende, weil mit dem befehl setgadgetcolor() wird ja der ganze text gefärbt.
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Hmmm... ich glaube bei RTF kannste einzelne Textabschnitte einfärben... Wird glaube ich auch beim dingelings chat benutzt, also zur einbindung notfalls dort mal hilfe holen ;)

Was UDP betrifft - auch kein Problem ohne server, so verschickt der Client die Farbwerte halt direkt an alle anderen Clients. Verschickt wird das ganze wie ein normaler string, nur meinetwegen mit nem "vorzeichen".
Irgendein sonderzeichen oder sonstwas welches dem Client signalisiert: "Halt, das ist kein Text, das iss ne andere info"
Meinetwegen sendet der dann sowas wie "|%|0,255,0".
Die anderen Clients parsen grundsätzlich jeden string den sie geschickt bekommen, erkennen sie dann "|%|" am Anfang eines selbigen, wissen sie dass - in diesem falle - ein Farbwert geschickt wird. Mit Hilfe des passenden RTF befehls wird dann bei dem User von dem der Wert kam der Text entsprechend eingefärbt.
Ich hoffe das ist soweit verständlich?

Die Farbwerte bekommste ja direkt vom ColorRequester. Speicher sie in ne Variable, verschicke diese wie eben beschrieben an die anderen user, diese setzen das entsprechende Flag, und mithilfe von RTF werden die nachrichten dieses users in zukunft immer gefärbt.
So vom Prinzip her ;)

Jetz n bissel klarer? :)


Mfg
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Gast

Beitrag von Gast »

ja schon danke, aber noch eine dumme frage was ist ein rtf befehl ?
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

rtf befehl iss n bissel flapsig ausgedrükt ;)
RTF steht für Richt Text Format. Hier gibt es auch irgendwo ne Lib für PB damit du das als Gadget verwenden kannst anstelle von Editor oder Stringgadget. Vorteil: Mehr funktionen, wie zum beispiel eben einzelne Textteile einfärben.

Insofern: keine dumme Frage, nur dumm erklärt, denn es gibt keine dummen Fragen ;)


Mfg
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Gast

Beitrag von Gast »

OK, das hab ich kapiert :) danke noch mal, mal sehen ob ich es schaffe ;)
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Viel Glück dabei :)
Sollte nur n Denkanstoß sein und ist auch nur ne idee wie ich es umsetzen würde. Sollte es Probleme geben einfach nochmal nachfragen bzw ggf. Sirhc.ITI kontaktieren, der färbt ja auch textteile ein und verwendet dafür auch rtf.
Auch in sachen "Protokoll" selber schreiben kann er dir sicher tipps geben.


Have fun!
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Gast

Beitrag von Gast »

ok ich hab doch noch ne frage :oops: :oops:

RichEditTextColor(farbe)

ich hab jetzt den befehl, aber wo bau ich den ein ?

ich zeig mal den code

Code: Alles auswählen

OpenWindow(0,0,0,500,390, "XIXIX Chat V 1.1 "+"©"+" 2007 by Maikel Rehl",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
AddKeyboardShortcut(0, #PB_Shortcut_Return, 3)
InitNetwork()
CreateGadgetList(WindowID(0))
EditorGadget(1,5,5,390,300, #PB_Editor_ReadOnly)
StringGadget(2,5,310,390,60,"")
ButtonGadget(3,400,310,95,25,"Senden")
ButtonGadget(6,400,340,95,25,"Farbe")
TextGadget(5,5,370,490,15,"Hallo ")

port=6054

Name.s = InputRequester("XIXIX Chat","Bitte geben sie Ihren Namen an:","")
farbe = ColorRequester()
SetGadgetColor(2,#PB_Gadget_FrontColor,farbe)

e = 0
f = 0

If CreateNetworkServer(#PB_Any, port, #PB_Network_UDP)
  SetGadgetText(5,"Server erfolgreich erstellt")
  SendUDPBroadcast(port,Name + ": ist der Sitzung beigetreten !!!")
EndIf
Repeat
Text.s = GetGadgetText(2)
  EventID = WaitWindowEvent()
 
  sevent = NetworkServerEvent()
  clientid = EventClient()
  
  If sevent = 2
    Text = Space(5000)
    ReceiveNetworkData(clientid, @Text, 5000) 
    ReceiveNetworkData(clientid, @Name, 5000)
    AddGadgetItem(1,e-1,Text)
  EndIf
  
  If EventID = #PB_Event_Menu
    Select EventMenu()
      Case 3
        If SendUDPBroadcast(port,Name + ": " + Text) = 0
          SetGadgetText(2,"")
          SetGadgetText(5,"Nachricht wurde erfolgreich gesendet")
        Else
          SetGadgetText(5,"Nachricht wurde nicht erfolgreich gesendet")
        EndIf

    EndSelect
  EndIf 

  If EventID = #PB_Event_Gadget
    Select EventGadget()
        Case 3
          Text.s = Name + ": " + GetGadgetText(2)
          If SendUDPBroadcast(port,Name + ": " +Text) = 0
            SetGadgetText(2,"")
            SetGadgetText(5,"Nachricht wurde erfolgreich gesendet")
          Else
            SetGadgetText(5,"Nachricht wurde nicht erfolgreich gesendet")
          EndIf
        Case 6
          farbe = ColorRequester()
          SetGadgetColor(2,#PB_Gadget_FrontColor,farbe)
      EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow
  SendUDPBroadcast(port,Name + ": hat die Sitzung verlassen !!!")
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Uff... gute Frage wenn ich ehrlich bin - habe schon ewig nimmer damit gearbeitet :oops:

Code: Alles auswählen

 Case 6 
          farbe = ColorRequester() 
          SetGadgetColor(2,#PB_Gadget_FrontColor,farbe)
Würde aber spontan vermuten dass es anstelle des SetGadgetColor hinkommt. Allerdings bin ich mir echt nicht sicher ob du dafür das Editor Gadget verwenden kannst - ich glaube fast nicht...
Also wären die Arbeiten zum umschreiben etwas umfangreicher...
Hmmm, habe noch nicht mit UDP gearbeitet... wenn du da etwas braodcastest, geht das automatisch an alle Clients? *interessehalber*
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Antworten