PySFML – balles rebondissantes

Samedi 30 août 2008 à 17h50


Capture d'écran des balles rebondissantes en action

Capture d'écran des balles rebondissantes en action

Depuis environ un an, je maintiens PySFML, le binding python de SFML, une librairie multimédia vraiment cool. Elle donne facilement accès à tous les périphériques, utilise l’accélération graphique et permet de développer facilement et rapidement des applications 2D.
PySFML rend cette librairie accessible au langage de programmation python, qui est très simple à apprendre et qui permet de développer des applications très rapidement.

Aujourd’hui je vous présente un petit programme exemple de balles rebondissantes, assez simple, avec moins de 240 lignes de code. Les balles ont des tailles, masses et pénétrations dans l’air différentes, et c’est assez amusant à voir en action. Le terrain est une simple image png que tu peux éditer.
Dans le programme, tu peux appuyer sur + pour faire apparaitre d’autres balles et sur enter pour redonner de l’énergie à une balle au hasard.

Téléchargement : sources (tu auras besoin de python et pysfml version >= 1.3).
Tu peux aussi directement faire un checkout du dépôt svn : svn co svn://svn.tuxfamily.org/svnroot/remi/dev/bouncing_ball bouncing_ball

Il ne te reste qu’à double cliquer sur main.py et à lire la suite.

Je vais ici présenter un peu plus en détail certains aspects du code.

Carte approximative

En rouge foncé : la carte originale, en rouge et vert : la carte approximative.

1) Les collisions avec la carte (map.py)

Lors de l’initialisation, une carte approximative est créée (ligne 23, méthode GenerateRoughMap). Pour faire cette carte, c’est très simple. On quadrille la vraie carte avec des cases d’une taille fixée, par exemple 32×32. Chacune de ces cases est représentée par un booléen : True si la case contient des pixels opaques, False si elle est entièrement transparente. Ainsi, pour faire un test de collision, on commence par vérifier si le bounding box de l’objet est en collision avec la carte approximative (ligne 34, méthode RoughlyCheckCollision). Ce test est très rapide, et au cas où la collision est détectée, il ne reste plus qu’à effectuer un test plus précis, qui va également permettre de calculer la normale du mur au point de contact.

Ce deuxième test est simple : on va prendre un certain nombre de points sur le périmètre du cercle, et vérifier si la carte y est transparente ou non. En connaissant les deux points limites (ceux en jaune sur l’illustration), on peut calculer la normale (la flèche noire). (ligne 48, méthode CheckCollision.)

Collision entre une balle et un mur.

Collision entre une balle et un mur.

Tu remarqueras peut être que les balles deviennent blanches près des murs. Elles deviennent en fait blanches dès que RoughlyCheckCollision a détecté une collision.

J’ai aussi fait un algo de QuadTree, mais il n’est pas vraiment adapté à la situation et je ne l’ai donc pas gardé, mais il n’empêche que c’est un concept que j’aime bien.

2) Les rebonds (ball.py)

Dans ball.py, la position, la vitesse et l’accélération sont représentés par des nombres complexes, ce qui raccourci pas mal le code. Pour les rebonds avec la carte (ligne 45, méthode Bounce), ça tient en 2 lignes, un peu plus pour la collision entre deux balles (ligne 53, méthode CheckCollision).

5 Réponses à “PySFML – balles rebondissantes”

  1. ThibG Dit:

    Ça m’a l’air assez intéressant tout ça :)
    Allez, j’vais essayer avec nouveau :P

  2. a3_nm Dit:

    Fatal error :-( .

    ———-

    Traceback (most recent call last):
    File « main.py », line 77, in
    Main()
    File « main.py », line 39, in Main
    while window.IsOpened():
    AttributeError: ‘RenderWindow’ object has no attribute ‘IsOpened’

    ———-

    C’est peut-être dû au WM exotique que j’utilise (StumpWM), ou pas. Je n’ai pas regardé sérieusement le code.

    J’utilise Python 2.5.2.

    PS : J’ai vu que tu m’avais mis en lien, c’est sympa. Je vais mettre un lien vers ton blog sur le mien.

    PPS : En fait, c’est sûrement parce PySFML n’est pas installé, tu me diras :)

    N’empêche, le message d’erreur n’est pas hyper explicite.

  3. toto Dit:

    pauvre con de ta mere

  4. Chris Dit:

    Salut,

    tout d’abord bravo et merci pour le code de rebond!

    Par contre il a une désagréable tendance à planter assez facilement, pour ca il faut appuyer plusieurs fois et rapidement sur entrée dans ton exemple, ca fait sortir la balle du tableau utilisé au premier test de collision. Je pense que c’est juste une question de vitesse.

  5. admin Dit:

    Je ne vois pas vraiment ce qui se passe dans ton « plantage », chez moi je n’ai aucun problème.
    Enter redonne effectivement de la vitesse à une balle.

Répondre