egofree Nouveau
Messages : 4
| Sujet: Optimisation d'un remake du jeu 'Son of blagger' Sam 28 Sep 2013 - 18:27 | |
| Bonjour, J'ai fait avec game maker un remake du jeu de plates-formes 'Son of blagger' qui est sorti en 1984 sur le Commodore 64. C'est la première fois que j'essaie de programmer un jeu. Voici une copie d'écran du jeu original : et du remake : J'aimerais partager avec vous les optimisations que j'ai réussi à implémenter sur ce jeu, et notamment les fonctions 'instance_activate_region' et 'instance_deactivate_region' que j'ai utilisé. Comme j'ai passé pas mal de temps à faire fonctionner correctement ces fonctions, j'espère que cela permettra de gagner du temps à ceux qui voudraient les utiliser dans un contexte similaire. Le 'problème' avec ce jeux est que les niveaux sont imbriqués les uns dans les autres et qu'il n'y a qu'une seule 'room' pour tous les niveaux. Cela signifie que par défaut les objets de tous les niveaux sont actifs en même temps. (un peu moins de 8000 objets). Avec la dernière version de Game Maker et un ordinateur nouveau et puissant cela ne pose pas trop de problèmes, mais c'est loin d'être optimal pour des ordinateurs plus anciens. Dans ce cas, les tutoriaux sur game maker conseille d'utiliser quand c'est possible des tuiles pour le décor au lieu d'objets. Mais le problème est que le joueur peut interagir avec une grand partie du décor,ce qui signifie qu'on est obligé dans ce cas d'utiliser des objets. Cela ne règle donc pas le problème (excepté pour le décor qui se trouve à l'extérieur du mur principal, on peut utiliser des tuiles dans ce cas). D'abord j'ai pu réduire le nombre d'objets en utilisant des objets plus grands. Comme le jeu original utilisait des caractères ASCII de grandeur 8 pixels sur 8, j'ai pu souvent remplacé deux caractères par un seul objet. Cela a permis de réduire de moitié le nombre d’objets actifs. Ensuite j'ai essayé les fonctions activate et deactivate region,comme c'est conseillé dans le manuel : - Code:
-
instance_deactivate_region(view_xview[0], view_yview[0], view_wview[0], view_hview[0], false, true); instance_activate_region(view_xview[0], view_yview[0], view_wview[0], view_hview[0], true); Cela permet de rendre actif seulement les objets qui sont visibles à l'écran. Mais le problème est qu'il y a beaucoup d'objets dans le décor qui sont animés (échelles, tapis roulants, plates-formes mouvantes,etc). Cela implique que lorsque le joueur bouge et provoque un défilement de l'écran, les objets animés ne sont plus synchronisés entre eux, car lorsque objet est réactivé son animation l'est aussi. J'ai trouvé la solution en utilisant pour chaque objet animé la fonction suivante : - Code:
-
with(objet) { image_index = objet.image_index; } Cela règle le problème de synchronisation pour le décor. Mais il reste le problème des ennemis. Ceux-ci peuvent sortir de l'écran et revenir. Avec les méthodes activate et deactivate regions, le mouvement des monstres est aussi désynchronisé. Finalement j'ai laissé cette méthode, et j'ai utilisé à la place un tableau qui contient pour chaque niveau des rectangles, qui définissent les zones visibles et actives : - Code:
-
active_region[1,LEFT_COORDINATE] = 546; active_region[1,TOP_COORDINATE] = 96; active_region[1,WIDTH] = 1246; active_region[1,HEIGHT] = 556;
active_region[2,LEFT_COORDINATE] = 802; active_region[2,TOP_COORDINATE] = 288; active_region[2,WIDTH] = 990; active_region[2,HEIGHT] = 604;
..... Ensuite lors du début de chaque niveau, je désactive tout, et j'active les régions nécessaires : - Code:
-
var number_of_regions = array_length_2d(active_region,level) / 4;
for (i = 0 ; i <= number_of_regions - 1 ; i += 1) instance_activate_region(active_region[level,LEFT_COORDINATE + i*4], active_region[level,TOP_COORDINATE + i*4] , active_region[level,WIDTH + i*4] , active_region[level,HEIGHT + i*4], true); Avec méthode, seul quelques centaines d'objets sont actifs. |
|