XNA Framework: управление яркостью экрана - PullRequest
3 голосов
/ 04 декабря 2011

Я работаю над проектом для игры с XNA Framework.

Я использую класс OptionsMenuScreen для отображения различных параметров / настроек игры для пользователя.

Я добавил дваКнопки UP и DOWN (Texture2D) на экране, которые увеличивают или уменьшают яркость экрана.

Я не могу найти логику, которую мне нужно было бы использовать для управления яркостьюscreen.

Буду очень признателен, если вы можете указать мне правильное направление.

Вот соответствующий код:


class OptionsMenuScreen : MenuScreen
{
    SpriteBatch spriteBatch;

    MenuEntry brightness;
    Texture2D brightnessUp;
    Texture2D brightnessDown;

    ContentManager contentManager;

    public OptionsMenuScreen() : base("Options")
    {
        brightness = new MenuEntry("Brightness");
        MenuEntries.Add(brightness);
    }

    public override void LoadContent()
    {
        if (contentManager == null)
        {
            contentManager = new ContentManager(ScreenManager.Game.Services, "Content");
        }

        brightnessUp = contentManager.Load<Texture2D>("handup");
        brightnessDown = contentManager.Load<Texture2D>("handdown");
    }

    public override void Draw(GameTime gameTime)
    {
        spriteBatch = ScreenManager.SpriteBatch;

        var brightnessDownPosition =
            new Vector2(brightness.Position.X - 50, brightness.Position.Y - 12);

        var brightnessUpPosition =
            new Vector2(brightness.Position.X 
                + brightness.GetWidth(this) + 8, brightness.Position.Y - 12);

        spriteBatch.Begin();

        spriteBatch.Draw(brightnessDown,
            new Rectangle((int)brightnessDownPosition.X, (int)brightnessDownPosition.Y,
                30, 30), Color.White);

        spriteBatch.Draw(brightnessUp,
            new Rectangle((int)brightnessUpPosition.X, (int)brightnessUpPosition.Y,
                30, 30), Color.White);

        spriteBatch.End();

        base.Draw(gameTime);
    }

    public override void Update(GameTime gameTime, bool otherScreenHasFocus, bool coveredByOtherScreen)
    {
        base.Update(gameTime, otherScreenHasFocus, coveredByOtherScreen);

        foreach (TouchLocation t in TouchPanel.GetState())
        {
            if (t.Position.X >= brightnessDown.Bounds.Left
                && t.Position.X <= brightnessDown.Bounds.Right
                && t.Position.Y >= brightnessDown.Bounds.Top
                && t.Position.X <= brightnessDown.Bounds.Bottom)
            {
                // What should I do here?
            }
            else if (t.Position.X >= brightnessUp.Bounds.Left
                && t.Position.X <= brightnessUp.Bounds.Right
                && t.Position.Y >= brightnessUp.Bounds.Top
                && t.Position.X <= brightnessUp.Bounds.Bottom)
            {
                // What should I do here?
            }
        }
    }
}

Большое спасибо за просмотр этого:)

1 Ответ

3 голосов
/ 04 декабря 2011

Согласно этой теме , есть несколько способов сделать это:

  • Использование GraphicsDevice.SetGammaRamp(...)
  • Использование черной текстуры и альфа-прозрачности
  • Настройка материалов и / или источников света на текстурах для всех объектов в сцене
  • Перепиксельный пересчет цвета с использованием пиксельного шейдера

Первый вариант является самым простым, но имеет некоторые недостатки (уродливые графические эффекты, когда вы его настраиваете - в основном это только меню опций), и не всегда поддерживается.

Вы можете использовать SupportsFullScreenGamma и CanCalibrateGamma, чтобы определить, поддерживается ли он, и использовать другой метод, если это не так.

Редактировать

В Windows Phone 7 некоторые из этих параметров могут быть недоступны .

Этот сайт (в настоящее время не работает, но, если вы воспользуетесь им в Google, вы сможете найти кэшированную копию), вы предлагаете использовать полноэкранный четырехъядерный подход с альфа-смешиванием в следующих режимах смешивания:

Brightness: source = ZERO, dest = SOURCECOLOR
Contrast: source = DESTCOLOR, dest = SOURCECOLOR

Вот код (украденный из этой статьи):

// In your game class:

Texture2D whiteTexture;

// In LoadContent:

whiteTexture = new Texture2D(GraphicsDevice, 1, 1);
whiteTexture.SetData<Color>(new Color[] { Color.White });

// In the appropriate class (the game class? not sure...):

int brightness;
int contrast;

BlendState brightnessBlend;
BlendState contrastBlend;

// In Initialize:

brightness = 255;
contrast = 128;

brightnessBlend = new BlendState();
brightnessBlend.ColorSourceBlend = brightnessBlend.AlphaSourceBlend =  Blend.Zero;
brightnessBlend.ColorDestinationBlend = brightnessBlend.AlphaDestinationBlend = Blend.SourceColor;

contrastBlend = new BlendState();
contrastBlend.ColorSourceBlend = contrastBlend.AlphaSourceBlend = Blend.DestinationColor;
contrastBlend.ColorDestinationBlend = contrastBlend.AlphaDestinationBlend = Blend.SourceColor;

// In Draw:

spriteBatch.Begin(SpriteSortMode.Immediate, brightnessBlend);
spriteBatch.Draw(whiteTexture, new Rectangle(0, 0, 480, 800), new Color (brightness, brightness, brightness, 255));
spriteBatch.End();

spriteBatch.Begin(SpriteSortMode.Immediate, contrastBlend);
spriteBatch.Draw(whiteTexture, new Rectangle(0, 0, 480, 800), new Color(contrast, contrast, contrast, 255));
spriteBatch.End();

GraphicsDevice.BlendState = BlendState.Opaque;
...