SpriteKit 动画没有在它应该加载的时候加载。我究竟做错了啥?

Posted

技术标签:

【中文标题】SpriteKit 动画没有在它应该加载的时候加载。我究竟做错了啥?【英文标题】:SpriteKit Animation isn't loading when it supposed to be. What am I doing wrong?SpriteKit 动画没有在它应该加载的时候加载。我究竟做错了什么? 【发布时间】:2015-03-11 10:28:32 【问题描述】:

我正在制作一个简单的游戏。英雄应该跳过敌人,如果他们发生碰撞 - 敌人应该吃掉英雄。我在英雄面前随机生成了 4 种敌人。我使用每个敌人阵列的第一个精灵作为主要精灵,其余的用于动画。但是当它们碰撞时——什么都没有发生,它仍然是第一个精灵。 我就是这样做的:

let mouseAtlas = SKTextureAtlas(named: "mouse") 
mouseArray.append(mouseAtlas.textureNamed("mouse_0"));
mouseArray.append(mouseAtlas.textureNamed("mouse_1"));
mouseArray.append(mouseAtlas.textureNamed("mouse_2"));
mouseArray.append(mouseAtlas.textureNamed("mouse_3"));

老鼠是敌人,饼干是英雄。

mouse = SKSpriteNode(texture: mouseArray[0]);
self.mouse.position = CGPointMake(CGRectGetMaxX(self.frame) + self.cookie.size.width, self.cookieSpot + self.cookie.size.height + self.cookie.size.height / 2)
self.mouse.size = CGSizeMake(self.cookie.size.width + self.cookie.size.width / 2, self.cookie.size.height + cookie.size.height / 2)    

self.addChild(cookie)
self.addChild(mouse)

然后我将实体应用于它们:

self.cookie.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(self.cookie.size.width / 2))
self.cookie.physicsBody?.affectedByGravity = false
self.cookie.physicsBody?.categoryBitMask = ColliderType.Cookie.rawValue
self.cookie.physicsBody?.collisionBitMask = ColliderType.Pet.rawValue
self.cookie.physicsBody?.contactTestBitMask = ColliderType.Pet.rawValue

self.mouse.physicsBody = SKPhysicsBody(rectangleOfSize: self.mouse.size)
self.mouse.physicsBody?.dynamic = false
self.mouse.physicsBody?.categoryBitMask = ColliderType.Pet.rawValue
self.mouse.physicsBody?.contactTestBitMask = ColliderType.Cookie.rawValue
self.mouse.physicsBody?.collisionBitMask = ColliderType.Cookie.rawValue    

然后我尝试在接触开始时制作动画:

func didBeginContact(contact: SKPhysicsContact) 
    eatenByMouse(); eatenByHamster(); eatenByRabbit(); eatenByCat()


func eatenByMouse() 
    self.groundSpeed = 0
    self.cookie.hidden = true
 let animateAction = SKAction.animateWithTextures(self.mouseArray, timePerFrame: 0.1)

就像我说的,有 4 种类型的敌人,但它们实际上是相同的。我做错了什么?我也有兴趣,我可以只在一侧制作敌人的物理体吗?我的意思是,例如,如果我的英雄碰到敌人的嘴,怎么能让它被吃掉?如果它碰到尾巴,它会继续滚动和跳跃吗?非常感谢!

【问题讨论】:

【参考方案1】:

您必须在创建后运行SKAction

func eatenByMouse() 
    self.groundSpeed = 0
    self.cookie.hidden = true
    let animateAction = SKAction.animateWithTextures(self.mouseArray, timePerFrame: 0.1)
    self.mouse.runAction(animateAction) // added line.

您可以使用SKPhysicsContact.contactPoint 来检测碰撞点。

【讨论】:

谢谢!它有帮助!你能帮我解决那一侧的碰撞吗?或者,也许还有一个问题。当我对敌人的外观进行编码时,我认为如果他们可以分组出现就可以了,但现在我发现这不是很好。如何让敌人之间出现随机范围?我尝试过,但最终得到了一些奇怪的东西。我将使用生成代码更新我的问题 我明白了。但是我现在尝试了动画,当敌人吃掉英雄时——屏幕上的每个敌人都会运行那个吃东西的动画。这是为什么呢? 在堆栈溢出中随机产生一个新问题。这令人困惑。 你正在运行所有的动画联系eatenByMouse(); eatenByHamster(); eatenByRabbit(); eatenByCat()这就是为什么所有的动画都同时执行 好吧,我会随机生成一个新问题!非常感谢!我想,我会为 didBeginContact 做一个 switch 语句,这样就可以了。再次感谢!

以上是关于SpriteKit 动画没有在它应该加载的时候加载。我究竟做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 SpriteKit 中预加载纹理

SpriteKit 在哪里为数千个精灵加载纹理图集

SpriteKit 示例游戏错误:纹理未加载?

首次加载时动画滞后

从文件名加载 SpriteKit 关卡

SpriteKit 瓷砖地图不加载瓷砖