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