After fixing my last problem, I found out a few things, first - appearently an object can slip through the "cracks" of two or more objects together, such as my playfield of cubes where they are in a row to form a table. secondly - appearently you can't move at all when a collision is "stopped" thereby not allowing the one object to move over the other object (moving ball over a table)...
Finally I decided to comment out the collision stuff with the playfield (the array of cubes) however for some reason this doesn't seem to work at all... So I have the code here and wondering why the gameToken isn't colliding with the "table"... Any insights are appreciated -
Finally I decided to comment out the collision stuff with the playfield (the array of cubes) however for some reason this doesn't seem to work at all... So I have the code here and wondering why the gameToken isn't colliding with the "table"... Any insights are appreciated -
; m = member, b = boolean Const b_DebugMode = False ; This won't have positional information ; as blitz will do that for me. It will ; have velocity, speed, and gravity parameters ; probably some blitz collision information as well Type TGameObject Field m_entity Field m_xVelocity# Field m_yVelocity# Field m_zVelocity# Field m_xSpeed# Field m_ySpeed# Field m_zSpeed# Field mb_useGravity Field m_gravity# End Type Global debugtxt$ = "" ; most of the game entities ; to copy all the playfield 'cells' ; from; Gametoken is the piece that ; moves around the board. Global camera, light, gameToken.TGameObject Dim Playfield( 12, 12 ) Global logfile ;;; General Functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function fn_AddDebugTxt( txt$ ) debugTxt = debugTxt + txt$ + "|" End Function Function fn_ShowDebugTxt( txt$ ) If( Right( txt, 1 ) <> "|" ) Then txt = txt + "|" ty = 0 Repeat tx = Instr( txt, "|" ) If( tx > 0 ) Text( 0, ty, Left( txt, tx - 1 ) ) txt = Right( txt, Len( txt ) - tx ) ty = ty + 10 End If Until tx = 0 debugTxt$ = "" End Function Function fn_OpenLogFile() If( b_DebugMode = True ) Cdate$ = CurrentDate$() Ctime$ = CurrentTime$() Cdir$ = CurrentDir$() logdir$ = Cdir$ + "log" If( FileType( logdir$ ) = 0 ) CreateDir( logdir$ ) End If LogFileName$ = logdir$ + "" + Cdate$ + "log.txt" If( FileType( logdir$ ) = 2 ) If( FileType( LogFileName$ ) = 1 ) logfile = OpenFile( LogFileName$ ) Repeat SeekFile( logfile, i ) i = i + 1 Until Eof( logfile ) Else logfile = WriteFile( LogFileName$ ) End If If( logfile <> 0 ) WriteLine( logfile, "" ) WriteLine( logfile, LogFileName$ + " opened successfully." ) WriteLine( logfile, "" ) WriteLine( logfile, "log file opened on " + Cdate$ + " at " + Ctime$ + "." ) Else DebugLog( "Could not create or open log file." ) End If End If End If End Function ; fn_OpenLogFile() ;--------------------------------------; Function fn_CloseLogFile() If( b_DebugMode = True ) If( logfile <> 0 ) WriteLine( logfile, "Logging successful, closing log file." ) WriteLine( logfile, "" ) WriteLine( logfile, "---" ) CloseFile( logfile ) End If End If End Function ; fn_CloseLogFile() ;--------------------------------------; ; This function generally creates everything in ; the game. First the camera, then the light, then ; playfield and finally the game token. Function fn_CreateWorld() ; camera camera=CreateCamera() PositionEntity( camera, 6, 8, -10 ) temppivot = CreatePivot() PositionEntity( temppivot, 6, 0, -6 ) PointEntity( camera, temppivot ) FreeEntity( temppivot ) ; light AmbientLight 32, 32, 32 light=CreateLight() RotateEntity light, 60, 0, 0 ; playfield boundry walls wallone = CreateCube() ScaleEntity( wallone, .5, 1, 7 ) PositionEntity( wallone, -1, .5, -5.5 ) EntityAlpha( wallone, .25 ) walltwo = CreateCube() ScaleEntity( walltwo, .5, 1, 7 ) PositionEntity( walltwo, 12, .5, -5.5 ) EntityAlpha( walltwo, .25 ) wallthree = CreateCube() ScaleEntity( wallthree, 6, 1, .5 ) PositionEntity( wallthree, 5.5, .5, -12 ) EntityAlpha( wallthree, .25 ) wallfour = CreateCube() ScaleEntity( wallfour, 6, 1, .5 ) PositionEntity( wallfour, 5.5, .5, 1 ) EntityAlpha( wallfour, .25 ) fn_CreatePlayfield() fn_CreateGameToken() table = CreateCube() ScaleEntity( table, 7, 1, 7 ) PositionEntity( table, 5.5, .5, -5.5 ) EntityType( table, 3 ) EntityBox( table, 5.5, .5, -5.5, 14, 2, 14 ) EntityAlpha( table, .5 ) EntityColor( table, 255, 0, 0 ) ; 2 = playfield (cube array array) ; Collisions( 1, 2, 3, 3 ) ; 3 = table (the entity created above Collisions( 1, 3, 3, 1 ) End Function ; fn_CreateWorld() ;--------------------------------------; ; free everything Function fn_DestroyWorld() fn_DestroyGameToken() fn_DestroyPlayfield() FreeEntity( light ) FreeEntity( camera ) End Function ; fn_DestroyWorld Function fn_ManageCollisions() ; cell y is as you're looking from the top down, essentially the 2d ; version used the y coordinates, but as y literally goes up and down ; i have to worry about the z position (in and out of the screen) readjusted_z# = -EntityZ( gameToken\m_entity ) fn_AddDebugTxt( "x = " + EntityX( gameToken\m_entity ) + " y = " + EntityZ( gameToken\m_entity ) ) ul_x = ( EntityX( gameToken\m_entity ) - 0.45 ) ul_y = ( readjusted_z# - 0.45 ) fn_AddDebugTxt( "upperleft x = " + ul_x + " upperleft y = " + ul_y ) ur_x = ( EntityX( gameToken\m_entity ) + 0.45 ) ur_y = ( readjusted_z# - 0.45 ) fn_AddDebugTxt( "upperright x = " + ur_x + " upperright y = " + ur_y ) ll_x = ( EntityX( gameToken\m_entity ) - 0.45 ) ll_y = ( readjusted_z# + 0.45 ) fn_AddDebugTxt( "lowerleft x = " + ll_x + " lowerleft y = " + ll_y ) lr_x = ( EntityX( gameToken\m_entity ) + 0.45 ) lr_y = ( readjusted_z# + 0.45 ) fn_AddDebugTxt( "lowerright x = " + lr_x + " lowerright y = " + lr_y ) End Function ;;; Playfield related functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Create the playfield, which at the moment ; is nothing more than an array of cubes. Function fn_CreatePlayfield() ; initial cube as a starting point Local cube = CreateCube() ScaleEntity( cube, 0.5, 0.5, 0.5 ) ; 12 x 12 game board ( 0 - 11 = 12 positions ) ; note using y for z, swapping axes as the 2d ; gameboard is being layed out flat like a table For y = 0 To 11 For x = 0 To 11 If( y > 0 ) Then adj_y = -y ; create each "cell" Playfield( x, y ) = CopyEntity( cube ) ; position it relative to the other cells PositionEntity( Playfield( x, y ), x, 0, adj_y ) ;EntityType( Playfield( x, y ), 2 ) ;EntityBox( Playfield( x, y ), x, 0, adj_y, 1, 1, 1 ) ; give it a random color for indentity EntityColor( Playfield( x, y ), Rand( 63, 192 ), Rand( 63, 192 ), Rand( 63, 192 ) ) Next Next ; no more need for the cube FreeEntity( cube ) End Function ; fn_CreatePlayfield ;--------------------------------------; ; free up all the cells essentially Function fn_DestroyPlayfield() For y = 0 To 11 For x = 0 To 11 FreeEntity( Playfield( x, y ) ) Next Next End Function ; fn_DestroyPlayfield ;;; Game Token Related Functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; The piece the player directs Function fn_CreateGameToken() gameToken = fn_CreateGameObject() ; Make sure it created correctly If( gameToken <> Null ) ; now create the mesh/model etc gameToken\m_entity = CreateSphere() ScaleEntity( gameToken\m_entity, 0.45, 0.45, 0.45 ) EntityType( gameToken\m_entity, 1 ) PositionEntity( gameToken\m_entity, 5.5, 6, -5.5 ) EntityRadius( gameToken\m_entity, 1 ) ResetEntity( gameToken\m_entity ) gameToken\m_xSpeed# = 0.0 gameToken\m_ySpeed# = 0.0 gameToken\m_zSpeed# = 0.0 gameToken\m_xVelocity# = 0.0 gameToken\m_yVelocity# = 0.0 gameToken\m_zVelocity# = 0.0 gameToken\mb_useGravity = True gameToken\m_gravity# = -.0001 Else RuntimeError( "Could not create game token." ) End If End Function ; fn_CreateGameToken() ;--------------------------------------; ; get rid of the game piece Function fn_DestroyGameToken() fn_DestroyGameObject( gameToken ) End Function ; fn_DestroyGameToken() ;--------------------------------------; Function fn_MoveGameToken() If( gameToken\mb_useGravity = True ) gameToken\m_yVelocity# = gameToken\m_yVelocity# + gameToken\m_gravity# End If If( KeyDown( 200 ) ) gameToken\m_zVelocity# = .2 Else If( KeyDown( 208 ) ) gameToken\m_zVelocity# = -.2 Else gameToken\m_zVelocity# = 0 End If dx# = gameToken\m_xVelocity# dy# = gameToken\m_yVelocity# dz# = gameToken\m_zVelocity# TranslateEntity( gameToken\m_entity, dx#, dy#, dz# ) End Function ;;; TGameObject Functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; A quick note about game object functions. It's not always ; good to create super long function names, so most of the ; game object functions shortend TGameObject as TGOb For instance ; fn_TGObXXX() - where XXX is the rest of the function name. ;--------------------------------------; ; create and return a game object (game entity, ; but since this is blitz i called it an object) Function fn_CreateGameObject.TGameObject() ; 'o' is temporary Local o.TGameObject ; create it make sure everything went well o.TGameObject = New TGameObject If( o <> Null ) Return( o ) Else RuntimeError( "Could not create game object." ) End If End Function ; fn_CreateGameObject.TGameObject() ;--------------------------------------; ; Get rid of it Function fn_DestroyGameObject( o.TGameObject ) ; if there's an entity created free it first If( o\m_entity <> 0 ) FreeEntity( o\m_entity ) End If Delete( o ) End Function ; fn_DestroyGameObject( o.TGameObject ) ;--------------------------------------; Function fn_TGObSetXVelocity( o.TGameObject, value# ) o\m_xVelocity# = value# End Function ;--------------------------------------; Function fn_TGObGetXVelocity#( o.TGameObject ) Return( o\m_xVelocity# ) End Function ;--------------------------------------; Function fn_TGObSetYVelocity( o.TGameObject, value# ) o\m_yVelocity# = value# End Function ;--------------------------------------; Function fn_TGObGetYVelocity#( o.TGameObject ) Return( o\m_yVelocity# ) End Function ;--------------------------------------; Function fn_TGObSetZVelocity( o.TGameObject, value# ) o\m_zVelocity# = value# End Function ;--------------------------------------; Function fn_TGObGetZVelocity#( o.TGameObject ) Return( o\m_zVelocity# ) End Function ;--------------------------------------; Function fn_TGObSetXSpeed( o.TGameObject, value# ) o\m_xSpeed# = value# End Function ;--------------------------------------; Function fn_TGObGetXSpeed#( o.TGameObject ) Return( o\m_xSpeed# ) End Function ;--------------------------------------; Function fn_TGObSetYSpeed( o.TGameObject, value# ) o\m_ySpeed# = value# End Function ;--------------------------------------; Function fn_TGObGetYSpeed#( o.TGameObject ) Return( o\m_ySpeed# ) End Function ;--------------------------------------; Function fn_TGObSetZSpeed( o.TGameObject, value# ) o\m_zSpeed# = value# End Function ;--------------------------------------; Function fn_TGObGetZSpeed#( o.TGameObject ) Return( o\m_zSpeed# ) End Function ;--------------------------------------; Function fn_TGObSetGravityFlag( o.TGameObject, b_flag ) o\mb_useGravity = b_flag End Function ;--------------------------------------; Function fn_TGObGetGravityFlag( o.TGameObject ) Return( o\mb_useGravity ) End Function ;--------------------------------------; Function fn_TGObSetGravity( o.TGameObject, value# ) o\m_gravity = value End Function ;--------------------------------------; Function fn_TGObGetGravity#( o.TGameObject ) Return( o\m_gravity# ) End Function ;--------------------------------------; .main Graphics3D 640,480 SetBuffer BackBuffer() fn_OpenLogFile() fn_CreateWorld() While Not KeyDown( 1 ) fn_MoveGameToken() fn_ManageCollisions() fn_AddDebugTxt( "Count collisions = " + CountCollisions( gameToken\m_entity ) ) UpdateWorld RenderWorld fn_ShowDebugTxt( debugTxt ) Flip Wend fn_DestroyWorld() fn_CloseLogFile()