| I added pushable objects.  It's almost right however you can sometime get stuck in moveable objects or at times quantum tunnel right through them. :(  Has to be a simple fix.  Any suggestions? 
 
 Arrow keys = move
 left ctrl = jump
 + and - change viewport size
 
 
 
; platformer collision test
; Kenneth "Physt" Lemieux
; kenlem@...
; No Rights Reserved
; Left Ctrl Key = jump 
; Arrow Keys = move 
;Include "viewport.bb"
Global viewportSize# = 1.0
; DEFINES
Global GRAVITY# = -0.0108
Global FLOOR_FRICTION# = .7
Global camera
Type actor
	Field mesh
	Field x#
	Field y#
	Field z#
	Field xvel#
	Field yvel#
	Field zvel#
	Field speed#
	Field isOnground#
	Field isOnObject#
End Type
frameTimer=CreateTimer(30)
WaitTimer(frameTimer) 
Global jumpheight# = 0.35
Global speed# = 0.07
Const numplatforms=6
Graphics3D 640,480,16,1
Gosub InitGame
Gosub GameLoop
End
; *********
.InitGame
; *********
frametimer = CreateTimer(60)
light=CreateLight() 
RotateEntity light,45,45,0
camera=CreateCamera() 
;SetCameraFOV(camera, 90) 
PositionEntity camera, 10, 15, 10
player = CreateCylinder(32)
FitMesh player, -1, -1, -1, 2, 2, 2, False
grid1=CreateGridTexture(32,64,128)
grid2=CreateGridTexture(240,72,20)
SetBuffer BackBuffer()
level = CreateCube() : EntityTexture level, grid1
FitMesh level, -40, -40, -40, 80, 80, 80, True 
FlipMesh level
Dim platform(numplatforms)
platform(1)=CreatePlatform(-20, -25 , 0, 10,1,40 , grid2)
platform(2)=CreatePlatform(-10,-30, 10,10,1,10 , grid2)
platform(3)=CreatePlatform(-5,-40, 15,10,5,10 , grid2)
platform(4)=CreatePlatform(-16,-20,  7,10,1,10 , grid2)
platform(5)=CreatePlatform(-16,-15, 15,5,1,5 , grid2)
platform(6)=CreatePlatform(6, -40, 12,5,20,5 , grid2)
EntityType player,1
EntityType level, 2
For d=1 To numplatforms
	EntityType platform(d), 2
Next
Collisions 1, 2, 2, 2
Collisions 1, 1, 3, 2
playerActor.actor = New actor
playerActor\Mesh = player
playerActor\x# = 10
playerActor\y# = -20
playerActor\z# = 10
playerActor\speed# = 0.07 
AddCan(-13, -11, 17)
AddCan(-11, -11, 17)
AddCan(-10, -11, 17)
AddCan(-9, -11, 17)
AddCan(-8, -11, 17)
AddCan(8, 20, 14.6)
AddCan(13, -11, 17)
AddCan(11, -11, 17)
AddCan(10, -11, 17)
AddCan(9, -11, 17)
AddCan(8, -11, 17)
AddCan(8, 20, -14.6)
Return
.GameLoop
While Not KeyDown(1)
	WaitTimer(frameTimer) 
	AdjustViewport()
	ControlActor(playerActor)
	UpdateAllActorCollisions(playerActor)
	UpdateAllActors()
	UpdateWorld()
	PostUpdateAllActors()
	FollowCam(camera, player)
	
	RenderWorld
	;Text 10,10, EntityX(playerActor\mesh) + ", " + EntityY(playerActor\mesh) + ", " + EntityZ(playerActor\mesh)
	Flip
Wend
Return
Function adjustviewport()
		If KeyHit(74) Then
			ShrinkViewport(camera)
		End If 
	
		If KeyHit(78) Then
			EnlargeViewport(camera)
		End If 
End Function 
Function UpdateAllActors()
	For a.actor = Each actor
		a\yvel# = a\yvel# + GRAVITY#
		a\x# = a\x# + a\xvel#
		a\y# = a\y# + a\yvel# 
		a\z# = a\z# + a\zvel#
		a\xvel# = a\xvel# * FLOOR_FRICTION#
		a\zvel# = a\zvel# * FLOOR_FRICTION#
		PositionEntity a\mesh, a\x#, a\y#, a\z#
	Next
End Function 
; reset actor postions based on collision results. called after UpdateWorld()
Function PostUpdateAllActors()
	For a.actor = Each actor
		a\x# = EntityX(a\mesh)
		a\y# = EntityY(a\mesh)
		a\z# = EntityZ(a\mesh)
		;PositionEntity a\mesh, a\x#, a\y#, a\z#
	Next
End Function 
Function CreateGridTexture(r,g,b)
	tex=CreateTexture(64,64,9)
	SetBuffer TextureBuffer(tex)
	Color r,g,b : Rect 0, 0, 64,64, 1
	Color 255,255,255 : Rect 0, 0, 64,64, 0
	ScaleTexture tex, .1, .1
	Return tex
End Function
Function CreatePlatform(x#,y#,z#,w#,h#,d#,tex)
	plat=CreateCube()
	FitMesh plat, x, y, z, w, h, d, False
	EntityTexture plat, tex
	Return plat
End Function
Function ControlActor(a.actor)
	dx=KeyDown(203)-KeyDown(205) ; left / right cursors
	dy=KeyDown(208)-KeyDown(200) ; up / down cursors
	TurnEntity a\mesh, 0, dx*3, 0
	
	TFormVector 0, 0, dy, a\mesh, 0
	a\xvel# = a\xvel# - (TFormedX() * a\speed#)
	a\yvel# = a\yvel# - (TFormedY() * a\speed#)
	a\zvel# = a\zvel# - (TFormedZ() * a\speed#)
	
	If a\IsOnground And KeyDown(29) Then 
		a\yvel# = a\yvel# + jumpheight#	
	End If
	
End Function 
Function UpdateAllActorCollisions(playerActor.actor)
	For a.actor = Each actor
		collide = CountCollisions (a\mesh)
		a\isOnground = False
		a\isOnObject = False
		If collide > 0
			For i = 1 To collide
				entity = CollisionEntity(a\mesh, i) 
				et = GetEntityType(entity)
				nx# = CollisionNX(a\mesh,  i)
				ny# = CollisionNY(a\mesh,  i)
				nz# = CollisionNZ(a\mesh,  i)
				If ny# = 1
					a\yvel# = 0
					a\yvel# = a\yvel# - GRAVITY#
					a\isOnground = True
					If et = 1 Then 	
						a\isOnObject = True
					End If 
				End If
				If ny# = -1 Then 
					a\yvel# = -a\yvel# * .5
				End If 
								
				entity = CollisionEntity(a\mesh, i) 
				If playerActor\isOnground = True And entity <> playerActor\mesh Then 
					If et = 1 Then 
					 	AddPlayerVelocityToActor(playerActor, entity)
					End If 
				End If 
				
			Next 
			
			
		End If 
	Next 
End Function 
Function FollowCam(camera, target)
	PositionEntity camera, EntityX(target), EntityY(target)+2.5, EntityZ(target)
	RotateEntity camera ,EntityPitch(target), EntityYaw(target)+4, EntityRoll(target)
	MoveEntity camera, 0, 0, -5.8
	PointEntity camera, target
End Function 
Function AddPlayerVelocityToActor(playerActor.actor, entity)
	; find the actor in the actor types with the entity that matches this one
	e.actor = First actor
	done = False
	While e <> Null And done = False
		If e\mesh = entity Then 
			If playerActor\isOnObject = False Then 
				e\xvel# = playerActor\xvel#
				e\zvel# = playerActor\zvel#
				done = True
			End If
		End If 
		e.actor = After(e)
	Wend 
	
End Function 
Function AddCan(argX#, argY#, argZ#)
	can.actor = New actor
	;can\Mesh = CreateCylinder(32)
	can\Mesh = CreateCube()
	FitMesh can\Mesh, -1, -1, -1, 2, 2, 2, False
	EntityType can\Mesh,1
	can\x# = argX#
	can\y# = argY#
	can\z# = argZ#
End Function 
Function ShrinkViewport(camera)
	If viewportSize#> .1 Then
		viewportSize#= viewportSize#- .1
		SetCameraViewport(camera)
	End If 
	
End Function
Function EnlargeViewport(camera)
	If viewportSize#< 1 Then
		viewportSize#= viewportSize#+ .1
		SetCameraViewport(camera)
	End If 
	
End Function 
Function SetCameraViewport(camera)
	; clear the screen
	
	width = GraphicsWidth()
	height = GraphicsHeight()
	newWidth = Int(GraphicsWidth() * viewportSize#)
	newHeight = Int(GraphicsHeight() * viewportSize#)
	xoffset = (width/2) - (newWidth/2) 
	yoffset = (height/2) - (newHeight/2)
	
	Color 32, 32, 32
	Flip
	Rect 0, 0, width, yoffset 
	Rect 0, yoffset+newHeight, width, height 
	Rect 0, yoffset, xoffset, newHeight
	Rect xoffset+newWidth, yoffset, width, newHeight
	Flip
	Rect 0, 0, width, yoffset 
	Rect 0, yoffset+newHeight, width, height 
	Rect 0, yoffset, xoffset, newHeight
	Rect xoffset+newWidth, yoffset, width, newHeight	
	CameraViewport camera, xoffset, yoffset, newWidth , newHeight	
End Function 
Function SetCameraFOV(Camera, FOV#) 
	CameraZoom Camera, 1.0 / Tan(FOV#/2.0) 
End Function 
 
 
 |