WindowWidth = DisplayWidth WindowHeight = DisplayHeight global winx , winy global scrnx , scrny , eye , you , thick global state , speed winx = WindowWidth winy = WindowHeight thick = 5 scrnx$ = str$( 350 ) prompt "Screen width in mm =" ; scrnx$ scrnx = val( scrnx$ ) scrny$ = str$( 280 ) prompt "Screen height in mm =" ; scrny$ scrny = val( scrny$ ) you$ = str$( 350 ) prompt "You - screen in mm =" ; you$ you = val( you$ ) eye = 70 ''pupil distance in mm dim pen( 6 ) , cam( 6 ) , zone( 20 , 7 ) global comp , ball , human , h.p , c.p global h.x , h.y , h.z , h.dx , h.dy global c.dx , c.dy global b.x , b.y , b.z , b.dx , b.dy , b.dz , b.size ball = 1 comp = 2 human = 3 inqbe = 4 global qbesize : qbesize = 70 b.size = 10 h.z = qbesize - b.size speed = 1 b.dx = sign( rnd(0) * 2 - 1 ) * speed b.dy = sign( rnd(0) * 2 - 1 ) * speed b.dz = 0 - speed call zoneblock human , h.x,h.y,h.z , 20,20,20 call zoneblock comp , 0,0,h.z , 20,20,20 call zonesphere bal , b.x,b.y,b.z , b.size nomainwin open "anaglyph 3D pong" for graphics as #m #m "trapclose [quit]" #m "fill black" #m "when mouseMove [mmove]" #m "setfocus" #m "rule "; _R2_MERGEPEN call scene timer 100 , [tmr] wait end [quit] close #m end [mmove] h.x = MouseX - winx / 2 h.y = MouseY - winy / 2 h.x = h.x * scrnx / winx h.y = 0 - h.y * scrny / winy wait [tmr] if zonehit( human , bal ) then b.dx = sign( zone( human , 0 ) _ - zone( bal , 0 ) ) * speed b.dy = sign( zone( human , 1 ) _ - zone( bal , 1 ) ) * speed b.dz = 0 - abs( b.dz ) end if if zonehit( comp , bal ) then b.dx = sign( zone( comp , 0 ) _ - zone( bal , 0 ) ) * speed b.dy = sign( zone( comp , 1 ) _ - zone( bal , 1 ) ) * speed b.dz = abs( b.dz ) end if if zone( bal , 0 ) < 0 - qbesize + b.size then b.dx = abs( b.dx ) end if if zone( bal , 0 ) > qbesize - b.size then b.dx = 0 - abs( b.dx ) end if if zone( bal , 1 ) < 0 - qbesize + b.size then b.dy = abs( b.dy ) end if if zone( bal , 1 ) > qbesize - b.size then b.dy = 0 - abs( b.dy ) end if if zone( bal , 2 ) < 0 - qbesize + b.size then call zoneplace bal , 0,0,0 c.p = c.p + 1 end if if zone( bal , 2 ) > qbesize + b.size then call zoneplace bal , 0,0,0 h.p = h.p + 1 end if c.dx = sign( zone( bal , 0 ) _ - zone( comp , 0 ) ) * speed * 0.8 c.dy = sign( zone( bal , 1 ) _ - zone( comp , 1 ) ) * speed * 0.8 call zonemove comp , c.dx , c.dy , 0 call zonemove bal , b.dx , b.dy , b.dz call zoneplace human , h.x , h.y , h.z call scene wait function sign( x ) uit = 0 if x < 0 then uit = -1 if x > 0 then uit = 1 sign = uit end function sub scene #m "fill black" call zonedraw human call zonedraw bal call zonedraw comp call cubo 0,0,0 , qbesize,qbesize,qbesize , thick #m "flush" end sub function tox( x , y , z , rl ) ''catch x/0 error if z + you = 0 then tox = 0 ''ofset red or blue o = ( eye / 2 ) / ( z + you ) * you - ( eye / 2 ) o = o * rl ''ofset z + perspertif a = ( x + o ) / ( z + you ) * you ''from mm to pixels tox = winx / 2 + a * winx / scrnx end function function toy( x , y , z ) ''catch x/0 error if z + you = 0 then toy = 0 ''ofset z + perspectif a = y / ( z + you ) * you ''from mm to pixels toy = winy / 2 - a * winy / scrny end function function lenght( x , y , z ) lenght = sqr( x^2 + y^2 + z^2 ) end function sub pixel x , y , z call sphere x , y , z , 3 , 3 end sub sub zonemove no , dx , dy , dz zone( no , 0 ) = zone( no , 0 ) + dx zone( no , 1 ) = zone( no , 1 ) + dy zone( no , 2 ) = zone( no , 2 ) + dz end sub sub zoneplace no , x , y , z zone( no , 0 ) = x zone( no , 1 ) = y zone( no , 2 ) = z end sub sub zoneblock no , x , y , z , dx , dy , dz zone( no , 0 ) = x zone( no , 1 ) = y zone( no , 2 ) = z zone( no , 3 ) = dx zone( no , 4 ) = dy zone( no , 5 ) = dz zone( no , 6 ) = -1 end sub sub zonesphere no , x , y , z , r zone( no , 0 ) = x zone( no , 1 ) = y zone( no , 2 ) = z zone( no , 3 ) = 0 zone( no , 4 ) = 0 zone( no , 5 ) = 0 zone( no , 6 ) = abs( r ) end sub sub zonedraw no if zone( no , 6 ) < 0 then call cubo zone( no , 0 ) _ , zone( no , 1 ) _ , zone( no , 2 ) _ , zone( no , 3 ) _ , zone( no , 4 ) _ , zone( no , 5 ) , thick else call sphere zone( no , 0 ) _ , zone( no , 1 ) _ , zone( no , 2 ) _ , zone( no , 6 ) , thick end if end sub function zonehit( no1 , no2 ) ''zone 1 and zone 2 = block if zone( no1 , 6 ) < 0 _ and zone( no2 , 6 ) < 0 then dx = abs( zone( no1 , 0 ) - zone( no2 , 0 ) ) dy = abs( zone( no1 , 1 ) - zone( no2 , 1 ) ) dz = abs( zone( no1 , 2 ) - zone( no2 , 2 ) ) ax = zone( no1 , 3 ) + zone( no2 , 3 ) ay = zone( no1 , 4 ) + zone( no2 , 4 ) az = zone( no1 , 5 ) + zone( no2 , 5 ) zonehit = dx < ax and dy < ay and dz < ay end if ''zone 1 and zone 2 = sphere if zone( no1 , 6 ) > 0 _ and zone( no2 , 6 ) > 0 then x1 = zone( no1 , 0 ) y1 = zone( no1 , 1 ) z1 = zone( no1 , 2 ) d1 = zone( no1 , 6 ) x2 = zone( no2 , 0 ) y2 = zone( no2 , 1 ) z2 = zone( no2 , 2 ) d2 = zone( no2 , 6 ) dis = sqr( ( x1 - x2 ) ^ 2 _ + ( y1 - y2 ) ^ 2 _ + ( z1 - z2 ) ^ 2 ) zonehit = dis < ( d1 + d2 ) end if ''zone 1 = sphere zone 2 = block if zone( no1 , 6 ) > 0 _ and zone( no2 , 6 ) < 0 then h = no1 no1 = no2 no2 = h end if ''zone 1 = block zone 2 = sphere diss = 0 x = 0 : y = 1 : z = 2 : dx = 3 : dy = 4 : dz = 5 : r = 6 if zone( no2 , x ) _ < ( zone( no1 , x ) - zone( no1 , dx ) ) then diss = diss + ( zone( no2 , x ) _ - ( zone( no1 , x ) - zone( no1 , dx ) ) ) ^ 2 else if zone( no2 , x ) _ > ( zone( no1 , x ) + zone( no1 , dx ) ) then diss = diss + ( zone( no2 , x ) _ - ( zone( no1 , x ) + zone( no1 , dx ) ) ) ^ 2 end if end if if zone( no2 , y ) _ < ( zone( no1 , y ) - zone( no1 , dy ) ) then diss = diss + ( zone( no2 , y ) _ - ( zone( no1 , y ) - zone( no1 , dy ) ) ) ^ 2 else if zone( no2 , y ) _ > ( zone( no1 , y ) + zone( no1 , dy ) ) then diss = diss + ( zone( no2 , y ) _ - ( zone( no1 , y ) + zone( no1 , dy ) ) ) ^ 2 end if end if if zone( no2 , z ) _ < ( zone( no1 , z ) - zone( no1 , dz ) ) then diss = diss + ( zone( no2 , z ) _ - ( zone( no1 , z ) - zone( no1 , dz ) ) ) ^ 2 else if zone( no2 , z ) _ > ( zone( no1 , z ) + zone( no1 , dz ) ) then diss = diss + ( zone( no2 , z ) _ - ( zone( no1 , z ) + zone( no1 , dz ) ) ) ^ 2 end if end if zonehit = diss < zone( no2 , 6 ) ^ 2 end function sub sphere x , y , z , d , t a = tox( x , y , z , 1 ) b = toy( x , y , z ) d = d / ( z + winx ) * winx t = t / ( z + winx ) * winx #m "size " ; t #m "goto " ; a ; " " ; b #m "down" #m "color red" #m "circle " ; d #m "up" a = tox( x , y , z , -1 ) #m "goto " ; a ; " " ; b #m "down" #m "color blue" #m "circle " ; d #m "up" end sub sub lino x1 , y1 , z1 , x2 , y2 , z2 , thick #m "size "; thick ax = tox( x1 , y1 , z1 , 1 ) ay = toy( x1 , y1 , z1 ) bx = tox( x2 , y2 , z2 , 1 ) by = toy( x2 , y2 , z2 ) #m "down" #m "color red" #m "line " ; ax ; " " ; ay ; " " ; bx ; " " ; by #m "up" ax = tox( x1 , y1 , z1 , -1 ) ay = toy( x1 , y1 , z1 ) bx = tox( x2 , y2 , z2 , -1 ) by = toy( x2 , y2 , z2 ) #m "down" #m "color blue" #m "line " ; ax ; " " ; ay ; " " ; bx ; " " ; by #m "up" end sub sub cubo mx , my , mz , dx , dy , dz , thick call lino mx+dx,my+dy,mz+dz,mx-dx,my+dy,mz+dz,thick call lino mx+dx,my+dy,mz-dz,mx-dx,my+dy,mz-dz,thick call lino mx+dx,my-dy,mz+dz,mx-dx,my-dy,mz+dz,thick call lino mx+dx,my-dy,mz-dz,mx-dx,my-dy,mz-dz,thick call lino mx+dx,my+dy,mz+dz,mx+dx,my-dy,mz+dz,thick call lino mx+dx,my+dy,mz-dz,mx+dx,my-dy,mz-dz,thick call lino mx-dx,my+dy,mz+dz,mx-dx,my-dy,mz+dz,thick call lino mx-dx,my+dy,mz-dz,mx-dx,my-dy,mz-dz,thick call lino mx+dx,my+dy,mz+dz,mx+dx,my+dy,mz-dz,thick call lino mx+dx,my-dy,mz+dz,mx+dx,my-dy,mz-dz,thick call lino mx-dx,my+dy,mz+dz,mx-dx,my+dy,mz-dz,thick call lino mx-dx,my-dy,mz+dz,mx-dx,my-dy,mz-dz,thick end sub