[MD] Gestion des ennemis dans un niveau

Voir le sujet précédent Voir le sujet suivant Aller en bas

[MD] Gestion des ennemis dans un niveau

Message par Tryphon le Mar 14 Fév 2017 - 18:01

Salut les codeurs

dans mon projet de Shinobi, j'ai un truc qui m'agace un peu, c'est la gestion des ennemis présents sur un écran à un moment donné.

Je m'explique : un niveau fait 2048 pixels de long, sur lesquels 320 sont affichés à un moment donné à l'écran. Dans le niveau, il y a (mettons) une vingtaine d'ennemis (c'est plutôt 50 en fait).

Je ne peux pas, à chaque frame, mettre à jour les 20 ennemis, ce serait trop long. Je ne mets donc à jour que les actifs, ceux qui sont présents à l'écran.

J'ai 3 idées pour procéder :

1) j'ai une liste des 20 ennemis quelque part, et à chaque frame, je teste si un objet est apparu à l'écran. Il devient actif, jusqu'à sa mort. Problème : ça m'oblige à faire 20 tests à chaque frame, et c'est lent sur une Megadrive. Je peux un peu ordonner la liste, mais c'est vite limité car certains niveaux sont vraiment en 2D (1024 par 1024 par exemple).

2) je fais 4 listes ordonnées, une par direction (chaque entrée est un pointeur vers un ennemi, pour éviter que ça bouffe trop de place et les redondances)

3) je découpe le niveau en blocs carrés plus petits (genre 128 x 128) dans une structure type quadtree, et je ne parcours que les blocs affichés (en tout ou partie) à l'écran

Est-ce que quelqu'un sait quelles sont les techniques utilisées dans les JV de l'époque 8/16 bits ? Dans les générations ultérieures, je pense que regarder toute la liste n'est pas vraiment un problème.

Tryphon
Infirmier

Masculin Nombre de messages : 3589
Age : 40
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par Hpman le Mar 14 Fév 2017 - 18:32

Tu évolues comment dans ton jeu? Comme Shinobi (scroll horizontal uniquement, sens unique, pas de retour) ?

Hpman
Patient contaminé

Masculin Nombre de messages : 125
Age : 39
Localisation : Lille
Date d'inscription : 22/08/2014

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par Tryphon le Mar 14 Fév 2017 - 18:38

Shinobi c'est scrolling dans les quatre directions, retour possible, certains ennemis respawnent...

Tryphon
Infirmier

Masculin Nombre de messages : 3589
Age : 40
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par upsilandre le Mar 14 Fév 2017 - 18:48

En général j'ai plutot l'impression que les ennemis sont chargé en meme temps que la tilemap, ils font partie des metadata de l'environnement (comme les items par exemple)
avatar
upsilandre
Patient incurable

Masculin Nombre de messages : 1427
Age : 42
Localisation : val de marne 94
Date d'inscription : 31/05/2015

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par Hpman le Mar 14 Fév 2017 - 19:37

@Tryphon a écrit:Shinobi c'est scrolling dans les quatre directions, retour possible, certains ennemis respawnent...

Ah ok, j'ai la mémoire qui flanche passé les premiers stages  vieux


Bon, je pense que tu devrais pouvoir test si une 20aine d'entités sont à l'écran ou pas. Dans mes bricolages en mode bourrin sur neo je peut en check dans les 150 sans soucis. Faut voir le temps cpu que t'as de dispo pour cette méthode toute en finesse  Mr. Green


Tu as un papier sur MC kids qui aborde le sujet, bien qu'un peu flou à mon gout sur l'axe Y: http://games.greggman.com/game/programming_m_c__kids/

Personnellement je couperais ça en blocs ou bandes horizontales, pour avoir un premier tri rapide. Si la densité est relativement égale dans tout le niveau tu dois pouvoir faire des blocs assez grands.

Hpman
Patient contaminé

Masculin Nombre de messages : 125
Age : 39
Localisation : Lille
Date d'inscription : 22/08/2014

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par Kannagi le Mar 14 Fév 2017 - 21:24

Je vais te dire je que je fais dans mon jeu (vu que je gère 64 ennemi par map grand max).
Si le nombre max de perso a l'écran est atteint je ne fait rien sinon :
A chaque frame je regarde si l'ennemi est a" l'écran" (enfin dans les fait il faut qu'il soit hors de l'écran mais pas trop loin) pour pas qu'il apparaît subitement a l'écran , s'il est a l'écran je l'affiche( et je fait tous les calculs relative a l'ennemi).

Vu que testé 64 ennemi est beaucoup , je ne teste que par bloc de 8 (donc en 8 frame je test le tout).
Vu que la MD est plus puissante que la SNES en cpu tu peux peut être testé par bloc de 16 (et donc en 16 frame tu test les 256 ennemis).

Kannagi
Patient contaminé

Masculin Nombre de messages : 248
Age : 29
Localisation : Marseille
Date d'inscription : 18/08/2014

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par Stef le Mar 14 Fév 2017 - 23:28

Je pense que la structure classique est de type "graphe", du moins c'est comme ça que je ferai. Quand tu te balades dans ton niveau, tu te balades également dans le graphe qui représente ton niveau, chaque noeud du graphe peut représenter un espace écran de 512x512. Et pour chaque noeud tu as un certains nombre "d'events" (arrivé d'un nouveau ennemi, bonus, cutscène, boss...) selon les conditions (position du joueur, défaite d'un ennemi...). L'avantage c'est que du coup, au maximum tu testes les conditions que pour un espace de 512x512, ce qui réduit de beaucoup comparé à un niveau complet.
avatar
Stef
Infirmier

Masculin Nombre de messages : 3522
Age : 38
Localisation : Sevres
Date d'inscription : 04/04/2007

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par philip le Mer 15 Fév 2017 - 11:40

Oui, il faut organiser plusieurs zones de jeu, chaque zone gérant ses propres objets interactifs.
avatar
philip
Docteur *
Docteur *

Masculin Nombre de messages : 1904
Age : 46
Localisation : 31350 déménagement terminé.
Date d'inscription : 10/04/2011

http://philip-md.blogspot.fr/

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par Tryphon le Jeu 16 Fév 2017 - 23:52

Je connaissais le blog sur mc kids mais j'ai pas pensé à le consulter. Si j'ai bien compris, il fait deux listes ordonnées, l'une horizontalement, l'autre verticalement.

Je pense que je vais essayer ça. Je pense pouvoir bientôt montrer quelque chose, en Python pour l'instant.

Tryphon
Infirmier

Masculin Nombre de messages : 3589
Age : 40
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par bfg le Ven 17 Fév 2017 - 21:42

Un tableau d'objet tabObj en rom, trié par toi en x pour l'apparition.

un index qui garde la position dans le tableau : index_obj = 0

structure de ce qu'il y à dans le tableau :

Position x dans la map
Position y dans la map
identifiant de l'objet = index du tableau pour simplifier

Si tabObj[index_obj].x < (position x +largeur) du scrolling Alors
 Existe t'il un objet créer avec l'identifiant index_obj ?
 Non --> Crééer l'objet index_obj en x,y et incrémenter index_obj
 
Quand l'obj sort de l'écran, tu le détruis.

Je met un identifiant à l'objet pour éviter de le recréer si le joueur fait droite/gauche et que le monstre à été créé. Si il est détruit car il est sorti de l'écran, alors il pourra respawner car l'indentifiant n'existera plus.

C'est brouillon ce que je raconte, mais je crois qu'il y à moyen de s'en sortir dans les 2 sens (test inverse pour la gauche + décrémentation). Après c'est ptet aussi de la merde  Mr. Green Mr. Green J'ai pas testé ...

bfg
Patient contaminé

Nombre de messages : 778
Date d'inscription : 11/09/2005

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par Tryphon le Lun 20 Fév 2017 - 0:39

@bfg a écrit:Un tableau d'objet tabObj en rom, trié par toi en x pour l'apparition.

un index qui garde la position dans le tableau : index_obj = 0

structure de ce qu'il y à dans le tableau :

Position x dans la map
Position y dans la map
identifiant de l'objet = index du tableau pour simplifier

Si tabObj[index_obj].x < (position x +largeur) du scrolling Alors
 Existe t'il un objet créer avec l'identifiant index_obj ?
 Non --> Crééer l'objet index_obj en x,y et incrémenter index_obj
 
Quand l'obj sort de l'écran, tu le détruis.

Je met un identifiant à l'objet pour éviter de le recréer si le joueur fait droite/gauche et que le monstre à été créé. Si il est détruit car il est sorti de l'écran, alors il pourra respawner car l'indentifiant n'existera plus.

C'est brouillon ce que je raconte, mais je crois qu'il y à moyen de s'en sortir dans les 2 sens (test inverse pour la gauche + décrémentation). Après c'est ptet aussi de la merde  Mr. Green Mr. Green J'ai pas testé ...

Merci pour le retour. C'est à peu près ce que j'ai fait. Les différences principales :

* dans la struct je code à la fois la position que doit avoir la caméra pour que l'ennemi apparaisse, et la position de l'ennemi : ça permet de faire apparaître des ennemis ailleurs qu'au bord de l'écran (les ninjas ont une fâcheuse tendance à apparaître près de toi)

* plutôt qu'un identifiant j'ai mis un flag : True si l'objet est actif, False s'il est inactif. Ça permet de respawner certains ennemis, mais pas d'autres (suffit de laisser leur flag à True quand ils sont morts)

Inconvénient : je suis obligé de copier le tableau en RAM au début du niveau pour pouvoir modifier le flag. Mais c'est pas trop gênant : ça me permet d'empêcher certains ennemis de réapparaître quand on perd une vie (les gros plein de soupe avec leur sabre n'apparaissent plus si on a libéréééé, délivrééé l'otage à côté d'eux).

Tryphon
Infirmier

Masculin Nombre de messages : 3589
Age : 40
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par TOUKO le Lun 20 Fév 2017 - 14:00

Inconvénient : je suis obligé de copier le tableau en RAM au début du niveau pour pouvoir modifier le flag. Mais c'est pas trop gênant : ça me permet d'empêcher certains ennemis de réapparaître quand on perd une vie (les gros plein de soupe avec leur sabre n'apparaissent plus si on a libéréééé, délivrééé l'otage à côté d'eux).
Pk ne pas juste garder le flag en RAM au lieu du tableau complet ?
avatar
TOUKO
Docteur *
Docteur *

Masculin Nombre de messages : 11754
Age : 44
Localisation : LE MANS/MARSEILLE
Date d'inscription : 08/07/2010

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par Tryphon le Mar 21 Fév 2017 - 15:32

Oui c'est vrai, pourquoi pas ? Very Happy

Mais je me demande : je vais devoir parcourir les deux tables "en parallèle", donc si je veux l'optimiser je vais devoir utiliser deux registres d'adresse, est-ce que ça vaut vraiment le coup ?

Tryphon
Infirmier

Masculin Nombre de messages : 3589
Age : 40
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par TOUKO le Mar 21 Fév 2017 - 16:50

@Tryphon a écrit:Oui c'est vrai, pourquoi pas ? Very Happy

Mais je me demande : je vais devoir parcourir les deux tables "en parallèle", donc si je veux l'optimiser je vais devoir utiliser deux registres d'adresse, est-ce que ça vaut vraiment le coup ?
Après c'est à voir, mais si par exemple ton flag se résume par juste 1/0, tu peux utiliser un mot de 32 bits pour 32 entrées ..
Après je sais pas ce que vaut le 68k dans les tests de bits, donc faut voir .
avatar
TOUKO
Docteur *
Docteur *

Masculin Nombre de messages : 11754
Age : 44
Localisation : LE MANS/MARSEILLE
Date d'inscription : 08/07/2010

Revenir en haut Aller en bas

Re: [MD] Gestion des ennemis dans un niveau

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum