Скриншот iOS, MonoGame

Я разрабатываю игру для iOS с помощью MonoGame. Игра уже вышла для Windows 8 (метро) с использованием MonoGame. У нас есть MonoTouch, и у меня было несколько проблем, но осталась только одна серьезная проблема. Я не могу сделать снимок экрана. Возможность сделать снимок экрана является важным компонентом игры, поскольку у нас есть совместное использование игровой области, поэтому другие пользователи смогут увидеть, как выглядит сохраненная игра. Насколько я понимаю, это не реализовано в ветке develop3d, но я слышал от кого-то, что это было реализовано в более старой версии ветки разработки. Кто-нибудь знает способ обойти это? Это кажется довольно обычным делом.

Любая помощь будет принята с благодарностью.


person weaverx9x9    schedule 27.03.2013    source источник


Ответы (3)


Для экранов UIKit вы можете использовать:

UIScreen.Capture()

Для экранов OpenGL вы можете использовать:

iPhoneOSGameView.Capture()
person miguel.de.icaza    schedule 29.03.2013
comment
Я не вижу метода Capture () в классе iOSGameView. - person weaverx9x9; 02.04.2013
comment
MonoGame не использует iPhoneOSGameView. У него есть собственный подкласс UIView. - person Aranda; 17.10.2013
comment
Когда я вызываю UIScreen.Capture () с моноигрой, все изображение белое: ( - person vmachacek; 12.03.2014

Вероятно, вы можете сделать это с помощью собственных API-интерфейсов iOS:

UIViewController controller = game.Services.GetService(typeof(UIViewController)) as UIViewController;

UIGraphics.BeginImageContext(controller.View.Frame.Size);
using (var context = UIGraphics.GetCurrentContext())
{
    controller.View.Layer.RenderInContext(context);
    using (var image = UIGraphics.GetImageFromCurrentImageContext())
    {
        //Save the image to file here   
    }
}
UIGraphics.EndImageContext();

Проверить на наличие ошибок, это не в моей голове.

Я предполагаю, что API XNA просто не реализованы.

person jonathanpeppers    schedule 27.03.2013
comment
Я действительно пробовал что-то подобное, все, что у меня было, это белые скриншоты. Но может быть, я делал это неправильно. Я попробую ваш код. Спасибо! - person weaverx9x9; 27.03.2013
comment
Итак, я использовал приведенный выше код и получаю белые снимки экрана с размерами 768 x 1024. Я не понимаю этого, потому что он работает на имитаторе Retina iPad. Я думаю, что беру неправильную поверхность для рисования или что у меня нет надлежащего разрешения на доступ к поверхности для рисования, хотя я не знаю, я просто догадываюсь. Я попробую запустить его на реальном устройстве, но серьезно сомневаюсь, что получу другие результаты. - person weaverx9x9; 28.03.2013
comment
Итак, я нашел код для захвата экрана и сохранения на диск с помощью OpenTK / OpenGL. Насколько я понимаю, проблема в том, что в OpenGL ES 2.0 вы не можете захватить содержимое буфера кадра, поэтому в MonoGame это не реализовано. Это верно. Код, который я нашел, находится здесь: opentk.com/doc/graphics / save-opengl-рендеринг-на-диск - person weaverx9x9; 28.03.2013
comment
Да, мой код выше не учитывает сетчатку. Но вы правы, похоже, вы потенциально не можете получить снимок экрана OpenGL. Я бы подумал о создании предварительно обработанных изображений для каждого уровня на iOS. У вас может быть такая же проблема на Android, если вы также поддерживаете эту платформу. - person jonathanpeppers; 28.03.2013
comment
@ weaverx9x9 Мне нужно реализовать ту же функцию. Удалось ли вам разобраться? Любая помощь очень ценится. - person vmachacek; 13.03.2014
comment
Я знаю, что это немного поздно, но я реализовал это самостоятельно. Я собирался создать пиар, но так и не дошел до этого. Вот файл Texture2D, который я использовал и который у меня сработал: github.com/weaverx9x9/MonoGame/blob/local/MonoGame.Framework/ - person weaverx9x9; 14.04.2014

Я реализовал это сам, собирался создать пиар, но не успел. Код, который я использовал для создания снимков экрана, можно найти здесь: Texture2D.cs Я давно не объединял с удаленным, поэтому не уверен, насколько хорошо он будет подключаться к текущему источнику. Обратите внимание: методы, которые вы хотите рассмотреть, - это SaveAsJpeg и SaveAsPng, часть, которая была сложной, заключалась в правильном получении GetTextureData (). Вполне возможно, что этот вопрос уже кто-то решил. Но у меня это сработало.

person weaverx9x9    schedule 14.04.2014