SpriteKit: спрайты движутся друг через друга с уже установленной физикой

Поэтому я создал игрока, который перемещает плитку и стену вокруг карты, чтобы держать игрока на игровой площадке. Оба имеют физику тела в них. Я предполагаю, что мое движение игрока не правильно, и поэтому игрок вонзается в стены. Позвольте мне показать вам мой код:

Итак, это физика тела игрока:

self.physicsBody!.usesPreciseCollisionDetection = true
self.physicsBody!.categoryBitMask = PhysicsCategory.Player
self.physicsBody!.contactTestBitMask = PhysicsCategory.House
self.physicsBody!.collisionBitMask = PhysicsCategory.Wall

И это физика тела стены:

self.physicsBody!.usesPreciseCollisionDetection = true
self.physicsBody!.categoryBitMask = PhysicsCategory.Wall
self.physicsBody!.contactTestBitMask = 0
self.physicsBody!.collisionBitMask = PhysicsCategory.Player
self.physicsBody!.isDynamic = false

Они оба наследуются от класса Objects:

self.physicsBody = SKPhysicsBody(rectangleOf: size)
self.physicsBody!.affectedByGravity = false
self.name = name

Итак, позвольте мне дать вам мой код движения игрока, если в этом причина:

func move(direction: String, width: CGFloat){
    //Choosing the direction based of the users touch
    switch direction{
        case "South":
        //Decreasing the position of the player by 1 Tile
        pos.y -= width

        //Flipping the picture the right way to make the player look in the right direction
        yScale = 1.0

        //Rotates the picture
        let rotateAction = SKAction.rotate(toAngle: -1.57, duration: 0.0)
        run(rotateAction)

       //All the other directions just change the x and y value of pos corresponding to the direction
    }

    //Moves the player to the calculated position
    let moveAction =  SKAction.move(to: pos, duration: 0.0)
    run(moveAction){
        //Sound
    }

Редактировать:

Значения PhysicsCategory.Player а также PhysicsCategory.Wall

struct PhysicsCategory{
   static let Wall:UInt32 = 0x1 << 0
   static let Player:UInt32 = 0x1 << 1
   static let House:UInt32 = 0x1 << 2
}

Изменить 2:

Основная проблема заключается в том, чтобы столкновение со SKAction работало нормально

2 ответа

Вы на самом деле не описали свою проблему, кроме "Спрайты движутся сквозь друг друга..." и "так что игрок вонзается в стены"

Чтобы проверить все ваши контакты и коллизии, взгляните на мой ответ здесь: iOS SpriteKit - коллизии и контакты работают не так, как ожидалось, и попробуйте реализовать функцию checkPhysics() и вызывать ее, как только вы решите, что настроили все свои физические тела и их взаимодействия.

Вы уверены, что:

  • игрок и стена на самом деле имеют физические тела?
  • сцена это SKPhysicsContactDelegate
  • Вы установили physicsWorld.contactDelegate = self
  • Вы реализовали один из дополнительных методов SKPhysicsContactDelegate:
    • didBeginContact
    • didEndcontact

Это правильно:

  • Вы хотите, чтобы игрок столкнулся со стеной?
  • Вы хотите, чтобы стена столкнулась с игроком?
  • Вы хотите получать уведомления (звонил ли Begincontact), когда игрок и дом касаются?
  • Вы не хотите получать уведомления, если стена касается чего-нибудь?

Это не перечислено в вопросе здесь, но причина, по которой контакт столкновения не происходит, состоит в том, что метод didBeginContact изменился на didBegin

Другие вопросы по тегам