RAPPORT DE PROJET Conception d un jeu- vidéo 1
Introduction... 3 Conception UML... 4 Diagramme de cas d utilisation... 5 Diagramme de classe... 7 Choix technologiques... 9 Interface graphique... 10 Threads... 11 Timers... 12 SQL... 13 Implémentation... 14 Conception de la fenêtre... 15 Affichage dans la fenêtre... 16 Contrôle du personnage... 17 Animations... 18 Connexion à la base de données... 19 Conclusion... 20 Captures d écran... 21 2
Introduction L objectif du projet est de développer un jeu- vidéo du genre «endless runner» en Java. Le jeu nommé Jump & Roll consiste à faire courir un personnage en lui faisant éviter des obstacles sur son passage tout en le faisant sauter ou rouler. Lorsque le personnage se fait toucher par un obstacle, la partie se termine et le score du joueur s'affiche avec la possibilité de recommencer une partie, regarder le classement des meilleurs joueurs ou quitter le jeu. Pour jouer au jeu, il faut, si ce n'est pas déjà fait, s'enregistrer dans la base de données en créant un compte. Une fois le compte créé, il est possible de se connecter et d'accéder à sa session de jeu. 3
Conception UML 4
Diagramme de cas d utilisation L utilisateur peut s inscrire ou se connecter s il possède déjà un compte. Une fois identifié, il peut démarrer une nouvelle partie ou afficher le classement des meilleurs joueurs. 5
6
Diagramme de classe Le programme dispose de deux classes : Menu et Jeu. 7
8
Choix technologiques 9
Interface graphique Afin de concevoir facilement une interface graphique, il a été décidé de choisir la librairie «Swing» ainsi que d'utiliser l extension WindowBuilder permettant de placer des composants graphiques directement dans une fenêtre contenant l'application. Il est donc très facile de créer des boutons, des labels et autres composants et de les placer sur la fenêtre de l application. 10
Threads Étant donné que le jeu comporte des animations et des déplacements en temps réel il est important d'utiliser des «threads». En effet, Swing repose sur un thread principal pour la gestion de l'affichage. Il a pour objectif de repeindre les différentes parties affichées dans un certains ordres. Il suit donc un algorithme relativement séquentiel pour l'affichage. De ce fait, les opérations liées à l'affichage des composants graphiques sont monothread et toute mise à jour en dehors de ce thread peut avoir un comportement imprévisible. La solution est donc de créer d'autres threads qui géreront les mises à jour graphiques comme les mouvements du personnage et le défilement des obstacles. 11
Timers Les «timers» ont été utilisé pour compter le nombre de points du score toute les deux secondes. Ils sont également utilisé pour définir une vitesse de déplacement des obstacles. Les obstacles se déplaçant pixel par pixel, on défini un changement de position tout les x temps. 12
SQL Afin de pouvoir enregistrer les joueurs ainsi que leur score et de les classer, on utilise une base de données MysQL en utilisant des requêtes. Pour cela nous avons créé une base de données. Lorsque l'utilisateur lance le jeu, il peut s'enregistrer. Si son enregistrement s'est déroulé avec succès il sera enregistré dans la base de données avec un score initialisé à 0 via une requête SQL qui insère les données. L'utilisateur enregistré se connecter en entrant ses identifiants. Une requête SQL se chargera alors de vérifier si l'identifiant et le mot de passe corresponde bien. Pour le classement, on fera des mises à jour dans la base de données lorsque les meilleurs scores d'un joueur change. 13
Implémentation 14
Conception de la fenêtre Pour lancer le jeu, nous allons nous servir dans la librairie SwingUtilities faisant partit de Swing. En effet celle ci permet de créer une fenêtre dans lequel sera affiché le jeu. Pour afficher la fenêtre, nous allons lui définir des paramètres : settitle("run Game"); // titre de l'application setsize(800, 600); // taille de la fenêtre setlocationrelativeto(null); // modification de la taille de la fenêtre desactivé setdefaultcloseoperation(jframe.exit_on_close); // quitter la fenêtre setcontentpane(buildlogin()); // affichage du panel souhaité Dans le code on définit les paramètres essentiels au bon fonctionnement de la fenêtre. 15
Affichage dans la fenêtre Dans le code ci-dessus, on remarque que la dernière ligne contient la fonction buildlogin(). Cette fonction définis un panel qui affichera un contenu (en l occurrence dans cette fonction la page pour s'identifier). On déclare un panel de la façon suivant : JPanel panel = new Jpanel(); // construction d'un nouveau panel panel.setbackground(new Color(135, 206, 250)); // couleur du font du panel panel.setlayout(null); // aucun positionnement d'objets particulier Pour déclarer des objets dans le panel, un procède de la même manière en précisant le panel dans lequel on veut les ajouter. 16
Contrôle du personnage Pour contrôler le personnage, deux touches suffisent : - flèche du haut : sauter - flèche du bas : rouler Pour cela on utilise une la fonction addkeylistener en précisant que les actions se font sur le label représentant le personnage puis on vérifie que la touche enfoncer correspond bien à l'une des deux : // declaration du personnage lcharac = new JLabel(new ImageIcon("perso.png")); // positionnement dans la fenêtre lcharac.setbounds(20, 465, 48, 65); // ajout dans le panel voulu panel.add(lcharac); // focus sur le personnage lcharac.setfocusable(true); // action possible sur le personnage lcharac.addkeylistener(new KeyAdapter() { @Override public void keypressed(keyevent ke) { // JUMP //Si on appuie sur la fleche du haut if (ke.getkeycode() == KeyEvent.VK_UP && activer) { //action sauter } // roll // si on appuie sur la fleche du bas else if (ke.getkeycode() == KeyEvent.VK_DOWN && activer) { //action rouler } 17
Animations Les animations du personnage sont faites à partir de threads permettant ainsi de voir en temps réel les changements d'image. Prenons par exemple l'animation rouler. Le but est de réduire la taille du personnage pour passer en dessous d'un obstacle en faisant défiler quatre images différentes pour donner une impression de roulade tant que le joueur maintient la touche flèche du bas enfoncé : // tant que la touche reste enfoncé le personnage reste en boule while (release) { // mise à jour des dimensions du label collision(48,45); // si la touche reste enfoncé un continu l'animation if (release) { try { // démarage du thread Thread.currentThread(); // changement de la taille du label lcharac.setsize(48, 45); // repositionnement du label lcharac.setlocation(20, 485); // image actuelle du personnage lcharac.seticon(new ImageIcon("perso_r1.png")); // temps d'affichage de l'image actuelle Thread.sleep(100); // temps de l'affichage de l'image } catch (InterruptedException e) { e.printstacktrace(); } } // on répette la condition 4 fois } 18
Connexion à la base de données Pour se connecter à la base de données, on utilise les fonctions de la librairie msql connector ainsi que du driver jbdc mysql puis on procède de la façon suivante : Class.forName("com.mysql.jdbc.Driver"); System.out.println("Driver ok"); try { // Connexion pour WAMP connexion = DriverManager.getConnection("jdbc:mysql://localhost/rungame", ""); "root", } catch (Exception m) { // Connexion pour MAMP connexion = DriverManager.getConnection("jdbc:mysql://localhost:8889/rungame", "root","root"); } System.out.println("Connexion ok"); transmission = connexion.createstatement(); On peut ensuite effectuer des requêtes sql comme ci-dessous : // requête query = "insert into PLAYER(PSEUDO, EMAIL, PASSWORD) "+ "values(\"" + tfregisterpseudo.gettext()+ "\",\"" + tfregisteremail.gettext() + "\",\""+ String.valueOf(tfRegisterPassword.getPassword())+ "\");"; // envoie de la requête transmission.executeupdate(query); // si tout ce passe comme prévu JOptionPane.showMessageDialog(null,"Successfully registered!"); query = "insert into LEADERBOARD(PSEUDO, SCORE) "+ "values(\"" + tfregisterpseudo.gettext()+ "\",0)"; transmission.executeupdate(query); Dans ces requêtes on enregistre les nouveaux joueurs qui s'inscrivent dans les logins ainsi que dans le classement. 19
Conclusion La conception de ce jeu fut un succès. Nous avons pu apprendre comment fonctionne les animations 2D dans les jeux-vidéo et de les gérer à l'aide des threads. Nous avons également pu nous expérimenter dans les interfaces graphiques et la gestion de base de données. 20
Captures d écran 21
22
23
24
25
DUPIN CASSONE 26