gameplaykit ios iphone swift sprite-kit game-engine

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í.