Programm-Kommunikation

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Stephan87

Betreff: Programm-Kommunikation

BeitragSo, Okt 07, 2007 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo!

ich habe hier ein kartenspiel geschrieben, bestehend aus einem client und einer gui...am liebsten würde ich beides vereinen, also zu einem prozess machen. das gelingt mir aber leider nicht :-\...würde daher gerne den server vom klienten aus starten, über eine gui lassen sich einstellungen ändern. so weit bin ich bereits fertig. es funktioniert alles ausser halt dass man den server vom client aus starten kann.
bisher muss man den server separat starten und dann über stdio eingaben machen. ich habe daher versucht mit OpenURL das programm zu starten, geht soweit, nur konnte ich da keine argumente übergeben (wie spieleranzahl, port. usw.). zu freeprocess gibt es leider sehr wenige beispiele und noch weniger tutorials. das ganze muss plattformunabhängig laufen.
habt ihr da vll. eine idee wie ich vorgehen sollte?

vielen dank!

Schnittlauch

Unkraut

BeitragSo, Okt 07, 2007 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wenn du MaxGUI hast mach doch einfach 2 Fenster.
Eins mit den Einstellungen und in dem anderen ein Canvas
wo du reinezichnen kannst.

Dann um die Events abzufragen kein WaitEvent() nehmen sondern
PeekEvent() und dann sollte das gehen.


Ups dann hab ich was falsch verstanden Embarassed
Dachte du hast jetzt eine Anwendung zum darstellen des Spiels
und eine Andere für die Einstellungen und wolltest die per Netzwerk
verlinken.
Ich wars nicht.
  • Zuletzt bearbeitet von Schnittlauch am So, Okt 07, 2007 13:58, insgesamt einmal bearbeitet

Stephan87

BeitragSo, Okt 07, 2007 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wenn du MaxGUI hast mach doch einfach 2 Fenster.
Eins mit den Einstellungen und in dem anderen ein Canvas
wo du reinezichnen kannst.

jup nehme ich. genauso mache ich das ja auch Smile

Zitat:
Dann um die Events abzufragen kein WaitEvent() nehmen sondern
PeekEvent() und dann sollte das gehen.

wo ist da der unterschied? also praktisch gesehen?

ich kann euch mal einen teilauszug vom quelltext zeigen: das ist der server:
Code: [AUSKLAPPEN]

Strict

SeedRnd MilliSecs()

Local Karten%[4, 8]
Local KarteVergeben%[35]
Local Synonym$[4]
Local ok%
Local WhoStarts$
Local port%

Global AmountOfPlayers% = Int(AppArgs$[1])
port = Int(AppArgs$[2])
   
For Local Player% = 0 To AmountOfPlayers-1
   For Local z% = 0 To 7
      ok = False
      Repeat
         Local MaybeCard% = Rand(1 , 34)
         If KarteVergeben[MaybeCard] Then
            ok = False
         Else
            KarteVergeben[MaybeCard] = True
            Karten[Player, z] = MaybeCard
            ok = True
         End If
      Until ok = True
   Next
Next

Local listen:TGNetHost = CreateGNetHost()

If Not GNetListen(listen, port) Then End

Print "Der Server ist gestartet. Schaue beim Klienten für weitere Infos."

Repeat
   GNetSync(listen)
   GNetListen(listen, port)
Until CountList(GNetObjects(listen)) = AmountOfPlayers

Local peerlist:TList = GNetObjects(listen)
Local peernumber% = 0
For Local peer:TGNetObject = EachIn peerlist
   Synonym[peernumber] = GetGNetString(peer, 0)
   peernumber:+1
Next

peernumber% = 0
For Local peer:TGNetObject = EachIn peerlist
   Local sendobject:TGNetObject = CreateGNetMessage(listen)
   For Local position% = 0 To 7
      SetGNetInt(sendobject, position, Karten[peernumber, position])
   Next
   
   For Local position% = 0 To 3
      SetGNetString(sendobject, position+8, Synonym[position])
   Next
   SendGNetMessage(sendobject, peer)
   GNetSync(listen)
   peernumber:+1
Next

Repeat
   GNetSync(listen)
Forever


und das der client (nur der notwendige teil für mein prob):
Code: [AUSKLAPPEN]

Const MENU_GAME% = 0
Const MENU_ABOUT% = 1
Const MENU_CLIENT% = 2
Const MENU_SERVER% = 3
Const MENU_HIGHSCORE% = 4
Const MENU_SETTINGS% = 5
Const MENU_EXIT% = 6

Const STATE_IDLE% = 0
Const STATE_CONNECT% = 1
Const STATE_PLAY% = 2

[Variablen entfernt, nehmem zuviel Platz weg :D]

Global mainwindow:TGadget = CreateWindow("SchranzOnline " + VERSION, CenterX(650), CenterY(540), 650, 540, Null, WINDOW_TITLEBAR|WINDOW_STATUS|WINDOW_MENU)
Global MyCanvas:TGadget = CreateCanvas(0, 0, 640, 480, mainwindow)
Local GameMenu:TGadget = CreateMenu("Spiel", 0, WindowMenu(mainwindow))
Local AboutMenu:TGadget = CreateMenu("Über", MENU_ABOUT, WindowMenu(mainwindow))
CreateMenu "Client", MENU_CLIENT, GameMenu
Local servermenu:TGadget = CreateMenu("Server", MENU_SERVER, GameMenu)
CreateMenu "", 0, GameMenu
Local highscoremenu:TGadget = CreateMenu("Highscore", MENU_HIGHSCORE, GameMenu)
CreateMenu "", 0, GameMenu
CreateMenu "Einstellungen", MENU_SETTINGS, GameMenu
CreateMenu "", 0, GameMenu
CreateMenu "Beenden", MENU_EXIT, GameMenu

' Client Window Decoration:
Local clientwindow:TGadget = CreateWindow("Client starten", CenterX(200), CenterY(170), 200, 170, mainwindow, WINDOW_TITLEBAR|WINDOW_TOOL)
Local localhostbutton:TGadget = CreateButton("Localhost", 10, 10, 75, 20, clientwindow, BUTTON_RADIO)
Local serverbutton:TGadget = CreateButton("Server", 10, 30, 75, 20, clientwindow, BUTTON_RADIO)
Local iplabel:TGadget = CreateLabel("Server IP:", 10, 60, 60, 20, clientwindow)
Local iptextbox:TGadget = CreateTextField(70, 55, 100, 20, clientwindow)
Local connectbutton:TGadget = CreateButton("Verbinden!", 10, 100, 80, 30, clientwindow)
Local cancelclientbutton:TGadget = CreateButton("Abbrechen", 100, 100, 80, 30, clientwindow)
SetButtonState(serverbutton, True)

Local serverwindow:TGadget = CreateWindow("Server starten", CenterX(0), CenterY(0), 210, 135, mainwindow, WINDOW_TITLEBAR|WINDOW_TOOL)
Local panelplayeramount:TGadget = CreatePanel(10, 10, 85, 115, serverwindow, PANEL_GROUP, "Spieleranzahl")
Local playerb2:TGadget = CreateButton("2", 10, 10, 15, 15, panelplayeramount, BUTTON_RADIO)
Local playerb3:TGadget = CreateButton("3", 30, 30, 15, 15, panelplayeramount, BUTTON_RADIO)
Local playerb4:TGadget = CreateButton("4", 50, 50, 15, 15, panelplayeramount, BUTTON_RADIO)
Local okserver:TGadget = CreateButton("OK", 15, 70, 80, 50, serverwindow)
Local cancelserver:TGadget = CreateButton("Abbrechen", 15, 70, 80, 50, serverwindow)

HideGadget(clientwindow)
HideGadget(settingwindow)
HideGadget(serverwindow)

SetGadgetText(usernametext, username)
PeekEvent
Repeat
   WaitEvent()
   Select EventID()
      [event_windowclose entfernt]

      [event_menuaction entfernt, ihr wisst ja was hier reinkommt ^^]
   
      Case EVENT_GADGETPAINT
         UpdateRender()
      
      Case EVENT_TIMERTICK
         
         If GameState = STATE_CONNECT Then
            GNetSync(listen)         ' Sync Network

            ' Hier wird die Statusleiste aktualisiert:
            Local userstring$
            For Local o:TGNetObject = EachIn GNetObjects(listen)
               userstring = userstring + " " + GetGNetString(o,0)
            Next
            SetStatusText(mainwindow, "Warte auf andere Spieler! Spieler im Netzwerk: " + CountList(GNetObjects(listen)) + " (" + userstring + ")")
            
            ' Hier werden die Konfigurationen (Eigene Karten + Spielerposition) übernommen
            If CountList(GNetMessages(listen)) = 1 Then
               For Local message:TGNetObject = EachIn GNetMessages(listen)
                  For Local position% = 0 To 7
                     MyCards[position] = GetGNetInt(message, position)
                  Next
                  For Local position = 0 To 3
                     Synonym[position] = GetGNetString(message, position+8)
                  Next
               Next
               
               ' Fix SchranzMaster Cards:
               For Local f% = 0 To 7
                  If MyCards[f] = 34 Then MyCards[f] = 33
               Next

               AmountOfPlayers = CountList(GNetObjects(listen))
               For Local o:TGNetObject = EachIn GNetObjects(listen)
                  For Local h% = 0 To 7
                     If MyCards[h] = 13 Then
                        Local msg:TGNetObject = CreateGNetMessage(listen)
                        SetGNetInt(msg, 0, MSG_MESTARTFIRST)
                        SetGNetString(msg, 1, username)
                        SendGNetMessage(msg, o)
                        firstround = True
                     End If
                  Next
                                    
                  ListAddLast(Playing_Players, GetGNetString(o, 0))
               Next
               
               For Local h% = 0 To AmountOfPlayers-1
                  If Synonym[h] = username Then OnTurn = h
               Next

               GameState = STATE_PLAY
            End If
            

            
         ElseIf GameState = STATE_PLAY
            UpdateNetwork()
         
         End If


         
         RedrawGadget(MyCanvas)

      Case EVENT_MOUSEDOWN
         UpdateInput()
         
      Case EVENT_GADGETACTION
         Select EventSource()
            Case connectbutton
               Local server_ip$
               If ButtonState(localhostbutton) = True Then server_ip = "127.0.0.1" Else server_ip = TextFieldText(iptextbox)
               If Not GNetConnect(listen, server_ip, 8086) Then Notify("Verbindung fehlgeschlagen! Port 8086 geöffnet?") Else Notify("Verbindung erfolgreich! Du wurdest in die Warteschlange aufgenommen.~nBitte warte, bis alle Spieler sich mit dem Server~nverbunden haben!")
               
               For Local m% = 1 To 8
                  SetGNetInt(localobject, m, 0)
               Next

               SetGNetString(localobject, 0, username)
               
               HideGadget(clientwindow)
   
               For Local h% = 0 To 3
                  AmountOfCards[h] = 8
               Next
               
               GameState = STATE_CONNECT

            Case okserver
               If ButtonState(playerb2) = True Then AmountOfPlayers = 2
               If ButtonState(playerb3) = True Then AmountOfPlayers = 3
               If ButtonState(playerb4) = True Then AmountOfPlayers = 4
               
               OpenURL("server.debug.exe " + AmountOfPlayers + " 8086")
                              
         End Select

   End Select
Forever


ich habe oben _einiges_ entfernt, aber ich glaube es trifft den kern meines problems: im endeffekt will ich die beiden zusammenbringen (client+server), praktisch eine fusion von beiden...wie würdet ihr da vorgehen?



edit:
wäre das eine lösung: den server über einen host "server" laufen lassen, dort alle clients sammeln und diese "unterhalten" sich wiederum über einen anderen host "client" z.b. .... hatte das problem, dass sich der server auch als client gezählt hat...


edit2:
also habe mein problem vll. gefunden, aber noch keine lösung: ich habe nun client und server zusammengebracht, in einem prozess quasi. ich kann den server auch starten, es können auch andere zu mir verbinden, aber ICH kann nicht zu MIR, also zu meinem eigenen prozess verbinden. ich habe das syncen des servers in die hauptschleife (repeat...forever) gepackt, der client-verbindungsaufbau ist jedoch im waitevent().....heisst das, dass dies nicht möglich ist? also muss ich speziell für den localhost-client den code umprogrammieren, damit es klappt?

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group