You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 line
10KB

  1. <!DOCTYPE html>
  2. <head>
  3. <meta charset="utf-8" />
  4. <!-- Set the viewport width to device width for mobile -->
  5. <meta name="viewport" content="width=device-width" />
  6. <title>Начало воссоздания Маджонга</title>
  7. <link rel="stylesheet" href="http://opengamestudio.org/theme/css/normalize.css" />
  8. <link rel="stylesheet" href="http://opengamestudio.org/theme/css/foundation.min.css" />
  9. <link rel="stylesheet" href="http://opengamestudio.org/theme/css/style.css" />
  10. <link rel="stylesheet" href="http://opengamestudio.org/theme/css/pygments.css" />
  11. <script src="http://opengamestudio.org/theme/js/custom.modernizr.js"></script>
  12. <!-- So Firefox can bookmark->"abo this site" -->
  13. <link href="feeds/all.atom.xml" rel="alternate" title="Opensource Game Studio" type="application/atom+xml">
  14. </head>
  15. <body>
  16. <!-- Nav Bar -->
  17. <nav>
  18. <!-- Show menu items and pages -->
  19. <div class="row">
  20. <div class="large-12 columns top-bar">
  21. <h1><a href="http://opengamestudio.org">Opensource Game Studio</a></h1>
  22. </div>
  23. </div>
  24. <div class="row top-menu">
  25. <div class="large-12 columns">
  26. <a href="pages/projects.html" class="menu-button secondary">Projects</a>
  27. <a href="pages/about.html" class="menu-button secondary">About</a>
  28. </div>
  29. </div>
  30. </nav>
  31. <!-- End Nav -->
  32. <!-- Main Page Content and Sidebar -->
  33. <div class="row">
  34. <!-- Main Blog Content -->
  35. <div class="large-9 columns">
  36. <article>
  37. <header>
  38. <h3 class="article-title"><a href="http://opengamestudio.org/mahjong-recreation-start-ru.html" rel="bookmark"
  39. title="Permalink to Начало воссоздания Маджонга">Начало воссоздания Маджонга</a></h3>
  40. </header>
  41. <h6 class="subheader" title="2018-01-26T00:00:00+03:00">Пт 26 Январь 2018
  42. <a class="button secondary small translation-button" href="http://opengamestudio.org/mahjong-recreation-start.html">en</a>
  43. </h6> <p><img alt="Screenshot" src="http://opengamestudio.org/2018-01-26-mahjong-recreation-start.png" /></p>
  44. <p>Эта статья описывает начало воссоздания игры Маджонг.</p>
  45. <p><strong>План</strong></p>
  46. <p>Мы начали воссоздание Маджонга с составления краткого плана реализации игровой механики с минимальной графикой:</p>
  47. <ul>
  48. <li>Загрузить раскладку</li>
  49. <li>Поместить фишки в позиции раскладки</li>
  50. <li>Различить фишки</li>
  51. <li>Реализовать выбор фишек</li>
  52. <li>Реализовать сравнение фишек</li>
  53. </ul>
  54. <p>Как и любой другой план, этот выглядел вполне адекватно на первый взгляд. Тем не менее стоит начать разработку, как появляются новые детали. Этот план не был исключением. Ниже представлена пара проблем, вскрывшихся во время разработки.</p>
  55. <p><strong>Проблема №1: предоставить бинарные ресурсы на поддерживаемых платформах</strong></p>
  56. <p>Маджонг будет доступен для десктопа, мобилок и веба. Каждая платформа имеет ограничения на доступ к внешним файлам:</p>
  57. <ul>
  58. <li>Десктоп позволяет получить доступ почти к любому файлу</li>
  59. <li>Мобилки имеют ограниченный доступ к файловой системе</li>
  60. <li>Веб не имеет файловой системы</li>
  61. </ul>
  62. <p>Мы решили сделать единый способ доступа к ресурсам путём их встраивания в исполняемый файл. Это решение привело к рождению проектов <strong>mjin-resource</strong> и <strong>mahjong-data</strong>.</p>
  63. <p>Проект <a href="https://bitbucket.org/ogstudio/mjin-resource">mjin-resource</a> служит для:</p>
  64. <ul>
  65. <li>перевода бинарных файлов в заголовочные файлы C с помощью утилиты <strong>xxd</strong></li>
  66. <li>создания проекта MJIN, состоящего из сгенерированных заголовочных файлов, который собирается в статическую библиотеку</li>
  67. <li>предоставления интерфейса C++ для работы с ресурсами</li>
  68. </ul>
  69. <p>Проект <a href="https://bitbucket.org/ogstudio-games/mahjong-data">mahjong-data</a> является примером подобного проекта MJIN, ресурсы из которого использует проект <a href="https://bitbucket.org/ogstudio-games/mahjong">mahjong</a>.</p>
  70. <p><strong>Проблема №2: загрузка изображений PNG на поддерживаемых платформах</strong></p>
  71. <p>Для загрузки PNG мы используем соответствующий плагин OpenSceneGraph. Мы собрали его без проблем для десктопа. Сборка же для веба (Emscripten) оказалась сложнее: Emscripten содержит собственную версию <strong>libpng</strong>, которую сборочный скрипт OpenSceneGraph не видит. Нам пришлось обойти несколько проверок OpenSceneGraph, чтобы успешно собрать плагин для Emscripten.
  72. Сборка плагина под мобилки ещё ждёт нас впереди. Как только мы разберёмся с плагином PNG на всех поддерживаемых платформах, мы опубликуем информацию о его сборке в новом самоучителе для <a href="https://github.com/ogstudio/openscenegraph-cross-platform-guide">кросс-платформенного руководства OpenSceneGraph</a>. Нас уже <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide/issues/4">попросили это сделать</a>.</p>
  73. <p><strong>Разработка</strong></p>
  74. <p><a href="http://opengamestudio.org/lets-go-ru.html">Как вы знаете</a>, мы опубликовали кросс-платформенное руководство OpenSceneGraph для усиления сообщества OpenSceneGraph. Мы ценим обучение и любим делиться своими знаниями. Поэтому мы решили разрабатывать Маджонг небольшими воспроизводимыми частями, каждая из которых имеет уникальную внутреннюю версию. Эти версии доступны в <a href="https://bitbucket.org/ogstudio-games/mahjong">хранилище проекта mahjong</a>.</p>
  75. <p>Мы также предоставляем <a href="http://ogstudio.github.io/game-mahjong">историю версий, каждая из которых сопровождается сборкой под веб</a>, для следующих целей:</p>
  76. <ul>
  77. <li>обучение: показать ход разработки изнутри</li>
  78. <li>доступность: предоставить старые версии для сравнения</li>
  79. </ul>
  80. <p><strong>Текущее состояние игры Маджонг</strong></p>
  81. <p>На момент написания этой статьи мы закончили реализацию выбора фишек. <a href="https://ogstudio.github.io/game-mahjong/versions/010/mjin-player.html">Проверьте в своём браузере!</a></p>
  82. <p>После реализации сравнения фишек мы опубликуем промежуточный результат для всех поддерживаемых платформ.</p>
  83. <p>На этом мы заканчиваем описание начала воссоздания игры Маджонг.</p>
  84. <p class="subheader">Category: <a href="http://opengamestudio.org/category/news.html">News</a>
  85. </p>
  86. </article>
  87. </div>
  88. <!-- End Main Content -->
  89. <!-- Sidebar -->
  90. <aside class="large-3 columns">
  91. <!--k
  92. <h5 class="sidebar-title">Site</h5>
  93. <ul class="side-nav">
  94. <li><a href="http://opengamestudio.org/archives.html">Archives</a>
  95. <li><a href="http://opengamestudio.org/tags.html">Tags</a>
  96. <li><a href="http://opengamestudio.org/feeds/all.atom.xml" rel="alternate">Atom feed</a></li>
  97. </ul>
  98. <h5 class="sidebar-title">Categories</h5>
  99. <ul class="side-nav">
  100. <li><a href="http://opengamestudio.org/category/news.html">News</a></li>
  101. </ul>
  102. -->
  103. <h5 class="sidebar-title">Ads</h5>
  104. <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
  105. <!-- ogs2 -->
  106. <ins class="adsbygoogle"
  107. style="display:block"
  108. data-ad-client="ca-pub-4473792248813084"
  109. data-ad-slot="9024247127"
  110. data-ad-format="auto"></ins>
  111. <script>
  112. (adsbygoogle = window.adsbygoogle || []).push({});
  113. </script>
  114. </aside> <!-- End Sidebar -->
  115. </div> <!-- End Main Content and Sidebar -->
  116. <!-- Footer -->
  117. <footer class="row">
  118. <div class="large-12 columns">
  119. <hr />
  120. <div class="row">
  121. <div class="large-7 columns">
  122. <p>Proudly powered by <a href="http://getpelican.com">Pelican</a>, which takes great advantage of <a href="http://python.org">Python</a>.</p>
  123. </div>
  124. </div>
  125. </div>
  126. <script type="text/javascript">
  127. var _gaq = _gaq || [];
  128. _gaq.push(['_setAccount', 'UA-3773114-1']);
  129. _gaq.push(['_trackPageview']);
  130. (function() {
  131. var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  132. ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  133. var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  134. })();
  135. </script>
  136. </footer>