Jeu Mobile avec Flutter

Par pkhalil, 26 février, 2025

20250226191903 ezgif.com video to gif converter

Dans mon dernier article, j’ai présenté une introduction à Flutter et comment installer l’environnement de développement. Aujourd’hui, passons à l’étape suivante : créer une application mobile interactive sous forme de petit jeu. Mon objectif est d’aider les étudiants et développeurs débutants à comprendre Flutter tout en construisant un projet ludique et motivant.


Présentation du jeu

J’ai choisi de développer un jeu simple mais amusant : Tap the Ball. Le concept est basique : une balle apparaît aléatoirement sur l’écran, et l’utilisateur doit appuyer dessus pour marquer des points. Le score s’affiche en haut de l’écran, et le jeu s’accélère progressivement.

Compétences abordées :

  • Gestion de l’interface utilisateur avec Flutter
  • Gestion de l’état avec StatefulWidget
  • Utilisation de setState pour mettre à jour l’UI en temps réel
  • Gestion des événements tactiles
  • Minuterie pour complexifier le jeu

1. Création du projet Flutter

Tout d’abord, j’ai créé un nouveau projet Flutter en utilisant Android Studio :

  1. Ouvrir Android Studio
  2. Créer un projet Flutter : File > New Flutter Project
  3. Configurer le chemin du SDK
  4. Choisir "Flutter Application" comme type de projet
  5. Exécuter le projet de base

Une fois le projet généré, j’ai remplacé le code par défaut par mon propre code pour le jeu.


2. Structure du jeu

J’ai structuré mon projet de la manière suivante :

lib/
 ├── main.dart  (Fichier principal)
 ├── game_screen.dart  (Écran du jeu)
 ├── score_widget.dart  (Affichage du score)

Le fichier main.dart est le point d’entrée de l’application et affiche l’écran principal du jeu.


3. Code du jeu : Explications détaillées

3.1 Interface du jeu

J’ai utilisé un StatefulWidget pour gérer l’évolution du jeu et mettre à jour l’état à chaque interaction.

import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Tap the Ball',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: GameScreen(),
    );
  }
}

3.2 Gestion du jeu avec StatefulWidget

J’ai créé un StatefulWidget qui affiche la balle à une position aléatoire.

class GameScreen extends StatefulWidget {
  @override
  _GameScreenState createState() => _GameScreenState();
}

class _GameScreenState extends State<GameScreen> {
  int score = 0;
  double posX = 100;
  double posY = 100;
  final Random random = Random();
  Timer? timer;

  @override
  void initState() {
    super.initState();
    startGame();
  }

  void startGame() {
    timer = Timer.periodic(Duration(seconds: 1), (timer) {
      setState(() {
        posX = random.nextDouble() * 300;
        posY = random.nextDouble() * 600;
      });
    });
  }

  void increaseScore() {
    setState(() {
      score++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Score: \$score')),
      body: Stack(
        children: [
          Positioned(
            left: posX,
            top: posY,
            child: GestureDetector(
              onTap: increaseScore,
              child: Container(
                width: 50,
                height: 50,
                decoration: BoxDecoration(
                  color: Colors.red,
                  shape: BoxShape.circle,
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    timer?.cancel();
    super.dispose();
  }
}

4. Explications techniques

  • StatefulWidget : J’ai utilisé un StatefulWidget pour permettre la mise à jour de l’interface à chaque interaction.
  • setState() : Chaque fois que l’utilisateur clique sur la balle, le score est incrémenté et l’UI est mise à jour.
  • Random() : La position de la balle est modifiée aléatoirement à chaque seconde.
  • Timer.periodic() : Utilisé pour déplacer la balle automatiquement toutes les secondes et ajouter du dynamisme au jeu.
  • dispose() : J’ai annulé la minuterie pour éviter les fuites de mémoire lorsque l’utilisateur quitte l’écran.


5. Résultats et améliorations possibles

En testant cette démo, j’ai pu créer une expérience fluide et interactive avec Flutter. Quelques idées d’amélioration :

  • Ajouter une limite de temps pour rendre le jeu plus compétitif.
  • Inclure un mode multijoueur local.
  • Ajouter des animations et effets sonores pour rendre l’expérience plus engageante.

Conclusion

Cette expérience m’a permis d’explorer la gestion d’état avec Flutter et de mieux comprendre l’interactivité d’une application mobile. En utilisant des widgets comme StatefulWidget, setState() et Timer, j’ai réussi à concevoir un jeu interactif et évolutif. Ce projet peut être une base pour des applications plus avancées.

Si vous souhaitez approfondir vos connaissances sur Flutter, je vous recommande les ressources suivantes.


Références

Commentaires2

srahman

il y a 3 semaines 1 jour

Selon toi, quelle amélioration rendrait ce jeu encore plus amusant et interactif ?

nbrahimi

il y a 1 semaine 5 jours

Salut, je me demandais si le child: Container représentait effectivement les caractéristiques de la balle dans le jeu ? Et si oui est-ce que c'est possible d'ajouter des caractéristiques différentes, genre le niveau de rebound, etc.