Voici ma fonction d'affichage de la fenetre simplifié. Elle est appelé par la méthode run de mon thread d'affichage :
def paintEvent(self):
self.app.clear()
self.states.transform = sf.Transform().scale((self.scale, self.scale))
### ...
### ...
### Gestion de l'animation et du scrolling de la map par rapport au mouvement du personnage
# Gestion du scolling de la map par rapport à la position du personnage
x, y = self.game.player.position
xMin = int(x - self.nbrTileX / 2.0) + 1
yMin = int(y - self.nbrTileY / 2.0) + 1
self.states.transform.translate((-xMin * self.tileWidth, -yMin * self.tileHeight))
# Affichage avec une image de fond
self.app.draw(self.worldSprite, self.states)
# Ou affichage avec des tiles
for x in xrange(self.nbrTileX + 4):
for y in xrange(self.nbrTileY + 4):
if (x + xMin - 2, y + yMin - 2) in self.game.world:
self.app.draw(self.game.world[x + xMin - 2, y + yMin - 2].sprite, self.states)
#Affichage du joueur
self.app.draw(self.animPlayer[self.game.player.movement][self.game.player.direction], self.statesPlayer)
# Affichage d'une couche supérieur
if self.worldSpriteSup:
self.app.draw(self.worldSpriteSup, self.states)
self.app.display()
La seule chose qui change entre l'affichage d'un background et celle des tiles c'est les lignes d'affichages (à part le chargement.
Mes sprites ne bougent pas et j'utilise un RenderStates pour gérer le scrolling.
Peut être que l'utilisation de ça ralenti un peu la sfml ?
En effet. Ca simplifie pas mal mais j'ai une nouvelle erreur maintenant.
Mes animations n'étaient au début que Drawable. Maintenant il faut que je les places aussi Transformable pour pouvoir changer leur positions/centre/ratio/rotation/... facilement.
Mais lorsque j'essaye de faire l'héritage j'obtiens une erreur :
TypeError: Error when calling the metaclass bases multiple bases have instance lay-out conflict
J'ai alors vu dans une doc de pysfml2 qu'il pouvait y avoir sf.TransformableDrawable mais elle n'est pas dans mon paquet.
Je peux contourner le problème en appliquant la transformation manuellement à chacun des sprites de l'animation mais je trouve ça moche.