I'm trying to make a small window for "description" that when it becomes selected/active, the string that is
"description" can be deleted and accept keyboard input such as A-Z, spacebar, and backspace commands. In other words, a textbox. When hitting 'escape' or some other designated key, whatever is in the box becomes the new standard.
I tried some messy stuff I found on the web but it just spits out the length of my string:
def STDOUT.write(prompt)
if prompt == "\n"
super
else
super "> #{prompt}"
end
rescue Errno::EBADF
def self.write(prompt)
end
end
def refresh
self.contents.clear
self.contents.font.color = text_color(6)
checkz = $stdout.write( "This is a test\n" )
self.contents.draw_text(0, 0, 100, 32, checkz.to_s)
end
in this case, it spat out 17 and then vanished a few seconds later.
Well, you definitely need a full keyboard input script. I recommend getting Blizzard's Custom Controls from his Tons of Addons script at Chaos Project and playing around with it.
Quote from: modern algebra on January 09, 2011, 07:00:09 PM
Well, you definitely need a full keyboard input script. I recommend getting Blizzard's Custom Controls from his Tons of Addons script at Chaos Project and playing around with it.
I've got SDK and Aleworks input module
edit: I got Aleworks input keys working, here's a demo of the letter "A" and the Backspace key, but the key listener is too sensitive and repeats too quickly. Any ideas on slowing it down? Otherwise if I was to type something like "this spell heals one target creature" it would read like
"tttthhhhhhiiss sppppeeeell hhhhhhheeeaaaaaaalllsssss ooooonnnee ttargggeett ccreeeaattture"
class Window_0 < Window_Base
def initialize
super(0, 0, 640,100)
self.contents = Bitmap.new(width-32, height-32)
#self.contents.font.name = "Arial"
#self.contents.font.size = 24
refresh
end
$description ="[DESCRIPTION]"
def refresh
self.contents.clear
self.contents.font.color = text_color(8)
if Input.press?(65)
a = "A"
$description = $description + a.to_s
end
#backspace
if Input.press?(8)
$description = $description.chop
end
self.contents.draw_text(0, 0, 500, 32, $description.to_s)
end
def update
if Graphics.frame_count / Graphics.frame_rate != @total_sec
refresh
end
end
end
I figured out I could put 'sleep 0.1' to 'sleep 0.3' right after and it prevents the repeat from being too stupid, but I'm not sure how well that's going to pan out.
Use trigger? or repeat? instead of press?
Quote from: modern algebra on January 10, 2011, 02:24:54 AM
Use trigger? or repeat? instead of press?
repeat? looks like it works best. trigger? is nice and would probably work for something besides letters like transition between screens. Btw, any idea how to temporarily disable the regular "C" input command?
Most direct way would be through aliasing the Input methods and returning false whenever Input::C is sent through, but that's not necessarily the smartest way. The best way would be to do it in the scene where you want to relieve it of its function, but I don't know what scene that is so I can't help you.
Quote from: modern algebra on January 10, 2011, 03:29:14 AM
Most direct way would be through aliasing the Input methods and returning false whenever Input::C is sent through, but that's not necessarily the smartest way. The best way would be to do it in the scene where you want to relieve it of its function, but I don't know what scene that is so I can't help you.
This is the scene:
$scene = Skill_Editor.newI've got A-Z, comma, space, backspace, and period installed, but I can't seem to get the Shift+other key combo working.
aleworks claims
#-- Example 3 --
# Input.trigger?([[Keys::SHIFT, Keys::ESCAPE]])
# It'll return true if the keys SHIFT and ESCAPE are being pressed.
but what actually happens is both keys work independently to produce the effect whether or not the mate is being pushed.
That's not really what I meant - I meant if you don't want Input::C to do anything special, then you should just disable it within the scene. It only does something if the scene you're in tells it to do something.
In any case, I don't know anything about this script you are using so I can't really tell you what's going on - I can say that trigger? is not a good one to use if you are checking two keys as it will mean they both have to be touched at the exact same time.
The way I would handle that is have the Input.repeat? for the regular keys and, then when it comes to choosing which key is included, do a check for Input.press? (Keys::SHIFT), rather than trying to do a combination thingy.
Quote from: modern algebra on January 10, 2011, 05:20:22 AM
That's not really what I meant - I meant if you don't want Input::C to do anything special, then you should just disable it within the scene. It only does something if the scene you're in tells it to do something.
In any case, I don't know anything about this script you are using so I can't really tell you what's going on - I can say that trigger? is not a good one to use if you are checking two keys as it will mean they both have to be touched at the exact same time.
The way I would handle that is have the Input.repeat? for the regular keys and, then when it comes to choosing which key is included, do a check for Input.press? (Keys::SHIFT), rather than trying to do a combination thingy.
could you give an example of "a" and "A"? Here's my base snippet:
if Input.repeat?(65)
a = "a"
$description = $description + a.to_s
end
if Input.press?(16) #16 is shift key
a = "A"
$description = $description + a.to_s
end
Doing it through individual keys like that is super nasty - I would imagine the Input module you are using would allow you to retrieve the keys being triggered without checking each one individually - I would suggest that you use that.
In any case, the idea would be this:
if Input.repeat? (65)
a = Input.press? (16) ? "A" : "a"
$description += a
end
But as I said again, you shouldn't have to go through each key individually like that - the Input module you are using should probably allow you to retrieve the keys being repeated, pressed, and triggered in separate arrays, and that is a much better way to write this script. You can use the chr method on an integer to return the letter corresponding. Ie. 65.chr would change to "A".
the shortform definitely works. Right now I'm trying to see how I can switch this 'keyboard' thing on and off, because if I can, the power to edit strings on the fly could be huge - like passwords, lines from poetry, spells, riddles and so on.
As is, as soon as $scene = Skill_Editor.new kicks on, and runs
class Skill_Editor
def initialize(menu_index = 0)
@menu_index = menu_index #Store the cursor position
end
def main
@window_0=Window_0.new
@window_0.y=380
@window_0.visible = false
@window_0.active = false
...
the keyboard script in window_0 is active, even if window_0 itself is not active. So When I start hitting backspace and typing, even if the window is invisible and inactive, when I activate that window, whatever I typed or deleted displays as such. Toggling it on and off with
if window_0.active == true
(keyboard stuff)
end
crashed instantaneously.
Well, that largely depends on where you are putting the processing for it. Putting it inside a conditional like that should certainly work, provided that is in the same scene as @window_0 and stuff outside it doesn't depend on stuff inside it. I don't see why it would crash if it was the same class and you are only calling it after @window_0 has been defined.
A workaround would be to simply clear that keyboard's global variable whenever you first make the window active. But that's a messy way to do it - an intelligent positioning of the Keyboard interpreting would be a better way.
I turned the keyboard thing into a method and moved it into the main section of my scene:skill_editor.
Also added an enter key to make the changes to skill descriptions permanent. Hypothetically, whatever skill.description or skill.name is to be edited is copied to $description, then you can edit it with keyboard, then when you hit enter, it copies the info from $description to the skill.description or skill.name. You can then exit the editor with the escape key.
So far it works for one window and description; getting the idea to work for a second window, like the skill's name is going to be the next step.
Edit:
This double window thing has been a nightmare. I've been working on it for hours but so far the closest I got was typing blind and having changes take place after hitting enter. I'm really beginning to think my $description thing needs to be an array like $rename=["[DESCRIPTION]", "[TITLE]"], but i think changing my method right now seems like a "if it aint broke, dont fix it" situation where some other way of using this seems more prudent.
edit(12:10AM):
I got it working. Instead of using window_0.active == true, I created a new set of booleans titled
$win0 and $win8, and set both to false.