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

- Nouveau blog en anglais / New blog in english ! par Le blog de Patrick [MVP SharePoint] le il y a 20 heures et 55 minutes

- [ #Yammer ] From Mailbox to Yammer and back / De votre messagerie vers Yammer et retour ! par Le blog de Patrick [MVP SharePoint] le 09-15-2014, 11:31

- [ #Office 365 ] New service settings panel / Nouveau panneau de paramétrage des services par Le blog de Patrick [MVP SharePoint] le 09-11-2014, 08:50

- Problème de déploiement pour une démo SharePoint/TFS? par Blog de Jérémy Jeanson le 09-10-2014, 21:52

- [ #Office365 ] Delve first impressions / Premières impressions sur Delve par Le blog de Patrick [MVP SharePoint] le 09-09-2014, 16:57

- [ #Office365 ] How to change Administration console language ? / Comment changer la langue de la console d’administration ? par Le blog de Patrick [MVP SharePoint] le 09-09-2014, 08:25

- [ #SharePoint 2013 ] Suppression de bases de données en état “Pas de Réponse” par Le blog de Patrick [MVP SharePoint] le 09-04-2014, 14:10

- Changer l’adresse d’une ferme Office Web Apps associée à SharePoint par Blog de Jérémy Jeanson le 09-01-2014, 22:21

- Une ferme #SharePoint 2013 dans @Azure en quelques clics (1ère partie) ! par Le blog de Patrick [MVP SharePoint] le 08-28-2014, 18:52

- SharePoint 2013: Préparation de la migration - Création des site Templates dans 2010 et 2013 par Blog Technique de Romelard Fabrice le 08-20-2014, 16:31