Archiv verlassen und diese Seite im Standarddesign anzeigen : Fragen zu Sockets und zu Input.press?
Krepusko
11.08.2012, 18:00
Hiho,
ich wollte gerne den Beitrag Serverklasse für den RPG Maker XP (http://www.multimediaxis.de/threads/131315-Serverklasse-f%C3%BCr-den-RPG-Maker-XP) benutzen, verstehe aber diesen Teil nicht: Socket.new(Socket:: AF_INET, Socket::SOCK_STREAM, Socket::IPPROTO_TCP)
Soweit ich weiß, würden also Domain, type und protocoll an die neue Klasse übergeben, aber eine Domain muss doch nach bestimmten Regeln aufgebaut sein, welche ich hier nicht sehe. Warum muss man Socket:: eingeben, wofür ist type gut und wofür steht AF_INET?
Mein zweites Problem ist, dass ich eine Eingabe für die Zeile $aic = Socket.sockaddr_in(PORT, HOST) schreiben wollte, wo der Benutzer die IP des Hostes einträgt, welche in etwa so aussehen sollte:
HOST=""
while HOST.length< 3
if Input.press?(1)
HOST +="1"
Kernel.pbMessage(_INTL(HOST))
elsif Input.press?(2)
HOST +="2"
Kernel.pbMessage(_INTL(HOST))
...
end
end
HOST +="."
...
Solange man im ersten Teil der Addresse ist, wird also immer wieder auf eine Eingabe gewartet, die Variable mit der Eingabe ergänzt und ausgegeben. Was so leider zum Absturz des Spiels führt. Meine Frage ist, was ich bei Input.press? falsch verstanden habe und wie ich abfragen kann, ob die Taste "." gedrückt wurde.
Im Ruby gibst du mit der Angabe "Socket::SOCK_STREAM" an, dass die Konstante SOCK_STREAM in dem Modul Socket definiert ist und der Wert aus diesem genommen werden soll.
Die Konstante SOCK_STREAM verweist hierbei auf einen Integer welcher als Eingabe von der WinAPI für Sockets benötigt wird.
Die Angabe AF_INET ist ebenfalls eine solche Konstante und sagt aus, dass das Socket das Internetprotokoll benutzen soll. Nicht etwa, zum Beispiel, zur lokalen Datenübertragung verwendet wird.
Was das Input-Modul betrifft so denke ich liegt dein Problem wahrscheinlich darin, dass du lediglich den Standard-Input des RPG-Makers verwendest und dieser nicht auf beliebige Zeichen von der Tastatur horchen kann.
Das standard Input-Modul des Makers ist so weit begrenzt, dass nur sehr wenige, fest vordefinierte Tasten abgefragt werden können. Falls du beliebige Tasten als Eingabe ermöglichen willst so musst du ein entsprechendes Script aus dem Internet suchen welches das Inpud-Modul erweitert. Davon gibt es bereits dutzende, es sollte nicht schwierig sein eines mit Hilfe von Google zu finden.
Allerdings würde ich dir generell davon abraten zu versuchen mit dem RPG-Maker ein Online-Spiel zu entwickeln. Ruby ist sehr ineffizient und der RPG-Maker selbst macht das sogar noch schlimmer. Falls du wirklich etwas größeres anfangen möchtest empfiehlt sich eine professionellere Programmiersprache wie C, C++ oder Java zu verwenden.
Krepusko
12.08.2012, 13:01
Vielen Dank für die schnelle Antwort :)
Jetzt seh ich auch, warum meine Eingaben nicht geklappt haben.
Das der Input des RPG-Makers begrenzt ist, habe ich schon befürchtet, weil die Tabelle auf Scientia stark begrenzt war. Ich bin da auch leider mit dem Wert und der Konstanten durcheinander gekommen und ich hätte trigger statt press benutzen müssen. Als Script habe ich mir nun Cybersams (http://www.rmxpunlimited.net/forums/topic/2079-rgsskey-input-script-by-cybersam/) geholt.
So wie ich das sehe müsste es ja reichen, wenn man im Input Modul die nötigen Tasten ergänzt, da ich aber dieses Modul nicht finde, gehe ich mal davon aus, dass man aus dem Script-Editor des RPG-Maker XP nicht drauf zugreifen kann, oder?
Was großes wollte ich nicht machen. Ich wollte nur, dass sich 2 Spieler ohne grafischen Schnickschnack verbinden und dann ein rundenbasierter Kampf startet.
Sonst hätte ich die IP auch mit einem Event über Input Number abfragen können. ;)
Das Input-Modul ist versteckt in der RGSS, du kannst es mit dem Script-Editor nicht öffnen, nein, aber das ist auch nicht nötig. Du kannst funktionen einfach hinzufügen, alle Änderungen welche du im Script-Editor schreibst werden übernommen.
Krepusko
13.08.2012, 02:55
Also ich kriege leider einen ganzen Haufen Fehler. Zum einem gibt es wohl Probleme mit meiner Variable inputs wegen der Meldung "cannot convert fixum into string". Der Gedanke war eine Schleife zu basteln, welche die Tasten 0 bis 9 abfragt und wenn keine dieser Tasten gedrückt wurde, sollten Entf, Enter und . überprüft werden. Ich dachte, es wäre eine bessere Methode als jede Taste einzeln abzufragen, funktioniert aber leider nicht. Wie könnte ich diesen Fehler beheben? Und gibt es eine Möglichkeit die eingegebenen Zeichen auszugeben, während man die IP eingibt? Denn mache ich das über print oder ähnliches (hier Kernel.pbMessage), dann muss man nach jeder Eingabe die Meldung bestätigen, bevor man weiter machen kann.
Kernel.pbMessage(_INTL("Enter IP:"))
target_ip=""
loop do
Keyboard.update
count=0
for i in 0..9 do
inputs="Keys::N_"+i
if Keyboard.trigger(inputs)
target_ip += i.to_s
break
else
count += 1
end
end
if count = 10
if Keyboard.trigger(Keys::PERIOD)
target_ip += "."
elsif Keyboard.trigger(Keys::DELETE)
target_ip =""
elsif Keyboard.trigger(Keys::RETURN) and target_ip.length>=7
Kernel.pbMessage(_INTL("Is "+target_ip+" correct? (Y/N)"))
if Keyboard.trigger(Keys::Y) and target_ip.length>=7
break
elsif Keyboard.trigger(Keys::N) and target_ip.length>=7
target_ip =""
end
end
end
end
Das andere Problem liegt wieder beim Socket. Soweit ich verstanden habe, muss der Port als Integer eingegeben werden, aber dann erhalte ich einen Syntaxfehler.
$s = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, Socket::IPPROTO_TCP)
$ais = Socket.sockaddr_in('7654', nil)
$s.bind($ais)
$s.listen(1)
Kernel.pbMessage(_INTL("Server initialisiert"))
Mein letztes Problem ist, dass ich nach der Eingabe der IP in $aic = Socket.sockaddr_in(7654, target_ip) mit target_ip='127.0.0.1' die Fehlermeldung connection refused erhalte. Wohlgemerkt kann ich den Port im client socket ohne Unterschied als integer oder string angeben. Ersetze ich aber bei $s.listen(1) die 1 durch eine 2 verschwindet diese Fehlermeldung, aber das Spiel stürzt trotzdem ab.
Ich kann nur raten, da ich das Script nicht gesehen habe, aber ich nehme an, dass diese Zeile hier:
[quote]inputs="Keys::N_"+i[quote]
der Grund des Fehlers ist.
Immerhin versuchst du hier einen String und einen Integer zu addieren und das kann (und sollte auch) normalerweise nicht funktionieren.
Was Sockets und dergleichen angeht so solltest du vielleicht nicht hier sondern in einem Forum zur WinAPI nachfragen. Wir beantworten hier eigentlich nur Rubybezogene Probleme mit dem RPG-Maker.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.