IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Tutoriel Gdi+ : programmez un jeu de Pacman complet en VBA

Image non disponible


précédentsommairesuivant

IX. Préparation du premier écran

Tout est prêt à ce stade pour commencer la programmation des écrans.

Chaque écran sera géré dans un module de classe indépendant : clScreenMenu, clScreenGame

Chacun de ces modules héritera de l'interface définie dans le module clScreen.
Cet héritage se traduit dans le code avec l'instruction Implements.
On pourra alors dans l'objet jeu faire appel à un unique objet de type clScreen pour faire appel à l'écran en cours.

Afin de pousuivre avec la création de ce module d'interface, écrivons l'algorithme de déroulement du jeu.
On va ainsi mettre en évidence les propriétés et fonctions nécessaires à un écran.

Algorithme de déroulement du jeu dans l'objet Jeu
Sélectionnez
oScreen = Nouvel écran de menu clScreenMenu
oCommand = Nouvel objet de commandes clCommand
oSharedData = Nouvel objet de données clSharedData
Affecte oCommand et oSharedData à oScreen
Début boucle de jeu
 Exécute mise à jour des commandes dans oScreen
 Exécute mise à jour de l'écran dans oScreen
 Exécute mise à jour de l'affichage dans oScreen
 Exécute la fonction d'attente dans oScreen
 Si oScreen demande un changement d'écran
  oScreen = Nouvel écran fonction de l'écran suivant dans oScreen
  Affecte oCommand et oSharedData à oScreen
 Fin Si
Fin boucle de jeu

IX-A. L'interface d'écran clScreen

Dans ce paragraphe nous développons l'interface des écrans dans le module de classe clScreen.
Dans un module d'interface, nous écrivons uniquement un squelette.
Les fonctions, procédures ou propriétés ne seront pas exécutées dans ce module mais dans les modules en héritant.
Nous n'écrivons donc qu'un commentaire à intérieur.

Les objets oCommand et oSharedData étant transmis à chaque écran par l'objet Jeu, il est nécessaire de créer une propriété publique en écriture.

Propriétés pour accès en écriture aux objets partagés
Sélectionnez
'------------------------------------------------------------------------
' Les objets Command et Shared sont en écriture public car ils seront
' transmis par l'objet jeu d'écran en écran
'------------------------------------------------------------------------
Public Property Set Command(poCommand As ClCommand)
'
End Property
Public Property Set SharedData(poSharedData As ClSharedData)
'
End Property

Occupons nous maintenant des variables.

Le nom de l'écran suivant NextScreen doit pouvoir être lu ou écrit de n'importe où.
En effet on doit pouvoir accéder au nom de l'écran suivant :

  • en lecture pour lire le nom de l'écran suivant lors d'un changement d'écran ;
  • en écriture pour définir un écran suivant différent de celui par défaut.

Le flag de demande de changement d'écran ChangeScreen doit être en lecture uniquement
En effet on doit pouvoir tester la demande de changement d'écran depuis l'objet jeu.

Propriétés pour accès aux variables
Sélectionnez
'------------------------------------------------------------------------
' Propriété pour nom de l'écran suivant
' Public car doit être accessible de partout
'------------------------------------------------------------------------
Public Property Get NextScreen() As String
'
End Property
Public Property Let NextScreen(pNextScreen As String)
'
End Property

'------------------------------------------------------------------------
' Propriété pour flag de changement d'écran
' Lecture Public
'------------------------------------------------------------------------
Public Property Get ChangeScreen() As Boolean
'
End Property

On note également dans l'algorithme que l'objet jeu appelle des fonctions de :

  • mise à jour des commandes pour tester l'appui de touches ;
  • mise à jour de l'écran pour gérer l'écran ;
  • mise à jour de l'affichage pour afficher sur le formulaire ;
  • minuterie pour gérer le framerate.

On ajoute donc une fonction publique pour chacune de ces étapes.

Fonctions pour chaque étape de l'algorithme
Sélectionnez
'------------------------------------------------------------------------
' Functions à gérer dans les écrans
'------------------------------------------------------------------------
Public Function UpdateScreen() As Boolean
' Mise à jour de l'écran
End Function

Public Function UpdateCommand() As Boolean
' Mise à jour des commandes
End Function

Public Function DisplayScreen() As Boolean
' Affichage de l'écran
End Function

Public Function ScreenWait() As Boolean
' Minuterie d'attente
End Function

Le module d'interface est prêt, nous pouvons maintenant créer le premier écran.

IX-B. Préparation du premier écran : le menu clScreenMenu

Le premier menu que nous allons créer est l'écran de menu.
Tout le code concernant le menu est écrit dans le module de classe clScreenMenu.

Ce module héritant de l'interface clScreen, la première étape est d'implémenter cette interface.

Déclaration de l'interface dans clScreenMenu
Sélectionnez
'***************************************************************************************
'*                             OBJET ECRAN DE MENU
'***************************************************************************************
Option Explicit

' Implémente l'interface de base des écrans
Implements ClScreen

Si on compile le projet (Débogage => Compiler) on obtient une erreur.

Image non disponible

Tout élément public (fonction, propriété, variable, procédure…) déclaré dans clScreen doit en effet être géré dans les modules d'écran qui en héritent.

Pour générer tout le code d'interface nécessaire, sélectionnez clScreen dans la liste déroulante de gauche au dessus du code VBA.

Image non disponible

Puis sélectionnez chaque entrée dans la liste déroulante de droite pour générer les déclarations correspondantes.

Image non disponible

Placez une apostrophe (') dans chacune des portions de code ajoutée pour éviter qu'elles ne disparaissent (s'il n'y a pas de code à l'intérieur, la compilation supprime les déclarations).

Voici le code obtenu, après ajout de commentaires :

Déclarations ajoutées clScreenMenu
Sélectionnez
'------------------------------------------------------------------------
' Implémentation des propriétés de l'interface
'------------------------------------------------------------------------
Private Property Get ClScreen_ChangeScreen() As Boolean
'
End Property

Private Property Set ClScreen_Command(RHS As ClCommand)
'
End Property

Private Property Let ClScreen_NextScreen(RHS As String)
'
End Property

Private Property Get ClScreen_NextScreen() As String
'
End Property

Private Property Set ClScreen_SharedData(RHS As ClSharedData)
'
End Property

'------------------------------------------------------------------------
' Mise à jour des commandes
'------------------------------------------------------------------------
Private Function ClScreen_UpdateCommand() As Boolean
'
End Function

'------------------------------------------------------------------------
' Mise à jour de l'écran
'------------------------------------------------------------------------
Private Function ClScreen_UpdateScreen() As Boolean
'
End Function


'------------------------------------------------------------------------
' Affichage de l'écran
'------------------------------------------------------------------------
Private Function ClScreen_DisplayScreen() As Boolean
'
End Function

'------------------------------------------------------------------------
' Minuterie d'attente
'------------------------------------------------------------------------
Private Function ClScreen_ScreenWait() As Boolean
'
End Function

Maintenant le projet compile, mais il nous faut gérer toutes ces propriétés et fonctions.

Nous remarquons qu'aucune variable n'a été définie dans notre module clScreenMenu.

D'après le schéma des objets, nous avons besoin de 4 objets par écran.

Déclaration des objets dans clScreenMenu
Sélectionnez
' Objet pour commandes
Private oCommand As ClCommand
' Objet pour données partagées
Private oSharedData As ClSharedData
' Objet pour sons
Private oSound As ClSound
' Objet pour gdiplus
Private oGdi As ClGdiplus

Et d'après l'algorithme de déroulement du jeu, nous avons besoin de deux variables :

  • un flag booléen pour demander le changement d'écran ;
  • et une variable contenant le nom de l'écran suivant.
Déclaration des variables dans clScreen
Sélectionnez
' Indicateur pour changement d'écran
Private gChangeScreen As Boolean
' Nom de l'écran suivant
Private gNextScreen As String

Puis gérons les propriétés :

Gestion des propriétés
Sélectionnez
'------------------------------------------------------------------------
' Implémentation des propriétés de l'interface
'------------------------------------------------------------------------
Private Property Get ClScreen_ChangeScreen() As Boolean
ClScreen_ChangeScreen = gChangeScreen
End Property

Private Property Set ClScreen_Command(RHS As ClCommand)
Set oCommand = RHS
End Property

Private Property Let ClScreen_NextScreen(RHS As String)
gNextScreen = RHS
End Property

Private Property Get ClScreen_NextScreen() As String
ClScreen_NextScreen = gNextScreen
End Property

Private Property Set ClScreen_SharedData(RHS As ClSharedData)
Set oSharedData = RHS
End Property

Occupons nous maintenant de l'initialisation de l'écran.
Cette initialisation a lieu dans l'événement Initialize lorsque l'objet est instancié.

Les objets oCommand et oSharedData sont transmis à chaque écran par l'objet Jeu.
Par contre, les autres objets sont spécifiques à chaque écran et doivent donc être créés à l'initialisation de l'écran.

Initialisation des objets dans clScreen
Sélectionnez
'------------------------------------------------------------------------
' Initialisation de l'objet
' =>création des objets nécessaire à l'écran
'------------------------------------------------------------------------
Private Sub Class_Initialize()
Set oGdi = New ClGdiplus ' Objet pour graphiques
Set oSound = New ClSound ' Objet pour sons
End Sub

Nous allons également définir un écran suivant par défaut dans cet événement.
Comme on est dans l'écran de menu, il n'y a pas vraiment d'écran suivant par défaut, le choix se fait par le menu.
Mettons tout de même un écran « quit » par défaut.

Ecran suivant par défaut à la suite des initialisations d'objets
Sélectionnez
' Ecran suivant par défaut
gNextScreen = "quit"

Il est maintenant grand temps de tester le code !

Créez un nouveau module (attention : pas un module de classe) : Insertion => Module.

Ecrivez-y une fonction de test :

Fonction de test dans un nouveau module
Sélectionnez
Option Explicit
            
' Test de l'écran de menu
Function TestEcran()
Dim oScreen As ClScreen
Set oScreen = New ClScreenMenu
MsgBox oScreen.NextScreen
End Function

Cette fonction :

  • déclare un objet de type clScreen ;
  • instancie un objet de type clScreenMenu (qui hérite de l'interface clScreen) ;
  • affiche un message contenant le nom de l'écran suivant.

Exécutez la fonction : le message attendu apparaît !

La base de notre écran est prête.
Elle pourra servir à la création des autres écrans car nous n'avons pas commencé à programmer le menu dans cet écran.

Mais il est difficile de continuer ainsi « en aveugle » à ce stade du projet.
Il faut désormais mettre en place la boucle de jeu dans l'objet Jeu (classe clGame) et l'intégrer au formulaire pour pouvoir ensuite commencer le développement graphique des écrans et tester l'affichage.


précédentsommairesuivant

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Thierry GASPERMENT. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.