A la découverte de Windows Azure

clip_image002

 

Annoncé par Microsoft le 28 Octobre 2008 et officiellement lancé le premier Janvier 2010, Windows Azure a déjà beaucoup fait parler de lui : il s’agit de la plate-forme de Cloud computing de Microsoft. Cet article est une présentation de cette nouvelle plate-forme pour ceux désirant découvrir le principe et le fonctionnement de Windows Azure.

 

L’informatique dans les nuages

 

 

 

On ne peut pas qualifier Windows Azure de Système d’exploitation à proprement parler. Il s’agit plutôt d’une extension, d’un prolongement de celui-ci « in the Cloud », comprenez dans les nuages.

Qu’est ce que le Cloud computing ?

clip_image004Il s’agit tout simplement d’un concept visant à placer internet au cœur des activités des entreprises. Avec le Cloud computing, les entreprises vont pouvoir utiliser des ressources matérielles distantes afin de créer leurs services, accessibles en lignes bien évidemment. Ainsi, les applications et les données ne se trouvent plus sur un ordinateur local, mais bien dans les nuages : des serveurs distants connectés entre eux.

Le Cloud computing marque le passage du SOA au SaaS. Le SOA ( Service Oriented Architecture ) visait à étendre nos applications vers l’univers d’internet, le SaaS ( Software as a Service ) permet de consommer et payer ces applications à la demande et non plus sur l’achat de licence.

Cependant, avec Windows Azure, Microsoft veut aller un peu plus loin : le « S + S » (Software + Service). Il faut voir le « S+S » comme un mélange entre le SOA et le SaaS.

 

 

 

 

 

 

L’hébergement

 

Pour pouvoir héberger nos applications et nos données, Microsoft a pensé toute une architecture s’articulant autour de ses « Data center ». Actuellement seul deux Data center sont opérationnels, ils sont situés sur le continent Américain. Bien entendu, Microsoft va en construire un peu partout autour du globe et pas n’importe comment. Ces derniers seront architecturés de manière à permettre leur extensibilité et permettront même de greffer des containers construits par d’autres constructeurs.

 

clip_image006En ce qui concerne l’hébergement de données, Windows Azure met à notre disposition l’ « Azure Storage ». Pas d’espace disque brut, pas de base de donnée et donc pas de SQL Server. En fait, l’Azure Storage nous permet de stocker des données binaires, des tableaux ou des piles d’élément et d’y accéder via une API spécifique. Ainsi, pour accéder à nos données nous utiliserons une couche logicielle (sur laquelle nous reviendront un peu plus loin) conçue spécialement pour une utilisation dans le Cloud.

Un des gros avantages de l’Azure Storage est qu’il gère la sécurisation automatique des données, la réplication des données (en deux lieux distincts par exemple) ou encore l’optimisation (répartition des charges, optimisation géographique, partitionnement sur plusieurs disques).

Concernant l’hébergement d’application, il n’y a pas d’accès à un quelconque système d’exploitation mais à des processeurs exécutant une machine virtuelle. Ainsi, si l’application a besoin de plus de puissance (que ce soit de manière continue ou ponctuelle) il est possible d’affecter des processeurs supplémentaires à l’application. Il s’agit la de la gestion de la montée en charge de l’application : on va créer de nouvelles instances d’application.

 

clip_image008Il existe deux types d’instance d’application : les « Web rôle instance » qui sont des applications web classique accessible via un navigateur Web grâce à un IIS7 hébergé directement dans Windows Azure et les « Worker role instance » qui sont des applications s’exécutant en tâche de fond.

Sachez également que Windows Azure nous permet de stocker deux versions de notre application : une version en production et une version de test. Il est également possible de les intervertir à tout moment.

 

 

 

(source schéma : http://www.indiangeek.net/)

Live Framework et services

Afin de compléter l’offre d’hébergement proposée par Windows Azure, une couche de service vient se greffer juste au-dessus. Cette couche est composée des Live Services, des .NET Services, des SQL Services ainsi que des Microsoft SharePoint Services et Dynamics CRM Services. Voyons maintenant en quoi ils consistent.

clip_image010

Les Live Services : Il s’agit d’une couche logicielle de haut niveau permettant la manipulation des différents éléments intervenant dans l’utilisation d’une application (les utilisateurs et leurs données associés).

Les applications accédant aux Live Services utiliseront le LOE (Live Operating Environnement) qui est le cœur du Live Framework. Ce LOE est composé entre autre d’un Live Desktop (un bureau web utilisable depuis un navigateur) et de Mesh (un système de synchronisation et de partage de données)

clip_image012

Les .NET Services : Il s’agit d’une couche logicielle de bas niveau apportant les fonctionnalités nécessaires à toutes applications informatiques : sécurité et authentification, communication, workflow.

Pour ce qui est de la sécurité et de l’authentification, nous avons à notre disposition l’ Access Control Service qui permet d’authentifier et d’accréditer un utilisateur. Concernant la communication, le Service Bus est un bus logiciel sur lequel des points de connexion permettent de connecter soit des services soit des clients. Enfin, pour ce qui est des workflow, nous utilisons les Workflow Services afin d’héberger et d’exécuter nos processus directement dans Windows Azure. Workflow Service est basé sur WF (Workflow foundation) du Framework .NET.

clip_image014

Les SQL Services : Il s’agit encore d’une couche logicielle de bas niveau permettant le reporting, l’analyse et le stockage de données. Contrairement à Azure Storage, ils reposent sur SQL Server 2008. On retrouve notamment les SQL Data Services permettant le stockage et le requêtage de données. Notez que les données ne sont pas gérées de manière relationnelle mais hiérarchique.

 

Conclusion

 

Comme vous pourrez le constater, Microsoft a su analyser a la fois le marché et la concurrence afin de nous dévoiler son écosystème Windows Azure. Sa principale force est finalement une symétrie flagrante entre le On Premises que l’on connaissait déjà avant et le On the Cloud de demain tant sur le plan de l’infrastructure, que sur celui du modèle applicatif ou encore concernant la plateforme de développement.

Azure

Accès aux données générique avec Linq To SQL et C#

25. February 2010 by Pierre-Luc.ROUAYS

Accès aux données générique avec Linq To SQL et C#

Introduction :

Cet article permet de construire une couche d’accès aux données générique en utilisant LINQ To SQL. Ceci permettra par la suite d’effectuer les opérations basiques du CRUD. Nous créerons une classe nommée EntityCrud qui implémentera ces fonctionnalités.

Vous pourrez par la suite créer des Adapters pour chacune de vos classe dérivant ce cette classe.

 

Place à l’action !

Nous allons créer une simple solution contenant 2 projet : le programme et la couche d’accès aux données (DAL).

 

 

Ajouter un élément de type classe LINQ To SQL :

Puis ensuite ajouter les Tables à votre projet par le biais de l’explorateur de solution.

Code Projet MonProgramme.DAL

La classe EntityCrud contient tout le code nécessaire pour communiquer avec la base de donnée par le biais de LinqToSQL.

Voici la classe AdapterFactory :

 

 

using System;

using System.Collections;

using System.Collections.Specialized;

using System.Collections.Generic;

using System.Collections.ObjectModel;

using System.Linq;

using System.Data.Linq;

using System.Data.Linq.Mapping;

using System.Text;

using System.ComponentModel;  

The next section contains the namespace and class declarations. 

namespace MonProgramme.DAL

{

 

    /// <summary>

    /// Generic Interface to Database

    /// using LINQ to SQL

    /// </summary>

          public class EntityCrud

          {

 

 

Première fonction permettant de récuperer un objet par sa clé Primaire.

               /// <summary>

                   /// Select by Primary Key Value

                   /// </summary>

                   /// <typeparam name="T"></typeparam>

                   /// <param name="id">The PK value to search for</param>

                   /// <returns>Single matching PK to id</returns>

                   public static T SelectByPK<T>(String id) where T : class

                   {

                             try

                             {

                                      using (NWindDataContext context = new

                        NWindDataContext())

                                      {

                              // Récupère la table du type passé

                                                var table = context.GetTable<T>();

 

                              // Récupère le mapping de l’objet avec la Base

                                                MetaModel modelMap = table.Context.Mapping;

 

                              // Récupère les members de l’objet

                              ReadOnlyCollection<MetaDataMember> dataMembers

                              = modelMap.GetMetaType(typeof(T)).DataMembers;

 

                              // Cherche le nom du champ de la clé primaire

                              string pk = 

                              (dataMembers.Single<MetaDataMember>(m =>

                              m.IsPrimaryKey)).Name;

 

                              // Retourne l’objet unique qui correspond à cette clé primaire

                              // passée en argument

                                    return table.SingleOrDefault<T>(delegate(T t)

                                    {

                                    String memberId =

      t.GetType().GetProperty(pk).GetValue(t,

                                    null).ToString();

                                    return memberId.ToString() == id.ToString();

                                    }

      );

                                      }

                             }

                             catch (Exception)

                             {

                                      throw;

                             }

                   }

 

 

Seconde méthode permettant de récupérer toutes les objets de la base.

 

        /// <summary>

        /// Select All by Type

        /// </summary>

        /// <typeparam name="T"></typeparam>

        /// <returns>Matching table as typed list</returns>

        public static IList<T> SelectAll<T>() where T : class

        {

            try

            {

                using (NWindDataContext context = new NWindDataContext())

                {

                    // Récupère la table qui correspond au type

                    // et retourne tous les enregistrement sous forme de liste

                    var table = context.GetTable<T>().ToList<T>();

                    return table;

                }

            }

            catch (Exception)

            {

                throw;

            }

        }

 

Méthode d’insertion de donnée dans la base.

                   /// <summary>

                   /// Insert an Object into a Table

                   /// </summary>

                   /// <typeparam name="T"></typeparam>

                   /// <param name="item"></param>

                   public static void Insert<T>(T item) where T : class

                   {

                             try

                             {

                // Récupère la table du type passé en argument

                // Insert l’enregistrement et soumet les changements à la Base

                                      using (NWindDataContext context = new

                        NWindDataContext())

                                      {

                              // Récupère la table correspondante

                                                var table = context.GetTable<T>();

 

                              // Passe l’objet à la method InsertOnSubmit

                              // et Soumet les changements

                                                table.InsertOnSubmit(item);

                              context.SubmitChanges();

                                      }

                             }

                             catch (Exception)

                             {

                                      throw;

                             }

              }

 

Méthode de mise à jour de donnée.

 

       /// <summary>

                   /// Update an Existing Object

                   /// </summary>

                   /// <typeparam name="T"></typeparam>

                   /// <param name="item">The object to update</param>

                   public static void Update<T>(T item) where T : class

                   {

                             try

                             {

                        // Crée une nouvelle instance de l’objet

                                      Object newObj = Activator.CreateInstance(typeof(T),    

                        new object[0]);

 

                                      PropertyDescriptorCollection originalProps =

                        TypeDescriptor.GetProperties(item);

 

                        // Donne la valeur de la donnée passée en argument à l’objet

                                      foreach (PropertyDescriptor currentProp in

                        originalProps)

                                      {

                                                if (currentProp.Attributes[typeof(

                              System.Data.Linq.Mapping.ColumnAttribute)] !=

                              null)

                                                {

                                                          object val = currentProp.GetValue(item);

                                                          currentProp.SetValue(newObj, val);

                                                }

                                      }

 

                        // Lie l’objet à un nouveau context de donnée

                        // et soumet les changement à la Base.

                                      using (NWindDataContext context = new

                        NWindDataContext())

                                      {

                                                var table = context.GetTable<T>();

                                                table.Attach((T)newObj, true);

                                                context.SubmitChanges();

                                      }

                             }

                             catch (Exception)

                             {

                                      throw;

                             }

                   }

 

Code de suppression d’un objet.

               /// <summary>

                   /// Remove an object

                   /// </summary>

                   /// <typeparam name="T"></typeparam>

                   /// <param name="item"></param>

                   public static void Remove<T>(T item) where T : class

                   {

                             try

                             {

                        // Crée une instance de l’objet avec le type passé en argument

                                      Type tType = item.GetType();

                                      Object newObj = Activator.CreateInstance(tType, new 

                        object[0]);

 

                        // Récupère les proprieties de l’objet passé en argument

                                      PropertyDescriptorCollection originalProps =

                        TypeDescriptor.GetProperties(item);

 

                        // Copie le contenue de la donnée passée en argument

                        // au nouveau objet du meme type

                                      foreach (PropertyDescriptor currentProp in

                        originalProps)

                                      {

                                                if (currentProp.Attributes[typeof(

                              System.Data.Linq.Mapping.ColumnAttribute)] !=

                              null)

                                                {

                                                          object val = currentProp.GetValue(item);

                                                          currentProp.SetValue(newObj, val);

                                                }

                                      }

 

                        //lie l’objet à la table, appel de la function deleteOnSubmit

                        // et soumet les changement à la base.

                                      using (NWindDataContext context = new

                        NWindDataContext())

                                      {

                                                var table = context.GetTable<T>();

                              table.Attach((T)newObj, true);

                                                table.DeleteOnSubmit((T)newObj);

                                                context.SubmitChanges();

                                      }

                             }

                             catch (Exception)

                             {

                                      throw;

                             }

                   }

 

Utilisation :

Une fois l’EntityCrud créé vous pouvez l’utiliser comme dans les exemples suivant :

Exemple Insert :

           try

                             {

                             Customer c = new Customer();

                             c.CustomerID = "AAAAA";

                             c.Address = "554 Westwind Avenue";

                             c.City = "Wichita";

                             c.CompanyName = "Holy Toledo Bibles";

                             c.ContactName = "Frederick Flintstone";

                             c.ContactTitle = "Boss";

                             c.Country = "USA";

                             c.Fax = "316-335-5933";

                             c.Phone = "316-225-4934";

                             c.PostalCode = "67214";

                             c.Region = "EA";

 

                             Order_Detail od = new Order_Detail();

         od.Discount = .25f;

                             od.ProductID = 1;

                             od.Quantity = 25;

                             od.UnitPrice = 25.00M;

 

                             Order o = new Order();

                             o.Order_Details.Add(od);

                             o.Freight = 25.50M;

                             o.EmployeeID = 1;

                             o.CustomerID = "AAAAA";

 

                             c.Orders.Add(o);

 

                             EntityCrud.Insert<Customer>(c); //INSERT Customer mais aussi les autres champs qui lui sont associés (order, order_detail).

 

                             }

                             catch (Exception ex)

                             {

                                      MessageBox.Show(ex.Message);

                             }

 

Les données seront toutes insérée en base : Le Customer, L’order et l’order_detail avec seulement cet appel : EntityCrud.Insert<Customer>(c);

Exemple Delete :

                             try

                             {

                             Customer doa = EntityCrud.SelectByPK<Customer>("AAAAA");

                                     EntityCrud.Remove<Customer>(doa); //DELETE

                             }

                             catch (Exception ex)

                             {

                                      MessageBox.Show(ex.Message);

                             }

Exemple Update :

 

         try

                             {

                                      var q = EntityCrud.SelectByPK<Customer>("AAAAA");

 

                                      q.City = "Calgary";

                                      q.Country = "Canada";

                                      q.Address = "100 Longhorn Drive";

                                      q.CompanyName = "Holy Moses Bibles";

                                      q.Region = "EE";

                                      q.ContactTitle = "Gopher";

                                      q.ContactName = "Moxie Peroxide";

 

                                      EntityCrud.Update<Customer>(q);//UPDATE

                             }

                             catch (Exception ex)

                             {

                                      MessageBox.Show(ex.Message);

                             }

 

ADO.NET, ASP.NET AJAX, C#, WPF , , , ,

[Tutoriel XNA] – 2D – Introduction au XNA 3.1

18. February 2010 by Xavier.QUINCIEUX

Présentation du Framework XNA 3.1

 

Le Framework XNA est un ensemble d’outils créé et mis à disposition du grand public gratuitement par Microsoft dans le but de faciliter le développement de jeux-vidéos sur les plates-formes PC et Xbox 360. Techniquement, c’est une surcouche de DirectX. Il est ainsi plus aisé pour l’entreprise ou l’amateur l’utilisant de développer un jeu-vidéo, les nombreuses classes et structures, comme les matrices, les vecteurs, chargement de modèle 3d entre (beaucoup) autres, étant intégrées au Framework. Le travail est alors focalisé sur l’essentiel du jeu et le gain de temps est très appréciable.

 

Créer son premier projet avec le Framework XNA 3.1

 

Pour commencer, il faut installer Visual Studio 2008 Express (gratuite) ou alors toute autre version de Visual Studio 2008 pour ceux qui peuvent. Ensuite, il faut télécharger le XNA Game Studio 3.1 à cette adresse : http://www.microsoft.com/downloads/details.aspx?FamilyID=80782277-D584-42D2-8024-893FCD9D3E82&displaylang=en . XNA Game Studio contient toutes les bibliothèques que l’on va avoir besoin pour coder avec XNA, et une multitude d’outils que nous ne servirons pas dans ce tutoriel, sauf le Microsoft Cross-Platform Audio Creation Tool qui nous servira à intégrer du son dans nos jeux. Une fois Game Studio 3.1 installé, ouvrez Visual Studio 2008, cliquez sur le menu File => New => Project.

clip_image002

 

 

 

Une fois cela fait, dans la liste à gauche, sélectionnez XNA Game Studio 3.1, puis dans la partie de droite, cliquez sur Windows Game (3.1).

clip_image004

 

Choisissez un nom de projet (Chapitre1 par exemple), l’endroit ou vous voulez que votre projet soit enregistré, puis cliquez sur OK.

Présentation du projet de base

 

Nous voilà donc dans Visual Studio, au centre la zone où nous allons coder. Le fichier ouvert est l’onglet sélectionné juste au dessus. A droite se trouve l’explorateur de solution, qui contient les projets de la solution, et dans chaque projet les fichiers et dossiers correspondant. Par défaut, lorsqu’on ouvre un nouveau projet en XNA, c’est le fichier Game1.cs qui est ouvert. Nous devons nous retrouver avec cette vue :

clip_image006

Si nous sommes attentifs, nous remarquons que notre classe Game1 dérive de la classe Game, et hérite du coup de ses propriétés, comme la collection Components, la collection Services, le GraphicDevice et d’autres propriétés qui sont toutes aussi importantes les unes que les autres.

Si nous allons plus en profondeur dans le fichier, nous retrouvons deux champs, graphics de type GraphicsDeviceManager et spriteBatch de type SpriteBatch. Le premier nous servira à avoir accès à quelques propriétés de l’affichage, telles que la résolution de notre fenêtre (sa taille), activer la synchronisation verticale, l’anti aliasing, le plein écran, etc… tandis que le second nous permettra d’afficher des images ou du texte à l’écran, mais ceci fait l’objet d’un autre chapitre.

Encore un peu plus en profondeur dans le fichier et nous nous retrouvons face à pas moins de 6 ( !) méthodes. La première, Game1(), est en fait le constructeur de la classe Game1(). Nous y instancions notre champs graphics, et initialisons le dossier qui contiendra nos ressources, nous reviendrons dessus un peu plus tard. La deuxième est la méthode Initialize(). C’est ici que l’on récupèrera les services que nous aurons besoin, si nécessaire bien sûr, et qu’on chargera tout contenu qui n’est pas graphique, entendez par là autre que image et modèle 3D. Elle est appelée automatiquement juste après le constructeur. La troisième méthode se nomme LoadContent(). Comme son nom l’indique, c’est ici que vous chargerez le contenu de votre jeu, mais graphique cette fois ci. Elle est appelée elle aussi automatiquement après la méthode Initialize(). La quatrième méthode s’appelle UnloadContent(). Elle sert à décharger le contenu chargé précédemment afin de vider la mémoire et d’éviter ainsi des fuites de mémoire. Elle est appelée automatiquement par le Framework quand on ferme le jeu. La cinquième méthode est la méthode Update(). Pour ceux qui n’ont jamais codé de jeux-vidéos ou qui ne ce sont jamais intéressé au développement de jeux-vidéos, sachez que niveau code, un jeu, mis à part initialisation, chargement et déchargement de contenu, n’est ni plus ni moins qu’une boucle infinie, à laquelle on mettra fin lorsque l’on cliquera sur Quitter, par exemple. Cette boucle infinie se découpe en deux phases : la première phase met à jour l’état du clavier, de la souris ou tout autre périphérique d’entrée, l’état des objets à l’écran, c'est-à-dire la position, la vitesse, etc… teste les collisions, met à jour le son, et tout ce qui a besoin d’être mis à jour. La deuxième phase se charge d’actualiser l’affichage de l’écran. Le schéma ci-dessous montre ce principe :

clip_image008

 

Revenons à notre méthode Update(). Si vous avez bien compris le principe, vous aurez remarqué que cette méthode Update() correspond à la première phase de notre boucle infinie. C’est donc ici que nous mettrons le code pour la gestion des périphériques, du son, des personnages etc… La sixième et dernière méthode est la méthode Draw(). Comme son nom l’indique, la méthode Draw() sert à dessiner à l’écran, elle constitue la deuxième phase de notre boucle infinie.

Voici un résumé de notre classe Game1 :

 

    /// <summary>

    /// This is the main type for your game

    /// </summary>

    public class Game1 : Microsoft.Xna.Framework.Game

    {

        GraphicsDeviceManager graphics;

        SpriteBatch spriteBatch;

 

        public Game1()

        {

            graphics = new GraphicsDeviceManager(this);

            Content.RootDirectory = "Content";

        }

 

        /// <summary>

        /// Allows the game to perform any initialization it needs to before starting to run.

        /// This is where it can query for any required services and load any non-graphic

        /// related content.  Calling base.Initialize will enumerate through any components

        /// and initialize them as well.

        /// </summary>

        protected override void Initialize()

        {

           

            // TODO: Add your initialization logic here

            base.Initialize();

        }

 

        /// <summary>

        /// LoadContent will be called once per game and is the place to load

        /// all of your content.

        /// </summary>

        protected override void LoadContent()

        {

           

            // Create a new SpriteBatch, which can be used to draw textures.

            spriteBatch = new SpriteBatch(GraphicsDevice);

           

            // TODO: use this.Content to load your game content here

        }

 

        /// <summary>

        /// UnloadContent will be called once per game and is the place to unload

        /// all content.

        /// </summary>

        protected override void UnloadContent()

        {

            // TODO: Unload any non ContentManager content here

        }

 

        /// <summary>

        /// Allows the game to run logic such as updating the world,

        /// checking for collisions, gathering input, and playing audio.

        /// </summary>

        /// <param name="gameTime">Provides a snapshot of timing values.</param>

        protected override void Update(GameTime gameTime)

        {

            // Allows the game to exit

            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

                this.Exit();

 

            // TODO: Add your update logic here

 

            base.Update(gameTime);

        }

 

        /// <summary>

        /// This is called when the game should draw itself.

        /// </summary>

        /// <param name="gameTime">Provides a snapshot of timing values.</param>

        protected override void Draw(GameTime gameTime)

        {

            GraphicsDevice.Clear(Color.CornflowerBlue);

 

            // TODO: Add your drawing code here

 

            base.Draw(gameTime);

        }

    }

 

Après une longue explication, et si on lançait le projet pour voir ?

 

 

Maintenant que vous connaissez tout de cette classe de base indispensable pour notre jeu, peut-être aimeriez-vous commencer par coder le prochain Call of Duty ? Bon, vous n’en êtes pas encore là, mais au moins appuyer sur la touche F5 dans Visual Studio (ou menu Debug => Start Debugging) pour voir ce qu’il se passe. Et… une belle fenêtre en 800x600 à fond bleu s’affiche. Ceci constituera notre fenêtre de base pour la suite.

clip_image010

Conclusion

 

Nous voici à la fin de votre première entrée dans le monde du XNA. Vous commencez à découvrir (un tout petit peu) tout ce que le Framework fait à votre place. En effet, vous n’avez même pas écrit une ligne de code, et une fenêtre s’affiche déjà. Aussi, le Framework a créé à votre place la boucle infinie, et tout ce qu’il faut pour charger du contenu. Tout a été pensé pour simplifier la vie du développeur, et vous n’en avez qu’un tout petit avant-goût.

 

 

XNA , ,

[Tutoriels XNA] - Sommaire

18. February 2010 by Xavier.QUINCIEUX

 

Bonjour à tous! Bienvenue sur ce nouveau tutoriel entièrement consacré au développement de jeux-vidéos avec le Framework XNA 3.1. Vous pourrez y trouver aussi bien des articles sur la 2D que sur la 3D. Ci-dessous se trouve un aperçu de ce qui vous attend:

 

 

La 2D avec XNA 3.1

     I. Introduction / Créer son premier projet avec XNA 3.1

     II. Dessiner une image

     III. Transformer ses sprites

     IV. Animer ses images

     V. Moduler son code

     VI. Dessiner avec des Pixels Shader

     VII. Gérer les collisions partie 1 : Broad Phase

     VIII. Gérer les collisions partie 2 : Narrow phase

     IX. Premier jeu 2D : un pong

     X. Intégrer une gravité

     XI. Deuxième jeu 2D : super-mario like

 

 

La 3D avec XNA 3.1

     I. Introduction

     II. Les primitives

     III. La caméra

     IV. Dessiner un modèle 3D

     V. Transformer ses modèles

     VI. Dessiner avec ses propres Effects

     VII. Gérer les collisions

     VIII. TP : gestion d’une height map + collision

     IX. Caméra type Third-Person Shooter (troisième personne)

     X. Premier jeu en 3D : un jeu d’avion

     XI. Caméra type First-Person Shooter (première personne)

     XII. Deuxième jeu en 3D : un petit FPS

 

Annexes

     I. Les vecteurs

     II. Les matrices

 

 

Je rédigerai les articles le plus régulièrement possible.

 

 

Bonne lecture à tous !

xna_logo

XNA , , ,

Développement XNA pour la Xbox et le PC

17. July 2009 by Leonard.LABAT

« Développement XNA pour la Xbox et le PC » : c’est le nom du premier livre en français qui a pour thème XNA et qui est disponible dès aujourd’hui en librairie et depuis quelques jours à de nombreux endroits sur la toile. Un grand merci à l’éditeur, Eyrolles, qui m’a aidé à la réalisation de ce projet.

Tout au long de ses 340 pages, que vous soyez un développeur C# expérimenté ou un débutant, le livre vous accompagnera dans la découverte des nombreuses facettes d’XNA.

Au sommaire :

  • Débuter en C#
  • Prise en main de XNA
  • Afficher et animer des images : les sprites
  • Interactions avec le joueur
  • Cas pratiques : programmer en Pong
  • Enrichir les sprites : textures, défilement, transformation, animation
  • La sonorisation
  • Exceptions et gestion des fichiers : sauvegarder et charger un niveau
  • Pathfinding : programmer les déplacements des personnages
  • Collisions et physique : créer un simulateur de vaisseau spatial
  • Le mode multijoueur
  • Les bases de la programmation 3D
  • Améliorer le rendu avec le High Level Shader Langage
  • Visual C# Express 2008
  • Les bienfaits de la documentation


Le livre sur lesite de l’éditeur :

http://www.eyrolles.com/Accueil/Livre/9782212124583

 

LABAT Léonard 

XNA, Livre , , , , , , ,