
-----------------------------------
Paul
Sun Feb 15, 2004 10:53 pm

Many Balls bouncing
-----------------------------------
Can anyone show me an easy way to have many balls bouncing around in a box, preferably without using alot of different variables and not alot of flashing?

-----------------------------------
Homer_simpson
Sun Feb 15, 2004 11:26 pm


-----------------------------------
check out my particle enegine with physics post...

-----------------------------------
Cervantes
Mon Feb 16, 2004 3:52 pm


-----------------------------------
Well I think he wants something simpler than that :?
You need to learn to use arrays. If you can't understand them from this code and from the help file and any tutorials on here (You'll get it from all those I'm sude) PM me or ask in this thread. :)

var howmany : int
put "How many balls? : " ..
get howmany
var x, y, dx, dy : array 1 .. howmany of int
for i : 1 .. howmany
    dx (i) := Rand.Int (-4, 4)
    dy (i) := Rand.Int (-4, 4)
    x (i) := maxx div 2
    y (i) := maxy div 2
end for
setscreen ("offscreenonly")
cls
loop
    cls
    for k : 1 .. howmany
        x (k) += dx (k)
        y (k) += dy (k)
        Draw.FillOval (x (k), y (k), 5, 5, brightred)
    end for
    View.Update
    delay (5)
end loop


-----------------------------------
zylum
Mon Feb 16, 2004 4:03 pm


-----------------------------------
you forgot to add the bit of code which checks whether the ball has reached the screen...


x (k) += dx (k)
y (k) += dy (k)
if x (k) < 0 or x (k) > maxx then
    dx (k) *= -1
end if
if y (k) < 0 or y (k) > maxy then
    dx (k) *= -1
end if


-----------------------------------
Cervantes
Mon Feb 16, 2004 4:08 pm


-----------------------------------
:roll:
Paul is a very compitent programmer who can do that himself...
All he needed to know was how to use an array.

-----------------------------------
we64
Mon Feb 16, 2004 6:37 pm


-----------------------------------
I changed it based on Cervantes' code... Now it really bouncing around screen...

var howmany : int
put "How many balls? : " ..
get howmany
var x, y, dx, dy : array 1 .. howmany of int
for i : 1 .. howmany
    dx (i) := Rand.Int (-4, 4)
    dy (i) := Rand.Int (-4, 4)
    x (i) := maxx div 2
    y (i) := maxy div 2
end for
setscreen ("offscreenonly")
cls
loop
    cls
    for k : 1 .. howmany
        x (k) += dx (k)
        y (k) += dy (k)
        Draw.FillOval (x (k), y (k), 5, 5, brightred)
        if x (k) >= maxx or x (k) = maxy or y (k)  maxx - radius then
            dx (i) := -dx (i)
        end if
        if y (i) + dy (i) < radius or
                y (i) + dy (i) > maxy - radius then
            dy (i) := -dy (i)
        end if
        x (i) := x (i) + dx (i)
        y (i) := y (i) + dy (i)
        Draw.FillOval (x (i), y (i), radius, radius, clr (i))
    end for
    View.Update
    delay (1)
end loop
hope you like!

-----------------------------------
Cervantes
Sat Mar 27, 2004 10:13 am


-----------------------------------

if x (i) > maxx - 20 - ballradius then


that code simply tells if the x position of ball (i) has hit the wall or not. 

xmen, how did you last long enough to notice that things speed up or slow down!! you must have made some alterations on my code, because I can't get past 7 of those guys :P  I guess it does depend on the speed of your computer though. I'm on 1.6ghz 512 mb of ram.  What do you have?  If your on a relatively slow computer it probably explains why the speed of the balls change: because as more balls are added the program has to go through the for loops more times, taking up more time.

-----------------------------------
xmen
Sat Mar 27, 2004 7:03 pm


-----------------------------------
my computer is 1.8 P4 / 256 ram.....well all i did was decrease the # of max balls (in the beginning of program) to like 4, n take out the red ball, everytime i run the program its different

sometimes the first blue ball goes very slow, then the second ball goes very fast, n if any of the balls hit the slow one, the slow one turns fast while the fast one turn slow.....etc

also if i make the size of the ball bigger, once they collide there are some bugs there too, n sometimes these balls just slide along the sides for some reason

i kno these are pretty simple n stupid questions but i reli need answers for them......cuz later on im gonna change the balls into happy faces n make this as screensaver (as one of my assignment).........thnx

-----------------------------------
Cervantes
Sat Mar 27, 2004 7:42 pm


-----------------------------------
You can use my code as a reference, but don't cut and paste and change a few things to make it look like your own code.  Just a warning, I don't know if you were planning on doing that or not.
Anyways, take a look at this part of the program:

for i : 1 .. totalballs
    x (i) := Rand.Int (20 + ballradius, maxx - 20 - ballradius)
    y (i) := Rand.Int (20 + ballradius, maxy - 20 - ballradius)
    dx (i) := Rand.Int (-3, 3)
    dy (i) := Rand.Int (-3, 3)
end for


This explains why certain balls begin at a faster pace then others.  dx represents the balls speed along the x axis, and dy represents the balls speed along the y axis.  
later, this code appears:

x (i) += dx (i)
y (i) += dy (i)

that code is inside the main loop, so every time that code executes, the value of dx is added to x, and dy to y.  
Because dx and dy are created using Rand.Int, the balls begin with different speeds.  
As for when they collide, the balls transfer energy between each other, speeding one up and slowing the other down.
you should note though that the collision data in this is rather messed up though.

-----------------------------------
xmen
Sat Mar 27, 2004 11:10 pm


-----------------------------------
Cervantes hav u tried letting ur program run for awhile (with like 6 balls, delete the red one) n get this error saying "array subscript is out of range" ?? 

how do i fix that??

-----------------------------------
Cervantes
Sun Mar 28, 2004 10:30 am


-----------------------------------
you fix that by increasing the totalballs variable at the top of the program.

-----------------------------------
xmen
Sun Mar 28, 2004 11:58 am


-----------------------------------
but wut if i only want 6 balls appearin in total??
well wut ive tried was set the totalballs to a large nuber (like 50, so that the program can continue longer) n then i put exit when i=7 to the part of actually drawin the balls

this worked completely fine (only 6 balls appeared) BUT if i was to leave the program on longer, it'll laaaaaaaaaaaaaaaggggggg like crazy, not cuz of my system, it was bcuz of the colliding part of this program was still calculating stuffs using the totalballs ive set (50) 

so is there any way i can hav this program run forever with only like 6 balls but no lag afterwards??

-----------------------------------
Cervantes
Sun Mar 28, 2004 12:32 pm


-----------------------------------
uh-huh.  all you do is set totalballs to 6 and comment out the bit about the timer.

-----------------------------------
xmen
Sun Mar 28, 2004 2:01 pm


-----------------------------------
ok thnx

sry but one last question.......u see rite now im making screensaverS for an assignment. it starts with a "menu" (just simply with GUI buttons) for viewing the 5 screensavers, so the first button is screen 1 n etc

but the problem is, if i was to copynpaste all 5 screensavers' codes and complie them into one program for this assignment, im thinking that i'll lag quite alot (especially with school computers). so i justwanna ask u if theres a command (for GUI button procedure) to read n run another turing file/program once i click GUI button 1,2,3...... so i'll hav 6 programs
with 5 screensavers and one "menu" page

-----------------------------------
Cervantes
Sun Mar 28, 2004 6:57 pm


-----------------------------------
F10 on include

-----------------------------------
Homer_simpson
Mon Mar 29, 2004 2:57 am


-----------------------------------
I changed it based on Cervantes' code... Now it really bouncing around screen...

var howmany : int
put "How many balls? : " ..
get howmany
var x, y, dx, dy : array 1 .. howmany of int
for i : 1 .. howmany
    dx (i) := Rand.Int (-4, 4)
    dy (i) := Rand.Int (-4, 4)
    x (i) := maxx div 2
    y (i) := maxy div 2
end for
setscreen ("offscreenonly")
cls
loop
    cls
    for k : 1 .. howmany
        x (k) += dx (k)
        y (k) += dy (k)
        Draw.FillOval (x (k), y (k), 5, 5, brightred)
        if x (k) >= maxx or x (k) = maxy or y (k) 