问题标签 [sprite-kit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sprite-kit - SpriteKit SKAction animateWithTextures 使用纹理图集
SpriteKit SKAction animateWithTextures 在第一次使用 Texture Atlasing 时无法正确渲染。
我有一个场景,它初始化一个精灵并在它上面运行一个动作,当我不使用纹理图集时效果很好。现在的问题是,当场景第一次加载时,它绘制的精灵帧大小与其纹理大小相同,因此精灵被拉伸。我有一个后退按钮,所以当我退出并重新进入场景时,它会正常加载。它不会影响 Texture Atlases 中的任何其他精灵纹理,只会影响动画纹理,奇怪的是它只在第一次渲染时发生。
注意:我使用的是一个单例,它有一个数组存储在 ViewController.m 文件中生成的所有动画。
** 添加 **
好的,我已经做了很多实验,我得出的结论是自动图集生成器解释我的文件名的方式一定有问题,我认为这与“@2x”标签有关特定。
我已经尝试通过删除名称的“.atlas”部分来重命名 atlas 文件夹,并且图像可以完美呈现,当然这不是理想的解决方案,因为这意味着更多的绘图调用。
我命名图像的方式如下...
主题-名称-编号-分辨率-设备-PNG
因此,例如,图像将被称为“SPOOKY_tree_0@2x~iphone.png”
然后我使用辅助方法将它加载到缓存单例中......
然后使用“名称”变量将其存储在一个键下的NSMutableDictionary中,就像这样......
当我想使用该动画时,我使用“[[PEGOGraphicLoader sharedGraphicLoader] frameByName:kP1_DEPLOYING_PEG]];”行调用单例缓存。它返回一个 SKAction *。
我想不知何故,当它为动画调用图像时,它会将@2x 重新应用于图像并尝试将它们压缩到精灵帧中,但我不确定。此外,这仍然不能解释动画在第一次之后正常渲染的事实。
我已经尝试将分辨率元素和设备元素排除在 -textureWithImageNamed: 方法之外,但是纹理图集根本没有找到图像,只是显示为巨大的 X。我想我会在没有启用纹理图集的情况下工作,直到我知道它绝对不是纹理图集生成器的错误。
与此同时,我正在考虑使用 hack 类型命名约定,这样我就可以根据设备类型等以编程方式决定要加载哪些纹理,并且每种设备类型都有不同的 atlas 文件夹。
如果有人遇到过类似的问题或想告诉我我做错了什么,那么我想知道。我还没有在实际设备上测试游戏,所以可能是模拟器的问题。
ios - iOS 7 - SpriteKit 按钮/菜单项
我正在尝试构建一个简单的 iOS 游戏。当我的主菜单加载并出现在屏幕上时,我想让按钮从侧面移入。我唯一的想法是将一些 SKActions 应用于 SKSpriteNodes。但是所以我必须创建自己的按钮类。有没有更简单的方法来实现这一点?cocos2d 中是否已经有像 CCMenuItem/CCMenu 这样的类?或者有没有 UIButtons 的方法?
谢谢
objective-c - 如何在 Sprite Kit (Xcode) 中创建关节?
我不明白如何在 SpriteKit 中创建一个关节来连接两个身体。感谢帮助。
ios - SpriteKit中如何应用全屏SKEffectNode进行后期处理
我正在尝试使用以下设置的 SpriteKit:
- 具有两个子节点的 SKScene 仅用于对其他节点进行分组:前景和背景。
- 到目前为止,背景确实是空的,但最终会保存某种类型的背景精灵/图层。
- foreground 是一个 SKEffectNode,每当用户点击屏幕时,代表游戏元素的 SKnode 子类的新实例将作为子元素添加到其中。
- 这个 SKNode 子类基本上创建了 3 个 SKShapeNode 和两个标签:一个外圆周、一个内圆周、2 个标签和一个内四分之一圆周。内四分之一圆周有一个 SKAction,使其永远围绕其原点/中心旋转。
现在问题来了,只要前台没有任何 CIFilter 或 shouldEnableEffects = NO,一切都很好。也就是说,我可以点击屏幕,我的游戏元素被实例化并添加到主场景中。但是,当我尝试将 CIGaussianBlur 或 CIBloom 添加到前景时,我注意到两件事:
- 帧率下降到大约 2fps。请注意,即使场景中只有 6 个节点存活,也会发生这种情况。
效果似乎在不断地裁剪其内容或调整其框架。也就是说,如果我有一个节点,“全屏”效果似乎会尝试不断裁剪或调整其边界到容纳所有节点所需的最小区域。这是一个节点:
这是针对 2 个节点的:
在 OpenGL ES 2 中,通过基本上将整个帧缓冲区(所有对象)渲染到纹理,然后在该纹理上至少再进行一次模糊等操作,然后将其呈现在附加到的帧缓冲区中,可以进行后期模糊/绽放显示或将其与原始渲染组合回帧缓冲区。我希望 SKEffectNode 以类似的方式工作。然而,裁剪和糟糕的性能让我认为我可能以错误的方式使用效果节点。有什么想法吗?
ios7 - 在两个 SKPhysicsBody 对象之间创建 SKPhysicsJoint 是否会禁用它们之间的碰撞检测?
我注意到以下几点:
- 如果我创建了一个具有物理边界 (
bodyWithEdgeLoopFromRect
) 和两个节点的场景,每个节点都有一个圆形实体物理体 (bodyWithCircleOfRadius
),那么在将这两个节点添加到场景中时,它们可以如预期的那样相互碰撞并与场景的边界发生碰撞。 - 但是,如果我在两个节点之间添加任何类型的关节,则关节约束在它们之间保持不变,并且它们仍然可以与场景的边界发生碰撞。但它们不再相互碰撞。
这对我来说似乎是一个错误。我希望物理体之间的任何关节除了它们的基本碰撞机制之外。有没有人经历过类似的行为或对我可能做错了什么有任何暗示?
(顺便说一句,我用 Box2d 标记它的原因是因为 SpriteKit 使用 Box2d,所以这可能是我不知道的 box2d 已知问题)。
ios - 如何在 SpriteKit 中为关节添加纹理?
也许我可以用锚点来做,但我真的不明白我应该怎么做。
objective-c - 如何让 SKPhysicsBody 在 iOS7 SpriteKit 中像球一样反弹?
我已经设置了我的场景以包含一个边缘循环和一个球形物体,它应该下降然后反弹,直到它的所有能量都消失了。但是,我似乎无法获得 SpriteKit 中的物理特性以最大程度地减少恢复原状。球总是掉落并反弹仅几个像素。
我的参数是:
- 世界重力 = -4f
- 球体 = 圆形,半径为框架宽度的一半
- 归还 = 0f
- 摩擦力 = 0f
我已经调整了重力、球的质量和所有其他属性。我的最后一个想法是在球击中其中一个边界时立即对球施加力,但这感觉不对。我应该能够模拟一个弹跳球。
xcode - Xcode 5 - 资产目录中的启动图像不会显示
我的 LaunchImage 有问题。当我使用 SpriteKit 模板创建一个新项目并立即添加我的两个启动图像时,一切正常。现在我将设备方向(常规->部署信息)更改为横向左和横向右(取消选择“纵向”)。我再次运行模拟器,图像不会显示。(即使我允许“纵向”-再次定向)有人知道,这是怎么回事?
第二个问题:当我尝试将资产目录与 SKSpriteNode 对象一起使用时,图像也没有显示出来。相反,节点是一个深绿色的矩形。如果我尝试将相同的图像分配给 UIImageView 一切正常......
objective-c - 了解 CGPoint 方法
我无法理解以下教程中的一些数学:
我不确定如何理解偏移量。在教程进行到一半时,Ray 使用了以下代码:
其中 rwSub 是
我知道这段代码有效,但我不明白。我尝试了 NSLogging 触摸点和偏移点,它们并没有形成如图所示的三角形:
(来源:raywenderlich.com)
这是我从输出中得到的:
这不会形成正确方向的矢量..但它仍然有效吗?有人能解释一下偏移是如何工作的吗?
ios - Sprite Kit 和播放声音导致应用程序终止
使用弧
只是我遇到的一个问题-我有一个 SKScene,我在其中使用 SKAction 类方法播放声音效果
现在,当我尝试进入后台时,无论声音结束,显然 iOS 正在终止我的应用程序,原因是gpus_ReturnNotPermittedKillClient
.
现在只有当我评论这一行而不运行动作时,iOS 才会在后台运行它(当然,暂停,但没有终止)。
我究竟做错了什么?
编辑:如果该行未运行,iOS 将不会终止应用程序 - 比如说,如果它在一个if statement
未运行(soundOn == YES)
或类似的情况下,当 bool 是false