L’animation joue un rôle essentiel dans l’amélioration de l’attrait visuel et de l’engagement des jeux vidéo. La bibliothèque Arcade est un cadre Python pour la création de jeux en 2D. Elle offre un moyen simple et efficace d’incorporer des animations dans vos projets de jeux.



Vous pouvez utiliser la bibliothèque Arcade pour créer des animations de mouvement de base et des animations synchronisées avec les événements du jeu.


Créer un jeu simple

Avant de commencer, assurez-vous que pip est installé sur votre appareil. Utilisez cette commande pour installer la bibliothèque arcade :

 pip install arcade 

Ensuite, créez un fichier Python nommé simple-game.py et commencez par mettre en place un jeu où le joueur peut se déplacer de gauche à droite.

Le code utilisé dans cet article est disponible dans ce dépôt GitHub et est libre d’utilisation sous la licence MIT.

En utilisant la bibliothèque Arcade, vous pouvez créer une fenêtre, configurer l’environnement de jeu et gérer les entrées du joueur. Voici un extrait de code pour commencer :

 import arcade

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

class MyGame(arcade.Window):
    def __init__(self):
        super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, "My Game")
        self.player_x = SCREEN_WIDTH // 2
        self.player_y = SCREEN_HEIGHT // 2

    def on_draw(self):
        arcade.start_render()
       col = arcade.color.BLUE
       arcade.draw_circle_filled(self.player_x, self.player_y, 20, col)

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= 10
        elif key == arcade.key.RIGHT:
            self.player_x += 10

def main():
    game = MyGame()
    arcade.run()

if __name__ == "__main__":
    main()

Ajout d’une animation de mouvement de base

Maintenant, allez plus loin et ajoutez une animation de mouvement de base à l’objet joueur. Pour animer le joueur en mouvement, créez 3 cercles différents et itérez entre eux séquentiellement lorsque le joueur commence à se déplacer. Voici l’extrait de code mis à jour pour l’objet movement-animation.py fichier :

 class MyGame(arcade.Window):
    def __init__(self):
        super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, "My Game")
        self.player_x = SCREEN_WIDTH // 2
        self.player_y = SCREEN_HEIGHT // 2
        self.frame_counter = 0

    def on_draw(self):
        arcade.start_render()
        col1 = arcade.color.BLUE
        col2 = arcade.color.GREEN
        col3 = arcade.color.RED

        if self.frame_counter < 10:
            arcade.draw_circle_filled(self.player_x, self.player_y, 20,col1 )
        elif self.frame_counter < 20:
            arcade.draw_circle_filled(self.player_x, self.player_y, 20,col2 )
        else:
            arcade.draw_circle_filled(self.player_x, self.player_y, 20, col3)

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= 10
            self.frame_counter = (self.frame_counter + 1) % 30
        elif key == arcade.key.RIGHT:
            self.player_x += 10
            self.frame_counter = (self.frame_counter + 1) % 30

Voici un exemple de trame de sortie :

l'objet joueur s'anime et change de couleur


Contrôle de la vitesse et de la direction de l’animation

Pour contrôler la vitesse de l’animation, vous pouvez introduire un système de fréquence d’images. Vous pouvez également modifier l’ordre des images en fonction de la direction du mouvement du lecteur. Lorsque le lecteur se déplace de gauche à droite, les images s’affichent dans l’ordre inverse.

Voici l’extrait de code modifié pour la fonction frame-rate.py fichier :

 class MyGame(arcade.Window):
    def __init__(self):
        super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, "My Game")
        self.player_x = SCREEN_WIDTH // 2
        self.player_y = SCREEN_HEIGHT // 2
        self.frame_counter = 0
        col1 = arcade.color.BLUE
        col2 = arcade.color.GREEN
        col3 = arcade.color.RED
        self.frames = [col1, col2, col3]
        self.frame_rate = 10

    def on_draw(self):
        arcade.start_render()
        frame_index = self.frame_counter // self.frame_rate % len(self.frames)

        if self.player_x < SCREEN_WIDTH // 2:
            frame_index = len(self.frames) - 1 - frame_index

        index = self.frames[frame_index]
        arcade.draw_circle_filled(self.player_x, self.player_y, 20, index)

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= 10
            self.frame_counter += 1
        elif key == arcade.key.RIGHT:
            self.player_x += 10
            self.frame_counter += 1

Utiliser l’opérateur de module % avec len(self.frames) pour s’assurer que le frame_index reste toujours dans la plage des trames disponibles. Cela permet d’éviter que le Erreur d’index de se produire lorsque l’animation passe en boucle à travers les images.

Ajuster le taux de rafraîchissement pour contrôler la vitesse d’animation et apprécier le mouvement animé des objets de votre jeu.


Fonctionnalités supplémentaires

La bibliothèque Arcade propose diverses fonctionnalités pour améliorer vos animations.

Effets de particules

Vous pouvez créer des effets de particules, tels que des explosions ou de la fumée, pour ajouter du réalisme à votre jeu. Créez un fichier nommé particle.py et ajoutez le code ci-dessous pour une implémentation simple du système de particules en utilisant Python et la bibliothèque Arcade :

 import arcade
import random

# Screen dimensions
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# Colors
WHITE = (255, 255, 255)

# Particle class
class Particle:
    def __init__(self, x, y, dx, dy, radius, color, lifespan):
        self.x = x
        self.y = y
        self.dx = dx
        self.dy = dy
        self.radius = radius
        self.color = color
        self.lifespan = lifespan

    def update(self):
        self.x += self.dx
        self.y += self.dy
        self.lifespan -= 1

    def draw(self):
        arcade.draw_circle_filled(self.x, self.y, self.radius, self.color)

# Game class
class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height, "Particle Example")
        self.particles = []

    def setup(self):
        # Create particles
        for _ in range(100):
            x = random.randrange(SCREEN_WIDTH)
            y = random.randrange(SCREEN_HEIGHT)
            dx = random.uniform(-1, 1)
            dy = random.uniform(-1, 1)
            radius = random.uniform(2, 5)
            color = arcade.color.WHITE
            lifespan = random.randint(60, 120)
            particle = Particle(x, y, dx, dy, radius, color, lifespan)
            self.particles.append(particle)

    def on_draw(self):
        arcade.start_render()
        for particle in self.particles:
            particle.draw()

    def update(self, delta_time):
        for particle in self.particles:
            particle.update()

            if particle.lifespan <= 0:
                self.particles.remove(particle)

def main():
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT)
    game.setup()
    arcade.run()

if __name__ == "__main__":
    main()

Vous devriez voir une animation impliquant de nombreuses particules en mouvement :

particules réparties dans la fenêtre de jeu

Animations interactives

Implémentez des animations interactives qui réagissent à l’entrée de l’utilisateur ou aux événements du jeu. Par exemple, lorsque le joueur interagit avec un objet, celui-ci peut s’animer, changer de couleur ou se transformer d’une manière ou d’une autre. Ces animations interactives fournissent un retour d’information et renforcent l’engagement du joueur dans le jeu. Voici le code de l’animation interactive-animation.py fichier :

 import arcade

# Screen dimensions
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# Colors
WHITE = (255, 255, 255)
RED = (255, 0, 0)

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height, "Interactive Animation")
        self.player_x = 400
        self.player_y = 300
        self.player_radius = 30
        self.player_color = RED
        self.animation_radius = 60
        self.animation_color = WHITE
        self.animation_active = False

    def on_draw(self):
        arcade.start_render()

        arcade.draw_circle_filled(self.player_x,
                                  self.player_y,
                                  self.player_radius,
                                  self.player_color)

        if self.animation_active:
            arcade.draw_circle_filled(self.player_x,
                                       self.player_y,
                                       self.animation_radius,
                                       self.animation_color)

    def on_mouse_press(self, x, y, button, modifiers):
        if (self.player_x - self.player_radius <=
            x <= self.player_x + self.player_radius and
                self.player_y - self.player_radius <=
            y <= self.player_y + self.player_radius
       ):
            self.animation_active = True

    def update(self, delta_time):
        if self.animation_active:
            self.animation_radius += 1

            if self.animation_radius > 100:
                self.animation_active = False
                self.animation_radius = 0

def main():
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT)
    arcade.run()

if __name__ == "__main__":
    main()

Surchargez les méthodes nécessaires, telles que on_draw, on_mouse_presset mise à jourpour dessiner le lecteur et l’animation, gérer les clics de souris et mettre à jour l’animation.

Pour dessiner le lecteur, utilisez la fonction arcade.draw_circle_filled qui prend la fonction (x, y) les coordonnées du centre, le rayon et la couleur en tant qu’arguments. La fonction draw_circle_filled est l’un des outils d’Arcade que vous pouvez utiliser pour dessiner des éléments de jeu. Dans ce cas, vous pouvez dessiner un cercle croissant en faisant varier le rayon dans le temps.

La fonction on_mouse_press s’exécute lorsque l’utilisateur clique sur la souris. Elle vérifie si les coordonnées de la souris se trouvent dans les limites de l’objet du lecteur et active l’animation si c’est le cas.


Meilleures pratiques pour l’ajout d’animations

Lorsque vous ajoutez des animations à vos jeux, tenez compte des meilleures pratiques suivantes :

Limiter le nombre d’animations

Le fait d’avoir beaucoup d’animations avec beaucoup d’images peut avoir un impact sur les performances. Pensez à minimiser le nombre d’animations ou d’images nécessaires, en particulier pour les éléments non critiques du jeu. La simplification des animations permet de maintenir un taux de rafraîchissement constant et d’optimiser l’utilisation des ressources.

Rendu par lots d’objets similaires

Regrouper les objets similaires qui partagent les mêmes images d’animation et les mêmes textures et les rendre par lots. La mise en lot réduit le nombre d’appels de dessin, ce qui améliore les performances. Cette technique est particulièrement utile pour animer des objets qui utilisent la même feuille de sprites ou qui ont des séquences d’animation similaires.

Utiliser l’interpolation pour une animation fluide

Appliquez des techniques d’interpolation, telles que l’interpolation linéaire (lerping), pour obtenir des transitions d’animation fluides. L’interpolation calcule des valeurs intermédiaires entre les images clés de l’animation pour créer des mouvements fluides. Cette approche permet d’éviter les sauts soudains ou les mouvements saccadés entre les images, ce qui rend les animations plus attrayantes sur le plan visuel.

Tenir compte de la vitesse et de la synchronisation de l’animation

Expérimentez différentes vitesses d’animation et différents temps pour trouver le bon équilibre pour votre jeu. Ajustez la durée des images ou utilisez différentes séquences d’animation pour créer des variations de vitesse, d’accélération ou de décélération. Ces ajustements peuvent ajouter de la profondeur et du caractère aux animations de votre jeu.

Test et optimisation

Testez régulièrement vos animations sur différents appareils et surveillez les performances. Recherchez les goulets d’étranglement ou les ralentissements potentiels et optimisez en conséquence. Ce processus permet de garantir des animations fluides et cohérentes sur un large éventail d’appareils.


Rendre les jeux plus attrayants grâce à l’animation

L’ajout d’animations à vos jeux peut considérablement améliorer l’engagement et l’immersion des joueurs. Les animations fournissent un retour visuel sur les actions du joueur, ce qui rend le jeu plus intuitif et plus agréable. Elles donnent vie aux univers de jeu, créant un sentiment de réalisme et d’excitation.

Qu’il s’agisse d’un personnage qui court, d’un objet qui explose ou d’un simple effet de transition, les animations contribuent à rendre l’expérience de jeu plus dynamique et captivante.