Archive

Articles taggués ‘PrismEngine’

XNA dans une Image WPF

08/08/2010 Stumpy 2 commentaires

Le problème de mélanger ces deux technologies que sont WPF et XNA existe depuis leurs débuts, chacune étant fort performante dans son domaines mais dans certains cas, nous aimerions bien pouvoir mixer les deux.
Au hasard, un éditeur d’environnement pour jeux vidéo ;) .

Il existe plusieurs solution plus ou moins viables, on peut citer par exemple le classique WindowsFormHost qui marche mais implique certaines limitations comme l’impossibilité de poser des contrôles WPF par-dessus le rendu XNA.
Valentin Billotte propose quant à lui une méthode différente et qui pour l’avoir vu tournée marche plutôt bien mais certains ont quelques réticences pour l’utiliser en raison de son principe de superposition des rendu

Par le biais de mon travail de recherche sur le produit Artlantis.com, une idée a germée dans mon esprit mais est restée bien longtemps tranquille par manque de temps.
Il y a peu, je suis tombé sur un forum ou quelqu’un évoquait cette même idée mais n’avait pas vraiment fait de proof-of-concept donc je me suis dis que c’était le bon moment !

Une fois expliqué en détail le process, un de mes collègues sur le projet de fin d’étude que je lead (PrismEngine), Alexandre Bossard nous a mis rapidement en place ce proto pour démontrer que oui cette solution est viable !
La solution a été un peu retouché car est maintenant notre méthode de rendu au sein de notre éditeur mais voici la marche à suivre si vous souhaitez essayer cette méthode qui pour le moment ne nous a pas déçu.

A noter que cette solution est viable pour un éditeur mais je ne promets rien pour un jeu ;) , d’une part utilisation de WPF donc aucune porta sur Xbox360/Zune/WP7 mais surtout malgré un FPS tout à fait correct, la transformation reste couteuse.

Son avantage est de garder toute la puissance de WPF, avec une modification minimum de votre class Game coté XNA.
La seule chose « contraignante » est la partie input qu’il faut légèrement surcouché car on ne travail plus directement sur le rendu XNA mais une simple Image WPF.
Oui, oui, une simple Image WPF donc aucuns soucis pour y ajouter divers contrôle, effet graphique et autre choses marrantes :) .

Voici la marche à suivre pour faire le premier proto, une bonne réorganisation est utiles pour rendre les choses plus élégantes mais allons au plus simple pour comprendre l’idée!
Dans l’ordre nous aurons besoin de :
1. Un projet XNA pour PC que l’on compilera sous forme de library et non exécutable (pour pouvoir l’embarquer au sein de l’appli WPF
2. Une appli WPF dans laquelle on ajoute une référence vers Microsoft.Xna.Framework.Game

Préparons notre class Game maintenant :
On y ajoute quelques « helpers » qui vont nous servir a faire le gros du travail

RenderTarget2D target; // Nous allons dessiner notre scene dedans
public WriteableBitmap bitmap = new WriteableBitmap(800, 460, 96, 96, System.Windows.Media.PixelFormats.Bgra32, null); // l'image que nous donnerons a WPF pour l'éditeur
Color[] colors = new Color[800 * 460]; // le tableau pour remplir notre image
private System.Windows.Threading.DispatcherTimer timer; // un timer, nous allons nous passer du cycle XNA classique donc il faut simuler nos ticks

Au sein de votre Constructor, nous allons ajouter 3 choses:

// on fix une hauteur et largeur en rapport avec notre image, bien sur ensuite ce morceau se devra de gérer les changements de résolution au runtime
this.graphics.PreferredBackBufferHeight = 460;
this.graphics.PreferredBackBufferWidth = 800;
this.graphics.ApplyChanges();
//on appel différentes méthodes de la classe Game manuellement, nous ne passerons pas par le cycle XNA donc c'est a nous de le faire
this.Initialize();
this.LoadContent();
//on lance le timer qui va nous permettre de gérer nos Ticks
this.timer = new System.Windows.Threading.DispatcherTimer();
this.timer.Interval = new System.TimeSpan(5000);
this.timer.Tick += new EventHandler(this.EngineTick);
this.timer.Start();

dans le LoadContent, nous allons initialiser notre RenderTarget:

this.target = new RenderTarget2D(graphics.GraphicsDevice, 800, 460, false, SurfaceFormat.Bgra4444, DepthFormat.Depth24, 0, RenderTargetUsage.DiscardContents);

Et viens la seule partie qui implique vraiment quelques changements dans votre code, la méthode Draw.
Au lieu de le faire de manière classique, nous allons rendre l’image dans notre texture puis ensuite copier son contenu au sein de notre WriteableBitmap qui sera l’image que nous donnerons a l’interface WPF.

protected override void Draw(GameTime gameTime)
{
    graphics.GraphicsDevice.SetRenderTarget(target); // on indique que l'on veut rendre dans notre RenderTarget
    GraphicsDevice.Clear(Color.CornflowerBlue);

    // TODO: Add your drawing code here

    base.Draw(gameTime); // on rend notre scene
    graphics.GraphicsDevice.SetRenderTarget(null);
    target.GetData<Microsoft.Xna.Framework.Color>(colors) // on recupere les pixels de notre scene
    // Bridge wpf/xna
    // Nous allons ecrire dans notre WriteableBitmap et lui assigner les pixels de notre scene
    bitmap.Lock();
    unsafe
    {
        int bb = (int)bitmap.BackBuffer;
        foreach (Microsoft.Xna.Framework.Color color in colors)
        {
            *((int*)bb) = color.B | (color.G <<  8 ) | (color.R << 16) | (color.A << 24);
            bb += sizeof(IntPtr);
        }
    }
    bitmap.AddDirtyRect(new System.Windows.Int32Rect(0, 0, 800, 460));
    bitmap.Unlock();
}

On remarque que l’utilisation d’un peu de code unsafe est obligatoire, la doc msdn est d’accord avec nous sur ce point, pensez donc bien a activé le code unsafe dans les propriétés de votre projet.

Dans notre Windows WPF, il nous suffit maintenant d’instancier notre classe Game mais au lieu de faire appel à la méthode Run qui va d’elle-même créer une fenêtre de rendu et faire appel aux méthodes Init, load,…, chose que nous ne voulons pas, nous allons laisser faire notre Constructor légèrement modifié.

Voici le code-behind de ma fenetre de test :

public partial class MainWindow : Window
{
    XNAPart.Game1 game;

     public MainWindow()
    {
        InitializeComponent();
        this.Init();
    }

     private void Init()
    {
        this.game = new XNAPart.Game1();
        // le fichier XAML de notre Windows comporte un controle de type Image qui porte le nom "Preview", on lui assign l'image de notre jeu
        this.Preview.Source = this.game.bitmap;
    }
}

Pas trop compliqué pour un résultat vraiment sympa et agréable à utiliser :) .
Petite preview avec le rendu XNA dans l’image du haut, un petit bouton par-dessus et un coup de visualBrush à partir de notre Image, chose impossible par exemple avec la méthode du WindowFormHost.

XNAinsideWPF

Categories: C#, Prism Engine, WPF, XNA Tags: , , , ,

Xna GS 4.0 et jeux sur Wp7

Quelques nouvelles de la GDC concernant XNA mais également et surtout le développement de jeu sur WP7.

On attend encore une change List plus précis car pour le moment l’ensemble des annonces faite reposent surtout sur wp7, compréhensible en soit :) .

Voici ce que l’on sait pour le moment à propos de la prochaine version du Framework XNA:

  • New platform
    • Windows Phone 7 Series
  • New features
    • Integrates with Visual Studio 2010
    • Dynamic audio output
    • Microphone input
    • BasicEffect has four new siblings
      • SkinnedEffect
      • EnvironmentMapEffect
      • DualTextureEffect
      • AlphaTestEffect
  • Improved portability and usability
    • Collapsed graphics caps into just two profile levels: Reach and HiDef
    • Many graphics API improvements
    • This involves some breaking API changes
    • Split Microsoft.Xna.Framework.dll into several assemblies, to make it more obvious which pieces are available on each platform

Et pour démontrer un peu ces nouveautés, voici quelques images de jeu tournant sur WP7, plutôt prometteur!

hmm… je sens déjà venir le passage à XNA 4.0 de PrismEngine et donc un petit module pour gérer les téléphones (on gère le ZuneHD donc la transition ne devrait pas être bien longue!)

harvetsachievementtop1

windowsphonexna01pr

windowsphonexna04pr

windowsphonexna10pr

On peut voir que le rendu est fort sympathique, le fait que wp7 réclame un minimum hardware permettant d’avoir une certaine uniformité sur l’ensemble des téléphones donc on peut espérer que le marché du jeu sur Windows mobile va subir le même essor que sur l’IPhone actuellement.

Le fait d’avoir qu’une seule plateforme est l’énorme atout qui a fait le succès de l’iPhone mais permettra a chacun de choisir le look de son téléphone tout en lui permettant l’accès aux mêmes applications avec un niveau de perf semblable n’est-il pas le parfait mélange a offrir aux clients?

Références:

http://klucher.com/blog/achievement-unlocked-xna-game-studio-4-0-for-windows-phone/

http://blogs.msdn.com/shawnhar/archive/2010/03/09/in-which-hints-become-facts-xna-game-studio-4-0.aspx

http://www.engadget.com/2010/03/09/microsoft-shows-off-xna-games-running-on-windows-phone-full-3d/

Forum EIP 2009

eip

Le forum EIP (Epitech Innovative Project) c’est tenu le 13 et 14 Novembre dans les locaux d’Epitech.

Nous y avons présenté notre projet, PrismEngine qui est un moteur de jeu reposant sur la technologie XNA permettant rapidement le prototypage de jeux sur PC, Xbox360, Surface et prochainement Zune HD.

Il nous reste encore pas mal de boulot sur le projet mais la majorité du groupe n’est qu’en quatrième année donc encore 18 mois pour améliorer l’existant, pas d’inquiétudes :) .

De nombreux professionnels nous ont tout de même annonce être très intéressé par le projet et même quelques responsables d’incubateur voulant savoir ce que nous prévoyons pour la suite, plutôt positif comme retour !

La présence de la table Surface sur le stand nous a permis de ramener un public nombreux, peut-être même un peu trop intéressé par la table et non le projet mais au moins ils ont eu le droit au pitch de présentation donc le message est transmis et cela reste le but du forum EIP.

Voici quelques photos de l’évènement  et de la preparation de celui-ci au sein du gamedevlab (on y trouve aussi 2/3 photos de l’application de carte faite au cours de mon stage a Microsoft France et une demo de la table Surface fournis en « standard », faut bien Test. :) ):

Categories: Epitech, Prism Engine, Salon Tags: ,