Programm-Kommunikation
Übersicht

![]() |
Stephan87Betreff: Programm-Kommunikation |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
||
![]() |
SchnittlauchUnkraut |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group