swift - 在 SpriteKit 中没有执行纹理的简单动画
问题描述
我正在尝试创建一个简单的动画(具有 3 个纹理),每次玩家死亡时应该只运行一次。我通过在线查找如何更改纹理并让程序在更改纹理之间等待来编写下面的代码(我想这样做而不是使用图集,因为它只有 3 个纹理)。
游戏有效,因此球停留在它死亡的位置。然后它停留在那个位置,而 print(I waited) 打印 3 次。但是,在等待之间,我的球的质地没有改变。这是下面代码中唯一不起作用的东西。
如何使此代码工作,或者是否有另一种创建一次性动画的简单方法?
override func update(_ currentTime: TimeInterval) {
//CHECK IF BALL IS INSIDE THE MAP
if (map_1_buffer.contains(ball.position)) {
} else {
let texture1 = SKTexture(imageNamed: "death_1")
let texture2 = SKTexture(imageNamed: "death_2")
let texture3 = SKTexture(imageNamed: "death_3")
let normal = SKTexture(imageNamed: "Ball1")
ball.texture = texture1
sleep(UInt32(2))
print("i waited 1")
ball.texture = texture2
sleep(UInt32(2))
print("i waited 2")
ball.texture = texture3
sleep(UInt32(2))
print("i waited 3")
ball.texture = normal
death += 1
ball.physicsBody?.velocity.dx = 0
ball.physicsBody?.velocity.dy = 0
ball.position = CGPoint(x: -120, y: 40)
}
}
解决方案
该update
函数旨在为每次显示刷新调用一次,因此将诸如sleep
调用之类的东西放入其中不会达到您想要的效果。我建议在这里阅读渲染周期的概述:https ://developer.apple.com/documentation/spritekit/skscene/responding_to_frame-cycle_events
渲染周期持续运行,您的目标是将事物放入update
或放入物理处理例程中,例如didBegin
检测和响应游戏中发生的事情。响应包括调整节点属性、添加或删除节点或向节点添加操作等内容。在您的特定情况下,您似乎想要在检测到条件时制作动画。您可以通过以下方式做到这update
一点。它让球运行动画,当动作完成时,它将运行一些额外的代码来重置球。
func checkOutOfBounds() {
if (!map_1_buffer.contains(ball.position)) {
let texture1 = SKTexture(imageNamed: "death_1")
let texture2 = SKTexture(imageNamed: "death_2")
let texture3 = SKTexture(imageNamed: "death_3")
let deathAnimation = SKAction.animate(with: [texture1, texture2, texture3], timePerFrame: 2.0)
ball.run(deathAnimation) {
self.death += 1
self.ball.texture = SKTexture(imageNamed: "Ball1")
self.ball.physicsBody?.velocity.dx = 0
self.ball.physicsBody?.velocity.dy = 0
self.ball.position = CGPoint(x: -120, y: 40)
}
}
}
override func update(_ currentTime: TimeInterval) {
checkOutOfBounds()
}
(我没有实际测试此代码的框架,因此可能存在拼写错误,并且重置球的完成操作中的某些内容可能没有,self
具体取决于其范围,但希望这个想法很清楚。)
推荐阅读
- php - 如何在 curl 帖子的数组值中使用新行“\r\n”
- python - 如何向 scipy.spatial voronoi 图添加信息?
- c# - 如何获取数据表的原始属性?
- c++ - 包括 mpif.h,错误 c2015 常量中的字符过多
- html - 使用html2pdf时表格框架太厚
- vba - 使用 Powershell(或 VBA)将 Word 样式字体设置为默认主题字体
- elasticsearch - 无法重启 heartbeat.service Unit not found
- android - Branch.io:通过代码在深度链接 url 中动态添加查询参数?
- codenameone - 代号一中的 System.gc()
- jenkins-plugins - Jenkins插件调试断点在slave上不起作用