Après tes explication et moults essais
j'ai enfin trouvé. Je pense qu'il y a quelques erreurs dans le tuto
donc effectivement il faut bien le
states dans :
target.draw(self.persoSprite, states)
logique
mais dans la ligne qui génère une erreur
states.transform.combine(self.transformable.transform)
il y a un mot de trop :
transformableet sans ce mot cela fonctionne parfaitement, donc :
states.transform.combine(self.transform)
ou
states.transform = self.transform
_________________
Et voici le code complet pour ceux qui veulent un Sprite qui peut bouger
import sfml as sf
class Perso (sf.TransformableDrawable) :
def __init__(self,texture):
sf.Drawable.__init__(self)
# Chargement de la texture et creation du sprite qui l'utilisera
self.imgTexture = sf.Texture.from_file(texture)
self.persoSprite = sf.Sprite(self.imgTexture)
def getImage(self,direction):
# en fonction du parametre 'direction' on decoupe un morceau (sf.Rectangle)
# de la texture pour la plaquer sur le sprite
if direction == 'down' :
self.persoSprite.texture_rectangle = sf.Rectangle((0, 0), (32, 32))
# self.persoSprite.color = sf.Color(255,0,255,250)
elif direction == 'up' :
self.persoSprite.texture_rectangle = sf.Rectangle((0, 96), (32, 32))
elif direction == 'left' :
self.persoSprite.texture_rectangle = sf.Rectangle((0, 32), (32, 32))
elif direction == 'right' :
self.persoSprite.texture_rectangle = sf.Rectangle((0, 64), (32, 32))
else :
print("ERROR : class Perso : ... ")
def draw(self, target, states):
# Transmission des parametres de transformation de l'obet Perso aux RenderStates ( states )
states.transform.combine(self.transform)
# Dessin du srpite avec le RenderStates precedement definie
target.draw(self.persoSprite, states)
if __name__ == '__main__' :
# Creation de la fenetre
window = sf.RenderWindow(sf.VideoMode(800, 600), "PySFML test")
# Limitation à 60 FPS
window.framerate_limit = 60
# Instance de la classe Perso en indiquant l'image qui servira de texture
player = Perso('resources/mperso.png')
player.getImage('down')
# Position de l'objet
player.position = sf.Vector2(150, 50)
# On démarre la boucle de jeu
while window.is_open :
# on gère les évènements
for event in window.events :
if type(event) is sf.CloseEvent :
window.close()
# Effase le contenue de la fenetre
window.clear()
# Transformation de l'objet
player.move(sf.Vector2(1,0))
player.rotate(1)
# Affichage de l'objet
window.draw(player)
# Rafraichissement de la fenetre
window.display()