我为一个叫海盗入侵的游戏设计了一个暂停按钮,我尝试着在他们的位置暂停/冻结身体,然后从他们所处的位置恢复。
我已经使用了setStatic
和isStatic
使用function mousePressed()
。但是,他们都显示错误Uncaught TypeError: Matter.Bodies.setStatic is not a function
。
我是错过了什么,还是这与保存头寸或类似的事情有关?
船是不得不“暂停/冻结”的身体。
function mousePressed(playButton) { // this is my play button which works perfectly
gameState = "play"
World.remove(world, playButton)
World.remove(world, playImage)
}
function mousePressed(pauseButton) { // pause button which gives an error
Matter.Bodies.setStatic(boats, true)
}
1条答案
按热度按时间fv2wmkja1#
首先,
World
已被弃用,因此您应该使用Composite.remove
而不是World.remove
。至于错误,
setStatic
是Body
方法,而不是Bodies
方法,您可以在每个主体上循环并调用setStatic
:boats.forEach(e => Matter.Body.setStatic(e, true));
,但是根据this issue,如果不实现主体缓存或其他解决方案,您将无法安全地切换静态。您确定要通过将主体设置为静态来实现暂停吗?这实际上并不暂停模拟--时间在流逝,各种属性可能会以意外的方式继续更改。
由于您使用的是自己的渲染器(p5.js),暂停整个模拟非常简单。您可以在渲染循环中停止调用MJS代码,模拟将暂停。在p5.js中,这可以通过在
draw
的开头执行布尔检查来完成。或者将draw
临时设置为不运行MJS更新的函数(可能会显示一个菜单或"暂停"屏幕)。有关该方法的详细信息,请参见使用p5. js从一个场景过渡到下一个场景。下面是根据复选框的值在
draw()
循环中通过早期返回切换暂停的基本示例:如果要使用鼠标暂停/取消暂停,请将复选框替换为
并在
draw
函数中测试running
:我不确定您的代码是否与项目中的代码完全相同,但如最初的帖子所示,如果第二个函数与第一个函数在相同的作用域中,它们将覆盖第一个函数。
p5中的另一个选项是调用
noLoop()
来暂停draw
循环,调用loop()
来恢复循环,您可以使用isLooping()
来确定调用哪一个。如果你使用的是内置渲染器,创建一个
Runner
并使用runner.enabled
来切换暂停。如果只想暂时暂停引擎,请参见
engine.enabled
。...虽然我相信
engine.enabled
是指runner.enabled
的错别字。我有一个PR可以修复这个错误。有关暂停内部渲染器的示例,请参见this answer。