【问题标题】:The correct way to animate multiple frames while moving移动时为多个帧设置动画的正确方法
【发布时间】:2013-03-26 16:06:52
【问题描述】:

我想知道这是否是在游戏角色从 a 点移动到 b 点时为游戏角色设置动画的正确方法,同时在显示模拟人的移动的不同移动图像时也是如此。

这是我所做的伪代码:

    [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
            }];
        }];
    }];

这是正确的方法吗?我这样做是因为我可以控制每一帧和每一帧的持续时间。

【问题讨论】:

    标签: ios objective-c animation


    【解决方案1】:

    似乎有更好的方法。如果您没有太多图像,我可能只建议使用animationImages 属性UIImageView 然后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;
        }
    }
    

    【讨论】:

    • 如果在第 5 帧期间,假设玩家正在向左移动,我希望它中断第 5 帧并从该帧向右移动?我可以在它完成之前调用 stopDisplayLink 来中断它,然后开始一个新的显示链接序列吗?
    • @mskw 是的,应该可以。试试看。仅供参考,如果您希望动画重复,您可能需要像我上面那样调整frameNumber,然后注释掉if (elapsed >= kAnimationDuration) ... 块。但希望你能明白。
    • @mskw 我可能误读了您的问题。如果您希望动画从中断处继续,您需要调整 CADisplayLink 代码(例如,设置一次后不要重置 startTime)。
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    相关资源
    最近更新 更多