none
Несколько вопросов по программированию под Windows Phone 8 RRS feed

  • Вопрос

  • Всем доброго вечера!

    Я только начал изучать Windows Phone 8 API и у меня появилось несколько вопросов. Изучаю я это всё посредством создания приложения Windows Phone с Direct3D (только машинный код), так как люблю полный контроль из кода. Пишу всё на языке C++. Управляемый C++ почти не использую (ну только там где без него не обойтись). Так вот, начал делать для себя что-то типа движка. Ну хочется чтобы для каждой новой игры мне достаточно было подключить к проекту уже готовые .cpp и .h файлы, и начать писать уже только логику. Ну что же, потратил на всё это не мало времени. Особенно много времени потратил на понимание компонентной сути составления проекта. То есть я хотел каждый из модулей вынести как отдельную статическую библиотеку. Так то это не сложно, но возникла проблема в другом. Оказывается нельзя ни в статической библиотеке, ни в динамической, использовать классы времени выполнения WinRT (или как там их назвать). В общем объясню так. Чтобы создать поток, нам нужно воспользоваться следующим API: Windows::System::Threading::ThreadPool::RunAsync(). А это всё управляемый C++ (хотя если уж сказать точнее, то это классы времени выполнения WinRT). А их вот нельзя засовывать в статическую библиотеку (и в динамическую тоже). А другим способом поток не создать. CreateThread() не реализован для Windows Phone 8, а std::thread использовать боюсь (использовал его под магазин Windows 8 и он рушил программу, перешёл на способ выше и всё стало работать). Да, можно создать компонент среды выполнения Windows Phone. Там это всё будет работать. Только вот там нужно использовать управляемый C++, а как я сказал уже выше, я его не люблю использовать. Поэтому не стал я больше с этим возиться, а просто всё сделал одним модулем. Просто файлы движка засунул в отдельную папку.

    В общем реализовал уже много вещей: AudioManager, FileManager, GraphicsManager, LanguageManager, ResourceManager и TimeManager. Сейчас допиливаю SceneManager и GestureManager. Так как в Windows Phone 8 жесты не реализованы, придётся их самому делать. Собственно пока не нужно, но в дальнейшем думаю сделать NetworkManager.

    Так вот, в чём собственно вопросы:

    ВОПРОС 1

    Как мгновенно завершить программу? У меня есть некий интерфейс:

    class IEngineEvent abstract
    {
    	public:
    		virtual void onLoad(IEngine* pEngine)=0;
    		virtual void onLogic(float total,float elapsed,IEngine* pEngine)=0;
    		virtual void onDraw(IEngine* pEngine)=0;
    		virtual void onError(const Error& error)=0;
    };

    Этот интерфейс должна реализовывать сама логика игры. Так вот, функция onError() вызывается тогда, когда происходит критическая ошибка. Мы получаем её, пользователь может что-то сделать (например соединиться с сервером и рассказать о ней) и дальше приложение нужно сразу закрыть.

    ВОПРОС 2

    Как заставить приложение работать при свёрнутой программе? Целей тут может быть много. Например можно играть в сетевую игру и тут позвонили на телефон. Работа приложения приостанавливается. Но надо же как-то в фоновом потоке крутить сокет и общаться с сервером что я живой, а не отвалился. Ну или играешь в какую-то игру, где пока ты свёрнут логика игры может идти дальше: золото капает, люди бегают (бегают в памяти). Я просто пробовал в момент получения события onSuspending() создавать поток и через определённый интервал времени чтобы точка останова в нём срабатывала. Так она не срабатывает, поток перестаёт выполняться. А когда программа разворачивается, тогда он продолжает выполняться.

    ВОПРОС 3

    Как перехватывать системные клавиши? Вообще нашёл обработчики только для не системных клавиш. А вот например надо мне, чтоб при нажатии кнопки Назад (или как её там называть), у меня приложение не закрывалось, а возвращалось в предыдущее меню. А вот если она будет в главном меню, то чтобы закрывалось. В Android'е было с этим удобно, там такое событие должно было вернуть boolean тип, типа если true, то мы сами обработали, а если false, то система сама и она закроет.

    Пока на этом всё. Спасибо за внимание!

    Нашёл ответ на третий вопрос. Если кому тоже будет нужно, то нужно подписаться на событие Windows::Phone::UI::Input::HardwareButtons::BackPressed. В функцию передаётся Windows::Phone::UI::Input::BackPressedEventArgs^. И если требуется не закрывать приложение, то нужно установить Handled в true. А если нужно закрыть, то Handled установить нужно в false.
    31 июля 2013 г. 14:00

Все ответы

  • Здравствуйте!

    По  второму вопросу посмотрите здесь, а по третьему здесь

    1 августа 2013 г. 11:43
  • Ответы на первый и третий вопросы я нашёл. А вот со вторым пока не ясно. По ссылке выше я прочитал про PhoneApplicationService::ApplicationIdleDetectionMode. Так же прочитал что PhoneApplicationService лежит в пространстве имён Microsoft.Phone.Shell. Однако в коде на C++ я не могу найти в пространстве имён Microsoft пространство имён Phone. Что подключить нужно? Ну или как вообще в фоне работать.
    2 августа 2013 г. 9:59