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

- [ #Office365 ] Pb de connexion du flux Yammer ajouté à un site SharePoint par Le blog de Patrick [MVP SharePoint] le il y a 4 heures et 13 minutes

- NFluent & Data Annotations : coder ses propres assertions par Fathi Bellahcene le il y a 4 heures et 21 minutes

- Installer un site ASP.net 32bits sur un serveur exécutant SharePoint 2013 par Blog de Jérémy Jeanson le il y a 14 heures et 42 minutes

- [ SharePoint Summit 2014 ] Tests de montée en charge SharePoint par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 20:44

- [ SharePoint Summit 2014 ] Bâtir un site web public avec Office 365 par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 18:30

- Kinect + Speech Recognition + Eedomus = Dommy par Aurélien GALTIER le 04-16-2014, 17:17

- [ SharePoint Summit 2014 ] Une méthodologie simple pour concevoir vos applications OOTB SharePoint de A à Z par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 16:51

- //Lean/ - Apprendre à faire des Apps Windows universelles par Blog de Jérémy Jeanson le 04-16-2014, 12:57

- Une culture de la donnée pour tous… par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 11:00

- [ SharePoint Summit 2014 ] L’utilisation de SharePoint 2013 pour la mise en place d’un site Internet Grand Public par Le blog de Patrick [MVP SharePoint] le 04-15-2014, 20:51