动态物理物体最终被推离屏幕

时间:2018-11-26 15:29:35

标签: ios swift sprite-kit physics

我有两个SKNode。我将角色添加为第一个角色的孩子,并将地图添加为第二个角色的孩子。我在角色接触的地图的墙壁上有一些物理物体。屏幕上有一个虚拟操纵杆,可以移动第二个SKNode。 (以显示运动的外观。)

我移动第二个(地图)SKNode的方式造成了这个奇怪的难题。我不知道。

由于他是动态的,所以当他与沿地图墙壁的物理物体碰撞时,我的角色会被推到一边并且不会保持居中。我需要当他与地图的墙壁碰撞时仍要居中,即使他直接正面撞击物理物体也是如此。 (仅供参考,该游戏是2D自上而下的RPG游戏。类似于“计时触发”,“最终幻想”,“勇者斗恶龙”等。不像恶魔城或Terraria。)

虚拟操纵杆代码:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)
        if isTracking == true && location.x >= -(self.frame.width / 2) {

            v = CGVector(dx: location.x - DPad.position.x, dy: location.y - DPad.position.y)
            let angle = atan2(v.dy, v.dx)
            let deg = angle * CGFloat(180 / Double.pi)

            let Length:CGFloat = DPad.frame.size.height / 2
            let xDist: CGFloat = sin(angle - 1.57079633) * Length
            let yDist: CGFloat = cos(angle - 1.57079633) * Length


            xJoystickDelta = thumbNode.position.x - DPad.position.x
            yJoystickDelta = thumbNode.position.y - DPad.position.y
        }
    }
}

地图代码移动:

override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
    let xScale = CGFloat(0.056) //adjust to your preference
    let yScale = CGFloat(0.056) //adjust to your preference

    let xAdd = xScale * self.xJoystickDelta
    let yAdd = yScale * self.yJoystickDelta

    map.position.x -= xAdd
    map.position.y -= yAdd
}

物理设置正常。我使用枚举来确定每个主体的类别位掩码。角色节点是动态的,墙不是。没有一个身体受重力影响。物理工作很棒。实际上,它们实际上工作得很好。如何保持播放器居中?有没有办法让他不充满活力,但又让他接触墙壁?

0 个答案:

没有答案