iMiniB3D Tween Code driving me mad

BlitzMax Forums/MiniB3D Module/iMiniB3D Tween Code driving me mad

Rob Pearmain(Posted 2012) [#1]
*** C++ Typo ***

Please delete this post,

Sorry, Rob

Last edited 2012


Floyd(Posted 2012) [#2]
In that case I have to delete my advice, which was really just guesswork.

Among other things I suggested you need 64-bit integers. That means using long long since a C++ long is ( probably ) 32-bit.


Rob Pearmain(Posted 2012) [#3]
That was the answer ;-). I will post up the code i came up with in a bit so you can see what i came up with ...


Yasha(Posted 2012) [#4]
Wait... iminiB3D supports tweening?

I must have missed something.


Rob Pearmain(Posted 2012) [#5]
Sorry, Tweening is probably the wrong word. I was trying to get a constant movement rate

e.g. If 60 frames per second, move object by 0.5, if 30 frames per second, move by 1 etc:

Anyway, this seems to work ok, but any improvements would be most welcome...


...

// Number of frames expected per second
const int FPS=30;

double nLastTime;
double nLastTime = [[NSDate date] timeIntervalSince1970];

float playermove=2.0f
i
...

Then called before Update and Render in RUN...

void Game::UpdateGame(){
    
    double currTime = [[NSDate date] timeIntervalSince1970];
    
    float timeThisSecond = (float)(currTime - nLastTime);
    nLastTime = currTime;
    
   float nMove =  (float)((timeThisSecond * 1000) / FPS); 
    
    mesh->TurnEntity(nMove * playermove,0,0);
   

}


Last edited 2012


Rob Pearmain(Posted 2012) [#6]
Ok, so my main issue is that on the iPhone, Milliseconds are stored as a double.

E.g, 1500 Milliseconds is 1.5 on the iPhone, 1.0f is 1 second.

If any interest, here is my code for "Time Based Movement" and "Frames Per Second"

.h:

   
    double nLastTime;
    double m_FPS_lastSecondStart;
    int m_FPS_FramesThisSecond;
    int m_FPS;
    const int nFPS = 30;

.mm:

void Game::UpdateFPS()
{
    double currTime = [[NSDate date] timeIntervalSince1970];
    m_FPS_FramesThisSecond++;
    float timeThisSecond = currTime - m_FPS_lastSecondStart;
    if(timeThisSecond > 1.0f ) {
        m_FPS = m_FPS_FramesThisSecond;
        m_FPS_FramesThisSecond = 0;
        m_FPS_lastSecondStart = currTime;
        
       // m_FPS now contains Frames Per Second
             
    }
}

void Game::UpdateGame(){
    
    double currTime = [[NSDate date] timeIntervalSince1970];
    
    float timeThisSecond = currTime - nLastTime;
    nLastTime = currTime;
     

  // Example Move Player
    float nMove =   ((timeThisSecond / nFPS) * 1000);
    
    mesh->TurnEntity(nMove * playermove,0,0);
   
  
  
}


Last edited 2012


simonh(Posted 2012) [#7]
There is a Millisecs() commands in iminib3d.


Rob Pearmain(Posted 2012) [#8]
lol, awesome, thanks:

    long currTime = Millisecs();
    m_FPS_FramesThisSecond++;
    
    long timeThisSecond = currTime - m_lasttime;
    
    if(timeThisSecond > 1000 ) {
        m_FPS = m_FPS_FramesThisSecond;
        m_FPS_FramesThisSecond = 0;
        m_lasttime = currTime;
        tmp->ChangeText(ToString(m_FPS));
        
    }

....

    long currTime = Millisecs();
    
    float timeThisSecond = currTime - lastTimeLong;
    lastTimeLong = currTime;
    
    float nMove =  playermove * (timeThisSecond / nFPS);
    
    mesh->TurnEntity(nMove,0,0);


Last edited 2012