gpt4 book ai didi

swift - 在子类 SKSpriteNode 中创建 SKSpriteNode 是一种好习惯吗?

转载 作者:可可西里 更新时间:2023-11-01 01:36:42 26 4
gpt4 key购买 nike

这里的代码子类化 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com