如何确定特定动画帧何时运行

2024-01-06

我想知道动画的某些帧何时运行以设置各种条件。在下面的代码中,如何使用计数器或设置条件来确定特定动画帧(例如第 3 帧和第 8 帧)当前正在运行的时间?

NSMutableArray *frameArray = [NSMutableArray array];
 for(int i = 1; i < 12; i++) 
{
    CCLOG(@"item %d added", i);
    [frameArray addObject:
     [birdSpriteFrameCache spriteFrameByName:
      [NSString stringWithFormat:@"Sprite%d.png", i]]];    } 

//Starting the Animation
CCAnimation *animation = [CCAnimation animationWithSpriteFrames:frameArray delay: 0.3];

id action =[CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation :animation]];
[firstSprite runAction:action];

如果您使用 cocos2d 2.0,现在会按帧提供通知。直接来自文档:

/*******************/
/** Notifications **/
/*******************/
/** @def CCAnimationFrameDisplayedNotification
    Notification name when a CCSpriteFrame is displayed
 */
#define CCAnimationFrameDisplayedNotification @"CCAnimationFrameDisplayedNotification"

创建动画时,您可以向每个帧添加将随通知一起接收的 userInfo 字典。这是来自 CCActionInterval 的行:

NSDictionary *dict = [frame userInfo];
if( dict )
    [[NSNotificationCenter defaultCenter]       
          postNotificationName:CCAnimationFrameDisplayedNotification 
          object:target_ 
          userInfo:dict
    ];

所以我想你可以为第 3 帧和第 8 帧添加一个 dict 对象,并在通知回调中“做你的事情”。

ob cit:没有尝试过,但应该对你有用。

编辑:现在尝试过。我只花了一个小时才将一个非常笨重的基于时间的算法转换为我的游戏的 BattleController 类中可靠的事件驱动实现。我只收到 2 帧的通知:攻击动画的第 9 帧(我现在可以完美同步地播放武器声音)和受伤动画的第 11 帧(如果受害者死亡,我可以停止动画并慢慢淡出小动物)。 cocos2d 团队一路走好。并不是那么难,API 干净利落。

这是代码的一部分(我第一次破解它,不自豪:)),该代码使用了我的一些其他东西,但您应该能够开始了解总体思路。

-(void) registerForFrames{

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(gotFrame:)
                                                 name:CCAnimationFrameDisplayedNotification
                                               object:nil];
}   

-(void) deregisterForFrames {

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:CCAnimationFrameDisplayedNotification
                                                  object:nil];

}

-(NSDictionary *) frameEventForFrameNumber:(NSUInteger) frameNumber 
                                 animation:(NSString *) animationType {

    return [[FrameEvent frameEventForListener:frameListenerCombatController
                                animationName:animationType
                                  frameNumber:frameNumber] asDictionary];

}

-(FrameEvent*) frameEventForFrame:(NSDictionary *) theDic{
    return [FrameEvent frameEventListenerWithContentsOfDictionary:theDic];
}

-(void) gotFrame:(id) notification{

    NSDictionary *userInfoDictionary =  [notification userInfo];
    FrameEvent *ev = [self frameEventForFrame:userInfoDictionary];
    if (!ev) {
        MPLOGERROR(@"*** userInfo returned nil frameEvent object, bailing out!");
        return;
    }

    if (ev.frameListenerType==frameListenerUnknown){
        MPLOGERROR(@"*** Got served an unknown dictionary, bailing out!");
        return;
    }

    if (ev.frameListenerType==frameListenerCombatController) {

        MPLOG(@"Got Frame %@",ev.description);

        if([ev.animationName isEqualToString:@"attack"]) {
            [self scheduleOnce:@selector(attackTurnAround) delay:0.];
        }

        if ([ev.animationName isEqualToString:@"hurt"]) {
            // more here !
            MPLOG(@"TODO : schedule dead critter method");
        }
    } else {
        MPLOGERROR(@"*** Not processing frame listener of type [%@], bailing out!",
        [GEEngineSpecs frameListenerAsString:ev.frameListenerType]);
    }
}

最后是关键部分,将用户信息放在框架上:

- (CCAction *)attackActionFor:(GEClassAnimationSpec *)animSpec playerAsString:(NSString *)playerKey {

    NSMutableArray *animFrames = [NSMutableArray array];
    for (int i = 1; i <= animSpec.frames; i++) {
        NSString      *sfn = [NSString stringWithFormat:@"%@%@%i.png", animSpec.fileName, playerKey, i];
        CCSpriteFrame *sf  = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:sfn];
        [animFrames addObject:sf];

    }

    float animFrameDelay = 1.0f / K_ATTACK_FRAME_RATE;
    CCAnimation *anim = [CCAnimation animationWithSpriteFrames:animFrames delay:animFrameDelay];
    anim.restoreOriginalFrame = NO;

    CCAnimationFrame * ninth = [anim.frames objectAtIndex:8];
    NSDictionary *ui = [self frameEventForFrameNumber:9 animation:@"attack"];
    ninth.userInfo=ui;

    CCAction *action = [CCSequence actions:
        [CCAnimate actionWithAnimation:anim],
        [CCCallFunc actionWithTarget:self selector:@selector(resumeAttackerIdle)],
        nil
    ];
    return action;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何确定特定动画帧何时运行 的相关文章

  • 如何在一个元素上实现多个 CSS 过渡?

    这是一个非常简单的问题 但我找不到关于 CSS 转换属性的很好的文档 这是 CSS 片段 nav a text transform uppercase text decoration none color d3d3d3 line heigh
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • Brush 属性的 WPF ColorAnimation

    我想知道是否有人可以帮助我 我有一个标签 当在后面的代码中调用方法时 我需要能够在任意两种颜色之间交叉淡入淡出 迄今为止我最好的尝试 Private OldColor as Color Colors White Sub SetPulseCo
  • 使用 CSS 动画完成后从 DOM 中删除/隐藏 div?

    我有一个动画 其中 div 滑出视图 但是当动画完成时 div 只是返回到其在视图中的原始位置 如何仅使用 CSS 完全删除 div 或在动画结束后隐藏它 这是标记 div class container div class slide b
  • Mathematica 二维热方程动画

    我正在努力绘制二维温度梯度图 但遇到了很多麻烦 我当前的方法是定义一个插值函数 然后尝试多次绘制它的图表 然后为该图表表设置动画 这是我到目前为止所拥有的 RT 388 726919 R 1 FUNC NDSolve D T x y t t
  • 停止 CSS 动画但让其当前迭代完成

    我有以下 HTML div class rotate div 以及以下 CSS webkit keyframes rotate to webkit transform rotate 360deg rotate width 100px hei
  • 设置正确的 cocos2d 方向

    在我的 cocos2d 应用程序中 在我的应用程序委托的 applicationDidFinishLaunching 方法内 我通过 director setDeviceOrientation kCCDeviceOrientationPor
  • Android 中用于过渡的自定义动画对象?

    我想用一些更奇特的东西来覆盖 Android 中的默认活动转换 我想做的事情不能用通常使用的 XML 集来完成 所以我不能使用overridePendingTransition因为它只接受对基于 XML 的动画资源的整数引用 我想做的是创建
  • iOS 按钮在动画期间不可点击

    当我使用类别方法向按钮添加动画时 我无法单击该按钮 似乎它已被禁用 compassCalibrateButton pulse 1 5 continuously YES compassCalibrateButton userInteracti
  • 如何将transform-origin与SVG结合使用? [复制]

    这个问题在这里已经有答案了 我正在尝试旋转SVG path从它的中心但它不工作 a width 40px height 40px width 40px font size 1 5rem padding 1px overflow hidden
  • 使用 CSS3 在屏幕上移动图像

    我浏览网页已经有一段时间了 试图找到一种方法 让图标在加载页面时移动到屏幕上 从左侧移动到 body div 的中心 如何才能做到这一点 这是我到目前为止所拥有的 CSS3 a rotator text decoration none pa
  • CSS动画比JS动画快吗?

    前段时间读到一篇文章说CSS动画比JS动画快 使用 jQuery 做了一些动画后 我可以理解为什么有些人会这么说 因为 jQuery 动画有时会出现错误并且速度很慢 但我想知道的是 这个论点是否有任何核心事实 有一种常见的误解 认为 CSS
  • 高级 XAML 动画效果。脉冲、行进的蚂蚁、旋转。警报

    我有一个警报列表 当警报被激活时 要求使其更加引人注目 当警报状态发生变化时 我想在该项目周围创建脉冲外发光几秒钟 然后让它消失 我遇到的问题是我似乎无法仅在需要时才出现 DropShadowEffect 我尝试将不透明度设置为 0 将颜色
  • Three.js - 如何使用姿势估计数据为 3D 模型制作动画

    我正在尝试使用姿势估计坐标来对 Three js 中的装配模型进行动画处理 我正在使用的姿势估计技术提供了视频源中人物的实时 x y z 坐标 我正在尝试使用这些坐标相应地移动 3D 模型 我使用下面的代码 其中一些代码是我在相关问题的答案
  • requestAnimationFrame 报告的帧速率有时高于显示器的刷新速率

    我使用以下内容来记录应用程序的帧速率 let lastCalledTime let fps let frame 0 let csv Frame Timestamp FPS const refreshLoop gt window reques
  • 如何向按钮添加动画 gif?

    你能告诉我如何在 C 中向按钮添加动画 gif 吗 仅仅通过将 gif 添加到资源并设置为按钮图像并不能很好地工作 下一个帧出现在前一个帧之上 问题似乎在于 c 如何处理透明度 但我不知道如何解决它 提前致谢 编辑 玩完 gif 后 问题出
  • jQuery背景颜色动画

    我有一个带有链接和 SPAN 的 DIV 单击链接时 它会使用 AJAX 呈现项目列表 单击某个项目时 SPAN 的内容会发生更改 我想通过将 DIV 的背景颜色设置为绿色并使用 jQuery 将其动画回白色来突出显示此更改 var ori
  • VisualStateManager 和生成的转换

    正当我以为我明白的时候VisualStateManager 有些事情证明我错了 我正在使用 WPF 4 并且尝试简单地在鼠标悬停时放大某个项目 并在鼠标离开时将其缩小 我想我只需定义每个状态VisualStateGroup然后指定一个Vis
  • 身体动画不流畅

    下面代码中的 spaceShip 在开始按住任何箭头键时移动并不顺利 它移动一步 冻结一瞬间 然后 平稳 地移动 怎样才能让它从一开始就顺利运转 而不是 冻结 My code
  • Safari 中的 css3 边框半径动画过渡不起作用

    尝试在 Safari 中对图像的边框半径进行 css3 轻松过渡 它只是有点闪烁进入悬停状态 而不是平滑过渡 任何帮助深表感谢 我的代码如下 CSS all a hover img webkit border radius 50 moz b

随机推荐

  • 导航屏幕时,BottomTabNavigator 内的 StackNavigator 会重新呈现

    我有一个Tab Navigator The Tabs包含Stack Navigators 代码结构为 Tab createBottomTabNavigator HomeStack createStackNavigator SettingSt
  • PHP:在单词边界处截断文本

    有谁知道 Drupal 用于转换以下字符串的函数的确切名称 你好 你好吗 再发一些短信 into 你好 IE 该函数用于在 x 个单词之后截断句子 然后添加省略号 或者 如果有人有一个 php 片段可以做到这一点 那就太好了 functio
  • 尽管设置了 CC 和 CXX 变量,C 编译器识别仍未知

    我正在使用命令 cmake CC C Program Files x86 Microsoft Visual Studio 12 0 VC bin cl exe CXX C Program Files x86 Microsoft Visual
  • 使用 pip 安装时出现 Transport_encoding 错误

    在尝试通过 pip 安装任何 python 包时 我在 parse 中遇到意外的 arg 关键字编码 自从我安装了 python 3 6 的tensorflow以来 我遇到了这个问题 这可能导致 html5lib 和 setuptools
  • 如何在 UWP 中执行相对源模式查找祖先(或等效项)

    我正在尝试做一些人们认为应该非常简单的事情 至少在 WPF 中是这样 我有一个带有列表框和数据模板的页面 现在数据模板调用其中带有按钮的用户控件 没什么花哨的 但是按钮命令不是列表框源的一部分 而且我找不到一种简单的方法来告诉按钮在哪里寻找
  • 在 Python 中允许 Markdown,同时防止 XSS 攻击的最佳实践?

    我需要让用户将 Markdown 内容输入到我的 Web 应用程序中 该应用程序具有 Python 后端 我不想不必要地限制他们的条目 例如不允许anyHTML 这违背了 Markdown 的精神和规范 但显然我需要防止跨站脚本 XSS 攻
  • 是否应该避免 x._1,x._2... 语法?

    我刚刚开始使用 Scala 我发现自己经常使用元组变量 例如 这是我编写的一些代码 Count each letter of a string and return in a list sorted by character countLe
  • 以符合 HTML5 的方式将
    向左对齐

    目前 我正在使用 hr align left 在我的 HTML5 页面上 但我读到 align 属性在 XHTML 4 01 中已被弃用 并且据说已从 HTML5 中删除 我想使用 CSS 而不是像这样的内联属性 但是当我尝试时 hr al
  • 使用 timeit.Timer() 时如何传递函数的参数

    这是一个简单程序的概要 some pre defined constants A 1 B 2 function that does something critical def foo num1 num2 do something main
  • 在“UIDatePicker”类型的对象上找不到属性“preferredDatePickerStyle”

    我正在使用react native 0 62 2版本和datetimepicker版本3 0 1 当我尝试使用 xcode 构建项目时 显示以下错误 使用未声明的标识符 UIDatePickerStyleCompact 使用未声明的标识符
  • 用于连续半部分的无限序列的 Linq 语句

    给定一个起始数 想象一下它的连续两半的无限序列 1 0 5 0 25 0 125 忽略任何固有的数值不稳定性double 这可以在单个表达式中完成 而无需编写任何自定义扩展方法或生成器方法吗 我不知道单表达式方式 但我在这里找到了这个聪明的
  • 查询 WMI 类 Win32_QuickFixEngineering 返回很多奇怪的时间戳 (C#)

    类文档here http msdn microsoft com en us library aa394391 VS 85 aspx InstalledOn 属性应该具有安装修复程序时的时间戳 好吧 废话 但文档没有说明格式是什么 我得到一些
  • preg_replace PREG_BAD_UTF8_ERROR

    我有一个烦人的问题preg replace和字符集 我正在做一对preg replace连续但不幸的是第一次出现任何特殊字符 例如 由 preg replace 插入我得到PREG BAD UTF8 ERROR在随后的通话中 除了插入的特殊
  • TEE 之后如何处理镜像(重复)的 iptables 流量?

    我有一个关于使用 TEE 选项 iptables 流量进行镜像的问题 主要目标是将服务器 A 端口 1935 上服务的所有流量复制到服务器 B 上同一端口 端口 1935 上运行的相同服务 例如 如果我开始将视频流式传输到 192 168
  • Maven 插件,用于创建可执行 jar,其依赖项未解压(jar with jars)

    我阅读了很多使用依赖项构建可执行 jar 的解决方案 maven 阴影插件 maven 依赖项插件 maven 程序集插件 所有这些插件都会解压依赖项 jar 并将它们重新打包到可执行 jar 中 唯一将解压到可执行 jar 中的依赖项 j
  • 外键中的循环依赖:使用还是避免?

    我的应用程序将数据库中的大量数据加载到复杂的数据结构中 内存中的数据结构类似于数据库的结构 这意味着如果数据库包含以下表 表A 键为A1 表 B 键为 B1 其中一列是表 A 的键 的外键 表 C 键为 C1 其中一列是表 B 的键 的外键
  • 如何在Android Studio中使用Google Cloud Translation API?

    我正在制作一个用于语言翻译的 Android 应用程序 到目前为止 我已经使用语音识别器意图将语音输入转换为字符串 现在我想将该字符串翻译成另一种语言 并使用 TTS 引擎说出翻译后的文本 我创建了一个单独的translate test文件
  • 如何将视图模型传递到布局/母版页?

    在谷歌搜索了一段时间后 我对如何在 asp mvc 3 中执行此操作有点困惑 因此 任务是为多个控制器的视图提供一个通用的布局 或主 页面 所有视图本身都是强类型的 这个布局页面实际上可视化了一些强类型对象 因此 我需要将此对象传递到布局页
  • 在 Matplotlib 中使用获取和设置轴方法的相对坐标

    控制位置的一种方法figure反对新的axes应该是通过使用add axes方法 此方法接受 4 个值的列表或元组 这些值表示 左 下 宽 高 其中所有数量均以图形宽度和高度的分数形式表示 例如 import matplotlib fig
  • 如何确定特定动画帧何时运行

    我想知道动画的某些帧何时运行以设置各种条件 在下面的代码中 如何使用计数器或设置条件来确定特定动画帧 例如第 3 帧和第 8 帧 当前正在运行的时间 NSMutableArray frameArray NSMutableArray arra