因此,我正在为我的计算机科学课制作一个游戏,并为该游戏中的精灵制作了一个名为Bomb的课。在Bomb类中,我有一个名为blowUp()的函数,当炸弹的倒数计时器关闭时会调用该函数。当时间用完时,炸弹的质地会发生其他变化,但它也应该触发游戏结束。
我在GameScene中有一个gameOver()函数,我想在blowUp()方法中调用它,但是当我这样做时,我收到错误消息“实例成员'gameOver'不能用于'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
}
}
答案 0 :(得分:0)
这是我要对您的代码进行的更改。
扩展SKSpriteNode并删除sprite变量,因为您希望炸弹是实际的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])
}
引燃的方法是在准备启动炸弹时先启动炸弹,等待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()
}