ios - 在 SpriteKit 中将动态物理对象保持在手指下

标签 ios swift xcode sprite-kit swift4

我正在使用 spritekit 开发一个相对简单的 child 游戏,例如虚拟玩具屋。在这个游戏中,他们是纸质角色,还有一些互动对象,如弹力球。目前,我可以在移动手指时给出球的速度,并且球会跟随我移动的手指。但是,当我将手指(握住球)保持在屏幕上的一个位置时,球会变得不稳定并开始在整个房间内跳跃或从我的手指中掉落。我通过在角色被按住时将 isDynamic 设置为 false 并将它们的位置更新到我的手指来为角色解决了这个问题,但这不能为球完成,因为它会阻止速度工作。我已经包含了 moveChar 和 moveBall 函数,因此您可以看到它们的区别,以及调用它们的地方的 touchesMoved。谢谢!

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
//        print("Ball velocity is: ", ball.physicsBody?.velocity as Any)
    if let touch = touches.first {
        let location = touch.location(in: self)
        let startLocation = touch.previousLocation(in: self)
        if let sprite = currentSpriteHeld {
            if sprite == ball {
                moveBall(sprite: sprite, to: location)
            } else {
                moveChar(sprite: sprite, to: location)
            }
        } else {
            let impulse = CGFloat(2.0)
            let dx = (impulse * (startLocation.x - location.x))
            let dy = (impulse * (startLocation.y - location.y))
            let cameraPos = desiredPosition;
            let newCameraPos = CGPoint(x: cameraPos.x+dx, y: cameraPos.y + dy);
//                cameraNode.position = newCameraPos
            desiredPosition = newCameraPos
        }
    }

}

func moveBall(sprite: SKSpriteNode, to location: CGPoint) {
    ball.physicsBody?.velocity = CGVector(dx: 0.0, dy: 0.0)
    let distance = CGDistance(from: sprite.position, to: location);
    print("CGDistance is: ", distance)
    if distance > 10.0 {
        let dx = location.x-sprite.position.x;
        let dy = location.y-sprite.position.y;
        let drag:CGFloat = 0.01
        var vel = CGVector(dx: dx/drag, dy: dy/drag)
        vel = velocityCheck(vel: vel);
        sprite.physicsBody!.velocity = vel
    } else {
        ball.position = location;
    }
}

func moveChar(sprite: SKSpriteNode, to location: CGPoint) {
    if (sprite == dad) {
        dad.texture = dadPickup
    }
    sprite.physicsBody?.isDynamic = false;
    sprite.zPosition = 2;
    sprite.position = location
    touchPoint = location;
}

已解决:我通过将 moveBall 移动到 touches ended 来解决这个问题。现在,我可以像捕获 sprite 一样捕获球,并且仅在松开时才施加速度(导致摇晃)。

最佳答案

已解决:我通过将 moveBall 移动到 touches ended 来解决这个问题。现在,我可以像捕获 sprite 一样捕获球,并且仅在松开时才施加速度(导致摇晃)。

关于ios - 在 SpriteKit 中将动态物理对象保持在手指下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48529501/

相关文章:

ios - 使用 vecLib/vDSP 创建带包络的正弦音调发生器

ios - 如何桥接 Objective-C initWithError : method into Swift

ios - UICollectionView subview 平移不滚动

SwiftUI Macos 搜索栏元素

iphone - 从搜索结果 UITableView 添加 segue

ios - Xcode 搜索和销毁

ios - 如果显式实现一个 getter,是否仍然创建了 ivar?

swift - 尝试合并两个日期会导致应用程序崩溃

android - android ByteBuffer.wrap(data).getFloat() 的 swift 等价物是什么?

ios - 单元格 ImageView 宽度不会改变