windows phone 8 - studio - ¿Cómo incluyo archivos de "contenido" en subdirectorios en el teléfono con Windows 8.1?
windows sdk for windows 7 (3)
Estoy trabajando en un proyecto con muchos archivos (un juego). Estos archivos pueden cambiar desde fuera de VS 2013, por ejemplo, por artistas. Los archivos están ubicados en subdirectorios y nuestro juego los espera allí. Por ejemplo images / items / block.png
Intenté usar un evento de construcción posterior
xcopy /C /Y /I /R /S /Q "$(SolutionDir)game_data/*" "$(TargetDir)"
y también con $ (LayoutDir). El problema no ocurre en nuestro proyecto de escritorio (tienda de Windows RT) porque simplemente copio los archivos en el directorio AppX de la compilación y cuando ejecuto, el exe los encuentra. Pero con Windows Phone ya no hay ningún directorio de AppX y NO lo copia en el teléfono.
¿Cómo incluyo archivos Y directorios de $ (SolutionDir) game_data en el paquete que se instala en el teléfono?
Preferiblemente una solución donde I:
- No es necesario volver a crear toda la estructura de la subcarpeta en los filtros del Proyecto
- No es necesario que especifique "Contenido = Sí" en las propiedades de cada archivo en cada subdirectorio.
- No es necesario agregar o eliminar ningún archivo nuevo que los artistas agreguen al directorio.
La forma de resolver esto es así:
Escriba una herramienta que cambie el nombre de toda su estructura de directorios de esta manera:
script/game/level.lua
convierte enscript#game#level.lua
A continuación, agregue todos los archivos (que están ahora en el directorio raíz) a su proyecto y establezca su propiedad Content = Yes
- Cambia tus caminos en tu juego, reemplazando ''/'' por ''#''. Espero que ya haya retransmitido todas las llamadas fopen a una implementación específica de plataforma (como hacemos nosotros).
Podría escribir un script que agregue nuevos archivos, pero por ahora es bastante fácil hacerlo cada vez después de una actualización SVN que agrega nuevos archivos.
Si la gente está interesada en el archivo por lotes que uso para desempaquetar / empacar el AppX, aquí está:
@echo off
@REM ==================================
@REM User variables
@REM ==================================
set GAME_DIR=C:/development/MyAwesomeGame
set GAME_VERSION=1.0.0.0
set PVK_PUBLISHER=SECRETSECRETSECRETSECRETSECRET
@REM Uncomment for beta builds:
@REM set APPX_BUILD=_Beta
@REM Uncomment for debug builds:
@REM set APPX_BUILD=_Debug
set RESOURCETOOL_FLAVOR=compile_for_winrt
set GAME_NAME=Game.WindowsPhone
set GAME_TOOLS_DIR=%GAME_DIR%/tools
set GAME_DATA_DIR=%GAME_DIR%/data
set PFX_FILE=%GAME_DIR%/proj.win8.1/%GAME_NAME%_StoreKey.pfx
set RESOURCETOOL_OUTPUT=%GAME_DIR%/processed_game_data/win8.1
set MY_START_DIR=%cd%
@REM ==================================
@REM Tools
@REM ==================================
set WIN_SDK_BIN_DIR=C:/Program Files (x86)/Windows Kits/8.0/bin/x64
if not exist "%WIN_SDK_BIN_DIR%" set WIN_SDK_BIN_DIR=C:/Program Files/Windows Kits/8.0/bin/x86
set WINRAR_EXE=%GAME_TOOLS_DIR%/WinRAR.exe
set MAKECERT_EXE=%WIN_SDK_BIN_DIR%/makecert.exe
set MAKEAPPX_EXE=%WIN_SDK_BIN_DIR%/makeappx.exe
set SIGNTOOL_EXE=%WIN_SDK_BIN_DIR%/signtool.exe
set POWERSHELL_EXE=%SYSTEMROOT%/system32/WindowsPowerShell/v1.0/powershell.exe
set PVK_FILE=None
set CER_FILE=None
@REM ==================================
@REM Prerequisites check
@REM ==================================
if not exist "%MAKECERT_EXE%" goto err_no_MAKECERT_EXE
if not exist "%MAKEAPPX_EXE%" goto err_no_MAKEAPPX_EXE
if not exist "%SIGNTOOL_EXE%" goto err_no_SIGNTOOL_EXE
if not exist "%WINRAR_EXE%" goto err_no_WINRAR_EXE
if not exist "%POWERSHELL_EXE%" goto err_no_POWERSHELL_EXE
@REM ==================================
@REM Build options
@REM ==================================
set do_verbose=n
set do_all=y
set build_arm_platform=y
set build_win32_platform=y
set do_delete_tmp_dir=y
set do_copy_resources=y
set do_unpack_source_appx=y
set do_create_appx=y
set do_sign_appx=y
set do_install_appx=y
set do_create_rar=y
set /p do_all=Complete process? (default on) [y/n]:
if not "%do_all%"=="n" goto skip_do_all
set /p build_arm_platform=Build ARM? (default on) [y/n]:
set /p build_win32_platform=Build Win32? (default on) [y/n]:
set /p do_verbose=Verbose output? (default off) [y/n]:
set /p do_delete_tmp_dir=Delete TMP dir? (default on [y/n]):
set /p do_copy_resources=Copy resources? (default on [y/n]):
set /p do_unpack_source_appx=Unpack AppX? (default on) [y/n]:
set /p do_create_appx=Create AppX? (default on) [y/n]:
set /p do_sign_appx=Sign AppX? (default on) [y/n]:
set /p do_install_appx=Install AppX? (default off) [y/n]:
set /p do_create_rar=Create Rar? (default on) [y/n]:
:skip_do_all
@REM ==================================
@REM Build verbosity settings
@REM ==================================
set XCOPY_VERBOSE=/q
if not "%do_verbose%"=="y" goto :skip_do_verbose
@echo on
set MAKEAPPX_VERBOSE=/v
set XCOPY_VERBOSE=
:skip_do_verbose
@REM ==================================
@REM Select current platform
@REM ==================================
if "%build_arm_platform%"=="n" goto end_arm_build
set WIN8_PLATFORM=ARM
goto run_appx_build
:end_arm_build
if "%build_win32_platform%"=="n" goto end_win32_build
set WIN8_PLATFORM=Win32
goto run_appx_build
:end_win32_build
cd "%MY_START_DIR%"
@echo ######## Done. ########
goto end
@REM ==================================
@REM Start platform dependent build here
@REM ==================================
:run_appx_build
@REM ==================================
@REM Platform AppX variables
@REM ==================================
set APPX_NAME=%GAME_NAME%_%GAME_VERSION%_%WIN8_PLATFORM%%APPX_BUILD%
set APPX_DIR=%GAME_DIR%/AppPackages/%GAME_NAME%/%APPX_NAME%_Test
set APPX_SOURCE_PATH=%APPX_DIR%/%APPX_NAME%.appx
set APPX_TEMP_DIR=%APPX_DIR%/_TMP_TMP_TMP_
@REM ==================================
@REM Remove temp dir
@REM ==================================
if "%do_unpack_source_appx%"=="n" if "%do_copy_resources%"=="n" if "%do_create_appx%"=="n" goto skip_temp_dir
if "%do_delete_tmp_dir%"=="n" goto skip_delete_temp_dir
@echo ######## Removing temporary directory ########
if exist "%APPX_TEMP_DIR%" call rmdir /S /Q "%APPX_TEMP_DIR%"
if exist "%APPX_TEMP_DIR%" goto err_APPX_TEMP_EXISTS
:skip_delete_temp_dir
mkdir "%APPX_TEMP_DIR%"
cd "%APPX_TEMP_DIR%"
:skip_temp_dir
@REM ==================================
@REM Unpack source AppX
@REM ==================================
if "%do_unpack_source_appx%"=="n" goto skip_unpack_source_appx
if not exist "%APPX_SOURCE_PATH%" goto err_no_APPX_SOURCE_PATH
@echo ######## Unpacking source AppX ########
"%WINRAR_EXE%" x "%APPX_SOURCE_PATH%"
:skip_unpack_source_appx
@REM ==================================
@REM Copy game resources
@REM ==================================
if "%do_copy_resources%"=="n" goto skip_copy_resources
if not exist "%RESOURCETOOL_OUTPUT%" goto err_no_RESOURCETOOL_OUTPUT
echo ######## Copying game''s resources ########
xcopy /C /Y /I /R /S %XCOPY_VERBOSE% "%RESOURCETOOL_OUTPUT%/*" "%APPX_TEMP_DIR%/*"
xcopy /C /Y /I /R /S %XCOPY_VERBOSE% "%GAME_DATA_DIR%/shaders/*.cso" "%APPX_TEMP_DIR%/shaders"
:skip_copy_resources
@REM ==================================
@REM Create AppX
@REM ==================================
if "%do_create_appx%"=="n" goto skip_create_appx
@echo ######## Packaging new AppX ########
if exist "%APPX_SOURCE_PATH%" del "%APPX_SOURCE_PATH%"
if exist "%APPX_SOURCE_PATH%" goto err_cant_delete_APPX_SOURCE_PATH
call "%MAKEAPPX_EXE%" pack /l /o %MAKEAPPX_VERBOSE% /d "%APPX_TEMP_DIR%" /p "%APPX_SOURCE_PATH%" > NUL
:skip_create_appx
@REM ==================================
@REM Check if AppX creation was succesfull
@REM ==================================
if "%do_create_appx%"=="n" if "%do_sign_appx%"=="n" if not "%do_install_appx%"=="y" goto skip_check_appx_created
if not exist "%APPX_SOURCE_PATH%" goto err_no_APPX_SOURCE_PATH
:skip_check_appx_created
@REM ==================================
@REM Sign AppX
@REM ==================================
if "%do_sign_appx%"=="n" goto skip_sign_appx
@echo ######## Signing AppX file ########
if not exist "%PFX_FILE%" goto err_no_PFX_FILE
"%SIGNTOOL_EXE%" sign /a /v /fd sha256 /f "%PFX_FILE%" "%APPX_SOURCE_PATH%"
:skip_sign_appx
@REM ==================================
@REM Check for install script
@REM ==================================
if not "%do_install_appx%"=="y" if "%do_create_rar%"=="n" goto skip_install_script_check
set APPX_INSTALLSCRIPT=%APPX_DIR%/Add-AppDevPackage.ps1
set APPX_CERTIFICATE=%APPX_DIR%/%APPX_NAME%.cer
if not exist "%APPX_INSTALLSCRIPT%" goto err_no_APPX_INSTALLSCRIPT
if not exist "%APPX_CERTIFICATE%" goto err_no_APPX_CERTIFICATE
:skip_install_script_check
@REM ==================================
@REM Install AppX
@REM ==================================
if not "%WIN8_PLATFORM%"=="Win32" goto skip_install_appx
if not "%do_install_appx%"=="y" goto skip_install_appx
@echo ######## Installing AppX file ########
"%POWERSHELL_EXE%" "%APPX_INSTALLSCRIPT%"
:skip_install_appx
@REM ==================================
@REM Create rar to distribute
@REM ==================================
if "%do_create_rar%"=="n" goto skip_create_rar
cd %APPX_DIR%
call "%WINRAR_EXE%" a "%GAME_DIR%/%APPX_NAME%.rar" "Add-AppDevPackage.resources" "Dependencies" "Add-AppDevPackage.ps1" "%APPX_NAME%.appx" "%APPX_NAME%.appxsym" "%APPX_NAME%.cer"
:skip_create_rar
@REM ==================================
@REM Loop other platforms
@REM ==================================
if "%WIN8_PLATFORM%"=="ARM" goto end_arm_build
if "%WIN8_PLATFORM%"=="Win32" goto end_win32_build
@REM =================================
@REM Error messages
@REM ==================================
:err_APPX_TEMP_EXISTS
@echo The temporary directory already exists and cannot be removed:
@echo %APPX_TEMP_DIR%
goto end
:err_no_MAKECERT_EXE
@echo Missing %MAKECERT_EXE%
goto end
:err_no_MAKEAPPX_EXE
@echo Missing %MAKEAPPX_EXE%
goto end
:err_no_SIGNTOOL_EXE
@echo Missing %SIGNTOOL_EXE%
goto end
:err_no_WINRAR_EXE
@echo Missing %WINRAR_EXE%
goto end
:err_no_POWERSHELL_EXE
@echo Missing %POWERSHELL_EXE%
goto end
:err_no_RESOURCETOOL_OUTPUT
@echo Missing %RESOURCETOOL_OUTPUT%
goto end
:err_no_APPX_SOURCE_PATH
@echo Missing %APPX_SOURCE_PATH%
goto end
:err_no_PFX_FILE
@echo Missing %PFX_FILE%
goto end
:err_no_APPX_INSTALLSCRIPT
@echo Missing %APPX_INSTALLSCRIPT%
goto end
err_no_APPX_CERTIFICATE
@echo Missing %APPX_CERTIFICATE%
goto end
:err_cant_delete_APPX_SOURCE_PATH
@echo Can''t delete %APPX_SOURCE_PATH%
goto end
:end
pause
Tendrá que copiar los archivos lo suficientemente temprano para que se incluyan en el paquete de Appx. Su solución de copia en el directorio de Appx post-build en el escritorio está limitada a la máquina de creación que ejecuta la aplicación directamente desde su propia carpeta en lugar de realizar una implementación completa. Como los archivos no están en el paquete de implementación, no estarán disponibles en otros sistemas. Esto es más obvio en el teléfono, ya que siempre tendrá que implementar la aplicación antes de ejecutarla, pero en última instancia es lo mismo.
La forma manual es incluir los archivos en el proyecto de Visual Studio. Puede copiar los archivos en el directorio del proyecto, mostrar todos los archivos y luego seleccionar e incluir los nuevos archivos. Si no se agregan automáticamente como contenido (la mayoría de los tipos de imágenes, como el png en su ejemplo), deberá establecerlo explícitamente para que se incluyan en el paquete appx cuando se construya.
Este es más o menos el escenario que dijiste que no querías.
En su lugar, puede automatizar la adición de los elementos al archivo del proyecto. El archivo vcxproj es un archivo XML ( esquema aquí ) y puede escribir un script para agregar sus archivos de activos a ItemGroups en el proyecto y marcarlos como DeploymentContent:
<ItemGroup>
<Image Include="images/items/block.png" />
<None Include="Assets/frotz.foo">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Assets/wibble.foo">
<DeploymentContent>true</DeploymentContent>
</None>
</ItemGroup>
Por último, puede crear el paquete de aplicación usted mismo con makeappx.exe en lugar de dejar que Visual Studio lo haga por usted. Esto le permitirá tener control total sobre los archivos en el paquete, incluida la capacidad de extraerlos desde fuera del proyecto VS. Ver paquetes de aplicaciones e implementación y la documentación del paquete de aplicaciones (MakeAppx.exe) .