Показать сообщение отдельно
Старый 06.08.2011, 21:40   #196
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Прикольный глюк

...
While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))
timeruno=xMillisecs()
...
xRenderWorld()
xText 100,120,xMillisecs()-timeruno
...
Печатает иногда... отрицательные значения. Кроме делэя и вэйттаймера это чем-нить лечится?

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
(Offline)
 
Ответить с цитированием