在子类SKSpriteNode中创建SKSpriteNode是一个好习惯吗?

时间:2016-04-14 02:08:56

标签: swift subclass skspritenode

这里的代码是SKSpriteNode的子类,并初始化它接受SKScene

import SpriteKit

class Spaceship: SKSpriteNode{

var spaceship:SKTexture
var hitpoint = 100
var thescene:SKScene

var lazer5:SKSpriteNode?
var lazer5_pathofdestruction:SKSpriteNode?

init(skScene:SKScene) {

    thescene = skScene
    self.spaceship  = SKTexture(imageNamed:"Spaceship")
    super.init(texture: spaceship, color: SKColor.clearColor(), size: spaceship.size())
    self.name = "Spaceship"
    self.setScale(0.10)
    self.position =  CGPointMake(CGRectGetMidX(skScene.frame), CGRectGetMidY(skScene.frame))

}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
.......

这个班级(宇宙飞船)有一个方法可以解雇双重扫描:

 func firedualcanon() {

    let canonposition = [10.00 , -10.00]
    let fireSound = SKAction.playSoundFileNamed("dualcanon.wav", waitForCompletion: false)
    let targeting = SKAction.sequence([


        SKAction.runBlock{

            for position in canonposition {

                let canon = SKSpriteNode(color: SKColor.whiteColor(), size: CGSize(width:4, height: 3))
                canon.name = "weapon"
                canon.position = CGPointMake(self.position.x - CGFloat(position), self.position.y)
                let projectile = SKAction.moveTo(CGPoint(x: self.position.x - CGFloat(position), y: self.thescene.frame.height + 200 ),duration: 1.50)

                GlobalReference.setPhysicsBody(canon,collidertype: GlobalVariable.ColliderType.Light)

                self.thescene.addChild(canon)
                let bulletaction = SKAction.sequence([projectile,SKAction.removeFromParent()])
                canon.runAction(bulletaction)

            }


        }


        , SKAction.waitForDuration(0.10)

        ])

    self.thescene.runAction(
        SKAction.repeatActionForever(SKAction.group([fireSound,targeting])),
        withKey: "fireweapons")



}

正如你在初始化中看到的那样,我使用了SKTexture但现在在方法firedualcanon()中我使用SKSpriteNode创建了一个正典。

这是一个很好的Swift编程实践吗?

2 个答案:

答案 0 :(得分:1)

在编写基于精灵的游戏时,将游戏对象作为sprite类(或更通用的节点)的子类,即使在Swift和SpriteKit之前(例如,Cocos2d /),这是很常见的做法目标-C)。

有些纯粹主义者可能认为你应该将模型(数据),视图(精灵)和控制器(游戏逻辑)分离成单独的对象,但在简单的游戏中,可以导致拥有大量的课程,每个课程都很少。

在我看来,它实际上是关于偏好以及对您的特定应用程序有何方便)

如果您仍然希望朝着这个方向前进,那么您可以让每个对象的逻辑/状态由非SpriteKit类(例如,Swift根类或NSObject的子类)表示,每个对象以某种方式链接到在屏幕上表示它的精灵(参考,唯一身份等),详细信息由你决定。

然后,在每个帧上,根据它们所代表的模型对象(例如,"太空飞船")的逻辑(游戏)状态,更新每个精灵的视觉状态(位置等)。 / p>

希望它有意义。

答案 1 :(得分:1)

我同意NicolasMiari的观点。这取决于你的特定游戏,但通常有一个SKNode类,它包含一个,两个或更多个SKSpriteKitNode,以便正确表示它。例如,如果你的宇宙飞船可以拥有一个太空飞船作为一个卫星,它的特定动作,动画,碰撞等怎么办?在这种情况下,更容易将它作为单独的精灵。