Ios 移动时设置多帧动画的正确方法
我想知道当游戏角色从a点移动到b点时,以及在显示模拟人的运动的不同运动图像时,这是否是设置游戏角色动画的正确方法 以下是我所做工作的个人代码:Ios 移动时设置多帧动画的正确方法,ios,objective-c,animation,Ios,Objective C,Animation,我想知道当游戏角色从a点移动到b点时,以及在显示模拟人的运动的不同运动图像时,这是否是设置游戏角色动画的正确方法 以下是我所做工作的个人代码: [UIView animateWithDuration:dMAN_MOVEMENT_SPEED/3 animations:^{ //Set Target Image //Set target position }completion:^(BOOL finished){ //2
[UIView animateWithDuration:dMAN_MOVEMENT_SPEED/3 animations:^{
//Set Target Image
//Set target position
}completion:^(BOOL finished){
//2nd to 3rd Frame
[UIView animateWithDuration:dMAN_MOVEMENT_SPEED/3 animations:^{
//Set Target Image
//Set target position
}completion:^(BOOL finished){
//3rd to final Frame
[UIView animateWithDuration:dMAN_MOVEMENT_SPEED/3 animations:^{
//Set Target Image
//Set target position
}completion:^(BOOL finished){
//do nothing
}];
}];
}];
这是正确的方法吗?我这样做是因为我可以控制每一帧和每一帧的持续时间 似乎有更好的办法。如果您没有太多图像,我可能会建议您使用
UIImageView
的animationImages
属性,然后使用startAnimating
:
NSArray *images = @[[UIImage imageNamed:@"0.jpg"],
[UIImage imageNamed:@"1.jpg"],
[UIImage imageNamed:@"2.jpg"],
[UIImage imageNamed:@"3.jpg"],
[UIImage imageNamed:@"4.jpg"],
[UIImage imageNamed:@"5.jpg"],
[UIImage imageNamed:@"6.jpg"],
[UIImage imageNamed:@"7.jpg"]];
self.imageView.image = images[0];
self.imageView.animationImages = images;
self.imageView.animationDuration = kAnimationDuration;
self.imageView.animationRepeatCount = 1;
[self.imageView startAnimating];
[UIView animateWithDuration:kAnimationDuration
animations:^{
self.imageView.center = ... // set this to whatever you want
}];
如果您担心将所有这些内容加载到内存中,还可以使用CADisplayLink
根据需要加载图像,如下所示:
- (void)animateImageUsingDisplayLink
{
self.imageNames = @[@"0.jpg",
@"1.jpg",
@"2.jpg",
@"3.jpg",
@"4.jpg",
@"5.jpg",
@"6.jpg",
@"7.jpg"];
self.imageView.image = [UIImage imageNamed:self.imageNames[0]];
[self startDisplayLink];
[UIView animateWithDuration:kAnimationDuration
animations:^{
self.imageView.center = ... // set this to whatever you want
}];
}
- (void)startDisplayLink
{
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
self.startTime = CACurrentMediaTime();
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)stopDisplayLink
{
[self.displayLink invalidate];
self.displayLink = nil;
}
- (void)handleDisplayLink:(CADisplayLink *)displayLink
{
CFTimeInterval elapsed = displayLink.timestamp - self.startTime;
// If you want it to repeat, then comment out the following `if` statement
if (elapsed >= kAnimationDuration)
{
[self stopDisplayLink];
return;
}
NSInteger frameNumber = ((NSInteger) elapsed * [self.imageNames count] / kAnimationDuration) % [self.imageNames count];
if (frameNumber != self.currentFrameNumber)
{
self.imageView.image = [UIImage imageNamed:self.imageNames[frameNumber]];
self.currentFrameNumber = frameNumber;
}
}
如果在第五帧中,如果播放器向左移动,我希望它中断第五帧,它将从该帧向右移动,该怎么办?我可以调用stopDisplayLink在它完成之前中断它,然后启动一个新的显示链接序列吗?@mskw是的,应该可以。试试看。仅供参考,如果您希望动画重复,您可能需要像上面一样调整
frameNumber
,然后注释掉if(appeased>=kAnimationDuration).
块。但希望你能理解。@mskw我可能误解了你的问题。如果希望动画从停止的位置继续播放,则需要调整CADisplayLink
代码(例如,设置一次后不要重置startTime
)。