gpt4 book ai didi

ios - UIKit Dynamics - 缓慢移动的物体不会反弹

转载 作者:行者123 更新时间:2023-12-01 18:17:59 25 4
gpt4 key购买 nike

我们的目标是创建一个环境,在该环境中,球的图像将非常缓慢在 View 中无限反弹。我可以让无尽的弹跳以高速运行,但不能以低速运行。

这是代码示例:

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

UICollisionBehavior *ballCollision = [[UICollisionBehavior alloc] initWithItems: @[largeBall, mediumBall, smallBall]];
[ballCollision setTranslatesReferenceBoundsIntoBoundary: YES];
[ballCollision setCollisionMode: UICollisionBehaviorModeBoundaries];

float force = 0.1;
int angle = 225;
NSNumber *rad = [NSNumber numberWithDouble: DEGREES_TO_RADIANS(angle)];

UIPushBehavior *smallPush = [[UIPushBehavior alloc] initWithItems: @[smallBall] mode: UIPushBehaviorModeInstantaneous];
[smallPush setAngle: [rad floatValue]];
[smallPush setMagnitude: force];

UIDynamicItemBehavior *dynamicBehavior = [[UIDynamicItemBehavior alloc] initWithItems: @[smallBall]];
[dynamicBehavior setDensity: 0.0];
[dynamicBehavior setElasticity: 1.0];
[dynamicBehavior setFriction: 0.0];
[dynamicBehavior setResistance: 0.0];

[animator addBehavior: ballCollision];
[animator addBehavior: smallPush];
[animator addBehavior: dynamicBehavior];

我的高中物理课肯定是没听进去,因为我想不通为什么这行不通。摩擦力为零,弹性为一,球应该永远弹跳,不是吗?

最佳答案

请记住,UIKIt 动力学不是物理学。 Apple 在 WWDC 上反复强调了这一点。它“类似于物理学”。

UICollisionBehavior 抑制小于 100p/s 的矢量分量(这没有记录;您可以通过实验解决)。这通常是您想要的,因此事情不会永远弹跳,并使一些常见用途更容易实现。 UIDynamicItemBehavior 并没有真正深入地融入我的体验。它并没有真正定义项目的“基本”特征;它只是以类似于物理学的方式调整其他行为。

UIKit Dynamics 也有各种舍入错误,当您将 float 推到可以容纳的边缘时,这些错误会使项目以非理想的方式运行。 UIKit Dynamics 的目的是在 UIView 中加入一点弹跳,而不是模拟真实的物理交互。

我并不是说 UIKit Dynamics 这样做是正确的。我发现使用它很有挑战性,而且它通常以这样不明显的方式表现。如果您需要更像物理学的东西,您可能想要探索 SpriteKit。如果这个问题对您有影响,我建议您打开雷达 (bugreport.apple.com)。

您可以通过更简单的实现自己进行试验:

- (void)viewDidLoad {
// Variables to play with
CGFloat force = .25; // At .25, will bounce forever.
CGFloat angle = 0; // Play with small values to see effect.

[super viewDidLoad];
UIView *ball = [[UIView alloc] initWithFrame:CGRectMake(400, 300, 50, 50)];
ball.backgroundColor = [UIColor greenColor];
[self.view addSubview:ball];

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView: self.view];

UICollisionBehavior *ballCollision = [[UICollisionBehavior alloc] initWithItems: @[ball]];
[ballCollision setTranslatesReferenceBoundsIntoBoundary:YES];

UIPushBehavior *smallPush = [[UIPushBehavior alloc] initWithItems:@[ball]
mode:UIPushBehaviorModeInstantaneous];
[smallPush setAngle:GetRadiansForDegrees(angle)];
[smallPush setMagnitude: force];

UIDynamicItemBehavior *dynamicBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[ball]];
__weak id weakBehavior = dynamicBehavior;
[dynamicBehavior setElasticity: 1];
[dynamicBehavior setResistance: 0.0];
dynamicBehavior.action = ^{
NSLog(@"linear:%@", NSStringFromCGPoint([weakBehavior linearVelocityForItem:ball]));
};

[self.animator addBehavior: ballCollision];
[self.animator addBehavior: smallPush];
[self.animator addBehavior: dynamicBehavior];
}

关于ios - UIKit Dynamics - 缓慢移动的物体不会反弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798050/

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