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

- Compte rendu : SharePoint / O365 : des pratiques pour une meilleure productivité par The Mit's Blog le 12-12-2014, 18:11

- [TFS] Suppression des feature SQL Entreprise en masse par Blog de Jérémy Jeanson le 12-06-2014, 09:18

- [Clean Code] règles de nommage par Fathi Bellahcene le 12-04-2014, 22:59

- Windows To Go 10 et Upgrades impossibles par Blog de Jérémy Jeanson le 12-04-2014, 21:38

- SharePoint OnPremise: Statistiques d’utilisation pour traquer les sites fantomes par Blog Technique de Romelard Fabrice le 12-03-2014, 10:28

- SharePoint 2007: Script PowerShell permettant le backup de toutes les collections de sites d’une application Web par Blog Technique de Romelard Fabrice le 12-02-2014, 10:00

- Xamarin : un choix précieux par .net is good... C# is better ;) le 12-01-2014, 15:10

- Office 365: Comparaison des composants pour préparer votre migration de SharePoint 2007 vers Office 365 par Blog Technique de Romelard Fabrice le 11-28-2014, 16:20

- Créer un périphérique Windows To Go 10 ! par Blog de Jérémy Jeanson le 11-21-2014, 04:54

- RDV à Genève le 12 décembre pour l’évènement “SharePoint–Office 365 : des pratiques pour une meilleure productivité !” par Le blog de Patrick [MVP Office 365] le 11-19-2014, 10:40