Include "xors3d.bb"
Global pivot,camera,mxs#,mys#,light,timeruno#
Const BallsNumber=20
;position,speed vector
Type ball_data
Field id
Field x#
Field y#
Field z#
Field vx#
Field vy#
Field vz#
End Type
xGraphics3D(640,480, 32,0, 0)
Create_Table()
Create_Balls(BallsNumber)
pivot=xCreatePivot()
camera = xCreateCamera(pivot)
light=xCreateLight()
xPositionEntity light,200,200,200
timeruno=MilliSecs()+2
While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))
timeruno=xMillisecs()
;добавление гравитации
gravitation#=0.0001
For biliard.ball_data =Each ball_data
biliard\vy=biliard\vy-gravitation
Next
;firststep
For biliard.ball_data =Each ball_data
biliard\x=biliard\x+biliard\vx
biliard\y=biliard\y+biliard\vy
biliard\z=biliard\z+biliard\vz
;сила трения
friction#=0.0001
If biliard\y>0.001 Then friction#=0
If biliard\vx>0 Then biliard\vx=biliard\vx-friction Else biliard\vx=biliard\vx+friction
If Abs(biliard\vx)<=friction Then biliard\vx=0
If biliard\vz>0 Then biliard\vz=biliard\vz-friction Else biliard\vz=biliard\vz+friction
If Abs(biliard\vz)<=friction Then biliard\vz=0
;выполнение столкновений со столом.
If biliard\y<=0 Then biliard\vy=-0.5*biliard\vy : biliard\y=-biliard\y
;выполнение столкновений со стенками север-юг
If Abs(biliard\z)>=39 Then
biliard\vz=-0.97*biliard\vz
If biliard\z>0 Then
biliard\z=39-(biliard\z-39)
Else
biliard\z=-39-(biliard\z+39)
EndIf
EndIf
;выполнение столкновений со стенками восток запад
If Abs(biliard\x)>=24 Then
biliard\vx=-0.97*biliard\vx
If biliard\x>0 Then
biliard\x=24-(biliard\x-24)
Else
biliard\x=-24-(biliard\x+24)
EndIf
EndIf
Next
For biliard.ball_data =Each ball_data
xPositionEntity biliard\id,biliard\x,biliard\y,biliard\z,1
Next
xRenderWorld()
xText 100,120,xMillisecs()-timeruno
xText 100,100,xMillisecs()
xText 100,110,MilliSecs()
Control(0.1,1)
xFlip()
Wend
End
Function Create_Balls(number)
For i=0 To number
biliard.ball_data = New ball_data
bb=xCreateSphere()
biliard\id=bb
biliard\x=-18.0+i*2
biliard\y=40
biliard\z=-20+i*2
biliard\vz=.1
biliard\vx=-.1
xPositionEntity biliard\id,biliard\x,biliard\y,biliard\z
xEntityColor biliard\id,Rand(0,255),Rand(0,255),Rand(0,255)
xEntityPickMode biliard\id,2,1,0
Next
End Function
Function Create_Table()
;base
bb=xCreateCube()
xEntityPickMode bb,2,1,0
xPositionEntity bb,0,-2,0
xScaleEntity bb,25,1,40
xEntityColor bb,0,128,0
xEntityBox bb,0,0,0,50,1,80
;south
bb=xCreateCube()
xEntityPickMode bb,2,1,0
xPositionEntity bb,0,-1,-41
xScaleEntity bb,23,2,1
xEntityColor bb,128,64,0
;north
bb=xCreateCube()
xEntityPickMode bb,2,1,0
xPositionEntity bb,0,-1,41
xScaleEntity bb,23,2,1
xEntityColor bb,128,64,0
;west
bb=xCreateCube()
xEntityPickMode bb,2,1,0
xPositionEntity bb,-26,-1,0
xScaleEntity bb,1,2,38
xEntityColor bb,128,64,0
;east
bb=xCreateCube()
xEntityPickMode bb,2,1,0
xPositionEntity bb,26,-1,0
xScaleEntity bb,1,2,38
xEntityColor bb,128,64,0
End Function
Function control(speed#,mousesensitivity#)
If xKeyDown(key_1) Then xWireframe(True) Else xWireframe(False)
xText(10, 10, "FPS: " +xGetFPS())
xText(10,30,"Trisinview: "+xTrisRendered ())
mxs#=mxs#+(xMouseXSpeed()/5.0)
mys#=mys#+(xMouseYSpeed()/5.0)
xRotateEntity (camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0)
xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/2
If xKeyDown(17) Or xKeyDown(200) xMoveEntity camera,0,0,speed#
If xKeyDown(31) Or xKeyDown(20

xMoveEntity camera,0,0,-speed#
If xKeyDown(30) Or xKeyDown(203) xMoveEntity camera,-speed#,0,0
If xKeyDown(32) Or xKeyDown(205) xMoveEntity camera,speed#,0,0
xPositionEntity pivot,xEntityX#(camera,1),xEntityY#(camera,1),xEnt ityZ#(camera,1)
xPositionEntity camera,0,0,0
End Function