swift - SpriteKit: los Sprites se mueven entre sí con un cuerpo físico ya configurado
sprite-kit collision (2)
Así que he creado un jugador que se mueve a base de fichas y un muro que rodea el mapa para mantener al jugador en el patio de recreo. Ambos tienen un cuerpo físico en ellos. Supongo que mi movimiento del jugador no es correcto y el jugador se mete en las paredes. Déjame mostrarte mi código:
Así que esta es la física del cuerpo del jugador:
self.physicsBody!.usesPreciseCollisionDetection = true
self.physicsBody!.categoryBitMask = PhysicsCategory.Player
self.physicsBody!.contactTestBitMask = PhysicsCategory.House
self.physicsBody!.collisionBitMask = PhysicsCategory.Wall
Y esta es la física Cuerpo del Muro:
self.physicsBody!.usesPreciseCollisionDetection = true
self.physicsBody!.categoryBitMask = PhysicsCategory.Wall
self.physicsBody!.contactTestBitMask = 0
self.physicsBody!.collisionBitMask = PhysicsCategory.Player
self.physicsBody!.isDynamic = false
Ambos heredan de la clase Objetos:
self.physicsBody = SKPhysicsBody(rectangleOf: size)
self.physicsBody!.affectedByGravity = false
self.name = name
Así que déjame darte mi código para el movimiento del jugador si esa es la causa:
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
}
Editar:
Los valores de PhysicsCategory.Player
y PhysicsCategory.Wall
struct PhysicsCategory{
static let Wall:UInt32 = 0x1 << 0
static let Player:UInt32 = 0x1 << 1
static let House:UInt32 = 0x1 << 2
}
Editar 2:
El problema principal es colisionar con SKAction funcionando correctamente
No aparece en la pregunta aquí, pero la razón por la cual el contacto de colisión no está sucediendo es porque el método didBeginContact
cambió a didBegin
No describiste tu problema de otra manera que no sea "Los Sprites se mueven entre ellos ..." y "el jugador se mete en las paredes"
Para validar todos sus contactos y colisiones, eche un vistazo a mi respuesta aquí: iOS SpriteKit: las colisiones y contactos no funcionan como se esperaba e intente implementar la función checkPhysics () y llamarla una vez que crea que ha configurado todos sus cuerpos físicos. y sus interacciones
¿Estás seguro de que:
- jugador y pared en realidad tienen cuerpos de física?
- la escena es un
SKPhysicsContactDelegate
- Has configurado
physicsWorld.contactDelegate = self
- Ha implementado uno de los métodos opcionales de
SKPhysicsContactDelegate
:- didBeginContact
- didEndcontact
Es esto correcto:
- ¿Quieres que el jugador colisione con la pared?
- ¿Quieres que la pared colisione con el jugador?
- ¿Desea que lo notifiquen (se llamó a BeginExpress?) Cuando tocan el reproductor y la casa?
- ¿No quieres que te notifiquen si el muro toca algo?