如何在精灵工具包中复制精灵并让它们表现不同

kap*_*ken 4 sprite-kit swift

我一直在研究IOS手机游戏,我想拿一个对象,复制它,让副本在整个屏幕上移动.我已经通过Google查找了与此相关的内容,但它们都是在Objective C中,或者只是没有我想要的东西.我想知道如何在Swift和SpriteKit中执行此操作.

Dio*_*son 10

如果您正在使用SKSpriteNode,可以复制它及其所有当前属性:

let copiedNode = nodeToCopy.copy() as! SKSpriteNode
Run Code Online (Sandbox Code Playgroud)

您仍然需要添加copiedNode到场景中.copiedNode还将继续运行nodeToCopy正在运行的任何操作.你可以用它取消它们copiedNode.removeAllActions().


请注意,协议的文档NSCopying准确读取:

协议

NSCopying

对象采用的协议,提供自己的功能副本.

"复制"的确切含义因类而异,但副本必须是功能独立的对象,其值与复制时的原始值相同...

事实上,在这种情况下SKSpriteNode,Apple已经解释了这个想法,以便该copy()功能"产生"该项目的另一个实例,就像在任何游戏引擎中一样.

(因此,对于SKSpriteNode copy()的工作方式与InstantiateUnity中的意义相同,比如说.)

正如mogelbuster在下面指出的那样,Apple文档中没有任何地方声明"Apple中的spawn命令是copy()"但事实上他们已经解释了这个"复制"的确切含义因类而异"正是这种方式对于SKNode来说,因为它确实是一个游戏引擎,它是那里唯一有意义的复制感.


值得注意的是,在游戏中最常用的工作方式是:对于你说的rocketShips,你会有一个你的rocketShip"模型",比如modelRocketShip.该模型只是位于屏幕外,或者可能标记为不可见或不活动.你永远不会在游戏中使用该模型,它只是坐在那里.当你产生rocketShips时,你只需要欺骗模型.(所以在Apple中的modelRocketShip.copy()然后设置位置等)

  • 该代码是一般化的.`nodeToCopy`表示要复制的节点. (2认同)

Lin*_*wei 1

您可以定义一个函数来创建并返回 sprite :

func createSprite()->SKSpriteNode{
    let sprite = SKSpriteNode(...)//Use the init function in the SKSpriteNode class
    //Add some code to define the sprite's property
    return sprite
}
Run Code Online (Sandbox Code Playgroud)

并调用此函数来获取一些具有相同属性的精灵:

let spriteOne = createSprite() 
let spriteTwo = createSprite()
Run Code Online (Sandbox Code Playgroud)

然后你可以SKAction为它们中的每一个添加不同的 s,以便它们可以有不同的行为。