Wall Collision
Author |
Message |
Mr. T
|
Posted: Tue Jun 20, 2006 10:18 pm Post subject: Wall Collision |
|
|
The commented part of code is that which I wish to be helped with. Using whatdotcolour (preferably ), how could I determine if the expanding bars have collided with the outer boundaries that I have drawn. TheOneTrueGod suggested using grid collision, but I wanted to know if there is a whatdotcolour solution.
code: | View.Set ("offscreenonly,nobuttonbar")
proc drawBar (barX, barY, a, b : int)
Draw.FillBox (barX, barY, barX + a, barY + 10, red)
Draw.FillBox (barX, barY, barX - b, barY + 10, green)
end drawBar
var x, y, button, left, middle, right : int := 0
var barX, barY, a, b : int := 0
var boolMoveRed, boolMoveGreen := false
loop
View.Update
delay (10)
cls
%Mouse Controls
Mouse.ButtonChoose ("multibutton")
Mouse.Where (x, y, button)
left := button mod 10 % left = 0 or 1
middle := (button - left) mod 100 % middle = 0 or 10
right := button - middle - left % right = 0 or 100
%Wall Movement Collision
%if %COLLISION WITH RIGHT SIDE OF THE SCREEN then
% boolMoveRed := false
%end if
%if %COLLISION WITH LEFT SIDE OF THE SCREEN then
% boolMoveGreen := false
%end if
%Wall Movement Flags
if left = 1 then
barX := x
barY := y
boolMoveRed := true
boolMoveGreen := true
end if
if boolMoveRed = true then
a += 10
drawBar (barX, barY, a, b)
end if
if boolMoveGreen = true then
b += 10
drawBar (barX, barY, a, b)
end if
%Draw Border
Draw.Box (10, 10, maxx - 10, maxy - 10, black)
end loop |
|
|
|
|
|
|
Sponsor Sponsor
|
|
|
Mr. T
|
Posted: Tue Jun 20, 2006 11:50 pm Post subject: Alex's Opinion |
|
|
Ok, I managed to solve that problem on my own, but I have a new one. I know it's impossible to pass a flexible array into a procedure through a parameter, so how would I convert my code so that I can draw an increasing # of walls after the first one is complete. I have already gotten a few suggestions from TheOneTrueGod, but I'm still a little bit confused as to how I would implement it in my code. |
|
|
|
|
|
Mr. T
|
Posted: Wed Jun 21, 2006 4:04 am Post subject: Alex's Opinion |
|
|
^Read the post above, then look at the code below:
code: | View.Set ("offscreenonly,nobuttonbar")
proc drawBar (barX, barY, a, b, colRight, colLeft : int)
Draw.FillBox (barX, barY, barX + a, barY + 10, colRight)
Draw.FillBox (barX, barY, barX - b, barY + 10, colLeft)
end drawBar
const RADIUS : int := 5
type ballData :
record
x : int
y : int
dx : int
dy : int
end record
var ballMovement : flexible array 1 .. 2 of ballData
for i : 1 .. upper (ballMovement)
ballMovement (i).x := Rand.Int (RADIUS + 10, maxx - RADIUS - 10)
ballMovement (i).y := Rand.Int (RADIUS + 10, maxy - RADIUS - 10)
ballMovement (i).dx := Rand.Int (-5, 5)
ballMovement (i).dy := Rand.Int (-5, 5)
end for
var clickX, clickY, button, left, middle, right : int := 0
var barX, barY, a, b, barStoreA, barStoreB : int := 0
var boolMoveRed, boolMoveGreen := false
var boolClick := true
var topCounter, bottomCounter := 0
loop
View.Update
delay (10)
cls
%Draw Border
Draw.Box (10, 10, maxx - 10, maxy - 10, black)
Draw.Fill (5, 5, black, black)
%Mouse Controls
Mouse.ButtonChoose ("multibutton")
Mouse.Where (clickX, clickY, button)
left := button mod 10 % left = 0 or 1
middle := (button - left) mod 100 % middle = 0 or 10
right := button - middle - left % right = 0 or 100
%Wall Movement Flags
if left = 1 and boolClick = true and whatdotcolour (clickX, clickY) not= black and whatdotcolour (clickX, clickY) not= blue then
barX := clickX
barY := clickY
boolMoveRed := true
boolMoveGreen := true
boolClick := false
end if
if boolMoveRed = true then
a += 5
barStoreA := barX + a
drawBar (barX, barY, a, b, red, green)
end if
if boolMoveGreen = true then
b += 5
barStoreB := barX - b
drawBar (barX, barY, a, b, red, green)
end if
%Wall Movement Collision
if whatdotcolour (barStoreA + 1, barY) = 7 then
boolMoveRed := false
if boolMoveGreen = false then
drawBar (barX, barY, a, b, blue, blue)
elsif boolMoveGreen = true then
drawBar (barX, barY, a, b, blue, green)
end if
end if
if whatdotcolour (barStoreB - 1, barY) = 7 then
boolMoveGreen := false
if boolMoveRed = false then
drawBar (barX, barY, a, b, blue, blue)
elsif boolMoveRed = true then
drawBar (barX, barY, a, b, red, blue)
end if
end if
%Wall Completion
if whatdotcolour (barStoreA + 1, barY) = 7 and whatdotcolour (barStoreB - 1, barY) = 7 then
%Box Creation Counter (above, below, or none)
for i : 1 .. upper (ballMovement)
if ballMovement (i).y > barY then %Balls above wall
topCounter += 1
elsif ballMovement (i).y < barY then %Balls below wall
bottomCounter += 1
end if
%Drawing Completed Wall
if topCounter not= 0 and bottomCounter not= 0 then %balls are located ABOVE and BELOW the bar
%No change
elsif topCounter not= 0 then %balls are located ABOVE the bar
Draw.FillBox (10, 10, maxx - 10, barY, blue)
elsif bottomCounter not= 0 then %balls are located BELOW the bar
Draw.FillBox (10, barY, maxx - 10, maxy - 10, blue)
end if
end for
end if
%Various Ball Collisions
for i : 1 .. upper (ballMovement)
%Balls to Bar Collision (for balls BELOW the bar)
if ballMovement (i).y + RADIUS >= barY and whatdotcolour (ballMovement (i).x, ballMovement (i).y + RADIUS) = blue then
ballMovement (i).dy := -ballMovement (i).dy
end if
%Balls to Bar Collision (for balls ABOVE the bar)
if ballMovement (i).y - RADIUS >= barY and whatdotcolour (ballMovement (i).x, ballMovement (i).y - RADIUS) = blue then
ballMovement (i).dy := -ballMovement (i).dy
end if
%Outer Boundary Collision for Balls
if ballMovement (i).x + ballMovement (i).dx - 10 < RADIUS or
ballMovement (i).x + ballMovement (i).dx > maxx - 10 - RADIUS then
ballMovement (i).dx := -ballMovement (i).dx
end if
if ballMovement (i).y + ballMovement (i).dy - 10 < RADIUS or
ballMovement (i).y + ballMovement (i).dy > maxy - 10 - RADIUS then
ballMovement (i).dy := -ballMovement (i).dy
end if
%Change Direction of Balls
ballMovement (i).x := ballMovement (i).x + ballMovement (i).dx
ballMovement (i).y := ballMovement (i).y + ballMovement (i).dy
%Draw Balls
Draw.FillOval (ballMovement (i).x, ballMovement (i).y, RADIUS, RADIUS, black)
end for
end loop |
|
|
|
|
|
|
zylum
|
Posted: Thu Jun 22, 2006 12:00 am Post subject: (No subject) |
|
|
you can pass a flexible array to a procedure but you cant change its dimension once in the procedure..
ie:
code: | var arr : flexible array 1 .. 5 of int
for i : 1 .. upper (arr)
arr (i) := Rand.Int (1, 9)
end for
proc printArray (a : array 1 .. * of int)
for i : 1 .. upper (a)
put a (i), " " ..
end for
end printArray
printArray (arr) |
if that doesnt help, can you explain a little further what you need this for? |
|
|
|
|
|
Mr. T
|
Posted: Thu Jun 22, 2006 12:15 am Post subject: Alex's Opinion |
|
|
I know...so how would you work around this problem? I will need to update the flexible array. |
|
|
|
|
|
Tony
|
|
|
|
|
Mr. T
|
Posted: Thu Jun 22, 2006 12:27 am Post subject: Alex's Opinion |
|
|
I didn't understand a single thing you just said. Care to link me to the necessary tutorials? |
|
|
|
|
|
Tony
|
|
|
|
|
Sponsor Sponsor
|
|
|
Mr. T
|
Posted: Sat Jun 24, 2006 9:52 pm Post subject: Alex's Opinion |
|
|
I read over the tutorial, but I'm still not sure how pointers will allow me to update a flexible array that has been passed into a procedure through a paramater...? |
|
|
|
|
|
|
|