0

我是游戏开发的新手,但熟悉编程语言。我已经开始使用 Flixel 并且有一个有效的 Breakout 游戏,有得分和生命。

如果玩家用完生命,我只是坚持如何在屏幕上创建新的屏幕/游戏。我希望该过程如下所示:

  1. 检查如果生命等于0
  2. 暂停游戏并显示一个显示“游戏结束”的新屏幕(可能是透明的)
  3. 当用户点击或敲击ENTER重新启动关卡

这是我目前必须更新生活的功能:

private function loseLive(_ball:FlxObject, _bottomWall:FlxObject):void
{
    // check for game over
    if (lives_count == 0)
    {

    }
    else 
    {
        FlxG:lives_count -= 1;
        lives.text = 'Lives: ' + lives_count.toString()
    }
}

这是我的主要游戏.as

package
{
    import org.flixel.*;

    public class Game extends FlxGame
    {
        private const resolution:FlxPoint = new FlxPoint(640, 480);
        private const zoom:uint = 2;
        private const fps:uint = 60;

        public function Game()
        {
            super(resolution.x / zoom, resolution.y / zoom, PlayState, zoom);
            FlxG.flashFramerate = fps;
        }
    }
}
4

1 回答 1

2

有多种方法可以做到这一点......

您可以使用不同的 FlxStates,就像我在您的另一篇文章的回答中所描述的那样:使用 Flixel 创建用户 UI,尽管您必须通过分数或其他任何东西变得聪明,或者使用注册表类型的设置

如果您希望它像上面描述的那样实际工作,使用透明覆盖屏幕,您可以尝试这样的事情(请记住,您的项目的确切细节可能会有所不同,我只是想给您一个想法) :

首先,确保你有良好的逻辑来启动一个关卡,假设它是一个名为StartLevel.

您需要定义一个标志 - 只是一个布尔值 - 来跟踪游戏是否仍在进行:private var _isGameOver:Boolean;在 的最后StartLevel(),将其设置为false

在你的create()函数中PlayState,构建一个新的FlxGroup,它在你的 Game Over 屏幕上包含你想要的所有东西——一些文本、一个图像,以及一些写着“按 ENTER 重新启动”(或其他)的东西。然后将其设置为visible = false. 其代码可能类似于:

grpGameOver = new FlxGroup();
grpGameOver.add(new FlxSprite(10,10).makeGraphic(FlxG.Width-20,FlxG.Height-20,0x66000000));  // just a semi-transparent black box to cover your game screen.
grpGameOver.add(new FlxText(...)); // whatever you want to add to the group...
grpGameOver.visible = false;
add(grpGameOver); // add the group to your State.

根据您的游戏设置方式,您可能还希望将组的 scrollFactor 中的对象设置为 0 - 如果您的游戏屏幕完全滚动:

grpGameOver.setAll("scrollFactor", new FlxPoint(0,0));

在您的update()函数中,您需要将其分成两部分:一是游戏结束时,一是游戏仍在进行时:

if (_isGameOver)
{
    if (FlxG.keys.justReleased("ENTER"))
    {
        grpGameOver.visible = false;
        StartLevel();
    }
}
else
{
    ... the rest of your game logic that you already have ...
}
super.update();

请记住,如果您在其他任何地方都有响应用户输入的东西 - 例如播放器对象或其他东西,您可能需要更改它们的update()功能以检查该标志。

然后,您需要做的最后一件事是在您的loseLive()逻辑中:

if (lives_count == 0)
{
    _isGameOver = true;
    grpGameOver.visible = true;
}
else 
...

应该这样做!

我强烈建议您花一些时间学习不同的教程和示例项目,以便总体上更好地了解 Flixel。Photon Storm有一些很棒的素材可以玩(尽管他已经跳到 HTML5 游戏了)

我还想指出,如果您对 Flixel 处理更新的方式感到满意,您可以对您的状态update()函数变得非常聪明,并让它只在 grpGameOver 对象上调用更新,而不必单独更改所有其他对象更新。相当先进的东西,但值得学习。

于 2013-11-11T14:58:23.813 回答