Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the antispam-bee domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/ruwritingagame/public_html/wp-includes/functions.php on line 6121
Глава 8. Внешние файлы данных, Android assets – Игра в Написание Игры

Глава 8. Внешние файлы данных, Android assets

Идея та же что и в предыдущей главе – расположить файлы данных в пределах досягаемости от экзешника. Правда, в случае Андроида мы имеем дело не с экзешником, а с APK. Кроме того, нам надо доставить файлы не просто в другой каталог, а на другое устройство. Единственный (известный мне) “транспорт” – это специальный каталог “assets“, который встраивается в APK, и затем инсталлируется на конечное устройство. Значит, давайте создадим его.

1. Запускаем Visual Studio, открываем C:\CPP\a999hello\p_android\p_android.sln solution.
Right-click на p_android.Packaging проект(НЕ на p_android.NativeActivity как раньше, а на p_android.Packaging ). Add -> New Folder, назовем его assets. Это специальное зарезервированное имя, p_android.Packaging в курсе что с ним делать.


2. Теперь открываем p_android.NativeActivity project Properties, All Configurations / ARM64, идем в Configuration Properties -> Build Events -> Post-Build Event -> Command Line -> Edit, добавляем команду

xcopy "..\..\..\engine\dt\*.*" "..\$(RootNamespace).Packaging\assets\dt\" /E /R /D /y

Ok, Apply, Ok

Раскадровка:

..\..\..\engine\dt\*.*” – откуда копировать. В отличие от Windows, здесь нам надо подняться на 1 уровень выше.

..\$(RootNamespace).Packaging\assets\dt\” – куда копировать. Поскольку эта команда будет исполняться из каталога p_android.NativeActivity, нам надо подняться на 1 уровень вверх и продолжить в каталог p_android.Packaging и затем – в assets.

Остальное – то же что и в Windows.


  1. VS верхнее меню -> Build -> Rebuild Solution. Результат: “2 succeeded, 0 failed, 0 skipped”.

Теперь, если открыть каталог C:\CPP\a999hello\p_android\p_android.Packaging\assetsWindows File Explorer-е, не в VS), то увидим там наш “dt”. Также он должен быть теперь включен в APK. Но, к моему большому удивлению, оказалось, что нет. Никаких следов test0.txt файла в APK (который находится в C:\CPP\a999hello\p_android\p_android.Packaging\ARM64\Debug) не обнаружено.


4. Оказалось, что надо было вносить каталоги и файлы в assets по-штучно вручную, как мы обычно делали с программными файлами (right-click, add item, и т.д.). Это БОЛЬШАЯ проблема. Понятно, что их (файлов) будет миллион: шейдеры, модели, текстуры, и т.д. Отслеживать их будет просто нереально. Надо как-то заставить assets включать его содержимое автоматом.

Решение далось непросто, пришлось погрузиться ОЧЕНЬ глубоко, но зато теперь я знаю

Как добавить файлы в Android assets в Visual Studio

В Android Studio (в отличие от Visual Studio), все что находится в каталоге assets, автоматически включается в APK. Чтобы воспроизвести это в VS, надо подправить конфиг файл проекта p_android.Packaging:

Закрываем Visual Studio.

В Текстовом Редакторе открываем C:\CPP\a999hello\p_android\p_android.Packaging\p_android.Packaging.androidproj

Прокручиваем вниз. Ближе к концу есть секция:

  <ItemGroup>
    <Content Include="res\values\strings.xml" />
    <AntBuildXml Include="build.xml" />
    <AndroidManifest Include="AndroidManifest.xml" />
    <AntProjectPropertiesFile Include="project.properties" />
  </ItemGroup>

Вверху добавляем:

<Content Include="assets\**" />

чтобы получилось:

  <ItemGroup>
    <Content Include="assets\**" />
    <Content Include="res\values\strings.xml" />
    <AntBuildXml Include="build.xml" />
    <AndroidManifest Include="AndroidManifest.xml" />
    <AntProjectPropertiesFile Include="project.properties" />
  </ItemGroup>

Save.


5. Запускаем Visual Studio, открываем C:\CPP\a999hello\p_android\p_android.sln solution.

Top menu -> Build -> Rebuild solution. Результат: “2 succeeded, 0 failed, 0 skipped”.

Вот теперь, если открыть C:\CPP\a999hello\p_android\p_android.Packaging\ARM64\Debug\p_android.apk в текстовом редакторе, можно убедиться, что test0.txt – там.


6. Так что, теперь можно прочитать этот файл на Андроиде?? Абсолютно. Код:

	//reading test file
	char buff[256];
	AAssetManager* am = androidApp->activity->assetManager;
	AAsset* asset = AAssetManager_open(am, "dt/shaders/test0.txt", AASSET_MODE_UNKNOWN);
	if (asset != NULL) {
		long size = AAsset_getLength(asset);
		AAsset_read(asset, buff, size);
		mylog("File size = %d, text:\n%s\n", size, buff);
		AAsset_close(asset);
	}
	else {
		mylog("Asset not found.\n");
	}

Откроем main.cpp. Прокрутим вниз. Вставим этот код перед theGame.run().

Включаем, разблокируем и подключаем Андроид, разрешаем дебаггинг.

  • Сперва запускаем Logcat (VS top menu -> Tools -> Android Tools -> Logcat), в поисковой строке набираем “mylog“, Enter. Если надо – очищаем экран (иконка с красным крестиком в меню Logcat-а).

Теперь – компиляция и запуск (зеленая стрелка). Пере-запускаем Logcat если закрылся. Результат:

Что дальше? Шейдеры??

Нет, пока нет, пока еще нет…

Постойте, это еще не все!

Продолжение следует…


Leave a Reply

Your email address will not be published. Required fields are marked *