Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


#ActualTom KQT

Posted 17 August 2013 - 03:40 PM

To fix your original code a bit:

// once:
float velocity = 0.01f; 

// ----------------------------------------------------------------

// each frame:
if (Pos.x >= 2.0f || Pos.x <= -2.0f) {
	velocity = -velocity;	
}
Pos.x = Pos.x + velocity;
 
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene(); D3DXMatrixTranslation(&matTrans, Pos.x, Pos.y, Pos.z);
d3ddev->SetTransform(D3DTS_WORLD, &(matTrans));
box->DrawSubset(0); d3ddev->EndScene(); 
d3ddev->Present(NULL, NULL, NULL, NULL);

It's much shorter smile.png

 

Some additional remarks:

  • Never use == with float variables. Your condition if(Pos.x == 2.0f) can actually never be true, because even if you think the value is 2.0f, it can be something like 2.0000001f or 1.9999998f. It's the typical floating point precision problem. In your case, you must use <= and >= to check whether the position isn't at OR BEHIND the border.
  • The code should work, but unless you have a fixed timestep, the box will move at different speed on different computers. And even if you have fixed timestep, you're doing it wrong, because you in fact cannot fix the timestep with 100 % certainty. The right way to do it isn't pos = pos + velocity, but pos = pos + velocity * dt, where dt is the time difference between two frames. If you do it this way, then suddenly velocity isn't a magic number 0.01f without obvious meaning, but it is a real physical velocity in [your_length_units / s]. Dt is a small number, so your new velocity won't be 0.01f anymore, it will be something higher. If your working are is -2 to +2 and if you wanted the box to move from left to right in for example 5 seconds, then velocity would be 0.8f and the box would travel for 5 seconds regardless the CPU and anything.

#2Tom KQT

Posted 17 August 2013 - 03:36 PM

To fix your original code a bit:

// once:
float velocity = 0.01f; 

// ----------------------------------------------------------------

// each frame:
if (Pos.x >= 2.0f || Pos.x <= -2.0f) {
	velocity = -velocity;	
}
Pos.x = Pos.x + velocity;
 
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene(); D3DXMatrixTranslation(&matTrans, Pos.x, Pos.y, Pos.z);
d3ddev->SetTransform(D3DTS_WORLD, &(matTrans));
box->DrawSubset(0); d3ddev->EndScene(); 
d3ddev->Present(NULL, NULL, NULL, NULL);

It's much shorter :)

 

Some additional remarks:

  • Never use == with float variables. Your condition if(Pos.x == 2.0f) can actually never be true, because even if you think the value is 2.0f, it can be something like 2.0000001f or 1.9999998f. It's the typical floating point precision problem. In your case, you must use <= and >= to check whether the position isn't at OR BEHIND the border.
  • The code should work, but unless you have a fixed timestep, the box will move at different speed on different computers. And even if you have fixed timestep, you're doing it wrong, because you in fact cannot fix the timestep with 100 % certainty. The right way to do it isn't pos = pos + velocity, but pos = pos + velocity * dt, where dt is the time difference between two frames. If you do it this way, then suddenly velocity isn't a magic number 0.01f without obvious meaning, but it is a real physical velocity in [your_length_units / s]. Dt is a small number, so your new velocity won't be 0.01f anymore, it will be something higher.

#1Tom KQT

Posted 17 August 2013 - 03:35 PM

To fix your original code a bit:

// once:
float velocity = 0.01f; 

// ----------------------------------------------------------------

// each frame:
if (Pos.x >= 2.0f || Pos.x <= -2.0f) {
	velocity = -velocity;	
}
Pos.x = Pos.x + velocity;
 
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene(); D3DXMatrixTranslation(&matTrans, Pos.x, Pos.y, Pos.z);
d3ddev->SetTransform(D3DTS_WORLD, &(matTrans));
box->DrawSubset(0); d3ddev->EndScene(); 
d3ddev->Present(NULL, NULL, NULL, NULL);

Some additional remarks:

  • Never use == with float variables. Your condition if(Pos.x == 2.0f) can actually never be true, because even if you think the value is 2.0f, it can be something like 2.0000001f or 1.9999998f. It's the typical floating point precision problem. In your case, you must use <= and >= to check whether the position isn't at OR BEHIND the border.
  • The code should work, but unless you have a fixed timestep, the box will move at different speed on different computers. And even if you have fixed timestep, you're doing it wrong, because you in fact cannot fix the timestep with 100 % certainty. The right way to do it isn't pos = pos + velocity, but pos = pos + velocity * dt, where dt is the time difference between two frames. If you do it this way, then suddenly velocity isn't a magic number 0.01f without obvious meaning, but it is a real physical velocity in [your_length_units / s]. Dt is a small number, so your new velocity won't be 0.01f anymore, it will be something higher.

PARTNERS