%Constants for platforms const num :=4%Total number of moving platforms at once type Platform : record
platx, platy, speed :real endrecord var platforms :array1.. num of Platform
setscreen("offscreenonly") var keys :arraycharofboolean
% 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) endfor
loop Input.KeyDown(keys) if keys ('q')then exit endif
% to make the player move if keys (KEY_LEFT_ARROW)then
velx := -movement
elsif keys (KEY_RIGHT_ARROW)then
velx := movement
else
velx :=0 endif
if dy <= bottom then
vely := jump
endif
% 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 < 0then
platforms (i).speed *= -1 elsif platforms (i).platx + 100 > maxxthen
platforms (i).speed *= -1 endif
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) endfor % collision check, keeps the player bouncing if they hit the platforms if dy < bottom or(dx + 30 < platforms (i).platx + 100and dx - 30 > platforms (i).platx and dy + 30 < platforms (i).platy + 20and dy - 10 > platforms (i).platy)then
dy := bottom
vely :=0 endif
%Draws player drawfillbox(dx - 30, dy - 10, dx + 30, dy + 30, green)
Please specify what version of Turing you are using
Latest Version.
Sponsor Sponsor
Tony
Posted: 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.
Posted: 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!
Tony
Posted: 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.
Posted: 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.
%Constants for platforms const num :=4%Total number of moving platforms at once type Platform : record
platx, platy, speed :real endrecord var platforms :array1.. num of Platform
setscreen("offscreenonly") var keys :arraycharofboolean
% 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) endfor
loop Input.KeyDown(keys) if keys ('q')then exit endif
Posted: 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 < 0then
platforms (i).speed *= -1 elsif platforms (i).platx + 100 > maxxthen
platforms (i).speed *= -1 endif
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 ifView.WhatDotColour(dx - 20, dy - 15)=1orView.WhatDotColour(dx, dy - 15)=1orView.WhatDotColour(dx + 20, dy - 15)=1or(View.WhatDotColour(dx - 20, dy - 15)=1and View.WhatDotColour(dx, dy - 15)=1andView.WhatDotColour(dx + 20, dy - 15)=1)then
vely := jump
endif endfor
Tony
Posted: 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
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?
Posted: 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
landfarm
Posted: 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
Posted: 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.
Posted: 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
Posted: 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
Posted: 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
Posted: 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
Posted: 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.