我正在Flash CS5和Actionscript 3.0中制作一个简单的平台游戏。当玩家失去一生时,我希望它将玩家重定向到“游戏结束”屏幕,在那里他们可以选择“再试一次”按钮重新开始游戏。
我很难找到办法做到这一点。我一直在努力通过以下方式实现我的目标:
这可能不是一个非常好的方法,但如果它有效,那么我很高兴。我只想简单地显示“游戏结束”屏幕,如果玩家点击“再试一次”按钮,他们可以从一开始就玩。
现在,我实现上述问题的问题是,当我将所有游戏玩法元素设置为false后将其设置为visible = true时,游戏停止了...键盘输入没有重新激活,游戏元素是显示但不活跃。有什么关于我不知道的可见属性吗?是否会混淆对象的“状态”?
以下是Actionscript文件中的一些代码片段......
if(lives >= 0) {
//print number of lives
}
else {
gameOverFlag= true;
//hide game objects, show game over menu
Coins.visible = false;
Platforms.visible = false;
Background.visible = false;
StartPosition.visible = false;
thePlayer.visible = false;
GameOver.visible = true; //this is the movie clip with the "Game over" text and "Try again" button in
GameOver.TryAgainButton.addEventListener(MouseEvent.CLICK, playagain);
}
function playagain(event:MouseEvent):void
{
//start game again
Coins.visible = true;
Platforms.visible = true;
Background.visible = true;
StartingPosition.visible = true;
thePlayer.visible = true;
}
答案 0 :(得分:0)
这更像是一个架构问题而不是代码问题。就个人而言,我在所有自定义类上创建了一个reset()
函数。在这个函数中,我做了将对象设置为默认状态所需的一切;设置位置,alpha,可见,自定义道具等。
至于什么时候打电话,这取决于你,但对你来说一个好的设计模式就是状态设计模式。
基本上,游戏中有一个StateManager
来保存和控制不同的State
个对象。这些State
个对象可以代表游戏的不同状态; MainMenu
,Play
,GameOver
,Reset
等。
每个State
都有begin()
,end()
,可能还有update()
。当您的StateManager
切换成员时,它会在end()
离开时拨打State
,并在start()
上拨打State
。您只能在一个State
{1}},因此它可以让您根据游戏中的位置轻松封装逻辑。
在begin()
功能中,您可以设置该特定状态所需的一切。例如,begin()
状态的Play
函数可以添加控制游戏所需的所有键盘/鼠标事件侦听器。在end()
功能中,您可以清除您设置的所有内容。在end()
状态的Play
函数中,您将删除所有键盘/鼠标事件侦听器。这意味着除非玩家处于Play
状态,否则玩家不可能做任何游戏逻辑。如果您的update()
中有State
函数(每个帧都称为Play
,那么您可以在Reset
示例中检查播放器是否还没有生命,或已达到下一个级别的分数。
对于重置逻辑,在reset()
状态下,您可以在所有对象上调用MainMenu
函数,或手动设置它们。通过状态游戏的路径看起来像这样:
Reset
(播放) - > Init
(或Play
州) - > GameOver
- > Reset
(重播) - > Play
- > {{1}}
没有内置逻辑来重置对象,你需要自己处理它。采用这样的模式可以有所帮助。
答案 1 :(得分:0)
我有过使用浏览器和平台的经验,这使我的show / hide代码实现略有不同。有时需要将元素移出舞台(object.x = -3000)
以完全禁用它们。这不是最佳实践,但如果您只需要继续生活,它将避免启用和禁用对象的任何冲突!
绝对使用reset()函数来包装切换对象属性的所有内容。