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

- SharePoint : Bug sur la gestion des permissions et la synchronisation Office par Blog Technique de Romelard Fabrice le 07-10-2014, 11:35

- SharePoint 2007 : La gestion des permissions pour les Workflows par Blog Technique de Romelard Fabrice le 07-08-2014, 11:27

- TypeMock: mock everything! par Fathi Bellahcene le 07-07-2014, 17:06

- Coding is like Read par Aurélien GALTIER le 07-01-2014, 15:30

- Mes vidéos autour des nouveautés VS 2013 par Fathi Bellahcene le 06-30-2014, 20:52

- Recherche un passionné .NET par Tkfé le 06-16-2014, 12:22

- [CodePlex] Projet KISS Workflow Foundation lancé par Blog de Jérémy Jeanson le 06-08-2014, 22:25

- Etes-vous yOS compatible ? (3/3) : la feuille de route par Le blog de Patrick [MVP SharePoint] le 06-06-2014, 00:30

- [MSDN] Utiliser l'approche Contract First avec Workflow Foundation 4.5 par Blog de Jérémy Jeanson le 06-05-2014, 21:19

- [ #ESPC14 ] TH10 Moving mountains with SharePoint ! par Le blog de Patrick [MVP SharePoint] le 06-01-2014, 11:30