从GameScene

时间:2016-01-19 19:55:17

标签: ios swift sprite-kit skspritenode

我正在制作一个自定义的SKSpriteNode,当我逐步调用createShip时,类中的heroShip常量是正确的,但是当我跳回到gameScene时,heroShip常量没有我在调用createShip时分配的属性,I我不确定我做错了什么。我尝试过使用类函数,但使用高度和宽度属性并不起作用。

自定义SKSpriteNode类

class hero: SKSpriteNode {
    var width: CGFloat = 0.0
    var height: CGFloat = 0.0

     func createShip() -> SKSpriteNode {
        let heroShip = SKSpriteNode(imageNamed: "heroShip")
            heroShip.anchorPoint = CGPointMake(1.0, 0.5)
            heroShip.physicsBody = SKPhysicsBody(rectangleOfSize: heroShip.size)
            heroShip.physicsBody?.usesPreciseCollisionDetection = true
              heroShip.zPosition = 1.0
            heroShip.physicsBody?.mass = 0.02
            heroShip.physicsBody?.dynamic = true
            heroShip.physicsBody?.affectedByGravity = false
            heroShip.physicsBody?.categoryBitMask = ObjectCategory.collisionHeroCategory.rawValue
            heroShip.physicsBody?.contactTestBitMask = ObjectCategory.sceneCategory.rawValue
            heroShip.physicsBody?.collisionBitMask = 0x0 | ObjectCategory.sceneCategory.rawValue

            //heroShip.position = CGPointMake((scene?.frame.size.width)!/6.0, (scene?.frame.size.height)!/2.0)

        heroShip.position = CGPointMake(width, height)

        return heroShip


    }
}

我的GameScene

class GameScene: SKScene,SKPhysicsContactDelegate{


    let background = SKSpriteNode(imageNamed: "background")
    var score:Int = 0
    let scoreLabel = SKLabelNode(fontNamed: "Courier")
    let MotionManager = CMMotionManager()
    var heroShip = hero()
    override func didMoveToView(view: SKView) {
        heroShip.width = self.size.width/6.0
        heroShip.height = self.size.height/2.0
        heroShip.createShip()
        let enemyShip = SKSpriteNode(imageNamed: "enemyShip")
        /* Setup your scene here */
        self.physicsWorld.contactDelegate = self
        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRectMake(0,heroShip.size.width/1.25,frame.width,frame.height - heroShip.size.width*1.6))
        scene?.physicsBody?.contactTestBitMask = ObjectCategory.sceneCategory.rawValue
        scene?.physicsBody?.categoryBitMask = ObjectCategory.sceneCategory.rawValue
        background.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame))
        scoreLabel.fontColor = SKColor.whiteColor()
        scoreLabel.text = String(format: "Score: %01u",score)
        scoreLabel.position = CGPointMake(frame.size.width/2, frame.size.height - scoreLabel.frame.size.width/1.2)
        scoreLabel.zPosition = 1.0


        enemyShip.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
        enemyShip.zPosition = 1.0
        enemyShip.physicsBody = SKPhysicsBody(rectangleOfSize: heroShip.size)
        enemyShip.physicsBody?.usesPreciseCollisionDetection = true
        enemyShip.physicsBody?.mass = 0.02
        enemyShip.physicsBody?.dynamic = true
        enemyShip.physicsBody?.affectedByGravity = false
        enemyShip.physicsBody?.categoryBitMask = ObjectCategory.collisionEnemyCategory.rawValue
        enemyShip.physicsBody?.contactTestBitMask = ObjectCategory.collisionBulletCategory.rawValue
        enemyShip.physicsBody?.collisionBitMask = 0x0

        self.addChild(enemyShip)
        self.addChild(background)
        self.addChild(self.heroShip)
        self.addChild(scoreLabel)

        if MotionManager.accelerometerAvailable{
            MotionManager.startAccelerometerUpdates()
        }

    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let bullet = SKSpriteNode(imageNamed: "bullet")
        bullet.position = CGPointMake(heroShip.position.x, heroShip.position.y)
        bullet.zPosition = 1.0
        // Add physics body for collision detection
        bullet.physicsBody = SKPhysicsBody(rectangleOfSize: bullet.frame.size)
        bullet.physicsBody?.dynamic = true
        bullet.physicsBody?.affectedByGravity = false
        bullet.physicsBody?.categoryBitMask = ObjectCategory.collisionBulletCategory.rawValue
        bullet.physicsBody?.contactTestBitMask = ObjectCategory.collisionHeroCategory.rawValue
        bullet.physicsBody?.collisionBitMask = 0x0;
        let action = SKAction.moveToX(CGRectGetMaxX(self.frame) + bullet.size.width, duration: 0.75)
        self.addChild(bullet)
        bullet.runAction(action, completion: {
            bullet.removeAllActions()
            bullet.removeFromParent()
        })
    }

    func didBeginContact(contact: SKPhysicsContact) {
        if contact.bodyB.categoryBitMask == ObjectCategory.collisionBulletCategory.rawValue && contact.bodyA.categoryBitMask == ObjectCategory.collisionEnemyCategory.rawValue{
        score++
        }
    }



    override func update(currentTime: CFTimeInterval) {
        let data = MotionManager.accelerometerData
        if data?.acceleration.x == nil{
            print("nil")
        }
        else if fabs((data?.acceleration.x)!) > 0.2 {
            heroShip.physicsBody?.applyForce(CGVectorMake(0.0, CGFloat(40 * (data?.acceleration.x)!)))
        }

        scoreLabel.text = String(format: "Score: %01u",score)


    }
}

2 个答案:

答案 0 :(得分:2)

你跑

import fileinput

for line in fileinput.input():
    print line

然后永远不会对返回的heroShip.createShip() 做任何事情。据我所知,英雄级英雄舰。对于这个答案的其余部分,我将不再考虑这个假设。

SKSpriteNode的顶部开始,你应该做一些重构。

GameScene将使用var heroShip = hero()结构替换为init:

SKSpriteNode

转到var heroShip = hero(imageNamed: "heroShip") 班级,hero应转为func createShip() -> SKSpriteNode {。由于您现在已经使用图像纹理设置了节点,并且正在使用func createShip() {类作为节点,因此无需返回hero

删除SKSpriteNode,因为let heroShip = SKSpriteNode(imageNamed: "heroShip") 将成为我们的hero

heroShip变量的所有用法替换为heroShip.whatever。最后,删除self.whatever

答案 1 :(得分:1)

您似乎无法理解您的代码发生了什么。

截至目前createShip()正在创建一艘英雄舰,但你永远不会使用它。

通过查看您的代码,似乎甚至不需要 convenience init(imageNamed: String,sceneSize:CGSize) { let heroTexture = SKTexture(imageNamed: imageNamed) self.init(texture: heroTexture, color: UIColor.whiteColor(), size: heroTexture.size()) //This may need to be tweeked, my mac is dead right now to verify. self.anchorPoint = CGPointMake(1.0, 0.5) self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size) self.physicsBody?.usesPreciseCollisionDetection = true self.zPosition = 1.0 self.physicsBody?.mass = 0.02 self.physicsBody?.dynamic = true self.physicsBody?.affectedByGravity = false heroShip.physicsBody?.categoryBitMask = ObjectCategory.collisionHeroCategory.rawValue heroShip.physicsBody?.contactTestBitMask = ObjectCategory.sceneCategory.rawValue heroShip.physicsBody?.collisionBitMask = 0x0 | ObjectCategory.sceneCategory.rawValue //self.position = CGPointMake((scene?.frame.size.width)!/6.0, (scene?.frame.size.height)!/2.0) self.position = CGPointMake(sceneSize.width, sceneSize.height) } 。从它看,英雄是ISoShip,你的init中的代码也是如此。

SKPhysicsBody

您现在遇到了另一个问题,那就是您的SKPhysicsBody无法与您的定位点对齐。

要解决此问题,请按以下方式创建let centerPoint = CGPointMake(self.size.width / 2 - (self.size.width * self.anchorPoint.x), self.size.height / 2 - (self.size.height * self.anchorPoint.y)) self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size, center: centerPoint)

/B/something