- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这里的代码子类化 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 编程实践吗?
最佳答案
在编写基于 sprite 的游戏时,将游戏对象作为 sprite 类(或更通用的节点)的子类是很常见的做法,甚至早于 Swift 和 SpriteKit(例如 Cocos2d/目标-C)。
一些纯粹主义者可能会争辩说,您应该将模型(数据)、 View ( Sprite )和 Controller (游戏逻辑)解耦为单独的对象,但在简单的游戏中可能会导致拥有大量的类,而每个类的作用很小。
(在我看来,这实际上是关于偏好以及什么对您的特定应用来说方便)
如果您仍然希望朝那个方向前进,您可以让每个对象的逻辑/状态由一个非 SpriteKit 类(例如,Swift 根类或 NSObject
的子类)表示,每个对象以某种方式链接到屏幕上代表它的 sprite(引用、唯一 ID 等),细节由您决定。
然后,在每一帧上,根据它们所代表的模型对象(例如“宇宙飞船”)的逻辑(游戏)状态更新每个 Sprite 的视觉状态(位置等)。
希望这是有道理的。
关于swift - 在子类 SKSpriteNode 中创建 SKSpriteNode 是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36612620/
在我生活的世界中,构建一个将所有飞镖都扔到墙上的解决方案,并希望其中一些能命中靶心是一种非常糟糕的解决方案方法。 那么,我的问题出现了,什么时候在约定可接受的生产系统中使用 INSERT IGNORE
在数据处理时,经常会因为index报错而发愁。不要紧,本次来和大家聊聊pandas中处理索引的几种常用方法。 1.读取时指定索引列 很多情况下,我们的数据源是 CSV 文件。假设
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我是一名优秀的程序员,十分优秀!