Управляющий целей перевода на XNA, используя интерфейс IDisposable


Я придумал следующий класс, который я могу использовать в качестве игры, фильмы, музыку сервис для управления оказания вещи другие, чем на экране, так как я не хочу проходить игрус/графических устройствс кругом для тестирования причин. Я не вижу ничего плохого с ним, но мне любопытно, что другие люди думают о дизайне/и т. д. это и общая теория он. Это злоупотребление интерфейс IDisposable, или это нормальный способ делать вещи?

Типичное Использование:

using(Services.GetService<IRenderTargetController>().SetRenderTarget(renderTarget, Color.Black)) {
    // [snip] Render stuff as normal here.
}

Реализация:

using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

sealed class RenderTargetController : IRenderTargetController
{
    private readonly GraphicsDevice _graphicsDevice;
    private readonly Stack<RenderTarget2D> _targets;

    public RenderTargetController(GraphicsDevice graphicsDevice)
    {
        _graphicsDevice = graphicsDevice;
        _targets = new Stack<RenderTarget2D>();
    }

    public IDisposable SetRenderTarget(RenderTarget2D target)
    {
        return SetRenderTarget(target, Color.Transparent);
    }

    public IDisposable SetRenderTarget(RenderTarget2D target, Color resetColor)
    {
        _targets.Push(target);
        _graphicsDevice.SetRenderTarget(target);
        _graphicsDevice.Clear(resetColor);

        return new TargetManager(this);
    }

    private class TargetManager : IDisposable
    {
        private readonly RenderTargetController _controller;

        public TargetManager(RenderTargetController controller)
        {
            _controller = controller;
        }

        public void Dispose()
        {
            _controller._targets.Pop();

            RenderTarget2D target = null;
            if (_controller._targets.Count > 0)
            {
                target = _controller._targets.Peek();
            }

            // Setting render target to null returns control to the screen.
            _controller._graphicsDevice.SetRenderTarget(target);
        }
    }
}


359
2
c#
задан 31 августа 2011 в 03:08 Источник Поделиться
Комментарии
1 ответ

Сам подход нормально ИМО, но API вводит в заблуждение. Зачем setxxx не способ когда-нибудь вернуть что-то, не говоря уже о возвращении интерфейс IDisposable? Может быть, придумать имя получше.

2
ответ дан 2 сентября 2011 в 11:09 Источник Поделиться