ios - 是否可以在类/结构实例方法中调用 GameScene 函数?
问题描述
所以我正在为我的计算机科学课制作一个游戏,并为游戏中的精灵制作了一个名为 Bomb 的课程。在 Bomb 类中,我有一个名为 blowUp() 的函数,当炸弹的倒数计时器响起时会调用该函数。当时间用完时,炸弹的材质会发生变化,但它也会触发游戏结束。
我的 GameScene 中有一个 gameOver() 函数,我想在 blowUp() 方法中调用它,但是当我这样做时,我收到错误消息“Instance member 'gameOver' cannot be used on type 'GameScene'; 你的意思是改为使用这种类型的值?”
有没有办法解决?提前致谢
class Bomb{
var sprite = SKSpriteNode()
var timer = Timer()
var secondsLeft = 20
func countDown(){
secondsLeft -= 1
if secondsLeft == 0{
blowUp()
}
}
init {
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: {_ in self.countDown()})
}
func blowUp(){
self.timer.invalidate()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.sprite.removeFromParent()
}
// gameOver() gives me an error
}
}
解决方案
以下是我将对您的代码进行的更改。
扩展 SKSpriteNode 并删除 sprite 变量,因为您希望您的炸弹是一个实际的精灵。
class Bomb : SKSpriteNode{
var sprite = SKSpriteNode()
消除你的计时器。计时器不在现实世界中,而不是在游戏世界中,因此如果发生任何外部事件(例如电话),您的时间就会关闭。请改用 SKActions。
var timer = Timer()
var secondsLeft = SKAction.wait(forDuration:20)
删除你的倒计时函数、爆破函数和你的初始化函数,并用一个点燃函数替换它
func countDown(){ secondsLeft -= 1 if secondsLeft == 0{ blowUp() } } init { timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: {_ in self.countDown()}) } func blowUp(){ self.timer.invalidate() DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self.sprite.removeFromParent() } // gameOver() gives me an error }
func ignite() { var explosionAnimation = SKAction.animate(with:arrayOfExplosionTextures,timePerFrame:0.1666) var blowup = SKAction.run{ [unowned self] in (self.scene as GameScene).gameOver() } //var seq = SKAction.sequence([secondsLeft,explosionAnimation,blowup,SKAction.removeFromParent]) var seq = SKAction.sequence([secondsLeft,blowup,SKAction.removeFromParent]) }
ignite 的作用是在您准备好启动炸弹时启动炸弹,等待 30 秒,然后爆炸。这使您可以在屏幕上放置延迟或哑弹的炸弹。
这是您的课程的外观:
class Bomb : SKSpriteNode{
var secondsLeft = SKAction.wait(forDuration:20)
func ignite() {
//var explosionAnimation = SKAction.animate(with:arrayOfExplosionTextures,timePerFrame:0.1666)
var blowup = SKAction.run{
[unowned self] in
(self.scene as GameScene).gameOver()
}
//var seq = SKAction.sequence([secondsLeft,explosionAnimation,blowup,SKAction.removeFromParent])
var seq = SKAction.sequence([secondsLeft,blowup,SKAction.removeFromParent])
}
}
以下是您在游戏场景中的使用方法:
func placeBomb(x:CGFloat,y:CGFloat){
let bomb = Bomb(imageNamed:"bomb")
addChild(bomb)
bomb.position = CGPoint(x:x,y:y)
bomb.ignite()
}
推荐阅读
- c# - 无法将 Gelf 配置文件添加到 Azure 函数应用
- python-3.x - 如何用Python返回平均值减去列表中的每个整数?
- javascript - 使用 useState 时如何为对象设置默认状态
- apache-kafka - 如何定义主题保留字节和段字节,以便主题分区的大小不会高于特定大小
- delphi - 表单创建 2 帧 - 如何从第 1 帧内部调用第 2 帧中的过程?
- jupyter-notebook - 有没有办法在 Jupyter Notebook 的单个单元格中混合降价和代码?或者将代码/降价导入到彼此的单元格中?
- database - 员工、部门和角色层次结构的数据库设计
- ember.js - 过渡到 Octane:替换 addObserver 设计
- javascript - 在 Google Apps 脚本中创建下拉菜单时出现错误:“sheet.indexOf 不是函数”
- python - Python getpass 函数