Как сделать так, чтобы узлы спрайтов не давили друг на друга? - PullRequest
0 голосов
/ 02 марта 2019

3 Узла Спрайта движутся вверх на разных уровнях скорости.Вы видите, что горилла любит отдыхать, но лобстер медленно толкает ее вверх.Ожидается, что омар будет отдыхать и продолжать идти вверх, когда горилла снова начнет двигаться.Использование .isDynamic = false не сработало - узлы спрайтов накладывались друг на друга, и лобстер полностью игнорировал физическое тело ежа и гориллы.

Запись моей сцены на детской площадке: https://youtu.be/l47kaJiJvkM

Снимок экранавидео: screenshot

Код:

import SpriteKit

public class WalkingScene: SKScene {

public override func didMove(to view: SKView) {
    backgroundColor = .white

    view.showsPhysics = true

    let hedgehog = SKSpriteNode(imageNamed: "hedgehog")
    hedgehog.size = CGSize(width: 64, height: 64)
    hedgehog.position = CGPoint(x: size.width/2, y: 400)
    hedgehog.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 80, height: 80))
    hedgehog.physicsBody?.affectedByGravity = false
    hedgehog.physicsBody?.allowsRotation = false


    let gorilla = SKSpriteNode(imageNamed: "gorilla")
    gorilla.size = CGSize(width: 64, height: 64)
    gorilla.position = CGPoint(x: size.width/2, y: 140)
    gorilla.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 80, height: 80))
    gorilla.physicsBody?.affectedByGravity = false
    gorilla.physicsBody?.allowsRotation = false


    let lobster = SKSpriteNode(imageNamed: "lobster")
    lobster.size = CGSize(width: 64, height: 64)
    lobster.position = CGPoint(x: size.width/2, y: 20)
    lobster.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 80, height: 80))
    lobster.physicsBody?.affectedByGravity = false
    lobster.physicsBody?.allowsRotation = false


    //        hedgehog.physicsBody?.isDynamic = false
    //        gorilla.physicsBody?.isDynamic = false
    //                lobster.physicsBody?.isDynamic = false

    //        hedgehog.physicsBody?.usesPreciseCollisionDetection = true
    //                hedgehog.physicsBody?.collisionBitMask = 0
    //        gorilla.physicsBody?.usesPreciseCollisionDetection = true
    //                gorilla.physicsBody?.collisionBitMask = 0
    //        lobster.physicsBody?.usesPreciseCollisionDetection = true
    //                lobster.physicsBody?.collisionBitMask = 0

    self.addChild(lobster)
    self.addChild(hedgehog)
    self.addChild(gorilla)

    self.moveGorilla(gorilla)
    self.moveLobster(lobster)
    self.moveHedgeHog(hedgehog)
}

func moveGorilla(_ passenger: SKSpriteNode) {

    let moveLeft = CGVector(dx: 0, dy: 200)
    let aYYY = CGVector(dx: 200, dy: 0)
    let moving = SKAction.move(by: moveLeft, duration: 1)
    let turnAYY = SKAction.move(by: aYYY, duration: 1)
    let chill = SKAction.wait(forDuration: 3)

    passenger.run(SKAction.sequence([moving, chill, moving, chill, turnAYY])) {
        print("Gorilla arrived")
    }
}

func moveLobster(_ passenger: SKSpriteNode) {

    let moveLeft = CGVector(dx: 0, dy: 200)
    let moving = SKAction.move(by: moveLeft, duration: 1.2)

    passenger.run(SKAction.sequence([moving, moving, moving, moving, moving, moving, moving, moving, moving])) {
        print("Lobster arrived")
    }
}

func moveHedgeHog(_ passenger: SKSpriteNode) {
    let moveLeft = CGVector(dx: 0, dy: 200)
    let moving = SKAction.move(by: moveLeft, duration: 1)
    let chill = SKAction.wait(forDuration: 2)

    passenger.run(SKAction.sequence([chill, moving, moving, moving])) {
        print("Hedgehog arrived")
    }
}

}

1 Ответ

0 голосов
/ 02 марта 2019

Вы можете установить эту динамику следующим образом:

     hedgehog.physicsBody?.isDynamic = true
     gorilla.physicsBody?.isDynamic = false
     lobster.physicsBody?.isDynamic = true

С помощью этой стратегии вы можете распространить этот пример на другие ситуации.

Если isDynamic = true рассматривается как 0, аisDynamic = false, то есть static, рассматриваемый как бесконечность, есть нечто, между чем можно контролировать массу физического тела.

    hedgehog.physicsBody?.isDynamic = false. (mass = Infinity)
    gorilla.physicsBody?.isDynamic = true. (mass = big)
    lobster.physicsBody?.isDynamic = true  (mass = 0)

    gorilla.physicsBody?.mass = 1000
...