Bonjour
Je viens de débuter sur SFML
Je souhaiterai convertir mon projet de jeux 2d ( basé sur un affichage de tileset et de sprite ) en PyGame, loin d'être fini mais PyGame n’étant pas assez véloce dans certain domaine je voulais essayer SFML pour comparer. Puis apparemment cette librairie offre plus de possibilité
J’essaie de traduire le tuto en C++ des vertexarray ( celui qui charge un tileset et l'affiche ) mais je galère quand même pas mal
Voila l'url du tuto C++
http://www.sfml-dev.org/tutorials/2.1/graphics-vertex-array-fr.phpet voici mon début de traduction :
import sfml as sf
class TileMap (sf.Drawable) :
def __init__ (self):
sfml.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
#
# déjà la ça déconne ...
#
tu = tileNumber % (self.m_tileset.size.x / tileSize.x);
tv = tileNumber // (self.m_tileset.size.x / tileSize.x);
# on récupère un pointeur vers le quad à définir dans le tableau de vertex
self.quad = self.m_vertices[(i + j * width) * 4]
print(type(self.quad))
# on définit ses quatre coins
#
# C'est la que je ne comprend pas ... un type(self.quad) m'indique que c'est un vertex
# hors un vertex ne n'est pas iterable donc d’où vient le quad[2]
#
self.quad[0].position = sf.Vector2(i * tileSize.x, j * tileSize.y)
self.quad[1].position = sf.Vector2((i + 1) * tileSize.x, j * tileSize.y)
self.quad[2].position = sf.Vector2((i + 1) * tileSize.x, (j + 1) * tileSize.y)
self.quad[3].position = sf.Vector2(i * tileSize.x, (j + 1) * tileSize.y)
# on définit ses quatre coordonnées de texture
self.quad[0].tex_coords = sf.Vector2(tu * tileSize.x, tv * tileSize.y)
self.quad[1].tex_coords = sf.Vector2((tu + 1) * tileSize.x, tv * tileSize.y)
self.quad[2].tex_coords = sf.Vector2((tu + 1) * tileSize.x, (tv + 1) * tileSize.y)
self.quad[3].tex_coords = sf.Vector2(tu * tileSize.x, (tv + 1) * tileSize.y)
# On crée la fenêtre principale
window = sf.RenderWindow(sf.VideoMode(800, 600), "PySFML test")
# window.vertical_synchronization = True
# window.framerate_limit = 60
# icon = sf.Image.from_file("data/icon.bmp")
# window.icon = icon.pixels
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,
]
tm = TileMap()
tm.load("resources/tileset1a.jpg",sf.Vector2(32,32),level,16,8)
window.draw(tm)
window.display()
Je ne comprend pas cette histoire de quad, qui est un vertex et qui serait iterrable
version C++ :
// on récupère un pointeur vers le quad à définir dans le tableau de vertex
sf::Vertex* quad = &m_vertices[(i + j * width) * 4];
// on définit ses quatre coins
quad[0].position = sf::Vector2f(i * tileSize.x, j * tileSize.y);