Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Pierrick's Blog

.Net "full power"

Joyeux anniversaire Msdn !

Msdn fête ses 10 ans, et à cette occasion l'équipe m'a demandé si je pouvais faire un petit jeu en Silverlight. Après quelques échanges avec Antoine, nous sommes mis d'accord sur le développement  d'un jeu en relation avec un site parlant de technos, tenu  par des microsoftees dont la mascotte est une grenouille :

image 

je vous invite à parcourir ce site : www.frogz.fr

tiens une grenouille... oui... un jeu avec une grenouille, cela ne vous rappelle rien............., toujours pas ?

alors voici un indice :

image 

Frogz + Frogger = "Frogzer"

Pour ceux qui ne connaissent pas le principe de ce jeu,  c'est très simple :

Frogzer adore la techno... aidez la à traverser, sans se faire percuter par un "bug", de plus frogzer ne sait pas nager, il faut donc lui faire prendre le bateau afin de rejoindre l'une des 5 zones à  l'effigie de IE8, .Net, Visual Studio, Windows et Silverlight.

Vous voulez essayer ?  Alors cliquez le sur le contrôle silverlight en dessous, et appuyer sur "espace".

 

 

 

Réalisation:

 

Ce jeu est un jeu Silverlight 2.0, écrit en C#.

Son architecture est simple : elle n'est constituée que de 2 couches physiques

La couche visuelle

C' est l'interface  utilisateur. Cette couche utilise le pattern MVP (Model View Presenter). Les liaisons entre les vues et les presenters se réalisées à l'aide du binding.

Le logo "msdn 10 ans", La coach C#, et Frogzer ont été "xamélisé" (bitmap vers Xaml). Ce qui me permet de les afficher dans une taille différente de leur taille original sans effet d'escalier.

La couche non visuelle

c'est la gestion du jeu, implémentée dans "Frogzer.core". Cette couche étant complètement non visuelle, elle peut être utilisée pour faire une version WPF, Windows forms, voir Console !

le résultat dans l'explorateur de solution

 image

 

Principe de base du jeu

C'est un timer qui ordonance le jeu tant au niveau de la gestion des déplacements de Frogzer, que du déplacement des autres sprites, que du changement de pahes du jeu. Ce timer "tick" toutes les 80ms au départ, puis accèlere à chaque fois que "frogzer" atteint une cible. Une définition générique d'un timer pour ce type de jeu ressemble à :

/// <summary>
///
generic definition for a timer
/// </summary>
public interface IGameTimer
{
   
/// <summary>
    /// Start the timer
    /// </summary>
    void Start();
   
/// <summary>
    /// stop the timer
    /// </summary>
    void Stop();

   
/// <summary>
    /// returns true if the timer is started
    /// </summary>
    bool IsStarted { get; }
   
/// <summary>
    /// elapsed milliseconds between ticks
    /// </summary>
    int Elapsed { get; set; }

   
/// <summary>
    /// event fired at interval specify by <see cref="Elapsed"/>
    /// </summary>
    event EventHandler Tick;
}

Les phases du jeu sont rudimentaires (GameOver / Ready / Play / Death), Le timer étant le coeur du jeu, la boucle principale du jeu est triviale :

private void Animate()
{
   
if (!Paused)
    {
        turn++;
       
switch (Status)
        {
           
case GameMode.GAME_OVER:
                AnimateGameOver();
               
break;
           
case GameMode.READY:
                AnimateReady();
               
break;
           
case GameMode.PLAY:
                AnimatePlay();
               
break;
           
case GameMode.DEATH:
                AnimateDeath();
               
break;
        }
    }
}

 

Les sprites

Il en existe 3 types (Frogzer, Bugs, Bateau).

image image image

Dans la couche "Frogzer.core", les sprites sont positionnés sur une grille 28x30, la taille "physique" d'un sprite est de 16points. Dans les faits cette taille physique est variable, puisque pour afficher les sprites j'utilise un "Viewbox" (nouveau controle dans le toolkit silverlight) qui va  adapter la taille des sprites à la taille de zone de jeu tout en conservant les proportions.

Pour les besoins du jeu, les sprites ne sont à la base que des "rectangles", c'est à dire que la gestion des colisions n'est ni plus ni moins qu'une simple intersection entre deux rectangles.

public virtual bool HasCollision(Sprite other)
{
    
Rect currentZone = Zone;
    currentZone.Intersect(other.Zone);
    
if (currentZone.IsEmpty || currentZone.Height == 0 || currentZone.Width == 0)
        
return false;
    
return true;
}

il est vrai que cette gestion est très rudimentaire, mais ici suffisante.

et enfin pour animer les sprites à des vitesses différentes, c'est très simple, il suffit changer les coordonnées des sprites non pas à chaque "tick", mais 1/2 ou  1/3...

public override int Animate()
{
    
int result = 0;
    
if (_DesiredDirection != null && --_animateTime <= 0)
    {
        
switch (_DesiredDirection.ToEnum())
        {
            
case DirectionEnum.Down:
                
throw new NotImplementedException();
            
case DirectionEnum.Left:
                
this._xBoard -= 1;
                
if (_xBoard + _width < 0)
                    _xBoard = 
Constants.MAXX;
                
this.X = this._xBoard * Constants.GRID_WIDTH;
                
break;
            
case DirectionEnum.Right:
                
this._xBoard += 1;
                
if (_xBoard > Constants.MAXX)
                    _xBoard = 0 - _width;
                
this.X = this._xBoard * Constants.GRID_WIDTH;
                
break;
            
case DirectionEnum.Up:
                
throw new NotImplementedException();
        }
        result = 1;
    }
    
if (_animateTime <= 0)
    {
        _animateTime = 7 - _speed;
    }
    
return result;
}

pour les sprites seuls le déplacement à gauche et à droite sont autorisés/implémentés

Vous voulez en savoir plus sur l'implémentation de ce jeu, rendez sur codeplex.

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: dimanche 7 décembre 2008 20:01 par pierrick
Classé sous : , , ,

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Evénement monfial Global Azure Bootcamp (10 000 participants) Venez !! par Blog de Vincent THAVONEKHAM, Objet Direct le 01-25-2015, 16:29

- Mon Blog déplacé vers une version anglaise... www.thavo.com par Blog de Vincent THAVONEKHAM, Objet Direct le 01-25-2015, 16:25

- Localisation et globalisation ne sont pas des options par Blog de Jérémy Jeanson le 01-17-2015, 11:47

- [Clean Code] les commentaires… par Fathi Bellahcene le 01-10-2015, 17:17

- Mise à jour de Test Professional 2013 par Blog de Jérémy Jeanson le 01-10-2015, 11:32

- [Dynamics CRM] Ajouter un bouton pour déclencher un workflow ou un script (dialogue) par Christine Dubois le 01-09-2015, 14:03

- RDV aux #SharePoint Days 2015 à Casablanca les 28 et 29 janvier ! par Le blog de Patrick [MVP Office 365] le 01-06-2015, 08:41

- TFS Online, vous allez aimer vos projets par Blog de Jérémy Jeanson le 01-03-2015, 11:19

- Bon code 2015 ! par Blog de Jérémy Jeanson le 01-02-2015, 19:01

- [Dynamics CRM] Créer un contact à partir d’une signature email par Christine Dubois le 12-30-2014, 14:37