Bien, formulado de esta manera, estoy seguro de que suena oscuro, pero haré todo lo posible para describir mi problema.
Primero, déjame explicarte lo que está mal con mi código fuente real.
Estoy haciendo un juego de plataformas, y aquí están los componentes de la corriente de mi juego: un nivel , que está llevando a cabo su propia rejilla de baldosas y también las hojas de baldosas y una teja , que sólo mantiene el nombre de su hoja de baldosas y el índice dentro de la hoja de azulejos Todos estos están dentro de un proyecto de juego XNA separado, llamado GameLib.
Así es como mis niveles están formateados en un archivo de texto:
x x . . . . .
. . . b g r .
. . . . . . .
X X X X X X X
Donde .
representa un mosaico vacío, b
representa una plataforma azul, X
representa un bloque con un color aleatorio, etc.
En lugar de hacer todo el trabajo de cargar un nivel dentro de la clase Level , decidí aprovechar la extensión de la canalización de contenido y crear una LevelContentPipelineExtension.
Tan pronto como comencé, me di cuenta rápidamente de que no quería codificar más de 20 líneas de este tipo:
if (symbol == 'b')
return new Tile(/*...*/);
Entonces, con la esperanza de al menos centralizar toda la creación de contenido en una clase, hice una clase estática, llamada LevelContentCreation , que contiene la información sobre qué símbolo crea qué y todo este tipo de cosas. También contiene una lista de todas las rutas de activos de las hojas de mosaico, para cargarlas más adelante. Esta clase está dentro de mi proyecto de biblioteca de juegos GameLib.
El problema es que estoy usando esta clase estática LevelContentCreation tanto en mi clase Level (para cargar las hojas de mosaico reales) como en mi extensión de canalización de contenido (para saber qué símbolo representa qué mosaico) ...
Y así es como se ve mi clase LevelContentCreation :
public static class LevelContentCreation
{
private static Dictionary<char, TileCreationInfo> AvailableTiles =
CreateAvailableTiles();
private static List<string> AvailableTileSheets { get; set; }
/* ... rest of the class */
}
Ahora, dado que la clase LevelContentCreation es parte de la biblioteca del juego, la extensión de la tubería de contenido intenta usarla, pero la llamada a CreateAvailableTiles () nunca ocurre y no puedo cargar un objeto Level de la tubería de contenido.
Sé que esto se debe a que la canalización de contenido se ejecuta antes de la compilación real o algo así, pero ¿cómo puedo solucionar el problema?
Realmente no puedo mover la clase LevelContentCreation a la extensión de canalización, porque entonces la clase Level no podría usarla ... Estoy bastante perdido y no sé qué hacer ... Sé estos son decisiones de diseño bastante malas, y me gustaría que alguien pudiera señalarme en la dirección correcta.
Gracias por tu precioso tiempo.
Si algo no está lo suficientemente claro o si debo proporcionar más información / código, deje un comentario a continuación.
Un poco más de información sobre mis proyectos:
- Juego - Proyecto de juego XNA para Windows. Contiene referencias a: Motor, GameLib y GameContent
- GameLib - Proyecto de biblioteca de juegos XNA. Contiene referencias a: Motor
- GameContent - Proyecto de contenido XNA. Contiene referencias a: LevelContentPipelineExtension
- Motor - Proyecto de biblioteca de juegos XNA. Sin referencias
- LevelContentPipelineExtension - Extensión de canalización de contenido XNA. Contiene referencias a: Motor y GameLib
No sé casi nada sobre XNA 4.0 y estoy un poco perdido sobre cómo funciona el contenido ahora. Si necesitas más información, dímelo.