I got several questions about Delta timing and as this is such a vital and exciting technique to use in EVERY aspect of Flashprogramming as soon as you want to withhold an exact speed of your flash no matter how bad or good the host computer is. Here comes a nice Papervision example.
First let’s create the document class so that is out of the way:
package {
import flash.display.Sprite;
public class DeltaTime extends Sprite
{
public function DeltaTime()
{
var tView:View3d = new View3d()
this.addChild(tView)
}
}
}
and now to the real part:
package
{
import flash.events.Event;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.shadematerials.PhongMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.BasicView;
import org.papervision3d.view.layer.util.ViewportLayerSortMode;
public class View3d extends BasicView
{
private var light:PointLight3D
private var sphere1:Sphere
private var sphere2:Sphere
private var ground:Plane
private var speed:Number
private var expTimeInMillisecs:Number
private var currentTime:int
private var lastTime:int
private var DELTA_SCALE:Number
public function View3d()
{
super();
setupScene()
startRendering()
initDeltaTiming()
}
private function setupScene():void
{
// set up camera so we an see the whole scene from a good perspective
camera.y = 1100
camera.z = -700
// setup ground
ground = new Plane(new ColorMaterial(0x224422),1600,1000,1,1)
ground.rotationX = 90
// create a light for the PhongMaterial to do it's shiny tricks)
light = new PointLight3D()
light.x = 400
light.z = -400
light.y = 600
// creating a red sphere - this one will be the normal sphere
sphere1 = new Sphere(new PhongMaterial(light,0xff1111,0x333333,1))
sphere1.x = -800
sphere1.y = 50
sphere1.z = 200
//creating a blue sphere - this will use Delta Timing.
sphere2 = new Sphere(new PhongMaterial(light,0x3333ff,0x333333,1))
sphere2.x = -800
sphere2.y = 50
sphere2.z = -200
// add all objects to their own layer so no Z-fighting will appear.
this.viewport.containerSprite.sortMode = ViewportLayerSortMode.INDEX_SORT
this.viewport.getChildLayer(ground,true).layerIndex = 1
this.viewport.getChildLayer(sphere1,true).layerIndex = 2
this.viewport.getChildLayer(sphere2,true).layerIndex = 3
// add all to the scene
scene.addChild(ground)
scene.addChild(sphere1)
scene.addChild(sphere2)
}
private function initDeltaTiming():void
{
// we will make the spheres travel with the speed of 15.
speed = 15
// we also would like it to do that when the fps is 20.
// so if the fps drops lower, the speed needs to be altered
// to keep up our expected speed over screen.
var expectedFPS:Number = 20
// as FPS is "Frames Per Second" it's easy to calculate how
// many millisecs it should take for one frame.
expTimeInMillisecs = 1000/expectedFPS
// just reseting the lastTime so DeltaTime doesn't
// freak out at start
lastTime = new Date().getTime()
}
private function calculateDeltaTime()
{
// first get the new current time (NOW that is)
currentTime = new Date().getTime()
// check how long time it took since last time
// we were here (in Millisecs)
var timeElapsed:int = currentTime-lastTime
// calculate out the new DELTA_SCALE for the round
// based on expected time it should have taken
DELTA_SCALE = timeElapsed/expTimeInMillisecs
// set lastTime to currentTime to be able to compare
// next round we are in here.
lastTime = currentTime
}
private function moveSpheres()
{
// sphere1 is moved with "normal" movement
sphere1.x += speed
if (sphere1.x > 800)
{
sphere1.x = -800
}
//sphere2 is moved with delta timing
sphere2.x += speed * DELTA_SCALE
if (sphere2.x > 800)
{
sphere2.x = -800
}
}
override protected function onRenderTick(event:Event = null):void
{
// .. normally a lot more happens here to slow a game down but not today...
calculateDeltaTime()
moveSpheres()
trace("DELTA_SCALE:"+DELTA_SCALE)
super.onRenderTick(event)
}
}
}
Now set this up in your preferred Flashenvironment and try to run the app in different FPS-settings. You will find that the red sphere will move faster or slower depending on the current FPS. But the blue one will constantly move over the ground in the same speed regardless of the current fps.
Why then does the spheres not move equally fast if we set the Flash to run at 20 FPS ?? Well, as many of you flashdevelopers already are aware about is that Flash cannot assure the framrate to be exactly 20, so even then, the blue sphere is moving more correct than the red one due to small differences in the framerate.
Hope you got it all explained in more detail now. Have a nice evening, I will.