Conception de niveau en jeu avec XNA?

10

Je me pose des questions sur la conception de niveau en jeu. Ma situation actuelle tourne autour de Tiled - j'ai plusieurs couches différentes avec différents types d'objets (pour ceux qui ne connaissent pas Tiled, un objet n'est rien de plus qu'une coordonnée avec des propriétés arbitraires qui lui sont assignées).

Je recompile actuellement le jeu chaque fois que j'apporte une petite modification à mon fichier de carte pour voir si tout est correctement positionné. Existe-t-il un moyen pour que mon jeu recharge automatiquement le niveau si un changement de fichier de carte est détecté? Est-ce que XNA le permet même, ou la façon dont le pipeline de contenu fonctionne ne permet-elle pas le contenu dynamique de cette manière? Tous les conseils ou suggestions sont les bienvenus.

Christopher Horenstein
la source

Réponses:

8

Je suppose que vos fichiers de carte sont traités via le Content Pipeline, puis chargés au moment de l'exécution avec Content.Load. Vous avez deux options:

  • Enregistrez vos cartes en tant que fichier XML, via IntermediateSerializer.Serialize. Ensuite, au moment de l'exécution, vous pouvez les lire avec IntermediateSerializer.Deserialize pour voir les modifications.
  • C'est plus difficile: appeler MSBuild au moment de l'exécution pour recompiler vos fichiers dans des XNB appropriés et les recharger avec le ContentManager. Cet exemple fait cela.
r2d2rigo
la source
Entre les deux, je suis sûr que je pourrai trier quelque chose. Je vous remercie!
Christopher Horenstein
2

Vous pouvez également utiliser Karvonite si vous souhaitez obtenir ce résultat et aller très vite.

C'est un framework de persistance agile. Je ne sais pas si la nouvelle version fonctionnera sur Windows Phone 7 ou Xbox.

Vous créeriez une définition de persistance avec leur éditeur de persistance (c'est assez simple, vous importez simplement l'assembly et vérifiez les champs / propriétés sur les classes / structures que vous souhaitez conserver) Vous lancez un ObjectSpace dans le code et ajoutez / supprimez / récupérez des objets à partir de celui-ci . (ces objets sont persistants)

Si vous pouviez créer une abstraction pour que le moteur de tuiles ou ce que vous appelez ne se soucie pas exactement de la façon dont il obtient la carte, juste qu'il obtient celle qu'il a demandée. Ensuite, vous pouvez revenir en arrière et utiliser le XmlSerializer ou l'Intermédiaire. (selon votre préférence) Tout ce que vous auriez à faire pour implémenter ces autres sérialiseurs est de créer une autre implémentation de l'abstraction (une interface ou une classe abstraite).

Je pense qu'il y a un exemple de la façon de créer du contenu lors de l'exécution sur le site Web du club du créateur XNA. Cependant, il pourrait ne pas être construit avec le dernier framework. De cette façon, vous pouvez conserver votre ancien code si vous utilisez déjà le pipeline de contenu. Voici le lien: Winform Series 2: Chargement de contenu

Michael Coleman
la source
Je me sens un peu idiot de demander cela, mais pouvez-vous décrire ce que vous envisagez pour le flux de travail utilisant ce cadre? Cela semble vraiment bien, mais je ne sais pas comment l'aborder.
Christopher Horenstein
1
Eh bien, vous définissez la sérialisation dans leur éditeur de persistance. (c'est vraiment facile, vous importez simplement votre assemblage d'objet et cochez certaines cases sur les structures / classes et les champs / propriétés que vous souhaitez conserver) Une fois que vous avez fait cela, vous pouvez simplement initialiser un espace objet qui sérialisera / désérialisera vos objets . C'est assez soigné et rapide pour être opérationnel.
Michael Coleman
1
Vous pouvez également consulter ce projet sur codeplex pour un meilleur exemple de création de contenu en dehors de Visual Studio. ( xnadevru.codeplex.com/… )
Michael Coleman