- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试为 SKPhysicsBody
实现一个简单的类别,这将允许我将“完美弹跳”应用于物理体。
这将简单地做的是当 perfectBouncing = YES
时将发生以下情况:
恢复 = 1.0
linearDamping = 0.0
摩擦 = 0.0
但是,当我尝试如下所示使用我的实现时,出现奇怪的崩溃,告诉我无法将 perfectBouncing
消息发送到 PKPhysicsBody
,这是一个我从未引用过并且不存在于我的项目中或据我所知在 SpriteKit SDK 中的类。
是的,正在导入目录。
崩溃消息
-[PKPhysicsBody setPerfectBouncing:]: unrecognized selector sent to instance 0x7fa828f84610
*** First throw call stack:
(
0 CoreFoundation 0x000000010882b3f5 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000107dbfbb7 objc_exception_throw + 45
2 CoreFoundation 0x000000010883250d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x000000010878a7fc ___forwarding___ + 988
4 CoreFoundation 0x000000010878a398 _CF_forwarding_prep_0 + 120
5 Squash The Dot 0x000000010785662c -[gameNode viewDidAnimateIn] + 1116
6 Squash The Dot 0x000000010783e709 -[lzyViewHandler initViewChild:] + 3305
7 Squash The Dot 0x000000010783d93d -[lzyViewHandler initViewChildren:] + 573
8 Squash The Dot 0x000000010785d3e0 __28-[splashVC viewDidAnimateIn]_block_invoke + 256
9 SpriteKit 0x000000010933837e _ZN9SKCAction25didFinishWithTargetAtTimeEP9SKCSprited + 44
10 SpriteKit 0x0000000109399638 _ZN9SKCSprite6updateEd + 170
11 SpriteKit 0x0000000109352dd4 -[SKScene _update:] + 119
12 SpriteKit 0x000000010936d299 -[SKView(Private) _update:] + 563
13 SpriteKit 0x000000010936ac2f -[SKView renderCallback:] + 829
14 SpriteKit 0x0000000109367cec __29-[SKView setUpRenderCallback]_block_invoke + 54
15 SpriteKit 0x0000000109394744 -[SKDisplayLink _callbackForNextFrame:] + 256
16 QuartzCore 0x00000001091f88f7 _ZN2CA7Display15DisplayLinkItem8dispatchEv + 37
17 QuartzCore 0x00000001091f87bf _ZN2CA7Display11DisplayLink14dispatch_itemsEyyy + 315
18 CoreFoundation 0x00000001087934e4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
19 CoreFoundation 0x00000001087930a5 __CFRunLoopDoTimer + 1045
20 CoreFoundation 0x00000001087563dd __CFRunLoopRun + 1901
21 CoreFoundation 0x0000000108755a06 CFRunLoopRunSpecific + 470
22 GraphicsServices 0x000000010be319f0 GSEventRunModal + 161
23 UIKit 0x000000010953f550 UIApplicationMain + 1282
24 Squash The Dot 0x00000001078550a3 main + 115
25 libdyld.dylib 0x000000010b6cb145 start + 1
)
类别实现
#import <SpriteKit/SpriteKit.h>
@interface SKPhysicsBody (lzySKPhysics)
// Enables perfect boucing by setting friction = 0, linearDamping = 0 and restitution = 1.
@property (nonatomic) BOOL perfectBouncing;
@end
@implementation SKPhysicsBody (lzySKPhysics)
-(BOOL) perfectBouncing {
return (self.restitution == 1 && self.linearDamping == 0 && self.friction == 0);
}
-(void) setPerfectBouncing:(BOOL)perfectBouncing {
self.restitution = perfectBouncing;
self.linearDamping = !perfectBouncing;
self.friction = !perfectBouncing;
}
@end
使用示例
hero = [[SKSpriteNode alloc] initWithColor:[SKColor blueColor] size:CGSizeMake(heroRadius*2, heroRadius*2)];
hero.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:heroRadius];
hero.physicsBody.perfectBouncing = YES;
知道这个难以捉摸的 PKPhysicsBody
是什么以及为什么我会遇到此崩溃吗?
最佳答案
在内部,Sprite Kit 为许多公共(public)类提供了自定义类。在这种情况下,SKPhysicsBody 实际上创建了内部类 PKPhysicsBody 的一个实例。据推测,PK 代表“Physics Kit”。
这就是为什么你的类别不起作用,如果我没记错的话,强制转换也不会成功,因为 SKPhysicsBody 没有继承自 PKPhysicsBody,但如果我错了,你可以这样尝试:
((SKPhysicsBody)hero.physicsBody).perfectBouncing = YES;
无论如何,这里不需要类别。相反,您可以使用辅助类和类方法实现相同的效果,例如:
@implementation SKPhysicsHelper
+(BOOL) perfectBouncingWithBody:(SKPhysicsBody*)body {
return (body.restitution == 1 && body.linearDamping == 0 && body.friction == 0);
}
+(void) setPerfectBouncing:(BOOL)perfectBouncing body:(SKPhysicsBody*)body {
body.restitution = perfectBouncing;
body.linearDamping = !perfectBouncing;
body.friction = !perfectBouncing;
}
@end
关于ios - SpriteKit 异常 'PKPhysicsBody' 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26492573/
我正在尝试构建一个 SpriteKit 游戏,但它因错误而失败:“无法将模块“SpriteKit”加载为“Spritekit”” 我使用的是 Xcode 版本 6.3.2 (6D2105)。 最佳答案
如何在 spritekit swift 中更改碰撞时的 spritekit。 else if collidedBird.birdType == 6 { if U
我刚刚创建了一个新的 SpriteKit 项目,就遇到了砰!问题。我运行该项目时没有触及任何内容,并且应该如此,默认的 hello world 项目出现了。这方面一切都很好。现在,我创建了一个新的 C
当我使用 SpriteKit 创建视频对象时 let background = SKVideoNode(videoFileNamed: "Video.mov") 我只使用了一次命令: backgrou
出于某种原因,我无法将节点放置在屏幕的顶部或底部。我曾经能够使用 self.frame.height/2 很好地做到这一点,但现在我在景观中工作,这行代码不起作用。注意:我的 anchor 是 0.5
在场景中“缩小”的正确方法是什么。 我有一个物体,我施加一个冲动将它发射到屏幕上。例如,它会发射大约 100 像素,这按预期工作 - 增加它飞行的力量,增加它飞行的密度更少等等。 我遇到的问题是缩放,
是否可以更改粒子发射的频率。例如,如果我发射一个粒子,我可以让它每 5 秒或 10 秒发射一次吗? 我搜索了文档,但找不到任何内容。有解决方法吗?我想做这样的事情: emitter.partic
有谁知道一些开箱即用的库,它们可能会为 SKNode 提供诸如相机抖动之类的效果。 ? 如果没有,是否有一种简单的方法可以使用 Action 来实现相机抖动? 谢谢 最佳答案 我找到了一种使用 SKA
我目前一直在使用委托(delegate)和 SKView 自定义类来监视我的 OS X SpriteKit 游戏中的按键。我需要为我的键盘监控类雇用多个代表,我知道这是不可能的,但可以通过使用观察者来
我从事 SpriteKit 游戏已经有一段时间了,但我有一个无法摆脱的恼人问题。我不想过多介绍这款游戏,但它非常简单。我每秒生成一些对象(SKSpriteNodes),这些对象使用 SpriteKit
我正在制作基于SpriteKit的多级游戏。 一切正常,除了一件事:当用户玩很长时间、改变很多关卡等时......然后 SpriteKit 开始丢失纹理。 我的意思是,没有像图像加载失败时那样的大红叉
我正在尝试将 SKSprite Particle Emitter 与 Swift 一起使用。 但我想在我的发射器中使用许多不同的纹理。 是否有可能:拥有许多图像,并且让发射器随机使用图像,而不是仅使用
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在用SpriteKit构建我的第一个项目,但我无法弄清楚这部分。 我的项目包括飞入屏幕的敌方直升机。每个敌人播放大约14秒长的声音文件。这不是循环。它包括敌人进入屏幕之前接近的声音,以及在屏幕上移
我试图在代码中到处搜索:解释文档在进入后台时会做什么,或者甚至有时会暂停,但无济于事-有人可以指导我在进入后台时建议做什么到启用 Sprite 套件的游戏中的背景吗? 我应该调用scene.pause
我是 SpriteKit 新手。我需要通过 UIImageView 或 SpriteNode 显示图像(它是游戏的背景图像)。但是,我需要用户能够放大背景并平移。我在不使用 SpriteKit 的情况
在我的游戏中,我正在创建一些受重力影响的球。当游戏开始时,他们会从屏幕外掉下来,并在底部找到自己的位置。没有其他力施加在他们身上。 问题是我正在用精确的坐标、精确的物理属性创建这些球,但结果不一样。它
我想让我的宇宙飞船有一条跟随它的粒子轨迹。我该怎么做? 这是我的宇宙飞船的代码: override func didMove(to view: SKView) { spaceS.positio
我正在尝试制作一个动画角色,可以在不移动他的躯干的情况下伸手去拿屏幕上的东西。 如果他够不到,他的手应该朝这个方向移动最大量,然后被他的静态躯干的物理限制所抵消。 所以在我的代码中,绿色矩形( han
我的场景上有player对象,并试图对其施加一些力。您可以看到我正在对update:文件上的MyScene.h方法施加作用力。但是,我的player根本没有动。发生了什么? 下面是Player SKS
我是一名优秀的程序员,十分优秀!