Динамическое физическое тело со временем отталкивается от экрана - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть два SKNodes.Я добавил своего персонажа как ребенка первого, а карту - как ребенка второго.У меня есть несколько физических тел вдоль стен карты, с которыми контактирует персонаж.У меня есть виртуальный джойстик на экране, который перемещает второй SKNode.(Чтобы создать видимость движения.)

Способ, которым я двигаю свою вторую (карту), SKNode создал эту странную дилемму.Я не могу понять это.

Поскольку он динамичен, мой персонаж отталкивается и не остается в центре, когда сталкивается с физическими телами вдоль стен карты.Мне нужно , чтобы он оставался в центре, когда он сталкивается со стенами карты, даже если он врезается прямо в физические тела.(К вашему сведению, игра представляет собой двухмерную ролевую игру сверху вниз. Похожа на Chrono Trigger, Final Fantasy, Dragon Quest и т. Д. Не похожа на Castlevania или 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
}

Физика настроена как обычно.Я использовал перечисление для определения битовых масок категорий каждого из тел.Узел персонажа является динамическим, а стены - нет.Ни одно из тел не подвержено гравитации.Физика работает отлично.На самом деле, они на самом деле работают слишком хорошо.Как мне держать моего игрока в центре?Есть ли способ не сделать его динамичным, но также заставить его соприкасаться со стенами?

...