访问阵列中的元素数量并应用重力行为



我在使用重力模块中使数组的所有元素掉落时遇到问题。我已经设法使阵列中的最后一个元素掉落,然后在测试过程中剩下的元素就停留在屏幕顶部。调试

我正在使用Uikit,并希望在使用其他各种引擎(例如SpriteKit和gameplaykit(之前彻底了解这种语言。

func mainGame()
    {
    let cars = ["car5", "car1", "car6", "car3", "car2", "car4"]
    var random2 = Int(arc4random_uniform(UInt32(cars.count))) + 1
    for i in 1...random2
        {
        let image = UIImage(named: cars[i - 1])
        let carView = UIImageView(image: image!)
        carView.frame = CGRect(x:i * 52, y:0 , width: 40, height: 50)
        view.addSubview(carView)
        dynamicAnimator = UIDynamicAnimator(referenceView: self.view)
        gravityBehavior = UIDynamicItemBehavior(items: [carView]) //cars falling
        dynamicAnimator.addBehavior(gravityBehavior)
        collisionBehavior = UICollisionBehavior(items: [carView, mainCar]) //collide
        collisionBehavior.translatesReferenceBoundsIntoBoundary = false
        gravityBehavior.addLinearVelocity(CGPoint(x: 0, y: 200), for: carView)
        dynamicAnimator.addBehavior(collisionBehavior)
        }
    collisionBehavior.addBoundary(withIdentifier: "Barrier" as NSCopying, for: UIBezierPath(rect: mainCar.frame))
    collisionBehavior.removeAllBoundaries()
    }

到目前为止,游戏中的最后一辆阵列中的最后一辆汽车和我控制的主要玩家汽车具有碰撞行为,这对我来说是一个重要的一步!

您正在创建一个新的UIDynamicAnimator,每次迭代循环并将其分配给dynamicAnimator。这就是为什么只有最后一个元素可以工作的原因,因为它是分配给该变量的最后一个。

要修复它,只需将此行移动到只能称为一次的地方。

dynamicAnimator = UIDynamicAnimator(referenceView: self.view)

viewDidLoad是一个应该有效的地方。

uikitdynamics是大多数相似框架的后退。您不会使对象动画。您有一个动画师并将对象附加到它。正如聪明的错误指出,在这种情况下,您只需要一个动画师。

关键点是您不将重力固定在汽车上;您将汽车连接到行为(重力(,然后将行为附加到动画师。是的,这很奇怪,向后。

我没有测试过,但是正确的代码将更接近这一点:

func mainGame()
    {
    let cars = ["car5", "car1", "car6", "car3", "car2", "car4"]
    var random2 = Int(arc4random_uniform(UInt32(cars.count))) + 1
    var carViews: [UIImageView] = []
    dynamicAnimator = UIDynamicAnimator(referenceView: self.view)
    // First create all the views
    for i in 1...random2
        {
        let image = UIImage(named: cars[i - 1])
        let carView = UIImageView(image: image!)
        carView.frame = CGRect(x:i * 52, y:0 , width: 40, height: 50)
        view.addSubview(carView)
        carViews.append(carView)
        }
    // and then attach those to behaviors:
    gravityBehavior = UIGravityBehavior(items: carViews) //cars falling
    dynamicAnimator.addBehavior(gravityBehavior)
    collisionBehavior = UICollisionBehavior(items: carView + mainCar) //collide
    collisionBehavior.translatesReferenceBoundsIntoBoundary = false
    dynamicAnimator.addBehavior(collisionBehavior)
    collisionBehavior.addBoundary(withIdentifier: "Barrier" as NSCopying, for: UIBezierPath(rect: mainCar.frame))
    collisionBehavior.removeAllBoundaries()
    // You don't need this; it's built into Gravity
    // gravityBehavior.addLinearVelocity(CGPoint(x: 0, y: 200), for: carView)
    }

Uikitdynamics与大多数动画框架不同的主要方式是,动画的事物不知道它们是动画的。您不能问汽车的行为,因为它没有任何行为。uidynemicanimator基本上是一个定时循环,可更新其目标的centertransform。确实没有什么幻想的(与诸如核心动画之类的东西相反,有很多花哨的事情正在进行(。有了一点iOS体验,您可能可以用单个GCD队列手动实现所有Uikitdynamics(甚至可能不需要,因为它在MAIN上运行了所有内容。...(

最新更新