这里的代码是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编程实践吗?
答案 0 :(得分:1)
在编写基于精灵的游戏时,将游戏对象作为sprite类(或更通用的节点)的子类,即使在Swift和SpriteKit之前(例如,Cocos2d /),这是很常见的做法目标-C)。
有些纯粹主义者可能认为你应该将模型(数据),视图(精灵)和控制器(游戏逻辑)分离成单独的对象,但在简单的游戏中,可以导致拥有大量的课程,每个课程都很少。
(在我看来,它实际上是关于偏好以及对您的特定应用程序有何方便)
如果您仍然希望朝着这个方向前进,那么您可以让每个对象的逻辑/状态由非SpriteKit类(例如,Swift根类或NSObject
的子类)表示,每个对象以某种方式链接到在屏幕上表示它的精灵(参考,唯一身份等),详细信息由你决定。
然后,在每个帧上,根据它们所代表的模型对象(例如,"太空飞船")的逻辑(游戏)状态,更新每个精灵的视觉状态(位置等)。 / p>
希望它有意义。
答案 1 :(得分:1)
我同意NicolasMiari的观点。这取决于你的特定游戏,但通常有一个SKNode类,它包含一个,两个或更多个SKSpriteKitNode,以便正确表示它。例如,如果你的宇宙飞船可以拥有一个太空飞船作为一个卫星,它的特定动作,动画,碰撞等怎么办?在这种情况下,更容易将它作为单独的精灵。