Game Development Reference

In-Depth Information

yVelocity = yVelocity - (acceleration.y * g * secondsSinceUpdate); //assumes

acceleration was constant over last update interval

//Mutate currentPos which will update screen

self.currentPos = CGPointMake(self.currentPos.x + deltaX,

self.currentPos.y + deltaY);

}

[lastUpdateTime release];

lastUpdateTime = [[NSDate alloc] init];

}

Previously, we discussed issues with timing when working with accelerometer data. In

this case, Objective-C makes it very easy to get the correct elapsed time in seconds. We

first define a static variable,
lastUpdateTime
, as an
NSDate
type. This type has a built-

in function to give the time interval in seconds from now, which we assign to an
NSTime

Interval
variable. Skipping down to the last two lines, we are simply updating the last

update time by releasing and reinitializing the variable. As it is static, it will remain even

after the function returns. If you are using a lower-level language, you might have to

write your own
timeIntervalSinceNow
function that takes into account the particular

clock frequency of the system.

Now that we have our time interval in seconds, we can calculate our new position. Recall

from
Chapter 2
:

s
2
= s
1
+ v
1
t + (a t
2
)/2

which we have rearranged to be:

Δs = s
2
− s
1
= v
1
t + (a t
2
)/2

This gets programmed as:

CGFloat deltaX = xVelocity * secondsSinceUpdate +

((acceleration.x*g*secondsSinceUpdate*secondsSinceUpdate)/2); // METERS

We then convert this displacement in meters to displacement in pixels using an appro‐

priate ratio for the size of our world. Before we can move on, we have to calculate our

new velocity at our new position. So we again assume the acceleration as constant over

the update interval, and recalling:

v
2
= v
1
+ a Δt

from
Chapter 2
, we can solve for the new
xVelocity
with:

xVelocity = xVelocity + acceleration.x * g * secondsSinceUpdate;