2011-03-16 53 views
0

我在Flash CS5和ActionScript 3.0制作一个简单的平台游戏。当玩家失去一生时,我希望它将玩家重定向到“游戏结束”屏幕,他们可以选择“再试一次”按钮重新开始游戏。故障复位对象/闪存CS5

我无法找到一个方法来做到这一点。我一直在试图通过执行以下操作来完成我的目标:

  • 设置应有尽有(播放器,背景等),以可见=影片剪辑假
  • 集“游戏结束”可见= TRUE(这是在游戏过程中不可见的)
  • 已在“游戏结束”的影片剪辑隐藏影片剪辑中的按钮,然后重新显示所有的游戏元素,玩家开始的
  • 复位位置,设置分数为0,活到3,等..

这是probab虽然这不是一个很好的方法,但如果它有效,那么我很高兴。我只想让“游戏结束”屏幕短暂显示,如果玩家点击“再试一次”按钮,他们可以从头开始玩。

现在,我上面实现的问题是,当我将所有游戏元素设置为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

你有一个主要的游戏循环,你可以停止和重新启动,而不是玩可见性?当你完成它之后,你是否也会从再次尝试按钮中移除事件监听器? – Sam 2011-03-16 19:47:30

+0

你可以尝试的其他东西就是将对象的x值设置为离开屏幕。 – Sam 2011-03-16 19:48:19

回答

0

这比一个代码问题的架构问题。就我个人而言,我在所有自定义类上创建了reset()函数。在这个函数内部,我可以根据需要将对象设置为默认状态;设定位置,α,可见,自定义道具等

至于何时调用它,它真的取决于你,但你的好设计模式将是国家的设计模式。

基本上,你在你的游戏,拥有和控制不同State对象StateManager。这些State对象可以表示您的游戏的不同状态; MainMenuPlayGameOverReset

每个State将具有begin(),一个end()和可能的update()。当您的StateManager开关处于状态时,它将在State上拨打end(),在State上拨打start()。您一次只能在一个State中,因此您可以根据自己在游戏中的位置轻松地封装逻辑。

里面的begin()功能,您可以设置您需要为特定状态的一切。例如,您的Play状态的begin()函数可以添加您需要控制游戏的所有键盘/鼠标事件侦听器。在end()功能中,您清除了您设置的所有内容。例如,在Play状态的end()函数中,您将删除所有键盘/鼠标事件侦听器。这意味着玩家不可能执行任何游戏逻辑,除非他们处于Play状态。如果您的State中有update()函数(这称为每帧),那么您可以在Play示例中检查玩家是否已经没有更多生命,或者已经达到了下一关的分数。

对于复位逻辑,在您的Reset状态下,您可以在所有对象上调用reset()函数,或者手动设置它们。通过你的游戏状态的路径应该是这样的:

MainMenu(播放) - >Reset(或Init状态) - >Play - >GameOver(重播) - >Reset - >Play

有没有内置逻辑来重置对象,你需要自己照顾它。采用这种模式可以帮助解决这个问题。

+0

顺便说一句,使用状态意味着很容易抛出GameOver屏幕x秒 - 只需要一个更新(),在移动到下一个状态前倒计时x秒 – divillysausages 2011-03-16 20:08:07

+0

另外,我注意到您没有将gameOverFlag设置为假playagain() - 也许这就是问题:D – divillysausages 2011-03-16 20:08:43

+0

感谢您的回复!我会仔细查看我的代码,看看我的任何愚蠢的人为错误是否应该首先归咎于,然后尝试并执行上述建议。伟大的建议,非常感谢! :) – james246 2011-03-16 23:46:16

0

我已经有了浏览器和平台的经验,给我的显示/隐藏代码略有不同的实现。有时需要将元素从舞台(object.x = -3000)中移除以完全禁用它们。这不是一个好的做法,但是如果你只需要继续前进,就可以避免启用和禁用对象的冲突!

绝对使用reset()函数来包装切换对象属性的所有内容。