IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Gameplay de Xonix


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Indie Dev
    Inscrit en
    Mai 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Indie Dev

    Informations forums :
    Inscription : Mai 2022
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Gameplay de Xonix
    Bonjour à tous,

    Je suis en train de développer un projet qui se rapproche du jeu rétro Xonix. J'ai mon propre moteur de rendu, ma gestion des polygones, etc - pour faire simple, un moteur dans l'esprit du OLC Pixel Game Engine, mais plus réduit... Je rencontre présentement un problème dans le remplissage des polygones lorsque le joueur "grignote" une nouvelle portion. Je me suis appliqué à une méthode de type ScanLine traditionnelle, mais ce n'est pas très convaincant. J'ai tenté la création d'un tableau (vector) avec les différents points pour la création des polygones, mais ce n'est pas bon. Bref...
    Je me demandais, selon vous, quelle serait la meilleure façon de remplir ces surfaces et de "gérer" les polygones finis ?

    Un lien pour comprendre le gameplay de Xonix :

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Amusant, ce bug. C'est la question habituelle en mathématique de savoir ce qu'est l'intérieur et l'extérieur. Dans ton cas, je garderais en mémoire la frontière entre les 2, comme une ligne brisée. Lorsque la tentative magenta reconnecte, je mets à jour la frontière. Pour la coloration, j'affecte la couleur par contamination. Tout point, en partant du bord du terrain transforme tout point adjacent dans la couleur du bord, jusqu'à la frontière (exclue). Et on recommence. Lorsque plus aucune contamination n'est possible, c'est que tout est coloré. Libre à toi de laisser voir le processus ou non, à l'écran.

    Note : Les ennemis pris dans le bord devrait mourir. Normalement.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Indie Dev
    Inscrit en
    Mai 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Indie Dev

    Informations forums :
    Inscription : Mai 2022
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Hello. Tu discernes bien le gameplay. Le principe en soi n'est pas un problème - c'est juste la gestion des portions grignotées. Comment faire pour identifier les parties qui doivent être colorées ? Il y a bien la méthode ScanLine, mais avec les bords qui s'ajoutent aux polygones éventuels, c'est difficile de définir les segments (ce que tu appelles l'intérieur/extérieur en tant que questionnement - ou computation). Un premier résultat plus ou moins satisfaisant se retrouve avec le code suivant (difficile à lire hors du contexte, mais je pense que vous parviendrez à comprendre). Je vous livre aussi un lien quant au principe de remplissage :

    https://web.cs.ucdavis.edu/~ma/ECS17...tes/0411_b.pdf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    void scanLine()
    {
    	gck::vi2d p1 = gck::vi2d(border / 2, border/2); // point up left
    	gck::vi2d p2 = gck::vi2d(sWidth - border/2, border / 2); // point up right
    	gck::vi2d p3 = gck::vi2d(border / 2, sHeight - border / 2 - 1); // point down right
            // scanline implementation
    	for (int y = p1.y; y <= p3.y; y++)
    		for (int x = p1.x; x <= p2.x; x++)
    			if (board->GetPixel(gck::vi2d(x, y)) != gck::DARK_CYAN)
    				sc.push_back(gck::vi2d(x, y));
    	// check vector
    	if (sc.size() > 1)
    	{
    		for (int l = 0; l < sc.size(); l++)
    			if (l % 2 == 0 && l + 1 < sc.size()) // odd point (because first occurence is occurence 0)
    				DrawLine(sc[l], sc[l + 1], gck::BLACK); // draw line
    	}
    	// fill yellow line
    	for (int o = 0; o < ScreenWidth(); o++)
    		for (int oo = 0; oo < ScreenHeight(); oo++)
    			if (board->GetPixel(gck::vi2d(o, oo)) == gck::YELLOW)
    				board->SetPixel(gck::vi2d(o, oo), gck::BLACK);
     
    	sc.clear(); // clean up vector
    }

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Pourquoi prends-tu le temps d'expliquer une méthode qui ne marche pas ?

    Pour la coloration, je t'ai répondu : par contamination
    Une liste des points à étudier, une liste des points déjà étudiés, et ton terrain.
    1. Au départ, la liste des points à étudier est remplie des points du bord.
    2. Au départ, la liste des points déjà étudiés (et colorés) est rempli des points de la frontière.
    3. Pour chaque point de la liste à étudier, on colorie, et on remplit la liste des points à étudier de tous les voisins, s'ils ne sont pas déjà étudiés.
    4. Le point colorié rentre dans la liste des points déjà étudiés.
    5. Si au moins un point a été colorié, on recommence à l'étape 3.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 528
    Points
    528
    Par défaut
    Bonsoir,

    Est-ce que ceci peut aider : https://fr.wikipedia.org/wiki/Algori..._par_diffusion

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Indie Dev
    Inscrit en
    Mai 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Indie Dev

    Informations forums :
    Inscription : Mai 2022
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Pourquoi prends-tu le temps d'expliquer une méthode qui ne marche pas ?
    Pardon. Juste une façon de montrer mes précédentes tentatives - je n'arrive pas sur le forum comme une fleur sans avoir cherché de solution...

    Je crois que je tiens quelque chose après toutes ces différentes explications. Je teste - optimise et je reviendrai avec une solution. Bon week-end à vous.
    Merci pour le lien. Je l'avais déjà consulté auparavant. Très intéressant ++

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    bonjour je pense que la méthode la plus efficace c'est d'utiliser des octrees...à condition que le compilateur supporte idéalement le C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    class Octree
    { 
    int numero;
    bool visible;
    /// rajouter les membres que l'on veut de la classe
    Rectangle Coordonnees ; /// coin gauche haut coin bas droite
    Octree *Haut_Gauche;
    Octree *Haut_Milieu;
    Octree *Haut_Droite;
    Octree *Milieu_Gauche;
    Octree *Milieu_Droite;
    Octree *Bas_Gauche;
    Octree *Bas_Milieu;
    Octree *Bas_Droite;
    };
    Après pour afficher les rectangles,se positionner sur l'instance requise et tester si les branches sont à NULL
    Le fond bleu on le peint qu'une seule fois tandis que les rectangles sont dessinés si nécessaires en parcourant l'arborescence

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Indie Dev
    Inscrit en
    Mai 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Indie Dev

    Informations forums :
    Inscription : Mai 2022
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos messages. En fait, afin de parvenir à quelque chose de vraiment efficace, ma Template est un enfer. Or, je suis tombé sur un code simple utilisant la bibliothèque SFML, laquelle je regardais avec un certain dédain, considérant les alternatives autrement plus performantes. J'ai eu tort. J'ai donc adopté l'esprit et je suis en train d'en faire la conversion. C'est bien moindre que tout mes précédents calculs. Merci pour vos conseils ++


Discussions similaires

  1. Réponses: 8
    Dernier message: 16/11/2010, 14h53
  2. Tout savoir sur Kinect : du Gameplay au SDK
    Par Gordon Fowler dans le forum Développement 2D, 3D et Jeux
    Réponses: 13
    Dernier message: 31/10/2010, 23h16
  3. Conseils gameplay mixte
    Par Wicked.lb dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 20/09/2008, 19h16
  4. Gameplay à la "worms"
    Par Johnbob dans le forum Web
    Réponses: 36
    Dernier message: 11/07/2006, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo