14 aoû
2008
2008
La gestion des grands sprites
C'est vraiment hyper frustrant.
Genre là je suis presque arrivé à gérer des caisses de n'importe quelle taille, composée de sprite de 32x32, référencée dans un endroit facile d'accès et construite à partir des maps générées par l'éditeur mais... mais presque quoi.
Comment gérer correctement des grands sprites ? Par grand j'entends de taille infinie, pas 64x64 ou 128x128. Plutôt 256x192 quoi, un truc pas carré qui prend bien tout l'écran.
La solution que j'essaye d'appliquer n'est pas particulièrement très futée puisque j'ai voulu conserver au mieux l'ancien système de gestion de caisses, c'est-à-dire uniquement des caisses 32x32. Ce système présentait l'avantage d'être simple. Mais comment faire une caisse plus grande, genre 96x96 ? Eh bien certaines caisses ont comme sprite un "bout" de caisse, le coin haut droit par exemple. Si elle est à côté d'autres bouts de caisse, ça donne l'illusion d'avoir une énorme boîte monstrueusement féroce devant soi.
Sauf que pour la physique et même les collisions, c'est nul. On ne sait pas jusqu'où la caisse va. Donc si on en détruit une, seule celle-là tombe. Petit exemple :
_ _ _Genre là je suis presque arrivé à gérer des caisses de n'importe quelle taille, composée de sprite de 32x32, référencée dans un endroit facile d'accès et construite à partir des maps générées par l'éditeur mais... mais presque quoi.
Comment gérer correctement des grands sprites ? Par grand j'entends de taille infinie, pas 64x64 ou 128x128. Plutôt 256x192 quoi, un truc pas carré qui prend bien tout l'écran.
La solution que j'essaye d'appliquer n'est pas particulièrement très futée puisque j'ai voulu conserver au mieux l'ancien système de gestion de caisses, c'est-à-dire uniquement des caisses 32x32. Ce système présentait l'avantage d'être simple. Mais comment faire une caisse plus grande, genre 96x96 ? Eh bien certaines caisses ont comme sprite un "bout" de caisse, le coin haut droit par exemple. Si elle est à côté d'autres bouts de caisse, ça donne l'illusion d'avoir une énorme boîte monstrueusement féroce devant soi.
Sauf que pour la physique et même les collisions, c'est nul. On ne sait pas jusqu'où la caisse va. Donc si on en détruit une, seule celle-là tombe. Petit exemple :
|X X X|
o |X X X|
k |X X X|
Personnage et Caisse en ASCII. Le personnage tire devant lui :
_ _ _ _ _
|X X X| _ X X|
o - |X X X| -> o |X X X|
k |X X X| k |X X X|
|X X X| _ X X|
o - |X X X| -> o |X X X|
k |X X X| k |X X X|
Un bout de la caisse s'effondre, le reste n'a même pas conscience qu'il va être pulvérisé. Or nous avons décidé qu'aussi grande soit la caisse, si elle n'a plus de PV c'est sa totalité qui est détruit (comme Half Life premier du nom).
Nous sommes en C++, et comme on est super originaux on a fait une classe "Caisse". Cette classe représente... une caisse ! Avec sa position, son type (bois métal etc), sa vie, ... Et plutôt que de tout repenser, j'ai choisi d'ajouter comme attribut à cette classe un pointeur vers un tableau de Caisse.
Nous sommes en C++, et comme on est super originaux on a fait une classe "Caisse". Cette classe représente... une caisse ! Avec sa position, son type (bois métal etc), sa vie, ... Et plutôt que de tout repenser, j'ai choisi d'ajouter comme attribut à cette classe un pointeur vers un tableau de Caisse.
Caisse* sous_caisses
Ce tableau contient la liste de toutes les caisses (appelées sous_caisses pour différencier) attachées à la caisse. Oui c'est compliqué, le code est tout aussi fouilli que mon explication qui servira à mon avis plus à Tibo qu'à vous chers lecteurs.
Ainsi, si on reprend la boîte du dessus :
_ _ _Ainsi, si on reprend la boîte du dessus :
|M X X|
|X X X|
|X X X|
M est la caisse "principale", et X sont les sous_caisses de M. Tout ça forme un ensemble dont on connaît les propriétés, et c'est bien ce qui nous intéresse.
N'empêche que ça ne marche pas...
A bientôt pour un billet pour dire combien mon système est génial et comment il marche trop bien :p
Aller, je lâche une image du menu (Tibo va me gronder !) :



Pas très sexy, mais fonctionnel ;)
On se fera un vrai logo à l'occasion.
EDIT : Et voilà, mon algorithme marche... Que d'émotions ! Par contre je demande à voir les temps de chargement sur une grosse map :s y'a au moins 40 boucles for/while !
N'empêche que ça ne marche pas...
A bientôt pour un billet pour dire combien mon système est génial et comment il marche trop bien :p
Aller, je lâche une image du menu (Tibo va me gronder !) :



Pas très sexy, mais fonctionnel ;)
On se fera un vrai logo à l'occasion.
EDIT : Et voilà, mon algorithme marche... Que d'émotions ! Par contre je demande à voir les temps de chargement sur une grosse map :s y'a au moins 40 boucles for/while !



0 commentaire(s)
14/08/2008 à 01:48:24 Dernière modif. : 20/08/2008 à 14:53:23

