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

Username:   Password: 
 RegisterRegister   
 Fixing the flicker in my program
Index -> Programming, Turing -> Turing Help
Goto page 1, 2  Next
View previous topic Printable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic
Author Message
Darkmantis




PostPosted: Sat Jun 03, 2006 7:04 pm   Post subject: Fixing the flicker in my program

hey I have this pong that i made but the program seems to slow down alot when the paddles move and the ball constantly flickers. Some people suggest to put "offscreenonly" and View.Updates in my program but the problem is I dont know where to put them, here is my code.

code:
setscreen ("graphics:610;400,nocursor")
var ballx, bally, paddleleftx, paddlelefty, paddlerightx, paddlerighty, direction1, direction2, c1, c2, c3, c4, o, q, t, r : int
var score, score2, scorel : int
var kp : array char of boolean
var ch : string (1)
var font1, font2, font3, font4, font5 : int
randint (ballx, 40, 360)
randint (bally, 40, 350)
paddleleftx := 30
paddlelefty := 180
paddlerightx := 580
paddlerighty := 180
score := 0
score2 := 0
direction1 := 1
direction2 := 1
font1 := Font.New ("serif:28")
font2 := Font.New ("serif:20")
font3 := Font.New ("serif:40")
font4 := Font.New ("serif:33")
font5 := Font.New ("serif:75")
procedure pong
    Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 10, black)
    Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 10, black)
    Draw.ThickLine (0, 365, 610, 365, 5, black)
    Draw.ThickLine (0, 40, 610, 40, 5, black)
    loop
        drawfilloval (ballx, bally, 3, 3, brightblue)
        delay (3)
        drawfilloval (ballx, bally, 3, 3, white)
        if ballx = 0 then
            score := score + 1
        end if
        if ballx = 610 then
            score2 := score2 + 1
        end if
        locate (1, 30)
        put "Paddle Right: ", score
        locate (2, 30)
        put "Paddle Left: ", score2
        locate (20, 30)
        c1 := whatdotcolor (ballx - 4, bally)
        c2 := whatdotcolor (ballx + 4, bally)
        c3 := whatdotcolor (ballx, bally + 4)
        c4 := whatdotcolor (ballx, bally - 4)
        if ballx > maxx and direction1 > 0 then
            direction1 := -direction1
        elsif ballx < 1 and direction1 < 0 then
            direction1 := -direction1
        elsif bally > maxy and direction2 > 0 then
            direction2 := -direction2
        elsif bally < 1 and direction2 < 0 then
            direction2 := -direction2
        end if
        if c1 = black then
            direction1 := -direction1
        end if
        if c2 = black then
            direction1 := -direction1
        end if
        if c3 = black then
            direction2 := -direction2
        end if
        if c4 = black then
            direction2 := -direction2
        end if
        ballx := ballx + direction1
        bally := bally + direction2
        Input.KeyDown (kp)
        if kp ('w') then
            Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 12, white)
            Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 10, black)
            delay (1)
            paddlelefty := paddlelefty + 1
            if paddlelefty > 325 then
                paddlelefty := paddlelefty - 1
            end if
        end if
        if kp ('s') then
            Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 12, white)
            Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 10, black)
            delay (1)
            paddlelefty := paddlelefty - 1
            if paddlelefty < 50 then
                paddlelefty := paddlelefty + 1
            end if
        end if
        if kp (KEY_UP_ARROW) then
            Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 12, white)
            Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 10, black)
            delay (1)
            paddlerighty := paddlerighty + 1
            if paddlerighty > 325 then
                paddlerighty := paddlerighty - 1
            end if
        end if
        if kp (KEY_DOWN_ARROW) then
            Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 12, white)
            Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 10, black)
            delay (1)
            paddlerighty := paddlerighty - 1
            if paddlerighty < 50 then
                paddlerighty := paddlerighty + 1
            end if
        end if
        if score = scorel then
            cls
            Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 10, black)
            delay (1)
            Draw.Text ("Right Paddle Wins!!!", 150, 200, font3, green)
            return
        elsif score2 = scorel then
            cls
            Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 10, black)
            Draw.Text ("Left Paddle Wins!!!", 150, 200, font3, green)
            return
        end if
    end loop
end pong

procedure mainmenu
    Draw.Text ("Space Pong!", 155, 300, font3, green)
    Draw.Text ("PRESS ANY KEY TO CONTINUE", 125, 50, font2, green)
    getch (ch)
    cls
    put "Choose the score limit"
    get scorel
    Draw.Text ("PRESS ANY KEY TO CONTINUE", 125, 50, font2, green)
    getch (ch)
    cls
    put "How many obstacle?"
    get o
    Draw.Text ("PRESS ANY KEY TO CONTINUE", 125, 50, font2, green)
    getch (ch)
    cls
    Draw.Text ("5", 280, 190, font5, green)
    delay (1000)
    cls
    Draw.Text ("4", 280, 190, font5, green)
    delay (1000)
    cls
    Draw.Text ("3", 280, 190, font5, green)
    delay (1000)
    cls
    Draw.Text ("2", 280, 190, font5, green)
    delay (1000)
    cls
    Draw.Text ("1", 280, 190, font5, green)
    delay (1000)
    cls
    Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 10, black)
    Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 10, black)
    Draw.ThickLine (0, 365, 610, 365, 5, black)
    Draw.ThickLine (0, 40, 610, 40, 5, black)
    Draw.Text ("GO!", 270, 200, font3, green)
    delay (1000)
    Draw.Text ("GO!", 270, 200, font3, white)

    for p : 1 .. o
        randint (q, 1, 25)
        randint (t, 40, 590)
        randint (r, 40, 350)
        drawfilloval (t, r, q, q, black)
    end for
    pong
end mainmenu

setscreen ("position:truemiddle,centre")
var clr : int := 218
var text1 : int := Font.New ("Times New Roman:38:Bold")
drawfillbox (0, 0, 610, 400, black)
for n : 0 .. 39
    RGB.SetColor (clr, 0, n / 39, 0)
    Font.Draw ("DarkMantis Productions", (maxx div 2) - (Font.Width ("DarkMantis Productions", text1) div 2), (maxy div 1.5) - 9, text1, clr)
    RGB.SetColor (clr, 0, n / 39, 0)
    Font.Draw ("Presents...", (maxx div 2) - (Font.Width ("Presents...", text1) div 2), (maxy div 2.5) - 9, text1, clr)
    View.Update
    delay (50)
end for
delay (1000)
for decreasing n : 39 .. 0
    RGB.SetColor (clr, 0, n / 39, 0)
    Font.Draw ("DarkMantis Productions", (maxx div 2) - (Font.Width ("DarkMantis Productions", text1) div 2), (maxy div 1.5) - 9, text1, clr)
    RGB.SetColor (clr, 0, n / 39, 0)
    Font.Draw ("Presents...", (maxx div 2) - (Font.Width ("Presents...", text1) div 2), (maxy div 2.5) - 9, text1, clr)
    View.Update
    delay (50)
end for

mainmenu
Sponsor
Sponsor
Sponsor
sponsor
MysticVegeta




PostPosted: Sat Jun 03, 2006 7:09 pm   Post subject: (No subject)

the setscreen ("offscreenonly") goes above the drawing loop and your View.Update seems to be in the right place...
Cervantes




PostPosted: Sat Jun 03, 2006 7:10 pm   Post subject: (No subject)

View.Set("offscreenonly") goes wherever you want to induce double buffering. The start of your program is a good place. You can inlcude offscreenonly with the other commands in your View.Set string.

View.Update goes wherever you want to flip the back buffer into view. This is probably after you've drawn everything in your main loop.

code:

loop
    cls
    %draw everything
    View.Update
    delay (5)
end loop
Darkmantis




PostPosted: Sat Jun 03, 2006 9:32 pm   Post subject: (No subject)

Thx guys the flickering is now gone but now I have to fix a bunch of bugs but I have no Idea where to start, my ball now eats the obstacles more then before and now my paddles arent erasing themselves, heres the code.

code:
setscreen ("graphics:610;400,nocursor")
setscreen ("offscreenonly")
var ballx, bally, paddleleftx, paddlelefty, paddlerightx, paddlerighty, direction1, direction2, c1, c2, c3, c4, o, q, t, r : int
var score, score2, scorel : int
var kp : array char of boolean
var ch : string (1)
var font1, font2, font3, font4, font5 : int
randint (ballx, 40, 360)
randint (bally, 40, 350)
paddleleftx := 30
paddlelefty := 180
paddlerightx := 580
paddlerighty := 180
score := 0
score2 := 0
direction1 := 5
direction2 := 5
font1 := Font.New ("serif:28")
font2 := Font.New ("serif:20")
font3 := Font.New ("serif:40")
font4 := Font.New ("serif:33")
font5 := Font.New ("serif:75")
procedure pong
    Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 10, black)
    Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 10, black)
    Draw.ThickLine (0, 365, 610, 365, 5, black)
    Draw.ThickLine (0, 40, 610, 40, 5, black)
    loop
        drawfilloval (ballx, bally, 3, 3, brightblue)
        View.Update
        delay (1)
        drawfilloval (ballx, bally, 3, 3, white)
        if ballx = 0 then
            score := score + 1
        end if
        if ballx = 610 then
            score2 := score2 + 1
        end if
        locate (1, 30)
        put "Paddle Right: ", score
        locate (2, 30)
        put "Paddle Left: ", score2
        locate (20, 30)
        c1 := whatdotcolor (ballx - 4, bally)
        c2 := whatdotcolor (ballx + 4, bally)
        c3 := whatdotcolor (ballx, bally + 4)
        c4 := whatdotcolor (ballx, bally - 4)
        if ballx > maxx and direction1 > 0 then
            direction1 := -direction1
        elsif ballx < 1 and direction1 < 0 then
            direction1 := -direction1
        elsif bally > maxy and direction2 > 0 then
            direction2 := -direction2
        elsif bally < 1 and direction2 < 0 then
            direction2 := -direction2
        end if
        if c1 = black then
            direction1 := -direction1
        end if
        if c2 = black then
            direction1 := -direction1
        end if
        if c3 = black then
            direction2 := -direction2
        end if
        if c4 = black then
            direction2 := -direction2
        end if
        ballx := ballx + direction1
        bally := bally + direction2
        Input.KeyDown (kp)
        if kp ('w') then
            Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 12, white)
            Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 10, black)
            View.Update
            delay (1)
            paddlelefty := paddlelefty + 10
            if paddlelefty > 325 then
                paddlelefty := paddlelefty - 10
            end if
        end if
        if kp ('s') then
            Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 12, white)
            Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 10, black)
            View.Update
            delay (1)
            paddlelefty := paddlelefty - 10
            if paddlelefty < 50 then
                paddlelefty := paddlelefty + 10
            end if
        end if
        if kp (KEY_UP_ARROW) then
            Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 12, white)
            Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 10, black)
            View.Update
            delay (1)
            paddlerighty := paddlerighty + 10
            if paddlerighty > 325 then
                paddlerighty := paddlerighty - 10
            end if
        end if
        if kp (KEY_DOWN_ARROW) then
            Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 12, white)
            Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 10, black)
            View.Update
            delay (1)
            paddlerighty := paddlerighty - 10
            if paddlerighty < 50 then
                paddlerighty := paddlerighty + 10
            end if
        end if
        if score = scorel then
            cls
            Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 10, black)
            delay (1)
            Draw.Text ("Right Paddle Wins!!!", 150, 200, font3, green)
            return
        elsif score2 = scorel then
            cls
            Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 10, black)
            Draw.Text ("Left Paddle Wins!!!", 150, 200, font3, green)
            return
        end if
    end loop
end pong

procedure mainmenu
    Draw.Text ("Space Pong!", 155, 300, font3, green)
    Draw.Text ("PRESS ANY KEY TO CONTINUE", 125, 50, font2, green)
    View.Update
    getch (ch)
    cls
    put "Choose the score limit"
    View.Update
    get scorel
    Draw.Text ("PRESS ANY KEY TO CONTINUE", 125, 50, font2, green)
    View.Update
    getch (ch)
    cls
    put "How many obstacle?"
    View.Update
    get o
    Draw.Text ("PRESS ANY KEY TO CONTINUE", 125, 50, font2, green)
    View.Update
    getch (ch)
    cls
    Draw.Text ("5", 280, 190, font5, green)
    View.Update
    delay (1000)
    cls
    Draw.Text ("4", 280, 190, font5, green)
    View.Update
    delay (1000)
    cls
    Draw.Text ("3", 280, 190, font5, green)
    View.Update
    delay (1000)
    cls
    Draw.Text ("2", 280, 190, font5, green)
    View.Update
    delay (1000)
    cls
    Draw.Text ("1", 280, 190, font5, green)
    View.Update
    delay (1000)
    cls
    Draw.ThickLine (paddleleftx, paddlelefty, paddleleftx, paddlelefty + 30, 10, black)
    Draw.ThickLine (paddlerightx, paddlerighty, paddlerightx, paddlerighty + 30, 10, black)
    Draw.ThickLine (0, 365, 610, 365, 5, black)
    Draw.ThickLine (0, 40, 610, 40, 5, black)
    Draw.Text ("GO!", 270, 200, font3, green)
    View.Update
    delay (1000)
    Draw.Text ("GO!", 270, 200, font3, white)
    View.Update
    for p : 1 .. o
        randint (q, 1, 25)
        randint (t, 40, 590)
        randint (r, 40, 350)
        drawfilloval (t, r, q, q, black)
        View.Update
    end for
    pong
end mainmenu
setscreen ("position:truemiddle,centre")
var clr : int := 218
var text1 : int := Font.New ("Times New Roman:38:Bold")
drawfillbox (0, 0, 610, 400, black)
View.Update
for n : 0 .. 39
    RGB.SetColor (clr, 0, n / 39, 0)
    Font.Draw ("DarkMantis Productions", (maxx div 2) - (Font.Width ("DarkMantis Productions", text1) div 2), (maxy div 1.5) - 9, text1, clr)
    RGB.SetColor (clr, 0, n / 39, 0)
    Font.Draw ("Presents...", (maxx div 2) - (Font.Width ("Presents...", text1) div 2), (maxy div 2.5) - 9, text1, clr)
    View.Update
    delay (50)
end for
delay (1000)
for decreasing n : 39 .. 0
    RGB.SetColor (clr, 0, n / 39, 0)
    Font.Draw ("DarkMantis Productions", (maxx div 2) - (Font.Width ("DarkMantis Productions", text1) div 2), (maxy div 1.5) - 9, text1, clr)
    RGB.SetColor (clr, 0, n / 39, 0)
    Font.Draw ("Presents...", (maxx div 2) - (Font.Width ("Presents...", text1) div 2), (maxy div 2.5) - 9, text1, clr)
    View.Update
    delay (50)
end for


mainmenu
Darkmantis




PostPosted: Wed Jun 07, 2006 10:42 am   Post subject: (No subject)

Is there anyone who will help me out?
Remm




PostPosted: Wed Jun 07, 2006 2:27 pm   Post subject: (No subject)

take off nocursor so it is possible to see what is typed. If you dont want it visible for your 'click to continue' stuff, you could always change it to a mouse click anywhere on screen to continue, or put nocruisor on then and take it off (though i tried that and it didint work for me Confused but thats not saying much)

anyways, nice startup with the fade in/out, Although it leaves a bit of residue in the end. In game everythign seems to be going uber fast, so you might wannna add some delays in the ball and movement keys.
Remm




PostPosted: Wed Jun 07, 2006 2:31 pm   Post subject: (No subject)

Uh, sorry to double post but i just tried out the first one you posted, and it works fine - on my computer anyways... how badly is it flickering for you? i only see minor flickers in the paddle and ball.
Clayton




PostPosted: Wed Jun 07, 2006 2:36 pm   Post subject: (No subject)

actually for you to be able to see what you have typed you have to either take off 'offscreenonly' using 'nooffscreenonly', or you can View.Update after every letter you have typed (i wouldnt suggest doing that) check out my View.Set tutorial at : http://compsci.ca/v2/viewtopic.php?t=12533 to read all you need on View.Update Very Happy
Sponsor
Sponsor
Sponsor
sponsor
Darkmantis




PostPosted: Wed Jun 07, 2006 3:03 pm   Post subject: (No subject)

I still dont see how to fix my program Sad. In the second set of code in this thread my paddles dont erase themselves, why? I dont see whats wrong. If I can fix this then the flickering is gone and my paddles wont lag the program plz help and thx to everyone for helping me Very Happy
Clayton




PostPosted: Wed Jun 07, 2006 3:59 pm   Post subject: (No subject)

did you actually read my tut? you have to use Draw.Cls to clear the screen, not just draw over the items you want to move, also, you arent even getting rid of the paddles in question, resulting in the "smearing" of the paddles
Darkmantis




PostPosted: Wed Jun 07, 2006 9:00 pm   Post subject: (No subject)

The problem is I dont want to clear the entire screen
HellblazerX




PostPosted: Wed Jun 07, 2006 9:02 pm   Post subject: (No subject)

Then use Draw.FillBox. Just draw a white box over whatever portion of your picture you need to erase.
Darkmantis




PostPosted: Thu Jun 08, 2006 6:31 am   Post subject: (No subject)

Thats what I'm doing but it doesnt work when useing View.Update.
HellblazerX




PostPosted: Thu Jun 08, 2006 6:44 am   Post subject: (No subject)

Use View.UpdateArea. It only updates the one area you specify.
Clayton




PostPosted: Thu Jun 08, 2006 7:39 am   Post subject: (No subject)

the reason drawing over the objects you want to move doesnt work for you is..... you arent doing it! nowhere in your loop are you drawing over the paddles then redrawing them
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 2  [ 20 Posts ]
Goto page 1, 2  Next
Jump to:   


Style:  
Search: