Archive

Archives pour la catégorie ‘Prism Engine’

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: , , , ,

PrismEngine tourne maintenant avec XNA 4.0!

2010_logo_prismengine Depuis l’annonce de la version 4.0 du Framework XNA, l’équipe de PrismEngine avait une folle envie de regarder cela de plus près et rapidement faire évoluer notre moteur dessus pour pouvoir tirer parti de la nouvelle plateforme mobile de Microsoft.

Apres une semaine chargée en évènement, on notera par exemple le boot camp de Microsoft pour Imagine Cup ou j’étais en qualité de mentor pour un groupe d’étudiant de troisième année d’Epitech. Quelques tests sur les nouvelles capacités du Framework (voir les derniers articles sur le tactile par exemple).

Le groupe, disons plutôt notre lead technique Benjamin Baldacci c’était réservé une nuit avec comme objectif de mener à bien cette évolution.

Vers 5h du matin, j’ai reçu un mail m’annonçant que cela était fait et qu’il était maintenant temps pour lui d’aller jouer un peu à la xbox 360 ;) .

cco_resources_downloads_downloadItemImage_XNAGS4_CTPLe passage vers XNA 4.0 n’est pas final encore, nous attendront une version plus complète du  Framework qui n’est pour le moment qu’en CTP mais nous avons pu confirmer que même pour un projet de grande ampleur, la transition n’est pas bien lourde.

Il y a bien quelques petites choses qu’il faut modifier mais dans l’ensemble, aucun soucis.

En quelques heures, le moteur était opérationnel !

Je me permettrais de citer notre lead technique : « Foutu référence null que le débuguer était pas foutu de m’indiquer ! », bug qui a dû lui prendre environ la moitié du temps c’est pour dire…

Aucune demo n’a été faite spécifiquement pour la plateforme, nous avons tout simplement repris une petite demo faite il y a quelque temps qui était là pour démontrer l’ajout de fonctionnalité par le biais de module.

Cela marchait sur PC, sur Xbox360, sur Surface et sur Zune HD et bien maintenant on peut officiellement dire que cela marche également sur Windows Phone 7 Series :) .

(A noter que le Zune HD a disparu de la version 4.0 du Framework donc paix à son âme…)

PrismEngine, un des premiers moteurs XNA a tourner sur Windows Mobile? Dans les premiers en tous les cas ;) .

Merci à Benjamin pour son boulot!

WP1

WP2

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: ,

Prism Engine

Petite pub pour le moteur de jeu que je développe actuellement pour mon EIP(Epitech Innovative Project, comprendre projet de fin d’étude).

Moteur de jeu développé dans le cadre des Epitech Innovative Projects, Prism Engine se veut un moteur facile d’utilisation et dont la portabilité des jeux entre la Xbox360 et un PC sous Windows est totalement transparente.

Notre but est de permettre à l’utilisateur de donner vie à son projet en ayant un bagage technique faible en matière de création de jeu vidéo, lui offrir une porte d’entrée dans cet univers!

La création de jeu réclame de nombreuse notions différentes du développement classique et avoir une approche simple avec un rendu intéressant rapidement est motivant pour l’utilisateur.

L’utilisation des technologies XNA et .Net nous permet de nous concentrer essentiellement sur l’architecture et les fonctionnalités du moteur.

Notre moteur repose sur une architecture découpée, chaque élément de ce dernier a un rôle bien précis et ne réclame pas obligatoirement la présence des autres.

Le moteur sera livré avec une offre de plugins pour Visual Studio permettant une intégration complète du moteur au sein de l’outil de développement, l’utilisation des DSLtools sont prévu pour simplifier encore plus la création.

Voila, derrière ce petit discours de com, vous l’aurez compris, notre idée est de découvrir plus en détail les technologies Microsoft par le biais d’un moteur de jeu pour Xbox 360 et PC.

Le dev avance plutôt bien, l’architecture de base est pose et nous somme actuellement en train d’améliorer notre renderer pour une gestion des matériaux et petit effet de lumière sympa pour avoir un rendu sympathique.

Pour ceux qui veulent en savoir un peu plus: www.prism-engine.net

Prism Engine, Demo WIP

Categories: Prism Engine, XNA Tags: , , ,