Salut à tous,

Je me suis penché récemment sur la création de moteurs de scrolling "fluides" (j'entends par là pas tile par tile, mais avec un défilement progresif) avec Silverlight : le premier pour un jeu type Advance Wars et le second pour un jeu en 3d isométrique dont les tiles sont des losanges (vues de biais donc).

Evidement, par curiosité, j'ai commencé par regarder comment le moteur de dobbschallenge2 etait implémenté, et le moins que l'on puisse dire, c'est qu'il ne fait pas dans la dentelle : au chargement de la map, on crée autant d'instances de Rectangle qu'il y a de tiles, on met tout ca sur un Canvas et on met les coordonnées du Canvas à jour au gré du déplacement de la caméra, le clipping faisant le reste.

La solution pour laquelle j'ai opté est un peu plus élégante : j'ai (largeurDeLecranEnTiles+1)*(longueurDeLecranEnTiles+1) tiles (le +1 étant lié au fait que le défilement est, comme je l'ai dit, progressif et donc qu'on peut ne voir qu'une partie de certaines tiles) que je place sur un Canvas : si, après déplacement, les coordonnées de la camera ne sont pas un multiple de la taille de tile, je me contente de déplacer légèrement le canvas dans la direction souhaitée, sinon je replace le Canvas en (0,0) et je met à jour l'apparence de tous mes Rectangles selon les tiles qu'il représentent : l'avantage c'est que quelque soit la taille de la map, j'ai toujours un nombre fixe de Rectangles gérés et un occupation mémoire moindre. Certes je me sers aussi du clipping, mais sur un nombre de Rectangle beaucoup plus modeste.

L'implémentation pour le moteur type advance war s'est faite en quelques minutes et fonctionne du tonnerre, mais l'implémentation de la version 3d isométrique est un peu plus délicate du points de vue de l'algorithmique (faut que je me triture les méninges pour savoir le nombre de rectangles à générer, selon la largeur des tiles qui n'est pas forcément multiple de la taille écran etc etc...) alors que la version bourrines ou je crée toutes mes tiles que je place sur un Canvas à la dobbschallenge est... complètement triviale à implémenter.

D'où ma question : au dela de la volonté de sortir un code propre, cela vaut il le coup que je me casse la tête à ce point ? Parce que bon les objets manipulés restent quand même extrêmement simples, alors est ce que j'y gagne réellement : n'est il pas plus rapide, niveau perf, de laisser Silverlight clipper l'ensemble des tiles plutôt que de chercher à modifier la propriété Fill de mes Rectangle avec la Brush adéquate chaque fois que cela s'avère nécessaire.

Je ferais bien un peu de profiling, pour voir mais si la réponse est évidente et en faveur de la méthode bourrin je m'économiserais cette peine

(même si je me doute évidement qu'avec une map immense les résultats joueront en ma faveur, mais bon je en pense pas développer un jeu avec des cartes de millions de tiles).

Merci

PS : Pour voir à quoi ca ressemble, créez une page html en local avec :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
<iframe src="http://silverlight.services.live.com/invoke/101387/ScrollingAW/iframe.html" scrolling="no" frameborder="0" style="width:320px; height:240px"></iframe>
(les graphismes sont ceux d'AW, ca se controle avec les touches fléchées)