| ..here is solution for your nightmares..enjoy.. 
 
 
Graphics3D 1280,1024,32,1
; ********************************* GLOBALS ****************************
Global midw,midh,disctex,boxtex,grasstex
Global g_Camera,player,player_piv,hat
Global camdistance#=10,camheight#=5
Global on_platform=0
Global picklength#=.5
Global pictentity	
Global gravity#=.005
Global turnspeed#,lateral_speed#,speed#,pxvel#,pyvel#,pzvel#,pyspin# ; player velocities
Global jumping=1
Global camdist_to_player#
Global fps
; Tweakable Values 
Const k_HDRTextureSize 	= 128		; Blur texture size, must be power of 2
Const k_HDRMotionZoom#	= 1.042		; The amount the blur sprite scales
Const k_HDRBlurFeedBack = 220		; 0 - 255 The amount of previous frame to feedback
Const k_HDRBlurFilter	= 100		; 0 - 255 The amount of the filter to overlay (additive) to the scene
Const k_HDRZSpritePos#	= 1.1
Const k_HDRSpriteOffs#	= 0.001
; Globals //////////////////////////////////////////////////////////////////////
Global g_BlurTex
Global g_BlurSprite
Type platform
	Field entity,brush
	Field startX#,starty#,startz#,xdist#,ydist#,zdist#,xspeed#,yspeed#,zspeed#,startdelay#,enddelay#
	Field yvel#,xvel#,zvel#,yspin#,mx#,my#
	Field xdamp#,ydamp#,zdamp#
	Field xdirection,ydirection,zdirection
	Field xstartdelaycounter,xenddelaycounter
	Field ystartdelaycounter,yenddelaycounter
	Field zstartdelaycounter,zenddelaycounter
End Type
SeedRnd MilliSecs
; CREATE OUR PLATFORMS
; (startXposition#,y#,z#,  xdist,Yd#,Zd#,  xspd#,yspd#,zspd#, xdamp#,ydamp#, zdamp, startdelay#,enddelay#, yspin# ,SHAPE_OF_PLATFORM$)
create_tex() ; go create some textures
; create the platforms for our little demo!
create_platform.platform(5,3,0,5,10,0,.001,.0005,0,.96,.96,.96,0,0,0,"box")
create_platform.platform(-6,6,0,0,30,0,.001,.001,0,.96,.96,.96,100,0,.5,"box")
create_platform.platform(-14,35,-4,0,0,10,0,0,.002,0,0,.96,0,0,0,"box")
create_platform.platform(10,2,10,0,40,0,0,.006,0,0,.9,0,200,50,0,"disc")
create_platform.platform(5,2,-12,0,20,0,0,.00005,0,00,.99,0,0,0,0,"disc")
create_world()
Collisions 1,2,2,2 ; set up collisions between the player and the world
fps=1 
HidePointer
EntityAlpha player,0
EntityAlpha hat,0
.main
; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MAIN LOOP ###################################
While Not KeyDown( 1 )
If KeyHit(59) Then save_bitmap()
; CAMERA MODES
			If KeyHit(2) 
			 	fps=0
				ShowPointer 
				EntityAlpha player,1
				EntityAlpha hat,1
			EndIf	
			
			If KeyHit(3) 
				fps=1 
				HidePointer
				EntityAlpha player,0
				EntityAlpha hat,0
			EndIf
; Line pick up and down to see if we are on or below a platform
	pick_platform.platform()
; move the player
	If fps=1 Then fps_camera()
	If fps=0 Then move_player()
	
; check player to world collisions
	
	
; move the platforms
do_collisions.platform()
	move_platform.platform()
 
	UpdateWorld
	
	RenderWorld
		draw_overlay()	; text and messages to the screen	 
	VWait:Flip False
Wend
End
; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;=====================================
Function create_platform.platform(stX#,sty#,stz#,dX#,dY#,dZ#,xspd#,yspd#,zspd#,xdamp#,ydamp#,zdamp#,sdelay#,edelay#,yspin#,shape$)
; create a platform and position it in the world
foo.platform=New platform
	
	
	
	
	
	If shape$="disc" 
		foo\entity=CreateSphere()
		ScaleMesh foo\entity,3,.5,3
		foo\brush=CreateBrush()
		BrushColor foo\brush,Rnd(100,255),Rnd(100,255),Rnd(100,255)
		BrushTexture foo\brush,disctex
		PaintEntity foo\entity,foo\BRUSH
	EndIf
	If shape$="column" 
		foo\entity=CreateCylinder()
					
		ScaleMesh foo\entity,3,.25,3
		
		foo\brush=CreateBrush()
		BrushColor foo\brush,Rnd(0,255),Rnd(0,255),Rnd(0,255)
		
		BrushTexture foo\brush,boxtex
		PaintEntity foo\entity,foo\BRUSH
	EndIf
	If shape$="box" 
		foo\entity=CreateCube()
		ScaleMesh foo\entity,3,.5,3
		foo\brush=CreateBrush()
		BrushColor foo\brush,Rnd(100,255),Rnd(100,255),Rnd(100,255)
		BrushTexture foo\brush,boxtex
		PaintEntity foo\entity,foo\BRUSH
	EndIf
	
	
	
	SetBuffer BackBuffer()
	
	EntityPickMode foo\entity,2
	EntityType foo\entity,2
	
	foo\startx#=stx#
	foo\starty#=sty#
	foo\startz#=stz#
	foo\xdist#=dx#
	foo\ydist#=dy#
	
	
	foo\zdist#=dz#
	foo\xspeed#=xspd#
	foo\yspeed#=yspd#
	foo\zspeed#=zspd#
	foo\xdamp#=xdamp#
	foo\Ydamp#=Ydamp#
	foo\Zdamp#=Zdamp#
	foo\yspin#=yspin#
	
	foo\startdelay#=sdelay#
	foo\enddelay#=edelay#
	
	
	PositionEntity foo\entity,stx#,sty#,stz#
Return foo.platform
End Function
;=====================================
Function move_platform.platform()
For foo.platform = Each platform
	
	
	
	If foo\xdirection=0 ; if Platform is going down?
		foo\xstartdelaycounter=foo\xstartdelaycounter-1  ; reduce startdelay counter
		 
		If foo\xstartdelaycounter<1		; if startdelay counter is less than 1
				foo\xstartdelaycounter=0 	; set it to 0 (so it will be less than 1 until it is reset)
				foo\xvel#=foo\xvel#-foo\xspeed# 				; accelerate
				TranslateEntity foo\entity,foo\xvel#,0,0 
				If EntityX(foo\entity)<foo\startx#+(foo\xdist#*.25) Then foo\xvel#=foo\xvel#*FOO\xdamp
	
					If EntityX(foo\entity)<foo\startx# 		; if platform reaches the bottom
						foo\xdirection=1						; change direction to UP
						foo\xenddelaycounter=foo\enddelay# 	; reset end delay counter
													
					EndIf
		EndIf
	EndIf	
	If foo\xdirection=1 ; UP
		foo\xenddelaycounter=foo\xenddelaycounter-1
		If foo\xenddelaycounter<1
			
			foo\xenddelaycounter=0
			foo\xvel#=foo\xvel#+foo\xspeed#
	
			If EntityX(foo\entity)>foo\startx#+(foo\xdist#*.75) Then foo\xvel#=foo\xvel#*FOO\xdamp
	
			TranslateEntity foo\entity,foo\xvel#,0,0
				If EntityX(foo\entity)>foo\startx#+foo\xdist#
					;If on_platform=1 Then yvel#=0
					foo\xdirection=0
					
					foo\xstartdelaycounter=foo\startdelay#
	
				EndIf
		EndIf
	EndIf	
	
	
	
	
	
	
	
	
	
	
	
	
	If foo\ydirection=0 ; if Platform is going down?
		foo\yenddelaycounter=foo\yenddelaycounter-1  ; reduce startdelay counter
		 TurnEntity foo\entity,0,foo\yspin#,0
		If foo\yenddelaycounter<1		; if startdelay counter is less than 1
				
				
				
				foo\yenddelaycounter=0 	; set it to 0 (so it will be less than 1 until it is reset)
				foo\yvel#=foo\yvel#-foo\yspeed# 				; accelerate
				TranslateEntity foo\entity,0,foo\yvel#,0 
				
				
				
				If EntityY(foo\entity)<foo\startY#+(foo\ydist#*.25) Then foo\yvel#=foo\yvel#*FOO\ydamp
					
					If EntityY(foo\entity)<foo\starty# 		; if platform reaches the bottom
						foo\ydirection=1						; change direction to UP
						foo\ystartdelaycounter=foo\startdelay#
						
						; stop the platform
					EndIf
		EndIf
	EndIf	
	If foo\ydirection=1 ; UP
		foo\ystartdelaycounter=foo\ystartdelaycounter-1
		TurnEntity foo\entity,0,foo\yspin#,0
		
		If foo\ystartdelaycounter<1
			
			foo\ystartdelaycounter=0
			foo\yvel#=foo\yvel#+foo\yspeed#
			
			
			TranslateEntity foo\entity,0,foo\yvel#,0
				If EntityY(foo\entity)>foo\startY#+(foo\ydist#*.75) Then foo\yvel#=foo\yvel#*FOO\ydamp
				If EntityY(foo\entity)>foo\startY#+foo\ydist#
					;If on_platform=1 Then yvel#=0
					foo\ydirection=0
					;foo\yvel#=0
					
					foo\yenddelaycounter=foo\enddelay# 	; reset end delay counter
				EndIf
		EndIf
	EndIf	
		If foo\zdirection=0 ; 
				foo\zenddelaycounter=foo\zenddelaycounter-1  ; reduce startdelay counter
				 
				If foo\zenddelaycounter<1		; if startdelay counter is less than 1
		
						foo\zenddelaycounter=0 	; set it to 0 (so it will be less than 1 until it is reset)
		
						foo\zvel#=foo\zvel#-foo\zspeed# 				; accelerate
						TranslateEntity foo\entity,0,0,foo\zvel# 
							
							If EntityZ(foo\entity)<foo\startz#+(foo\zdist#*.25) Then foo\zvel#=foo\zvel#*FOO\zdamp
							If EntityZ(foo\entity)<foo\startz# 		; if platform reaches the bottom
								foo\zdirection=1						; change direction to UP
								foo\zstartdelaycounter=foo\startdelay# 	; reset end delay counter
														
							EndIf
				EndIf
			EndIf	
			If foo\zdirection=1 ; UP
				foo\zstartdelaycounter=foo\zstartdelaycounter-1
				If foo\zstartdelaycounter<1
					
					foo\zstartdelaycounter=0
					foo\zvel#=foo\zvel#+foo\zspeed#
			
					TranslateEntity foo\entity,0,0,foo\zvel#
					
					If EntityZ(foo\entity)>foo\startz#+(foo\zdist#*.75) Then foo\zvel#=foo\zvel#*FOO\zdamp
						If EntityZ(foo\entity)>foo\startz#+foo\zdist#
							;If on_platform=1 Then yvel#=0
							foo\zdirection=0
							
							foo\zenddelaycounter=foo\enddelay#
			
						EndIf
				EndIf
			EndIf	
		
Next
Return foo.platform
End Function
;=============================================================================================
Function create_world()
midw=GraphicsWidth()/2
midh=GraphicsHeight()/2
g_Camera=CreateCamera()
MoveEntity g_Camera,0,10,-15
player=CreateSphere(24)
hat=CreateCube(player)
MoveEntity hat,0,1,0
ScaleMesh hat,.1,.1,1
player_piv=CreatePivot(player)
MoveEntity player_piv,0,0,-camdistance
;AddMesh hat,player
MoveEntity player,0,15,-5
EntityColor player,200,0,0
EntityShininess player,.9
EntityRadius player,.7
EntityType player,1		; type 1 = player ------ type 2 = world objects
AmbientLight 50,50,50
lite=CreateLight()
bulb=CreateSphere(6,lite)
EntityFX bulb,1
EntityColor bulb,255,255,0
PositionEntity lite,-20,40,-20
;level = LoadMesh("level.b3d")
level=CreateCube()
EntityFX level,1
EntityType level,2
mirror=CreateMirror()
ptex=CreateTexture(256,256,8)
SetBuffer TextureBuffer(ptex)
Color 40,40,80
Rect 0,0,256,256
Color 255,255,230
Rect 0,0,128,128,1
Color 0,60,0
Rect 1,1,126,126,0
Color 60,60,100
Rect 128,128,128,128,1
Color 0,0,90
Rect 129,129,127,127,0
EntityTexture level,ptex
ScaleTexture ptex,.25,.25
EntityType level,2
EntityAlpha level,.7
SetBuffer BackBuffer()
FlipMesh level
ScaleEntity level,25,25,25
MoveEntity level,0,25,0
End Function
;=============================================================================================
Function move_player()
	; camera smoothing
	smoothcam(player_piv,player,25)
	If KeyDown(57) And jumping=0
		jumping=1
		pyvel#=.2
	EndIf
 
	; boost# could be if you pick up an object it would increase speed for a time
   	If KeyDown(17)=1 Or KeyDown(200) Then speed#=speed#+.005 +boost#
	If KeyDown(30)=1 Or KeyDown(203) Then turnspeed# = turnspeed# + .2 +boost#
	If KeyDown(31)=1 Or KeyDown(208) Then speed# = speed# -(.005 +boost#)
	If KeyDown(32)=1 Or KeyDown(205) Then turnspeed# = turnspeed# - .2 +boost#
	; FRICTION FOR SMOOTH MOVEMENT
	
	turnspeed#=turnspeed#*.94
	speed#=speed#*.95
		
	TurnEntity player,0,turnspeed#+pyspin#,0 ;  turn pivot left --right
	If on_platform=0 Then pyvel#=pyvel#-gravity#
	
	;move the player 
	MoveEntity player,0,pyvel#,speed#
	TranslateEntity player,pxvel#,0,pzvel#
	pxvel#=pxvel#*.9
	pzvel#=pzvel#*.9
	
	PointEntity g_Camera,player
	
	alpha_platforms.platform() ; so we can see the player
	
	
FlushKeys
FlushMouse
	
End Function
;=============================================================================================
Function fps_camera()
	
 	If KeyDown(57) And jumping=0 ; SPACE to JUMP
		jumping=1
		pyvel#=.2
	EndIf
 
   	If KeyDown(17)=1 Or KeyDown(200) Then speed#=speed#+.005 +boost#
	If KeyDown(30)=1 Or KeyDown(203) Then lateral_speed# = lateral_speed# - .004 +boost#
	If KeyDown(31)=1 Or KeyDown(208) Then speed# = speed# -(.005 +boost#)
	If KeyDown(32)=1 Or KeyDown(205) Then lateral_speed# = lateral_speed# + .004 +boost#
	; FRICTION FOR SMOOTH MOVEMENT
	
	lateral_speed#=lateral_speed#*.97
	speed#=speed#*.95
		
	PositionEntity g_Camera,EntityX(player),EntityY(player)+1,EntityZ(player)
	; CAMERA MOVEMENTS
	MY#=curvevalue#(MouseYSpeed(),MY#,4 )
	MX#=curvevalue#(MouseXSpeed(),MX#,4 )
	TurnEntity g_Camera,MY#,0,0 ; turn camera up and down
	TurnEntity player,0,-mx+pyspin#,0 ;  turn pivot left --right
	RotateEntity g_Camera,EntityPitch(g_Camera),EntityYaw(player),0
	MoveMouse midw,midh; Bring mouse to middle of screen for mouselook to work
	
	
	
	If on_platform=0 Then pyvel#=pyvel#-gravity#
	;pyvel#=pyvel#*.99
	;move the player --- the camera in this case!
	MoveEntity player,lateral_speed#,pyvel#,speed#
	
	TranslateEntity player,pxvel#,0,pzvel#
	
	
	pxvel#=pxvel#*.9
	pzvel#=pzvel#*.9
		
	
FlushKeys
FlushMouse
	
End Function
Function do_collisions.platform()
For col=1 To CountCollisions(player)
		cnx#=CollisionNX(player,col)
		cny#=CollisionNY(player,col)
		cnz#=CollisionNZ(player,col)
		If cnx#<>0
			pxvel#=pxvel#+cnx/10
		EndIf
		If cnz#<>0
			pzvel=pzvel+cnz/10
		EndIf
		
		If cny#>0
			pyvel=Abs(pyvel)*.8 ; bounce 
			jumping=0
		EndIf
		If cny#<0
			pyvel=pyvel-.05
			For foo.platform=Each platform
				If CollisionEntity(player,col)=foo\entity
			      foo\ydirection=1-foo\ydirection
					foo\yvel#=0
					
					;wire=1-wire
				EndIf
			Next
		EndIf	
	Next
Return foo.platform
End Function
;====================================================================================
;curvevalue()
Function curvevalue#(newvalue#,oldvalue#,increments# )
	If increments>1 Then oldvalue#=oldvalue#-(oldvalue#-newvalue#)/increments
	If increments<=1 Then oldvalue=newvalue
	Return oldvalue#
End Function
;====================================================================================
Function pick_platform.platform()
px#=EntityX(player)
py#=EntityY(player)
pz#=EntityZ(player)
picklength#=.7
	
	LinePick(px#,py#-picklength,pz#,0,picklength#,0,1)
		up_pict=0
		up_pict=PickedEntity()
	LinePick(px#,py#+picklength#,pz#,0,-picklength#,0,1)
		down_pict=0
		down_pict=PickedEntity()
	
	on_platform=0
	pyspin#=0
	
	If up_pict<>0 Or down_pict<>0
		
		For foo.platform=Each platform
			
			EntityFX foo\entity,0
			If foo\entity=down_pict
				EntityFX foo\entity,1
				pyvel#=foo\yvel#  + foo\yvel/50
				pyspin#=foo\yspin#
				pxvel#=foo\xvel#
				pzvel#=foo\zvel#
				
				
				on_platform=1
				jumping=0
				;ResetEntity player
			EndIf
			
			If foo\entity=up_pict
				;pictentity=foo\entity
				pyvel#=pyvel#-.01
				foo\ydirection=1
				foo\yvel=0
				
				
				;ResetEntity player
			EndIf
			
		Next
	EndIf
	
	
Return foo.platform
End Function
;=============================================================================================
Function mess$(x,y,message$)
; styles
	leftoffset= StringWidth(message$)*.1
	width=StringWidth(message$)*1.2
	height=FontHeight()*1.2
	
	Color 0,0,0
	Rect x+3,y+3,width,height+3,1 ; shadow
	
	Color 0,0,60
	
	Rect x-leftoffset,y,width,height,1	; draw a rectangle
	Color 0,140,0
	Rect x-leftoffset-1,y-1,width+1,height+1,0
	Rect x-leftoffset-2,y-2,width+2,height+2,0
	
	Color 255,255,0
	
	Text x,y,message,0,0					; print message inside the rectangle
	
End Function
;=============================================================================================
Function draw_overlay()
If fps=1 Then draw_crosshairs()
; Draw the FPS rect
			
					
			; screen messages ************
									
			
					
					
							
							mess$(60,5,"WASD or arrows to move, SPACE to JUMP")
							;If pictentity<>0 Then mess$(60,180,"distance"+EntityDistance(player,pictentity))
							If fps=0 Then mess$(60,30,"press 2 for FPS MODE")
							If fps=1 Then mess$(60,30,"press 1 for CHASE-CAM MODE")
							;If on_platform=1 Then mess$(60,220,"ON A PLATFORM")
							;If on_platform=0 Then mess$(60,220,"OFF PLATFORMS")
							;mess$(60,260,"x= "+EntityX(player))
							;mess$(60,280,"y= "+EntityY(player))
							;mess$(60,300,"z= "+EntityZ(player))
							;mess$(60,260,"fill this in")
	
					
					
End Function
;=============================================================================================
Function smoothcam(pivot,target,camspeed)
	curx#=EntityX(g_Camera)
	curz#=EntityZ(g_Camera)
	destx#=EntityX(pivot,True)
	destz#=EntityZ(pivot,True)
	
	curx#=curx#+((destx#-curx#)/camspeed)
	curz#=curz#+((destz#-curz#)/camspeed)
	
	PositionEntity g_Camera,curx,EntityY(target)+camheight#,curz
	
End Function
;=============================================================================================
Function draw_crosshairs()
Color 0,235,0
Rect midw-3,midh-3,6,6,0
;Line midw-6,midh,midw+6,midh
End Function
;=============================================================================================
Function alpha_platforms.platform()
	; get the distance from the camera to the player this could be static for speed increase
 camdist_to_player#=EntityDistance(g_Camera,player)-3
 For foo.platform = Each platform  
	; now see if the platform is between the player and the camera
	camdist_to_platform#=EntityDistance(g_Camera,FOO\ENTITY)
		If camdist_to_player>camdist_to_platform
			EntityAlpha FOO\ENTITY,.7
		Else
			EntityAlpha FOO\ENTITY,1
		EndIf
 Next
	
Return foo.platform
End Function
;=============================================================================================
Function save_bitmap()
Repeat
Until KeyDown(59)=0
	SaveBuffer(FrontBuffer(),"screenshot.bmp")
End Function
;=============================================================================================
Function create_tex()
	
	
	
disctex=CreateTexture(256,256,64+8)
SetBuffer TextureBuffer(disctex)
For x=1 To 230
    Color Rnd(100,255),Rnd(100,255),Rnd(100,255)
	Oval Rnd(0,255),Rnd(0,255),Rnd(8,32),Rnd(8,32),1
Next
boxtex=CreateTexture(32,32,8)
SetBuffer TextureBuffer(boxtex)
Color 200,200,200
Rect 0,0,32,32
Color 30,30,30
Rect 0,0,16,16,1
Rect 16,16,16,16,1
ScaleTexture boxtex,.5,.5
grasstex=CreateTexture(127,127,8)
SetBuffer TextureBuffer(grasstex)
Color 0,128,0
Rect 0,0,128,128
For x=0 To 128
For y=0 To 128
	count=count+1
	If count=5 
		count=1
		Color Rnd(0,20),Rnd(0,155),0
		Line x,y,x+3,y+3
	EndIf
Next
Next
SetBuffer BackBuffer()
End Function
 
 |