예제 #1
0
void TinyGameLibrary::mainLoop()
{
    m_run = true;
    while (m_run) {
        SDL_RenderClear(m_renderer);
        readKeys();
        moveObjects();
        renderLevel();
        SDL_RenderPresent(m_renderer);
        SDL_Delay(1000 / 30);
    }
}
    //-----------------------------------------------------------------------
	// Loop over every edge tile.  Determine which the lowest lod on each edge
	// and use that to adjust the extents.
	// TODO:  This routine is expensive, and is only needed when LOD is involved.
	// Optimize?  Ironic since LOD is supposed to make things faster.
	void AdjustEdgesForLod( LodTracker& lodTracker,
							int minPageX, int minPageZ, int maxPageX, int maxPageZ,
							int& localPageMinX, int& localPageMinZ, int& localPageMaxX, int& localPageMaxZ )
	{
		int minTileZ = PageToTile( localPageMinZ, 
								   lodTracker.GetInvTileSize(),
								   lodTracker.GetMaxNumTiles() );
		int maxTileZ = PageToTile( localPageMaxZ, 
								   lodTracker.GetInvTileSize(),
								   lodTracker.GetMaxNumTiles() );
		int minTileX = PageToTile( localPageMinX,
								   lodTracker.GetInvTileSize(),
								   lodTracker.GetMaxNumTiles() );
		int maxTileX = PageToTile( localPageMaxX, 
								   lodTracker.GetInvTileSize(),
								   lodTracker.GetMaxNumTiles() );
		int westRenderLevel = 0;
		int eastRenderLevel = 0;
		for( int pageZ = minPageZ; pageZ <= maxPageZ; ++pageZ )
		{
			int endTileZ = ( pageZ == maxPageZ ) ? maxTileZ : lodTracker.GetMaxNumTiles() - 1;
			for( int tileZ = ( pageZ == minPageZ ) ? minTileZ : 0;
				 tileZ <= endTileZ;
				 ++tileZ )
			{
				// West edge
				lodTracker.SetPage( minPageX, pageZ );
				lodTracker.UpdateTile( minTileX, tileZ );
				int renderLevel = lodTracker.GetRenderLevel().GetRenderLevel();
				if( renderLevel > westRenderLevel )
					westRenderLevel = renderLevel;
				// East edge
				lodTracker.SetPage( maxPageX, pageZ );
				lodTracker.UpdateTile( maxTileX, tileZ );
				renderLevel = lodTracker.GetRenderLevel().GetRenderLevel();
				if( renderLevel > eastRenderLevel )
					eastRenderLevel = renderLevel;
			}
		}

		int northRenderLevel = 0;
		int southRenderLevel = 0;
		for( int pageX = minPageX; pageX <= maxPageX; ++pageX )
		{
			int endTileX = ( pageX == maxPageX ) ? maxTileX : lodTracker.GetMaxNumTiles() - 1;
			for( int tileX = ( pageX == minPageX ) ? minTileX : 0;
				 tileX <= endTileX;
				 ++tileX )
			{
				// North edge
				lodTracker.SetPage( pageX, minPageZ );
				lodTracker.UpdateTile( tileX, minTileZ );
				int renderLevel = lodTracker.GetRenderLevel().GetRenderLevel();
				if( renderLevel > northRenderLevel )
					northRenderLevel = renderLevel;
				// South edge
				lodTracker.SetPage( pageX, maxPageZ );
				lodTracker.UpdateTile( tileX, maxTileZ );
				renderLevel = lodTracker.GetRenderLevel().GetRenderLevel();
				if( renderLevel > southRenderLevel )
					southRenderLevel = renderLevel;
			}
		}
		// Use the lods we found to adjust the min and max local coords.
		RenderLevel renderLevel( westRenderLevel );
		localPageMinX = renderLevel.Floor( localPageMinX );
		renderLevel.SetRenderLevel( eastRenderLevel );
		localPageMaxX = renderLevel.Ceil( localPageMaxX );
		renderLevel.SetRenderLevel( northRenderLevel );
		localPageMinZ = renderLevel.Floor( localPageMinZ );
		renderLevel.SetRenderLevel( southRenderLevel );
		localPageMaxZ = renderLevel.Ceil( localPageMaxZ );
	}