
-----------------------------------
petree08
Thu Oct 26, 2006 9:03 am

Fun ball physics
-----------------------------------
In this program there are 4 balls.  If you bump into a ball with your mouse then the ball you hit will bounce off of it.  Eventually all the balls will start bouncing off each other and the walls.
you can stop the balls by pressing the keys ...

1, 2, 3, 4, 5 




var X1, Y1, X2, Y2, X3, Y3 : int
var X4, Y4 : int
var X, Y, Clicker : int % mouse
var Dx1, Dy1, Dx2, Dy2, Dx3, Dy3 : int := 0
var Dx4, Dy4 : int := 0
var Size : int := 15
var Key : array char of boolean
randint (X1, 20, maxx - 20)
randint (X2, 20, maxx - 20)
randint (X3, 20, maxx - 20)
randint (X4, 20, maxx - 20)
randint (Y1, 20, maxy - 20)
randint (Y2, 20, maxy - 20)
randint (Y3, 20, maxy - 20)
randint (Y4, 20, maxy - 20)

setscreen ("graphics:max,max,nobuttonbar,offscreenonly")
colorback (7)
loop
    cls
    X1 += Dx1
    Y1 += Dy1

    X2 += Dx2
    Y2 += Dy2

    X3 += Dx3
    Y3 += Dy3
    X4 += Dx4
    Y4 += Dy4

    mousewhere (X, Y, Clicker)
    if Clicker = 1 then
        Size := Size + 1
    else
        if Size > 15 then
            Size := Size - 1
        end if
    end if
    Input.KeyDown (Key)
    if Key ('1') then
        Dx1 := 0
        Dy1 := 0
    end if
    if Key ('2') then
        Dx2 := 0
        Dy2 := 0
    end if
    if Key ('3') then
        Dx3 := 0
        Dy3 := 0
    end if
    if Key ('4') then
        Dx1 := 0
        Dy1 := 0
        Dx2 := 0
        Dy2 := 0
        Dx3 := 0
        Dy3 := 0
        Dx4 := 0
        Dy4 := 0
    end if
    drawline (X, Y, X1, Y1, 10)
    drawline (X, Y, X2, Y2, 10)
    drawline (X, Y, X3, Y3, 10)
    drawline (X, Y, X4, Y4, 10)
    drawfilloval (X, Y, 5, 5, 10)
    drawoval (X, Y, Size, Size, 10)
    drawfilloval (X1, Y1, 5, 5, 12)
    drawfilloval (X2, Y2, 5, 5, 12)
    drawfilloval (X3, Y3, 5, 5, 12)
    drawfilloval (X4, Y4, 5, 5, 12)
    drawoval (X1, Y1, 15, 15, 12)
    drawoval (X2, Y2, 15, 15, 12)
    drawoval (X3, Y3, 15, 15, 12)
    drawoval (X4, Y4, 15, 15, 12)
    if X1 + 15 >= maxx or X1 - 15 = maxy or Y1 - 15 = maxx or X2 - 15 = maxy or Y2 - 15 = maxx or X3 - 15 = maxy or Y3 - 15 = maxx or X4 - 15 = maxy or Y4 - 15  X and X1 - 30 - Size < X and Y1 + 15 + Size > Y and Y1 - 15 - Size < Y then
        Dx1 := (X1 - X) div (Size div 3)
        Dy1 := (Y1 - Y) div (Size div 3)
    end if


    if X2 + 15 + Size > X and X2 - 30 - Size < X and Y2 + 15 + Size > Y and Y2 - 15 - Size < Y then
        Dx2 := (X2 - X) div (Size div 3)
        Dy2 := (Y2 - Y) div (Size div 3)
    end if

    if X3 + 15 + Size > X and X3 - 30 - Size < X and Y3 + 15 + Size > Y and Y3 - 15 - Size < Y then
        Dx3 := (X3 - X) div (Size div 3)
        Dy3 := (Y3 - Y) div (Size div 3)
    end if


    if X4 + 15 + Size > X and X4 - 30 - Size < X and Y4 + 15 + Size > Y and Y4 - 15 - Size < Y then
        Dx4 := (X4 - X) div (Size div 3)
        Dy4 := (Y4 - Y) div (Size div 3)
    end if

    if X3 + 30 > X1 and X3 - 30 < X1 and Y3 + 30 > Y1 and Y3 - 30 < Y1 then
        Dx3 := (X3 - X1) div 4
        Dy3 := (Y3 - Y1) div 4
        Dx1 := (X1 - X3) div 4
        Dy1 := (Y1 - Y3) div 4
    end if


    if X3 + 30 > X2 and X3 - 30 < X2 and Y3 + 30 > Y2 and Y3 - 30 < Y2 then
        Dx3 := (X3 - X2) div 4
        Dy3 := (Y3 - Y2) div 4
        Dx2 := (X2 - X3) div 4
        Dy2 := (Y2 - Y3) div 4
    end if

    if X1 + 30 > X2 and X1 - 30 < X2 and Y1 + 30 > Y2 and Y1 - 30 < Y2 then
        Dx1 := (X1 - X2) div 4
        Dy1 := (Y1 - Y2) div 4
        Dx2 := (X2 - X1) div 4
        Dy2 := (Y2 - Y1) div 4
    end if



    if X4 + 30 > X2 and X4 - 30 < X2 and Y4 + 30 > Y2 and Y4 - 30 < Y2 then
        Dx4 := (X4 - X2) div 4
        Dy4 := (Y4 - Y2) div 4
        Dx2 := (X2 - X4) div 4
        Dy2 := (Y2 - Y4) div 4
    end if

    if X4 + 30 > X1 and X4 - 30 < X1 and Y4 + 30 > Y1 and Y4 - 30 < Y1 then
        Dx4 := (X4 - X1) div 4
        Dy4 := (Y4 - Y1) div 4
        Dx1 := (X1 - X4) div 4
        Dy1 := (Y1 - Y4) div 4
    end if

    if X4 + 30 > X3 and X4 - 30 < X3 and Y4 + 30 > Y3 and Y4 - 30 < Y3 then
        Dx4 := (X4 - X3) div 4
        Dy4 := (Y4 - Y3) div 4
        Dx3 := (X3 - X4) div 4
        Dy3 := (Y3 - Y4) div 4
    end if



    drawline (X1, Y1, X2, Y2, 12)
    drawline (X1, Y1, X3, Y3, 12)
    drawline (X2, Y2, X3, Y3, 12)
    drawline (X1, Y1, X4, Y4, 12)
    drawline (X2, Y2, X4, Y4, 12)
    drawline (X3, Y3, X4, Y4, 12)


    % if balls get stuck
    if X1 > maxx then
        X1 := maxx - 30
    elsif X1 < 1 then
        X1 := 30
    end if
    if Y1 > maxy then
        Y1 := maxy - 30
    elsif Y1 < 1 then
        Y1 := 30
    end if

    if X2 > maxx then
        X2 := maxx - 30
    elsif X2 < 1 then
        X2 := 30
    end if
    if Y2 > maxy then
        Y2 := maxy - 30
    elsif Y2 < 1 then
        Y2 := 30
    end if

    if X3 > maxx then
        X3 := maxx - 30
    elsif X3 < 1 then
        X3 := 30
    end if
    if Y3 > maxy then
        Y3 := maxy - 30
    elsif Y3 < 1 then
        Y3 := 30
    end if

    View.Update
end loop



-----------------------------------
zylum
Thu Oct 26, 2006 11:40 pm


-----------------------------------
pretty cool :wink: although i did notice that your collision detection is a bit off. i just skimmed through your code and it doesnt seem like you are using circular collision detection...

if youre interested, these tutorials will help you write a program that does the same thing but you will write it faster, with less effort and it will your program will be significantly shorter:

procedures: http://www.compsci.ca/v2/viewtopic.php?t=407

records: http://www.compsci.ca/v2/viewtopic.php?t=9636

-----------------------------------
Mathwiz
Tue Oct 31, 2006 9:00 am

Re: Fun ball physics
-----------------------------------
that was cool

:roll:  :borg:  :borg: 



In this program there are 4 balls.  If you bump into a ball with your mouse then the ball you hit will bounce off of it.  Eventually all the balls will start bouncing off each other and the walls.
you can stop the balls by pressing the keys ...

1, 2, 3, 4, 5 




var X1, Y1, X2, Y2, X3, Y3 : int
var X4, Y4 : int
var X, Y, Clicker : int % mouse
var Dx1, Dy1, Dx2, Dy2, Dx3, Dy3 : int := 0
var Dx4, Dy4 : int := 0
var Size : int := 15
var Key : array char of boolean
randint (X1, 20, maxx - 20)
randint (X2, 20, maxx - 20)
randint (X3, 20, maxx - 20)
randint (X4, 20, maxx - 20)
randint (Y1, 20, maxy - 20)
randint (Y2, 20, maxy - 20)
randint (Y3, 20, maxy - 20)
randint (Y4, 20, maxy - 20)

setscreen ("graphics:max,max,nobuttonbar,offscreenonly")
colorback (7)
loop
    cls
    X1 += Dx1
    Y1 += Dy1

    X2 += Dx2
    Y2 += Dy2

    X3 += Dx3
    Y3 += Dy3
    X4 += Dx4
    Y4 += Dy4

    mousewhere (X, Y, Clicker)
    if Clicker = 1 then

        Size := Size + 1
    else
        if Size > 15 then
            Size := Size - 1
        end if
    end if
    Input.KeyDown (Key)
    if Key ('1') then
        Dx1 := 0
        Dy1 := 0
    end if
    if Key ('2') then
        Dx2 := 0
        Dy2 := 0
    end if
    if Key ('3') then
        Dx3 := 0
        Dy3 := 0
    end if
    if Key ('4') then
        Dx1 := 0
        Dy1 := 0
        Dx2 := 0
        Dy2 := 0
        Dx3 := 0
        Dy3 := 0
        Dx4 := 0
        Dy4 := 0
    end if
    drawline (X, Y, X1, Y1, 10)
    drawline (X, Y, X2, Y2, 10)
    drawline (X, Y, X3, Y3, 10)
    drawline (X, Y, X4, Y4, 10)
    drawfilloval (X, Y, 5, 5, 10)
    drawoval (X, Y, Size, Size, 10)
    drawfilloval (X1, Y1, 5, 5, 12)
    drawfilloval (X2, Y2, 5, 5, 12)
    drawfilloval (X3, Y3, 5, 5, 12)
    drawfilloval (X4, Y4, 5, 5, 12)
    drawoval (X1, Y1, 15, 15, 12)
    drawoval (X2, Y2, 15, 15, 12)
    drawoval (X3, Y3, 15, 15, 12)
    drawoval (X4, Y4, 15, 15, 12)
    if X1 + 15 >= maxx or X1 - 15 = maxy or Y1 - 15 = maxx or X2 - 15 = maxy or Y2 - 15 = maxx or X3 - 15 = maxy or Y3 - 15 = maxx or X4 - 15 = maxy or Y4 - 15  X and X1 - 30 - Size < X and Y1 + 15 + Size > Y and Y1 - 15 - Size < Y then
        Dx1 := (X1 - X) div (Size div 3)
        Dy1 := (Y1 - Y) div (Size div 3)
    end if


    if X2 + 15 + Size > X and X2 - 30 - Size < X and Y2 + 15 + Size > Y and Y2 - 15 - Size < Y then
        Dx2 := (X2 - X) div (Size div 3)
        Dy2 := (Y2 - Y) div (Size div 3)
    end if

    if X3 + 15 + Size > X and X3 - 30 - Size < X and Y3 + 15 + Size > Y and Y3 - 15 - Size < Y then
        Dx3 := (X3 - X) div (Size div 3)
        Dy3 := (Y3 - Y) div (Size div 3)
    end if


    if X4 + 15 + Size > X and X4 - 30 - Size < X and Y4 + 15 + Size > Y and Y4 - 15 - Size < Y then
        Dx4 := (X4 - X) div (Size div 3)
        Dy4 := (Y4 - Y) div (Size div 3)
    end if

    if X3 + 30 > X1 and X3 - 30 < X1 and Y3 + 30 > Y1 and Y3 - 30 < Y1 then
        Dx3 := (X3 - X1) div 4
        Dy3 := (Y3 - Y1) div 4
        Dx1 := (X1 - X3) div 4
        Dy1 := (Y1 - Y3) div 4
    end if


    if X3 + 30 > X2 and X3 - 30 < X2 and Y3 + 30 > Y2 and Y3 - 30 < Y2 then
        Dx3 := (X3 - X2) div 4
        Dy3 := (Y3 - Y2) div 4
        Dx2 := (X2 - X3) div 4
        Dy2 := (Y2 - Y3) div 4
    end if

    if X1 + 30 > X2 and X1 - 30 < X2 and Y1 + 30 > Y2 and Y1 - 30 < Y2 then
        Dx1 := (X1 - X2) div 4
        Dy1 := (Y1 - Y2) div 4
        Dx2 := (X2 - X1) div 4
        Dy2 := (Y2 - Y1) div 4
    end if



    if X4 + 30 > X2 and X4 - 30 < X2 and Y4 + 30 > Y2 and Y4 - 30 < Y2 then
        Dx4 := (X4 - X2) div 4
        Dy4 := (Y4 - Y2) div 4
        Dx2 := (X2 - X4) div 4
        Dy2 := (Y2 - Y4) div 4
    end if

    if X4 + 30 > X1 and X4 - 30 < X1 and Y4 + 30 > Y1 and Y4 - 30 < Y1 then
        Dx4 := (X4 - X1) div 4
        Dy4 := (Y4 - Y1) div 4
        Dx1 := (X1 - X4) div 4
        Dy1 := (Y1 - Y4) div 4
    end if

    if X4 + 30 > X3 and X4 - 30 < X3 and Y4 + 30 > Y3 and Y4 - 30 < Y3 then
        Dx4 := (X4 - X3) div 4
        Dy4 := (Y4 - Y3) div 4
        Dx3 := (X3 - X4) div 4
        Dy3 := (Y3 - Y4) div 4
    end if



    drawline (X1, Y1, X2, Y2, 12)
    drawline (X1, Y1, X3, Y3, 12)
    drawline (X2, Y2, X3, Y3, 12)
    drawline (X1, Y1, X4, Y4, 12)
    drawline (X2, Y2, X4, Y4, 12)
    drawline (X3, Y3, X4, Y4, 12)


    % if balls get stuck
    if X1 > maxx then
        X1 := maxx - 30
    elsif X1 < 1 then
        X1 := 30
    end if
    if Y1 > maxy then
        Y1 := maxy - 30
    elsif Y1 < 1 then
        Y1 := 30
    end if

    if X2 > maxx then
        X2 := maxx - 30
    elsif X2 < 1 then
        X2 := 30
    end if
    if Y2 > maxy then
        Y2 := maxy - 30
    elsif Y2 < 1 then
        Y2 := 30
    end if

    if X3 > maxx then
        X3 := maxx - 30
    elsif X3 < 1 then
        X3 := 30
    end if
    if Y3 > maxy then
        Y3 := maxy - 30
    elsif Y3 < 1 then
        Y3 := 30
    end if

    View.Update
end loop

 :roll:  :borg:  :borg:
