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

Username:   Password: 
 RegisterRegister   
 Collision Problem in Array
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
landfarm




PostPosted: Fri Dec 18, 2009 10:37 pm   Post subject: Collision Problem in Array

What is it you are trying to achieve?
I am trying to create collision detection.


What is the problem you are having?
The problem is that when I put "i" into the collision check, it says it has not been declared yet.


Describe what you have tried to solve this problem
I put a for loop before the collision check, clearly declaring the "i".


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


Turing:


%General constants
const bottom := 0
const movement := 10
const jump := 35
const grav := 2

%Constants for platforms
const num := 4 %Total number of moving platforms at once
type Platform :
    record
        platx, platy, speed : real
    end record
var platforms : array 1 .. num of Platform

setscreen ("offscreenonly")
var keys : array char of boolean

% player position and velocity
var dx, dy : int
var velx, vely : real
% platform positions
var platx, platy : int

dx := 200
velx := 0
dy := 400
vely := 0
platx := 100
platy := 30
%Randomizes starting locations of moving platforms
for i : 1 .. num
    platforms (i).platx := Rand.Int (0, maxx - 100)
    platforms (i).platy := Rand.Int (20, 350)
    platforms (i).speed := Rand.Int (1, 5)
end for

loop
    Input.KeyDown (keys)
    if keys ('q') then
        exit
    end if

    % to make the player move
    if keys (KEY_LEFT_ARROW) then
        velx := -movement
    elsif keys (KEY_RIGHT_ARROW) then
        velx := movement
    else
        velx := 0
    end if

    if dy <= bottom then
        vely := jump
    end if

    % constantly subtracting gravity from the dy position
    vely -= grav
    dx += round (velx)
    dy += round (vely)

    %Draws platforms
    for i : 1 .. num
        if platforms (i).platx < 0 then
            platforms (i).speed *= -1
        elsif platforms (i).platx + 100 > maxx then
            platforms (i).speed *= -1
        end if
        platforms (i).platx += platforms (i).speed
        drawfillbox (round (platforms (i).platx), round (platforms (i).platy), round (platforms (i).platx + 100), round (platforms (i).platy + 20), blue)
    end for
    % collision check, keeps the player bouncing if they hit the platforms
    if dy < bottom or (dx + 30 < platforms (i).platx + 100 and dx - 30 > platforms (i).platx and dy + 30 < platforms (i).platy + 20 and dy - 10 > platforms (i).platy) then
        dy := bottom
        vely := 0
    end if

    %Draws player
    drawfillbox (dx - 30, dy - 10, dx + 30, dy + 30, green)

    %Draws the bottom, easier to see for testing
    drawline (0, bottom, maxx, bottom, blue)
    View.Update
    delay (30)
    cls
end loop




Please specify what version of Turing you are using
Latest Version.
Sponsor
Sponsor
Sponsor
sponsor
Tony




PostPosted: Fri Dec 18, 2009 10:41 pm   Post subject: RE:Collision Problem in Array

i is local to the score of the for-loop. That is, if it's created inside the for-loop, you can't use it outside. Though in this case, if you want to use the last value of i, you can use "num" instead.
Latest from compsci.ca/blog: Tony's programming blog. DWITE - a programming contest.
landfarm




PostPosted: Sat Dec 19, 2009 12:50 pm   Post subject: Re: Collision Problem in Array

I replaced i with num and now it's working, but the player is not bouncing when it hits the platforms. Is there something wrong with my collision? I'm going to try using WhatDotColour now, but I would still like a clear explanation for my mistake. You guys are the best! Smile
Tony




PostPosted: Sat Dec 19, 2009 1:00 pm   Post subject: Re: Collision Problem in Array

I don't really understand why you would check the collision for just one platform, when you have multiple ones.

landfarm @ Sat Dec 19, 2009 12:50 pm wrote:
I would still like a clear explanation for my mistake.

Uhh... perhaps it's...
landfarm @ Sat Dec 19, 2009 12:50 pm wrote:

I'm going to try using WhatDotColour now
Latest from compsci.ca/blog: Tony's programming blog. DWITE - a programming contest.
landfarm




PostPosted: Sat Dec 19, 2009 1:23 pm   Post subject: Re: Collision Problem in Array

Wait, I'm trying to check the collision for all of them, but through the use of the array. I just tried using View.WhatDotColour to check if the points turn blue or not but it does not seem to work either. Here's what I changed.
Turing:

%General constants
const bottom := 0
const movement := 10
const jump := 35
const grav := 2

%Constants for platforms
const num := 4 %Total number of moving platforms at once
type Platform :
    record
        platx, platy, speed : real
    end record
var platforms : array 1 .. num of Platform

setscreen ("offscreenonly")
var keys : array char of boolean

% player position and velocity
var dx, dy : int
var velx, vely : real
% platform positions
var platx, platy : int

dx := 200
velx := 0
dy := 400
vely := 0
platx := 100
platy := 30
%Randomizes starting locations of moving platforms
for i : 1 .. num
    platforms (i).platx := Rand.Int (0, maxx - 100)
    platforms (i).platy := Rand.Int (20, 350)
    platforms (i).speed := Rand.Int (1, 5)
end for

loop
    Input.KeyDown (keys)
    if keys ('q') then
        exit
    end if

    % to make the player move
    if keys (KEY_LEFT_ARROW) then
        velx := -movement
    elsif keys (KEY_RIGHT_ARROW) then
        velx := movement
    else
        velx := 0
    end if
    %The collision check
    if dy <= bottom or (View.WhatDotColour (dx - 20, dy - 15) = 1 and View.WhatDotColour (dx, dy - 15) = 1 and View.WhatDotColour (dx + 20, dy - 15) = 1) or (View.WhatDotColour (dx - 20, dy
            - 15) = 1) then
        vely := jump
    end if

    % constantly subtracting gravity from the dy position
    vely -= grav
    dx += round (velx)
    dy += round (vely)

    %Draws platforms
    for i : 1 .. num
        if platforms (i).platx < 0 then
            platforms (i).speed *= -1
        elsif platforms (i).platx + 100 > maxx then
            platforms (i).speed *= -1
        end if
        platforms (i).platx += platforms (i).speed
        drawfillbox (round (platforms (i).platx), round (platforms (i).platy), round (platforms (i).platx + 100), round (platforms (i).platy + 20), 1)
    end for
    % collision check, keeps the player above the ground
    if dy < bottom then
        vely := 0
    end if

    %Draws player
    drawfillbox (dx - 30, dy - 10, dx + 30, dy + 30, green)
    Draw.ThickLine (dx - 20, dy - 8, dx - 20, dy - 15, 5, black)
    Draw.ThickLine (dx, dy - 8, dx, dy - 15, 5, black)
    Draw.ThickLine (dx + 20, dy - 8, dx + 20, dy - 15, 5, black)

    %Draws the bottom, easier to see for testing
    drawline (0, bottom, maxx, bottom, 1)
    View.Update
    delay (30)
    cls
end loop
landfarm




PostPosted: Sat Dec 19, 2009 2:12 pm   Post subject: RE:Collision Problem in Array

Ok, I put the collision check for the platforms inside the for loop like this. The problem is that the player will sometimes drop through the platforms. What can I do to fix this? And I'm sorry from jumping from problem to problem.
Turing:

    %Draws platforms
    for i : 1 .. num
        if platforms (i).platx < 0 then
            platforms (i).speed *= -1
        elsif platforms (i).platx + 100 > maxx then
            platforms (i).speed *= -1
        end if
        platforms (i).platx += platforms (i).speed
        drawfillbox (round (platforms (i).platx), round (platforms (i).platy), round (platforms (i).platx + 100), round (platforms (i).platy + 20), 1)
        %Checks if the player hits any platforms
        if View.WhatDotColour (dx - 20, dy - 15) = 1 or View.WhatDotColour (dx, dy - 15) = 1 or View.WhatDotColour (dx + 20, dy - 15) = 1 or (View.WhatDotColour (dx - 20, dy - 15) = 1 and
            View.WhatDotColour (dx, dy - 15) = 1 and View.WhatDotColour (dx + 20, dy - 15) = 1) then
            vely := jump
        end if
    end for
Tony




PostPosted: Sat Dec 19, 2009 2:28 pm   Post subject: RE:Collision Problem in Array

I like how you posted just the relevant part of the code Smile

But... why is that inside a for-loop? And, for bonus points (read as: "required question"), why was the array-based collision outside of for-loop originally?
Latest from compsci.ca/blog: Tony's programming blog. DWITE - a programming contest.
TheGuardian001




PostPosted: Sat Dec 19, 2009 2:30 pm   Post subject: Re: Collision Problem in Array

My assumption would be that your character is simply moving too fast. When you change the characters position, it doesn't hit every point in between where it was and where it will be. This means if it moves fast enough, your character will pass right by the platform without ever appearing to hit it.

you will either have to limit the characters downward speed, or find a way to check farther below the player if they get above a certain speed.
Sponsor
Sponsor
Sponsor
sponsor
landfarm




PostPosted: Sat Dec 19, 2009 2:55 pm   Post subject: RE:Collision Problem in Array

@ Tony, I just thought if it right now, and it's in the for loop because it doesn't seem to work when it's outside of it. Very strange.
Thanks Guardian, I just made the platforms longer so it shouldn't have that problem.
Tony




PostPosted: Sat Dec 19, 2009 4:35 pm   Post subject: RE:Collision Problem in Array

But the if-statement doesn't even rely on the value of i.
Latest from compsci.ca/blog: Tony's programming blog. DWITE - a programming contest.
landfarm




PostPosted: Sun Dec 20, 2009 2:47 pm   Post subject: RE:Collision Problem in Array

I'm not sure, but it doesn't work if it's outside the for loop. Doesn't the i represent each platform though?
TheGuardian001




PostPosted: Sun Dec 20, 2009 3:30 pm   Post subject: Re: Collision Problem in Array

landfarm wrote:

I'm not sure, but it doesn't work if it's outside the for loop. Doesn't the i represent each platform though?

Yes, i does represent that. But you aren't ever using i in your collision detection, since you're using whatdotcolour. The computer doesn't care which block dy-15 belongs to, it just cares if it's blue.

Lets walk through your main loop before you put the collisions inside:

code:

loop start
    check for input
        respond to input
   
    check for colours

    for loop
        draw colours
   
    clear screen
loop end


Can you see anything wrong with where you're checking the colours in relation to where you're drawing the colours?
landfarm




PostPosted: Mon Dec 21, 2009 2:59 pm   Post subject: RE:Collision Problem in Array

Oh, I see. The check is before the for loop actually draws them. There shouldn't be a problem though if the boxes are thick enough though? And also, out of a question of laziness, is it okay if I just the colour check inside the for loop?
TheGuardian001




PostPosted: Mon Dec 21, 2009 3:47 pm   Post subject: Re: Collision Problem in Array

landfarm wrote:

Oh, I see. The check is before the for loop actually draws them.

Exactly.
landfarm wrote:

There shouldn't be a problem though if the boxes are thick enough though?

The thickness of the box is irrelevant. if you check before you draw them, there won't be anything to check, regardless of how thick they will be when you actually draw them.
landfarm wrote:

And also, out of a question of laziness, is it okay if I just the colour check inside the for loop?

For the sake of you not getting into bad practices, No, it's not okay. All you need to do is move it outside of the loop, it's really not that much trouble.
Something like this might not present much of a problem in this specific program, but what if you had 10 platforms to draw? what if you had 100? whatdotcolour itself is a relatively costly procedure to call, and if you're calling it repeatedly in a for loop, there's a good chance you'll see some performance issues.
landfarm




PostPosted: Tue Dec 22, 2009 9:32 pm   Post subject: Re: Collision Problem in Array

TheGuardian001 @ Sat Dec 19, 2009 2:30 pm wrote:
My assumption would be that your character is simply moving too fast. When you change the characters position, it doesn't hit every point in between where it was and where it will be. This means if it moves fast enough, your character will pass right by the platform without ever appearing to hit it.

you will either have to limit the characters downward speed, or find a way to check farther below the player if they get above a certain speed.

That's why I increased the thickness of the platforms. Thanks for your help though. I'm gonna fix it right now. Smile
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  [ 23 Posts ]
Goto page 1, 2  Next
Jump to:   


Style:  
Search: