gpt4 book ai didi

ios - SpriteKit 异常 'PKPhysicsBody' 崩溃

转载 作者:可可西里 更新时间:2023-11-01 04:41:31 25 4
gpt4 key购买 nike

我正在尝试为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com