ios - gameplaykit
Brecha entre SKSpriteNodes en la detección de colisiones SpriteKit (1)
Creo que tiene que ver con physicsBodies
construidos desde un CGPath
. Por ejemplo, usando el código a continuación para crear 6 cuadrados:
override func didMoveToView(view: SKView) {
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
self.physicsWorld.gravity = CGVector(dx: 0, dy: -9.8)
self.backgroundColor = UIColor.whiteColor()
let square1 = SKSpriteNode(color: UIColor.blackColor(), size: CGSize(width: 50, height: 50))
square1.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRect(x: -25, y: -25, width: square1.size.width, height: square1.size.height))
square1.position = CGPoint(x: self.size.width/2 - 75, y: 25)
self.addChild(square1)
let square2 = SKSpriteNode(color: UIColor.greenColor(), size: CGSize(width: 50, height: 50))
square2.physicsBody = SKPhysicsBody(rectangleOfSize: square2.size)
square2.position = CGPoint(x: self.size.width/2 - 75, y: 200)
self.addChild(square2)
let square3 = SKSpriteNode(color: UIColor.blueColor(), size: CGSize(width: 50, height: 50))
square3.physicsBody = SKPhysicsBody(rectangleOfSize: square3.size)
square3.position = CGPoint(x: self.size.width/2 + 75, y: 200)
self.addChild(square3)
let squarePath = getSquarePath()
let square4 = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 50, height: 50))
square4.physicsBody = SKPhysicsBody(polygonFromPath: squarePath)
square4.position = CGPoint(x: self.size.width/2 + 75, y: 400)
self.addChild(square4)
let square5 = SKSpriteNode(color: UIColor.orangeColor(), size: CGSize(width: 50, height: 50))
square5.physicsBody = SKPhysicsBody(rectangleOfSize: square5.size)
square5.position = CGPoint(x: self.size.width/2, y: 200)
self.addChild(square5)
let square6 = SKSpriteNode(color: UIColor.purpleColor(), size: CGSize(width: 50, height: 50))
square6.physicsBody = SKPhysicsBody(rectangleOfSize: square6.size)
square6.position = CGPoint(x: self.size.width/2, y: 400)
self.addChild(square6)
}
func getSquarePath() -> CGPath {
let path = CGPathCreateMutable()
CGPathMoveToPoint(path, nil, -25, -25)
CGPathAddLineToPoint(path, nil, -25, 25)
CGPathAddLineToPoint(path, nil, 25, 25)
CGPathAddLineToPoint(path, nil, 25, -25)
CGPathCloseSubpath(path)
return path
}
se puede ver que los cuadrados con physicsBodies
creados a partir de CGPath
(esto incluye edgeLoopFromRect) tienen ese problema de espacio. Incluso el physicsBody
del physicsBody
de la escena tiene este problema. Esto también aparece cuando construyo physicsBody usando los constructores de texture
que parecen construir un CGPath
bajo el capó.
No he encontrado una solución para eso, aparte de no usar esos tipos de physicsBodies
para physicsBodies
a largo plazo (visibles).
He estado tratando de resolver esto desde hace bastante tiempo. Tengo un juego con física de plataformas simple donde un jugador se cae en un bloque, lo que le impide caerse. Esto funciona, sin embargo, hay una brecha notable entre dónde se detiene el jugador y dónde se encuentra el objeto / spritenode real. Aquí hay una captura de pantalla, debería ser autoexplicativa:
class GameScene: SKScene {
override init(){
super.init(size: UIScreen.mainScreen().bounds.size)
self.physicsWorld.gravity = CGVector(dx: 0, dy: -9.8)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func genBlock(iteration: CGFloat){
let block = SKSpriteNode(color: UIColor.blackColor(), size: CGSizeMake(100,50))
block.position = CGPointMake((iteration*50)-block.size.width/2,0)
block.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRectMake(0,0,block.size.width,block.size.height))
self.addChild(block)
}
func genPlayer(){
let char = SKSpriteNode(color: UIColor.redColor(), size: CGSizeMake(100,100))
char.position = CGPointMake(0,500)
char.physicsBody = SKPhysicsBody(rectangleOfSize: char.size)
self.addChild(char)
}
override func didMoveToView(view: SKView) {
/* Setup your scene here */
view.backgroundColor = UIColor.whiteColor()
self.view?.backgroundColor = UIColor.whiteColor()
genBlock(0)
genBlock(1)
genBlock(2)
genBlock(3)
genBlock(4)
genPlayer()
}
}
Siento que esto no es un problema con SpriteKit y, en cambio, es un problema con mi código. Cualquier consejo sobre cómo eliminar esta brecha entre los nodos sería muy apreciado.
EDITAR: He enviado esto al reportero de errores de Apple, pero no espero recibir nada en respuesta. Si alguien viene aquí mucho después de haber publicado esto, sería genial si pudiera enviar sus sugerencias aquí.