et non
Voici le message d'erreur concernant la ligne : states.texture = tileset
TypeError: can't set attributes of built-in/extension type 'sfml.graphics.RenderStates'
EDIT : ahh j'ai vue d’où provient une des erreurs :
states = sf.RenderStates
()Je vais déjà chercher de ce coté la
EDIT 2 : J'arrive a afficher la map
Voici le code pour les intéressés :
import sfml as sf
class TileMap (sf.TransformableDrawable) : # sf.Transformable
def __init__ (self):
sf.Drawable.__init__(self)
# on declare la texture et le VertexArray
self.m_tileset = sf.Texture
self.m_vertices = sf.VertexArray(sf.PrimitiveType.QUADS)
def load (self,tileset, tileSize, tiles, width, height) :
# on charge la texture
self.m_tileset = sf.Texture.from_file(tileset)
# on redimensionne le tableau de vertex pour qu'il puisse contenir tout le niveau
self.m_vertices.resize(width * height * 4);
# on remplit le tableau de vertex, avec un quad par tuile
for i in range(width) :
for j in range(height) :
# on récupère le numéro de tuile courant
tileNumber = tiles[i + j * width];
# on en déduit sa position dans la texture du tileset
tu = tileNumber % (self.m_tileset.size.x / tileSize.x);
tv = tileNumber // (self.m_tileset.size.x / tileSize.x);
# On incremante une variable qui definie la position de chaque case
case = (i + j * width) * 4;
# on définit ses quatre coins
self.m_vertices[case + 0].position = sf.Vector2(i * tileSize.x, j * tileSize.y)
self.m_vertices[case + 1].position = sf.Vector2((i + 1) * tileSize.x, j * tileSize.y)
self.m_vertices[case + 2].position = sf.Vector2((i + 1) * tileSize.x, (j + 1) * tileSize.y)
self.m_vertices[case + 3].position = sf.Vector2(i * tileSize.x, (j + 1) * tileSize.y)
# on définit ses quatre coordonnées de texture
self.m_vertices[case + 0].tex_coords = sf.Vector2(tu * tileSize.x, tv * tileSize.y)
self.m_vertices[case + 1].tex_coords = sf.Vector2((tu + 1) * tileSize.x, tv * tileSize.y)
self.m_vertices[case + 2].tex_coords = sf.Vector2((tu + 1) * tileSize.x, (tv + 1) * tileSize.y)
self.m_vertices[case + 3].tex_coords = sf.Vector2(tu * tileSize.x, (tv + 1) * tileSize.y)
def draw(self, target) :
states = sf.RenderStates()
states.texture = self.m_tileset
target.draw(self.m_vertices, states)
# ----- MAIN -----
# On crée la fenêtre principale
window = sf.RenderWindow(sf.VideoMode(800, 600), "PySFML test")
level = [
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0,
0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0,
0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0,
2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1,
0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1,
]
# on crée la tilemap avec le niveau précédemment défini
map = TileMap()
map.load("resources/tileset1a.jpg", sf.Vector2(32,32),level,16,8)
# 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()
# On dessine le niveau
window.clear()
map.draw(window)
window.display()