• Anmelden

1

Samstag, 1. März 2008, 00:11

Per Tastatur Text eingeben und in einen String speichern~

Hallo,

hab mich hier angemeldet, da ich hier schon viele Dinge gesehen habe, die mir persönlich sehr weiter geholfen haben, an der Stelle ein Lob an die helfenden Leute hier, ihr macht eure Arbeit wirklich gut. Und das gedenke ich jetzt aus zu nutzen X3

Ich würde eine Texteingabe erstellen, in der man, für den am meisten benutzten Fall, den Namen oder sonstwas eingibt. Kennen sicher einige aus dem Consolenskript von Monsta. So etwas in der Art bräuchte ich. Sprich, der Text, den ich eingebe, soll sichtbar und wenn ich bestätige, in einen String gespeichert werden.

Da ich mich erst in Ruby einarbeite, blicke ich noch nicht wirklich durch. Erste Versuche stellen zwar Buchstaben dar, aber jene aneinander zu reihen, sodass es einen Text ergibt, erweist sich als ziemlich schwierig, für mich momentan unlösbar.

Ich habe mir auch das Consolenskript angesehen und versucht zu verstehen, aber kein Erfolg. Das einzige, was ich ja bräuchte wäre das Skript ohne Historyanzeige der letzten Befehle und ohne Ausführung des eingegebenen Textes als RGSS-Kommando, sondern als Speichern in einen String. Und ohne das Standardfenster im Hintergrund, also das Blaue, dass erscheint, wenn man ein neues Window erstellt.

Nunja, ich hoffe, da kann mir jemand weiter helfen. Ich wäre wirklich dankbar =3


Greetings~

Edit: KD! Ich habe dich verraten xD

2

Samstag, 1. März 2008, 11:02

Hab hier mal was gemacht.

Füg dieses Skript über Main ein.
Spoiler: Skript

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
#==============================================================================
# **Scene_Inputprocessing
#------------------------------------------------------------------------------
#  
#==============================================================================
class Scene_InputProcessing
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
  def initialize(letters=10, id=1) # Hier Standartwerte für VariablenID und Buchstabenanzahl eingeben.
    @id = id
    @letters = letters
    main
  end
  def main
    @alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] #kleines Alphabet
    @big_alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] # großes Alphabet
    @index = 0
    @text = [""]
    #Create objects
    @sprite = Spriteset_Map.new
    @text_window = Window_InputText.new(224, 224, @letters)
 
    # Execute transition
    Graphics.transition
 
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
 
    # Prepare for transition
    Graphics.freeze
 
    # Dispose of objects
    @sprite.dispose
    @text_window.dispose
  end
 
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
  def update
    input_update
    #Update of objects
    @sprite.update
    @text_window.update
  end
#--------------------------------------------------------------------------
# * Input Update
#--------------------------------------------------------------------------
 
  def input_update
 
    if Input.trigger?("enter")
      @last_text = ""
      for i in 0...@text.size
        @last_text += @text[i]
      end
      $game_variables[@id] = @last_text
      $scene = Scene_Map.new
      return
    end
 
    if Input.trigger?("back")
      @index -= 1 if @index > 0
      @text[@index] = ""
      @text_window.text = ""
      for j in 0...@text.size
        @text_window.text += @text[j]
      end
      return
    end
 
    if Input.trigger?("space")
      @text[@index] = " "
      @text_window.text = ""
      for i in 0...@text.size
        @text_window.text += @text[i]
      end
      @index += 1
      return
    end
 
    for i in 0...@alphabet.size
      if Input.trigger?(@alphabet[i]) and @index < @letters
        @text[@index] = @alphabet[i] if Input.press?("shift") == false
        @text[@index] = @big_alphabet[i] if Input.press?("shift")
        @text_window.text = ""
        for j in 0...@text.size
          @text_window.text += @text[j]
        end
        @index += 1
        return
      elsif Input.trigger?(@alphabet[i]) and @index >= @letters
        $game_system.se_play($data_system.buzzer_se)        
      end
    end
  end
end
 
 
#==============================================================================
# **Window_Text
#------------------------------------------------------------------------------
#  
#==============================================================================
class Window_InputText < Window_Base
attr_accessor  :text
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
  def initialize(x, y, letters)
    @letters = letters
    @text = ""
    @widht = (@letters*6)+64
    #Create objects
    super(x, y, @widht, 64)
    self.contents = Bitmap.new(@widht - 32, height - 32)
    refresh
  end
 
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.contents.draw_text(0, 0, @widht - 32, 32, @text + "_") if @text.size < @letters
    self.contents.draw_text(0, 0, @widht - 32, 32, @text) if @text.size == @letters
    @old_text = @text
  end
  def update
    refresh if @old_text != @text
    super
  end
end
 
#-----------------------------------------------------------------
# Input Script
# Version : 1.0
# Autor : strify
#-----------------------------------------------------------------
# Ich habe selber mal nach einen Input script gesucht da 
# ich keine lust hatte mir selber eins zu erstellen.
# Dabei ist mir aufgefallen das die Input scripte im netzt
# nicht so wirklich viel bringen da man zwar die tasten 
# abfragen konnte, jedoch aba nix mit anfangen konnte 
# da es weder trigger? wie repeat? gegeben hat.
# Das sollten andere Scripter jetzt sich bitte nicht als
# angriff auf ihr können nehmen.
# Die verschiedenen Methoden gab es schon beim alten 
# Input script vom RGSS nur ich hab sie den neuen Input 
# script ein wenig angepasst.
#-----------------------------------------------------------------
# Funktionen ::
# Input.trigger?(key)
# key=Sring oder HexCode
# Falls die Taste gedrückt wird ... (Keine doppelte true ausgabe)
# Input.repeat?(key)
# key=Sring oder HexCode
# Falls die Taste gehalten wird ...
# der repeat befehl hat eine verzögerung von 5 frames (Einstellbar in Zeile::56)
# Input.press?(key)
# key=Sring oder HexCode
# Falls die Taste gehalten oder gedrückt wird ...
# der press befehl hat keine verzögerung (nicht zu empfehel für listen usw.)
# Input.dir4
# Fragt ab ob die Richtungs Tasten benutzt werden.
# Ausgabe::
# 2=Down/Unten
# 4=Left/Links
# 6=Right/Rechts
# 8=Up/Unten
# Der Befehl für das bewegen des Spielers in Game_Player
#-----------------------------------------------------------------
# Zum Einbau ::
# Eigentlcih ist es den meisten leuten klar die dieses Script 
# benutzten aber zur sicherheit kommt hier der einbau.
# Legt ein neues Leeres Script an. (Rechte Maustaste>Insert)
# Kopiert den gesamten Quelltext dan in die Leere Seite hinein 
# und wolla fertig ist es und kann benutzt werden.
#-----------------------------------------------------------------
# Sonstiges ::
# Da ich zu faul war alle Tasten mit den dazugehörigen 
# HexCode zu bestücken hab ich mir mal den Hash von 
# Miikku`s Input Script genommen.
#-----------------------------------------------------------------
# Ich hoffe das Script gefällt euch. ^^
# Credits bitte falls es verwendet wird.
#-----------------------------------------------------------------
 
module Input
#-------------------------------------------------------------------------- 
REPMAX=5
A="shift"
B="esc"
C="enter"
X="a"
Y="s"
Z="d"
L="q"
R="w"
UP="up"
DOWN="down"
RIGHT="right"
LEFT="left"
F1="F1"
F2="F2"
F3="F3"
F4="F4"
F5="F5"
F6="F6"
F7="F7"
F8="F8"
F9="F9"
F10="F10"
F11="F11"
F12="F12"
#-------------------------------------------------------------------------- 
@keys={
#--------------------------Maus
"l mouse" => 0x01, #Linke Maustaste
"r mouse" => 0x02, #Rechte Maustaste
"m mouse" => 0x04, #Mittlere Maustaste
#--------------------------Special
"back" => 0x08, #Backspace
"tab" => 0x09, #Tabulator-Taste
"enter" => 0x0D, #Enter
"shift" => 0x10, #Eine der Shift-Tasten
"strg" => 0x11, #Alt Gr-Taste oder eine der Strg-Tasten
"alt" => 0x12, #Eine alt oder die Num-Block-Taste5 mit num lock
"umschalt" => 0x14, #Umschalttaste
"esc" => 0x1B, #Escape
"space" => 0x20, #Leertaste
#--------------------------Extra-Block
"bild oben" => 0x21,
"bild unten" => 0x22,
"ende" => 0x23,
"pos1" => 0x24,
#--------------------------Pfeil
"left" => 0x25,
"links" => 0x25, #-
"up" => 0x26,
"hoch" => 0x26, #-
"oben" => 0x26, #-
"right" => 0x27,
"rechts" => 0x27, #-
"down" => 0x28,
"unten" => 0x28, #-
#--------------------------Extra-Block
"snapshot" => 0x2C,
"einfg" => 0x2D,
"entf" => 0x2E,
#--------------------------Zahlen
"0" => 0x30,
"1" => 0x31,
"2" => 0x32,
"3" => 0x33,
"4" => 0x34,
"5" => 0x35,
"6" => 0x36,
"7" => 0x37,
"8" => 0x38,
"9" => 0x39,
#--------------------------Alphabet
"a" => 0x41,
"b" => 0x42,
"c" => 0x43,
"d" => 0x44,
"e" => 0x45,
"f" => 0x46,
"g" => 0x47,
"h" => 0x48,
"i" => 0x49,
"j" => 0x4A,
"k" => 0x4B,
"l" => 0x4C,
"m" => 0x4D,
"n" => 0x4E,
"o" => 0x4F,
"p" => 0x50,
"q" => 0x51,
"r" => 0x52,
"s" => 0x53,
"t" => 0x54,
"u" => 0x55,
"v" => 0x56,
"w" => 0x57,
"x" => 0x58,
"y" => 0x59,
"z" => 0x5A,
#--------------------------Special
"l windows" => 0x5B, #linke "Windows-Taste"
"r windows" => 0x5C, #rechte "Windows-Taste"
#--------------------------Num-Block
"num 0" => 0x60,
"num 1" => 0x61,
"num 2" => 0x62,
"num 3" => 0x63,
"num 4" => 0x64,
"num 5" => 0x65,
"num 6" => 0x66,
"num 7" => 0x67,
"num 8" => 0x68,
"num 9" => 0x69,
"num *" => 0x6A,
"num +" => 0x6B,
"num -" => 0x6D,
"num ," => 0x6E,
"num /" => 0x6F,
#--------------------------F-Zeichen
"F1" => 0x70,
"F2" => 0x71,
"F3" => 0x72,
"F4" => 0x73,
"F5" => 0x74,
"F6" => 0x75,
"F7" => 0x76,
"F8" => 0x77,
"F9" => 0x78,
"F10" => 0x79,
"F11" => 0x7A,
"F12" => 0x7B,
#--------------------------Num-Block
"num lock" => 0x90,
#--------------------------Extra-Block
"scroll" => 0x91,
#--------------------------Special
"l shift" => 0xA0,
"r shift" => 0xA1,
"l strg" => 0xA2,
"r strg" => 0xA3,
"l alt" => 0xA4,
"alt gr" => 0xA5,
#--------------------------Sonderzeichen
"ü" => 0xBA,
"+" => 0xBB,
"," => 0xBC,
"-" => 0xBD,
"." => 0xBE,
"#" => 0xBF,
"ö" => 0xC0,
#--------------------------Special
"menü" => 0xD5,
#--------------------------Sonderzeichen
"ß" => 0xDB,
"^" => 0xDC,
"´" => 0xDD,
"ä" => 0xDE,
"<" => 0xE2
}
@used_key = []
@repeat_key=[]
@repeat_counter={}
#-------------------------------------------------------------------------- 
def self.dir4
return 2 if self.press? DOWN
return 4 if self.press? LEFT
return 6 if self.press? RIGHT
return 8 if self.press? UP
end
#-------------------------------------------------------------------------- 
def self.start
@keyboard = Win32API.new('user32', "GetAsyncKeyState", 'i', 'i')
end
#-------------------------------------------------------------------------- 
def self.trigger?(key)
if key.is_a?(String)
key=@keys[key]
end
return false if @used_key.include?(key)
if self.press?(key)#@keyboard.call(key) < 0
@used_key.push(key)
return true
else
return false
end
end
#-------------------------------------------------------------------------- 
def self.press?(key)
if key.is_a?(String)
key=@keys[key]
end
return (@keyboard.call(key) != 0 and @keyboard.call(key) != 1)
end
#--------------------------------------------------------------------------
def self.repeat?(key)
if key.is_a?(String)
key=@keys[key]
end
if !@repeat_counter.has_key?(key)
@repeat_counter[key]=0
end
if @repeat_key.include?(key)
@repeat_counter[key]+=1
if @repeat_counter[key] >= REPMAX
@repeat_counter[key]=0
return true
else
return false
end
else
@repeat_counter[key]=0
return false
end
end
#-------------------------------------------------------------------------- 
def self.update
@keys.each_value {|hex|
unless self.press?(hex)
@used_key.delete(hex)
@repeat_key.delete(hex)
else
@repeat_key.push(hex) unless @repeat_key.include?(hex)
end
}
end
end
Input.start
zum Lesen den Text mit der Maus markieren


Das Fenster kannst du mit

Ruby Quellcode

1
$scene = Scene_InputProcessing.new
aufrufen.
Im Kopf musst du dann noch die ein paar Sachen einstellen.

Ruby Quellcode

1
2
    @letters = Anzahl an Buchstaben
    @id = GamevariablenID in welcher der Text gespeichert werden soll.


Von Zeile 145 befindet sich das Inputskript von Strifty das kanns du rauslöschen solltest du es schon eingebaut haben.

Edit Löschproblem gelöst. Skript funktioniert einwandfrei sobald ich weiß.

3

Samstag, 1. März 2008, 12:06

Hallo,

danke erstmal für das Skript. Hätte nicht gedacht, dass sich so schnell jemand meldet. Das Teil funktioniert ganz wunderbar, genau so wie ich mir das vorgestellt habe =D

Da du ja mit Arrays arbeitest, hast du dir das mit dem letzten Zeichen löschen ja ziemlich erschwert. Bei Strings kann man ja einfach den Befehl chop! benutzen, um das letzte Zeichen zu löschen. Bei Arrays kann man nur Teile rauslöschen, wenn sie existieren. Ich hab überlegt, die Position des letzten Zeichens als Variable zu deklarieren und dann per delete_at(x) das letzte Zeichen zu löschen (wobei x = letztes Zeichen in einer Variable).
Nur ich krieg das nicht hin, da ich bei dir nicht weiß, wie oder wo du das letzte Zeichen betitelst, wenn überhaupt.

Wenn du mir sagst, welches das ist, mach ich's auch selbst ;D

Danke nochmal.

4

Samstag, 1. März 2008, 12:19

Ich verwende die Variable @index wi ich die Anzahl an Buchstaben angebe. Wenn du also @text[@index] = nil machst müsste es vll funktionieren. Aber ga es da nicht mal den befehl pop. Naja müsste nochmal nachschauen.

Edit Der Fehler war, dass wenn ich schreibe der index nach jedem Buchstaben um 1 erhöht wird. Also gebe ich den Befeh, das nächste mal einen Buchstaben dranzuhängen. Wenn ich jetzt @text[@index]="" verwende füge ich eine Leerstelle dran und spule danach den Text zurück, sodass erst beim nächsten mal der Text editiert wird. Wenn ich jetzt aber erst den Index zurückdrehe und danach den Buchstaben mit "" überschreibe löscht der den Buchstaben und nicht den noch nicht existierenden Buchstaben.

Hab das verbesserte Skript oben in den 1. Post editiert.

5

Samstag, 1. März 2008, 17:19

Dankeschön, funktioniert wunderbar! Eine Empfehlung meinerseits ist dir sicher! ;)

6

Sonntag, 2. März 2008, 17:25

Hallo,
für gehobenen Ansprüche -> http://www.rmxp.org/forums/index.php?topic=28392.0 ;)
aber wenn du mit dem Script zufrieden bist, behalte ist, da das andere etwas fummlig zu benutzen ist.

Gruß Sven
:information: YAams
:rainbow: Random Signatur
Bild





Weitere Informationen | Download
Mit Support für RGSS Project 1!
Bild

Social Bookmarks