You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MonoGame中实现无需复杂逻辑的简易启动标题屏?

简易MonoGame启动标题屏实现

直接用一个布尔变量控制游戏状态,完全符合你要的简洁需求,不用枚举这类复杂结构:

1. 添加状态控制变量

在你的游戏类(比如Game1)里添加一个布尔字段:

private bool _isGameStarted = false;

2. 修改Update方法

只在游戏启动后运行核心逻辑,同时监听空格键触发启动:

protected override void Update(GameTime gameTime)
{
    var keyboardState = Keyboard.GetState();

    // 检测空格键按下,启动游戏
    if (!_isGameStarted && keyboardState.IsKeyDown(Keys.Space))
    {
        _isGameStarted = true;
        // 如有需要,可在此初始化游戏数据(比如重置计时器)
    }

    // 仅游戏启动后执行核心机制(计时器、玩家逻辑等)
    if (_isGameStarted)
    {
        // 这里放你的玩家更新、计时器累加、碰撞检测等代码
        // 示例:player.Update(gameTime); timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
    }

    base.Update(gameTime);
}

3. 修改Draw方法

先绘制启动屏,游戏启动后再执行原有绘制逻辑:

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.Black);

    _spriteBatch.Begin();

    if (!_isGameStarted)
    {
        // 绘制启动标题与提示
        int screenWidth = GraphicsDevice.Viewport.Width;
        int screenHeight = GraphicsDevice.Viewport.Height;
        
        _spriteBatch.DrawString(MainFont, "MY GAME", 
            new Vector2(screenWidth/2 - 100, screenHeight/2 - 50), 
            Color.Gold);
        _spriteBatch.DrawString(MainFont, "PRESS SPACE TO START", 
            new Vector2(screenWidth/2 - 180, screenHeight/2 + 20), 
            Color.White);
        // 如需启动背景图,添加:_spriteBatch.Draw(startScreenTexture, Vector2.Zero, Color.White);
    }
    else
    {
        // 你的原有游戏绘制代码
        if (!player.dead)
            player.animation.Draw(_spriteBatch);

        if (!player.dead)
        {
            _spriteBatch.DrawString(MainFont, $"Time survived: {timer.ToString("F3")}", 
                new Vector2(player.Position.X - 240, player.Position.Y + 270), 
                Color.White);
        }
        else
        {
            _spriteBatch.Draw(endScreen, 
                new Vector2(player.Position.X -900, player.Position.Y - 700), 
                Color.White);
            _spriteBatch.DrawString(MainFont, "YOU DIED", 
                new Vector2(player.Position.X - 155.0f, player.Position.Y - 70), 
                Color.Gold);
            _spriteBatch.DrawString(MainFont, "PRESS ESCAPE TO EXIT", 
                new Vector2(player.Position.X - 325.0f, player.Position.Y -10.0f), 
                Color.Gold);
            _spriteBatch.DrawString(MainFont, $"Time Survived: {timer.ToString("F3")}", 
                new Vector2(player.Position.X - 280.0f, player.Position.Y + 50.0f), 
                Color.White);
        }
    }

    _spriteBatch.End();

    base.Draw(gameTime);
}

实现说明

  • 游戏启动前,Update中的核心逻辑完全不执行,计时器、玩家更新等进程不会后台运行
  • 仅用单个布尔变量控制状态,没有复杂的状态管理逻辑
  • 启动屏与原有结束屏逻辑完全分离,代码结构清晰

内容的提问来源于stack exchange,提问作者revivetime

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:03:27