• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 用图片或 SKAction 存储在内存 NSArray 中

[复制链接]
菜鸟教程小白 发表于 2022-12-12 23:18:57 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我不完全了解 Sprite 套件动画的最佳选择; 1) Apple 在“Adventure”示例中使用了这种方法,它们将动画作为图片存储在 nsarray 中:

static NSArray *sSharedTouchAnimationFrames = nil;
- (NSArray *)touchAnimationFrames {
    return sSharedTouchAnimationFrames;
}

- (void)runAnimation
{
    if (self.isAnimated) {
        [self resolveRequestedAnimation];
    }
}

- (void)resolveRequestedAnimation
{
    /* Determine the animation we want to play. */
    NSString *animationKey = nil;
    NSArray *animationFrames = nil;
    VZAnimationState animationState = self.requestedAnimation;

    switch (animationState) {

        default:
        case VZAnimationStateTouch:
            animationKey = @"anim_touch";
            animationFrames = [self touchAnimationFrames];
            break;

        case VZAnimationStateUntouch:
            animationKey = @"anim_untouch";
            animationFrames = [self untouchAnimationFrames];
            break;
    }

    if (animationKey) {
        [self fireAnimationForState:animationState usingTextures:animationFrames withKey:animationKey];
    }

    self.requestedAnimation = VZAnimationStateIdle;
}

- (void)fireAnimationForStateVZAnimationState)animationState usingTexturesNSArray *)frames withKeyNSString *)key
{
    SKAction *animAction = [self actionForKey:key];
    if (animAction || [frames count] < 1) {
        return; /* we already have a running animation or there aren't any frames to animate */
    }

    [self runAction:[SKAction sequence[
                                         [SKAction animateWithTextures:frames timePerFrame:self.animationSpeed resize:YES restore:NO],
                                        /* [SKAction runBlock:^{
        [self animationHasCompleted:animationState];
    }]*/]] withKey:key];
}

我很欣赏这种方法,但我无法理解。将SKAction存储在内存中不是更好的选择吗?总是这样使用动画?

[self runAction:action];

不总是产生新的 SKAction;

[SKAction animateWithTextures:frames timePerFrame:self.animationSpeed resize:YES restore:NO]



Best Answer-推荐答案


NSArray 中存储 SKTextures 是推荐用于动画的方法。我也不能说我发现 SpriteKit 的文档也缺少该主题,因为 SKAction 有方法 animateWithTextures

您确实可以拥有一个 SKAction,它具有由给定 NSArray 定义的给定动画,并且可能将这些动画存储在 NSMutableDictionary 中键的动画名称。但是,我在上面看到的这种方法在其 fireAnimationState 方法中只有一次 animateTextures 代码行,您可以将参数传递给它,例如 animationStatekey .

我认为您需要对他们的方法进行表面上的了解,才能确定他们选择这条路线的原因。您可以看到 animationState 在动画完成后被使用,并且可能触发了其他东西。

[self runAction:action] 确实很简单,但也很容易看出它根本没有管理动画状态或键,我不得不假设他们决定他们的游戏需要这样做.

另外请记住,他们的方法可能具有更高的层次,在给定的玩家类中,它会调用一种灵活的方法来为给定的游戏实体制作动画并执行除更改动画之外的其他操作。所以在他们的高级编码中,他们可能会做更多这样的事情:

[self runAnimation"jump"];

甚至

[自跳];

而且因为他们设计了一个低级系统来管理动画状态并为给定的管理设计添加键,所以他们不必编写您指出的长线,除非您在上面看到的那种方法中使用过一次。

我发现存储 NSArray 帧而不是存储在 SKAction 中很有用的几个原因是因为我有时想操作动画或以不同的速度运行动画。但是您可能需要也可能不需要操纵动画的这些方面。

关于ios - 用图片或 SKAction 存储在内存 NSArray 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24439162/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap