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
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