Programming C, C++, Java, PHP, Ruby, Turing, VB
Computer Science Canada 
Programming C, C++, Java, PHP, Ruby, Turing, VB  

Username:   Password: 
 RegisterRegister   
 Input.KeyDown Problems... Seems to keep the value of the key until something happens...
Index -> Programming, Turing -> Turing Help
View previous topic Printable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic
Author Message
Shadow456732




PostPosted: Tue Dec 18, 2012 7:48 pm   Post subject: Input.KeyDown Problems... Seems to keep the value of the key until something happens...

What is it you are trying to achieve?
This program is essentially like one of those asteroid dodge programs. You are the ball, avoid all in coming objects. Though, the problem is, that when you lose, the game ends.
I want to make it so clicking enter will bring you back to the main menu. And then you click enter once more to start the game.


What is the problem you are having?
When i click enter in the end to restart the loop, it seems to start where the game starts... So it dosen't show the intructions, and it dosen't wait for the input.


Describe what you have tried to solve this problem
Tried putting delay's in a few places to see wether or not it actually did go through that code. It seemed to, but it would assume that enter was clicked when it wasn't.


Post any relevant code (You may choose to attach the file instead of posting the code if it is too long)



Turing:


setscreen ("graphics:500;700")
View.Set ("nobuttonbar")
View.Set ("offscreenonly")
var jumpheight, flor, radius, endcolor, score, button, mx, my, font : int
var x, y, xpixelchange, ypixelchange, distance : real
var jump, buffer, fall, endgame : boolean
var left, right, up, down : char
var key : array char of boolean
var asteroid, aradius, acolor : array 1 .. 100 of int
var aspeed, ax, ay : array 1 .. 100 of real
var num : int

loop
font := Font.New ("serif:12")
num := 10
flor := 100
jumpheight := flor + 150
radius := 15
x := (maxx / 2)
y := flor + radius
xpixelchange := 0.5
ypixelchange := 0.6
left := 'a'
right := 'd'
up := (chr (ORD_SPACE))
down := 's'
buffer := true
jump := false
fall := false
endgame := false
score := 0
endgame := false
for i : 1 .. num
    ax (i) := Rand.Int (0, maxx)
    aradius (i) := Rand.Int (15, 20)
    aspeed (i) := Rand.Int (2, 9) / 10
    ay (i) := maxy + aradius (i)
    acolor (i) := Rand.Int (0, 244)
end for
Draw.FillBox(1,1,10,10,black)
Font.Draw ("- Welcome to balloon dodge! Your Objective Is To Dodge Oncoming Ballons!", 1, round (maxy / 2), font, red)
Font.Draw ("- Use A and D to move left and right. Spacebar is to jump", 1, round (maxy / 2) - 15, font, red)
Font.Draw ("- Click p to pause the game ,click any keyboard key to resume", 1, round (maxy / 2) - 30, font, red)
Font.Draw ("- Hit The Enter Key To Begin!", 1, round (maxy / 2) - 45, font, red)
View.Update
loop
    Input.KeyDown (key)
    if key (KEY_ENTER) then
        exit
    else
        buffer := true
        end if
end loop

loop
    cls
    Draw.FillBox (0, flor, maxx, maxy, gray)
    Draw.FillBox (0, 0, maxx, flor, green)
    Draw.FillBox (0, flor - 10, maxx, flor, red)
    Input.KeyDown (key)
    if key (left) and x >= radius then
        x := x - xpixelchange
    elsif key (right) and x <= maxx - radius then
        x := x + xpixelchange
    end if
    Input.KeyDown (key)
    if key (up) and buffer = true then
        jump := true
        buffer := false
    elsif jump = true and y < jumpheight then
        y := y + ypixelchange
        if round (y) >= jumpheight then
            jump := false
            fall := true
        end if
    elsif fall = true and y >= flor + radius then
        y := y - ypixelchange
        if y <= flor + radius then
            fall := false
        end if
    end if
    Input.KeyDown (key)
    if key (up) then
        buffer := false
    else
        if round (y) <= flor + radius then
            buffer := true
        end if
    end if
    Draw.FillOval (round (x), round (y), radius, radius, blue)
    for i : 1 .. num
        Draw.FillOval (round (ax (i)), round (ay (i)), aradius (i), aradius (i), acolor (i))
        Draw.Oval (round (ax (i)), round (ay (i)), aradius (i), aradius (i), black)
        ay (i) := ay (i) - aspeed (i)
        if ay (i) <= flor + aradius (i) then
            ax (i) := Rand.Int (0, maxx)
            aradius (i) := Rand.Int (15, 20)
            aspeed (i) := Rand.Int (2, 9) / 10
            ay (i) := maxy + aradius (i)
            acolor (i) := Rand.Int (0, 244)
            score := score + 1
        end if
        distance := sqrt ((ax (i) - x) ** 2 + (ay (i) - y) ** 2)
        if distance <= aradius (i) + radius then
            endgame := true
            for l : 1 .. 150
                delay (10)
                View.Update
                Draw.FillOval (round (ax (i)), round (ay (i)), aradius (i), aradius (i), acolor (i))
                Draw.Oval (round (ax (i)), round (ay (i)), aradius (i), aradius (i), black)
                endcolor := acolor (i)
                aradius (i) := aradius (i) + 5
            end for
        end if
    end for

    Input.KeyDown (key)
    if key ('p') then
        loop
            Draw.FillBox (0, 0, maxx, maxy, black)
            Font.Draw ("Paused! Click Any Key To Resume Game", 10, round (maxy / 2), font, red)
            View.Update
            exit when hasch
        end loop
    end if
    if endgame = true then
        exit
    end if
    View.Update
end loop
colorback (endcolor)
cls
Font.Draw ("YOU LOSE! Your Score Was: " + intstr (score), 10, round (maxy / 2), font, whatdotcolor (1, 1) + 10)
Font.Draw ("Click Enter To Replay", 10, round (maxy / 2) - 15, font, whatdotcolor (1, 1) + 10)
View.Update
loop
    Input.KeyDown (key)
    if key (KEY_ENTER) then
        exit
    end if
end loop
end loop



Please specify what version of Turing you are using
The second newest. As the newest has a bug with making stand alone programs lol. Thanks for any help Smile p.s I would like to avoid using getch/hasch as i find it somewhat slow.
Sponsor
Sponsor
Sponsor
sponsor
TerranceN




PostPosted: Tue Dec 18, 2012 9:20 pm   Post subject: RE:Input.KeyDown Problems... Seems to keep the value of the key until something happens...

Since you have inner loops that wait for you to press enter at the beginning and the end of the outer loop, you essentially have a situation like this:

Turing:

var keys : array char of boolean

put "a"
loop % this would be for the 'you lose' screen
    Input.KeyDown(keys)
    exit when keys(KEY_ENTER)
end loop
put "b"
loop % and this would be for the instructions
    Input.KeyDown(keys)
    exit when keys(KEY_ENTER)
end loop
put "c"


If you run that, you will find that the program runs so fast that after pressing enter to get out of the 'you lose' loop, it goes through the instructions loop before you can take your finger off enter.

One way to fix this problem is to keep track of the keys that were down the previous iteration of the loop, then only exit when enter is down but wasn't before (i.e. right when it is pressed). This gives the desired behaviour of having to press enter twice to get through both loops:

Turing:

var keys : array char of boolean
var preKeys : array char of boolean

put "a"
loop
    preKeys := keys
    Input.KeyDown(keys)
    exit when keys(KEY_ENTER) and ~preKeys(KEY_ENTER)
end loop
put "b"
loop
    preKeys := keys
    Input.KeyDown(keys)
    exit when keys(KEY_ENTER) and ~preKeys(KEY_ENTER)
end loop
put "c"
Shadow456732




PostPosted: Tue Dec 18, 2012 9:33 pm   Post subject: RE:Input.KeyDown Problems... Seems to keep the value of the key until something happens...

Hmm, sounds good, though could i just change the value of key before the check? I'll try that out as well thanks Smile

EDIT: Also, is there a way to "clear" the value of Input.KeyDown??
Shadow456732




PostPosted: Tue Dec 18, 2012 9:40 pm   Post subject: RE:Input.KeyDown Problems... Seems to keep the value of the key until something happens...

Alright! After trying it out, it seems to work. Though for future reference, what does the "~" do in this situation?
TerranceN




PostPosted: Tue Dec 18, 2012 9:43 pm   Post subject: RE:Input.KeyDown Problems... Seems to keep the value of the key until something happens...

The problem with changing the value of key is you need to continuously keep updating key using Input.KeyDown to determine when enter is pressed. So even if you change the value of key, the next Input.KeyDown will overwrite your change.

'~' is just shorthand for 'not'.
Shadow456732




PostPosted: Tue Dec 18, 2012 9:47 pm   Post subject: RE:Input.KeyDown Problems... Seems to keep the value of the key until something happens...

Makes sense. Thanks a bunch , works like a charm now! Very Happy
Shadow456732




PostPosted: Tue Dec 18, 2012 9:50 pm   Post subject: RE:Input.KeyDown Problems... Seems to keep the value of the key until something happens...

Lol, sorry, final thing. I found out that if you do

"and not= prekey(KEY_ENTER) then"

instead of

"and ~prekey(KEY_ENTER) then"

dosen't seem to work.... Also, putting the not=
in between prekey and (KEY_ENTER), it dosen't work either. How would i do it other than with a ~ if possible haha
TerranceN




PostPosted: Tue Dec 18, 2012 10:00 pm   Post subject: RE:Input.KeyDown Problems... Seems to keep the value of the key until something happens...

'~' is a shorthand for the negation operator 'not' (i.e. 'not false' is 'true'), not 'not='.

If you do "and not prekey(KEY_ENTER) then" it should work.
Sponsor
Sponsor
Sponsor
sponsor
Display posts from previous:   
   Index -> Programming, Turing -> Turing Help
View previous topic Tell A FriendPrintable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic

Page 1 of 1  [ 8 Posts ]
Jump to:   


Style:  
Search: