Input with Input.KeyDown is too fast?
Author |
Message |
NikG
|
Posted: Mon May 08, 2006 11:37 pm Post subject: Input with Input.KeyDown is too fast? |
|
|
Hey all, I got a little problem, demostrated by the sample code below: code: | setscreen ("offscreenonly")
var chars : array char of boolean
var a := ""
loop
Input.KeyDown (chars)
if chars ('1') then
if a = "a" then
a := "b"
else
a := "a"
end if
end if
put a
View.Update
%delay (100)
cls
end loop |
What I want is that when the user presses '1' the first time, the value of the variable should change to 'a' and after the 2nd press, it should turn to 'b'. If you uncomment that delay, this works. But I don't want to use a delay of any sort.
Although I don't want to do this, I've alse tried adding a boolean that keeps track of keypresses (i.e. if chars ('1') and keydown=false then) but that doesn't work reliably without a delay either.
I'm guessing there's no way to do this without a delay.
Any ideas? |
|
|
|
|
|
Sponsor Sponsor
|
|
|
Bobrobyn
|
Posted: Tue May 09, 2006 7:38 am Post subject: (No subject) |
|
|
Try changing your code so that it's not using the same button for the same thing.
For example:
code: | setscreen ("offscreenonly")
var chars : array char of boolean
var a := ""
loop
Input.KeyDown (chars)
if chars ('1') then
a := "b"
end if
if chars ('2') then
a := "a"
end if
locate(1,1)
put a
View.Update
end loop | [/code] |
|
|
|
|
|
jamonathin
|
Posted: Tue May 09, 2006 9:12 am Post subject: (No subject) |
|
|
You could turn it into 2 buttons, or you ca make a fake delay.
Basically taking the time when the '1' was pressed and waiting 'x' amount of time until you are allowed to change it again.
The 'x' amount in this example is 100. I took out your View.Update because it was unneccesary and slowed things down major.
code: | var chars : array char of boolean
var a := ""
var last : real := 0
loop
Input.KeyDown (chars)
if chars ('1') and Time.Elapsed - last >= 100 then %if time between is 100 milliseconds or longer
last := Time.Elapsed %last time button was pressed
if a = "a" then
a := "b"
else
a := "a"
end if
end if
locate (1, 1)
put a ..
end loop |
|
|
|
|
|
|
HellblazerX
|
Posted: Tue May 09, 2006 4:15 pm Post subject: (No subject) |
|
|
actually, I think what NikG is asking for is how do you make it so the user must release the key and press it again to change the value, so the user can't hold down the 1 key and the value will constantly change back and forth.
Your original method of using a boolean flag would work nicely in this case:
code: | setscreen ("offscreenonly")
var chars : array char of boolean
var a := ""
var pressed : boolean := false
loop
Input.KeyDown (chars)
if chars ('1') then
%Checks if the user has let go of the key yet
if pressed = false then
if a = "a" then
a := "b"
else
a := "a"
end if
pressed := true %Sets pressed to true
end if
else
%If user is not pressing on the key, then pressed becomes false
pressed := false
end if
put a
View.Update
cls
end loop |
Note that the pressed condition is in its own separate if construct, otherwise it won't work properly. |
|
|
|
|
|
NikG
|
Posted: Tue May 09, 2006 9:37 pm Post subject: (No subject) |
|
|
Bobrobyn: I need it to be one key, not two.
jamonathin: I don't want a delay of any sort.
HellblazerX: Thanks, that works, although I was hoping to do it without having to create another variable.
Thanks guys. |
|
|
|
|
|
|
|