问题描述
我儿子和我正在尝试实施 fun-science.org 微比特教程之一 - 构建“拔河”游戏。本质上,按 10 次按钮 A 会将精灵移近该按钮,按钮 B 也是如此。当您点击屏幕边缘时,会播放音乐,并且在游戏重新开始之前屏幕上会滚动一条消息。
我们已经让它完全工作了,但是一旦赢得比赛,它似乎没有正确重置。它在模拟器上运行良好,但不适用于物理设备(microbit 2)。
一旦赢得比赛,行为就会变得不稳定。它通常会将精灵放回中间,有时不会,但通常情况下,一个按钮在下一场比赛中不起作用。有时两者都停止工作。在任何情况下,重启都会解决问题。
代码有问题吗?我想知道音乐/消息是否正在破坏某些东西,我需要等待它完成。我已经重新下载了 hex 文件并重新刷了 microbit 几次,所以我想我已经消除了一个损坏的代码文件。
Javascript 版本的代码如下所示,但它实际上是使用 Microsoft MakeCode 工具构建的。
input.onButtonpressed(Button.A,function () {
sprite.change(LedSpriteProperty.X,-0.1)
})
input.onButtonpressed(Button.B,0.1)
})
let sprite: game.LedSprite = null
sprite = game.createSprite(2,3)
basic.forever(function () {
if (sprite.get(LedSpriteProperty.X) == 0) {
music.startMelody(music.builtInMelody(Melodies.Birthday),MelodyOptions.Once)
basic.showString("liverpool wins")
sprite.set(LedSpriteProperty.X,2)
} else if (sprite.get(LedSpriteProperty.X) == 4) {
music.startMelody(music.builtInMelody(Melodies.Entertainer),MelodyOptions.Once)
basic.showString("rb leipzig wins")
sprite.set(LedSpriteProperty.X,2)
}
})
解决方法
我发现如果我在游戏结束时滚动文本和播放音乐时执行 game.pause() 和 game.resume() 会更可靠:
input.onButtonPressed(Button.A,function () {
sprite.change(LedSpriteProperty.X,-0.1)
})
input.onButtonPressed(Button.B,0.1)
})
let sprite: game.LedSprite = null
sprite = game.createSprite(2,3)
basic.forever(function () {
if (sprite.get(LedSpriteProperty.X) == 0) {
game.pause()
music.startMelody(music.builtInMelody(Melodies.Birthday),MelodyOptions.Once)
basic.showString("liverpool wins")
game.resume()
sprite.set(LedSpriteProperty.X,2)
} else if (sprite.get(LedSpriteProperty.X) == 4) {
game.pause()
music.startMelody(music.builtInMelody(Melodies.Entertainer),MelodyOptions.Once)
basic.showString("rb leipzig wins")
game.resume()
sprite.set(LedSpriteProperty.X,2)
}
})
您还可以查看以下未使用游戏渲染引擎 https://makecode.microbit.org/projects/tug-of-led 的游戏版本,看看是否有所不同。