INSpriteKit 1.2.1

INSpriteKit 1.2.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2015年4月

Sven Korset 维护。



  • 作者:
  • Sven Korset

INSpriteKit 为 Sprite Kit 添加了一些功能。这个库最初是为 iOS 设计的,但也适用于 OS X。在 OS X 上,鼠标事件(特别是左键单击)被解释为触摸。

功能

INSKView: 为更好的触摸传递替换 SKView

  • 用自有的触摸传递系统替换 Sprite Kit 的触摸传递系统,以解决 Sprite Kit 中一些触摸检测的错误
    • 尊重 SKNode 的 userInteractionEnabled 属性。
    • 使用精灵节点的框架而不是所有子节点都在其中的外扩展边界框。
    • 即使在旋转时也使用精灵节点的视觉表示,而不是扩展框架。
  • 即使不在所有节点上方,SKNodes 也可以使用 touchPriority 获得触摸。
  • 添加全局触摸观察节点,无论其位置和可见状态如何都会收到通知。节点也可以这样获得触摸,即使没有在场景树中。
  • 默认情况下在 OS X 的 Sprite Kit 场景中支持右键鼠标,可以选择使用 AppKit 的默认行为进行上下文菜单。

INSKButtonNode: Sprite Kit 的 UIButton 适配器

  • 完全支持触摸和状态处理。
  • 为禁用、正常、高亮、选择和选择+高亮状态设置不同的视觉表示。
  • 当按钮被按下、释放和释放在其框架内时,通过选择器或委托回调。
  • 为测试环境提供了一个快捷方法 buttonNodeWithTitle:fontSize:,用于创建带标签的按钮。

INSKScrollNode: Sprite Kit 的 UIScrollView 适配器

  • 完全支持在所有方向上滚动内容节点。
  • 可以从中选择不同的预设以选择滚动退出行为。
  • 还支持分页。

INSKTiledImageNode: 为大型精灵的 SKSpriteNode

  • 一个用于显示图像的精灵节点,这些图像太大而无法用作纹理。
  • 显示大于 1024x1024(分别 2048x2048)的图像。
  • 将大图像分块,将分块保存到磁盘,稍后加载并传递给 INSKTiledImageNode 而不是单个大文件。

数学函数

  • 用于 CGPoint 的不同向量和适当的转换方法。
  • 例如 ScalarNearOther() 等标量的方法,用于确定 CGFloat 是否与另一个加减 epsilon 相同。
  • 角度转换和计算。

一些分类

  • SKNode
    • insertChildOrNil:atIndex: 作为 iOS 7 中存在bug的 insertChild:atIndex: 函数的工作替代品。
    • bringToFrontsendToBack 用于操作树顺序。
    • changeParent: 替换节点的父节点并转换其位置。
    • stringifyNodeTree 从节点的树创建 NSString 以供调试。
  • SKSpriteNode
    • isPointInside: 检查位置点是否位于精灵节点的纹理内。
    • sizeUnscaled 返回精灵的非缩放大小。
  • SKEmitterNode
    • emitterLife 计算发射器的总寿命。
    • runActionToRemoveWhenFinished 添加一个动作,在发射器完成发射后将移除它。

示例

有两个示例项目,一个是 iOS 的,另一个是 OS X 的。它们都使用相同的示例场景和测试,可以在 'Example' 目录中找到。要运行示例项目,首先在项目目录中运行 pod install(需要安装 Cocoapods)。然后使用 Xcode 打开工作区文件 INSpriteKitExample.xcworkspace 并运行示例或测试。示例场景在 'ExampleScenes' 目录中,只需浏览它们以了解如何使用库。

要查看 INSKView 和 SKView 之间的行为差异,只需将Storyboard(OS X项目的 WindowController.xib 文件)中 skView 类的名称从 INSKView 更改为 SKView。

要求

iOS 7+ 或 OS X 10.9+,启用 ARC

需要以下框架

  • SpriteKit
  • GLKit

安装

或者手动克隆仓库,将 INSpriteKit 目录添加到您的项目中,并将要求部分中提到的必要框架添加到您的项目中。

将 INSpriteKit.h 头文件包含到您的项目中以获取访问所有添加项。

如果是使用 OS X 和 iOS 代码在同一项目中,可能还需要包含 INSKOSBridge.h,它添加了一些在其他 OS 中不可用的类型和方法。

已知错误

OS X 中 Sprite Kit 场景上的 AppKit 控制器的触摸传递

在 OS X 中,当有 AppKit 控制器覆盖 Sprite Kit 场景时,可能会发生触摸传递错误。一些鼠标抬起事件可能丢失。

要复现此错误,请运行 OS X 示例项目并启动 TouchHandlingScene。将鼠标移至场景底部 AppKit 按钮的左上角,使鼠标也位于指向两个按钮的红色按钮上。按下左鼠标按钮将触发 AppKit 按钮,按下右鼠标按钮将触发红色 Sprite Kit 按钮。

然而,在按下并持有那里的左鼠标按钮时,然后按下并持有右鼠标按钮,并且在此之后在右按钮之前释放左鼠标按钮,会导致事件丢失。在这种情况下,不会将右鼠标按钮的鼠标按下事件传递到场景,而只有右鼠标按钮的鼠标抬起事件,所以它会被过度释放。

如果改变这个顺序,将产生一个不会释放的鼠标按下事件。因此,当在相应位置按下并持有右鼠标按钮,然后按下并持有左鼠标按钮,并在随后在左按钮之前释放右鼠标按钮时,也会导致事件丢失。在这种情况下,右鼠标按钮的鼠标抬起事件将不会传递。

您可以通过观察按钮右侧的小绿色/青色方块来查看丢失的事件。当按下的按钮总数为负时,方块将消失;如果不释放点击,方块的大小将不会缩小回正常大小。

使用[NSEvent addLocalMonitorForEventsMatchingMask:handler:]进行事件观察也会产生类似的问题,因为表格视图的单元格上的点击不会传递相应的触摸抬起事件。

任何帮助都将受到欢迎,因此如果有人可以解决这个问题,或者指给我一个好的方向,请不要犹豫,给我发个信息。

更新日志

CHANGELOG.md

许可证

INSpriteKit 在MIT许可证下可用。更多信息请参阅LICENSE文件。