swift sprite-kit collision skphysicsbody

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?