4

を使用するとクラッシュし続けUIKit Dynamicsます。コードが実行されるたびに発生するわけではありませんが、かなり頻繁に発生します。誰かがこれに出くわしましたか?

Assertion failed: (a.x >= 0.0f && a.y >= 0.0f), 
function SolveVelocityConstraints, file 
/SourceCache/PhysicsKit/PhysicsKit-
4.6/PhysicsKit/Box2D/Dynamics/Contacts/b2ContactSolver.cpp, line 422.

これは、エラーを生成するコードです。衝突境界と関係があると思います。

UIDynamicAnimator *animator = 
 [[UIDynamicAnimator alloc] initWithReferenceView:self];

UIGravityBehavior *gravityBehavior = 
 [[UIGravityBehavior alloc] initWithItems:@[self.rewardButton]];
gravityBehavior.gravityDirection = CGVectorMake(0.0, 1.0);
gravityBehavior.magnitude = 1.0f;

UICollisionBehavior* collisionBehavior = 
 [[UICollisionBehavior alloc] initWithItems:@[self.rewardButton, 
                                              self.processingView]];
collisionBehavior.collisionDelegate = self;
UIEdgeInsets insets = UIEdgeInsetsMake(-700, 60, 200, 60);
[collisionBehavior setTranslatesReferenceBoundsIntoBoundaryWithInsets:insets];

UIDynamicItemBehavior* propertiesBehavior = 
 [[UIDynamicItemBehavior alloc] initWithItems:@[self.rewardButton]];
float elasticity = arc4random() % 4 * 0.1 + 0.1f;
propertiesBehavior.elasticity = elasticity;

[animator addBehavior:propertiesBehavior];
[animator addBehavior:gravityBehavior];
[animator addBehavior:collisionBehavior];

self.animator = animator;
4

2 に答える 2

1

私にとってうまくいくと思われるちょっとしたハックは、UIDynamicItemBehavior に非常に大きな密度量を設定することです。1 または 2 の密度を使用してもエラーが発生しましたが、500 では発生しなかったようです。私が言ったように、それはかなりハックですが、私の非常に限られたテストでは、うまくいくようです.

UIDynamicItemBehavior *itemBehavior = 
 [[UIDynamicItemBehavior alloc] initWithItems:self.items];
[itemBehavior setDensity:500.0f];
[self.animator itemBehavior];

コメントしている KillerRhino と彼がリンクしている Box2D スレッドに感謝します。UIDynamicItemBehavior のドキュメントによると、密度とそのサイズによって質量が決まります。願わくば、この回避策が他の条件や設定の下でも有効であることを願っています。

この問題は、新しい A7 チップを搭載した新しいデバイス (iPhone 5s、iPad Air、iPad Mini Retina) でのみ発生すると思います。たぶん64ビットの問題?

于 2013-11-27T06:41:08.270 に答える
0

私はまったく同じクラッシャーを持っていました。スプライトのphysicsBodyオブジェクトの質量を増やすことで解決しました。それらは 0.05 のように非常に小さかった。それらを 50 に増やし (すべてを 1,000 倍した)、クラッシャーが停止しました。もちろん、物理効果が質量を増やす前と同じように見えるようにするには、他のいくつかのプロパティを変更する必要があります。

于 2013-12-13T04:04:30.827 に答える