SgdK Megadrive - Démo d'une gestion de YOrder

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

SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Ven 19 Mai 2017 - 0:02

Coucou,

Longtemps que je voulais me lancer dans la création d'une telle routine sur une Megadrive.
Ne voulant pas trop mettre les mains dans des routines en full ASM, j'ai tenté, avec le Sgdk, de réaliser ça !

Bon bien sûr, c'est pas génial, les cadors du forum trouveront toujours mieux à faire, mais qui ne tente rien n'a rien et à ce propos, ce sont surtout les débutant qui osent poster, à méditer.



Vous pourrez voir dans cette petite vidéo, ce que cela donne.
Ici, le calcul se fait toutes les 30 frames.

Bon alors, comment ça marche ???


Et bien, ayant discuter avec Stef sur cette feature, ce dernier m'a parlé qu'une telle routine serait vraiment un plus, car le Sgdk ne le permet pas.
En fait, la liste est crée au moment de la déclaration :

Code:
Sprites[No1].SpriteA= SPR_addSprite(&Exemple1, Sprites[0].CoordX, Sprites[0].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
Sprites[No2].SpriteA= SPR_addSprite(&Exemple1, Sprites[0].CoordX, Sprites[0].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
Sprites[No3].SpriteA= SPR_addSprite(&Exemple1, Sprites[0].CoordX, Sprites[0].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
Sprites[No4].SpriteA= SPR_addSprite(&Exemple1, Sprites[0].CoordX, Sprites[0].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));

Ici, le Sprites[No1] aura le focus sur les 3 autres, le No2 sur les 2 suivants etc ...
On ne peut pas changer la priorité une fois la liste crée, enfin, je n'y suis jamais arrivé même avec l'aide de Stef.

Donc l'idée, est la suivante :
1/ Copier les données essentielles dans un tableau tampon.
2/ Détruire tous les sprites.
3/ Faire le tri Y
4/ Reconstruire la liste de sprite en tenant compte du tri.

On pourra faire appel à cette routine via une tempo programmable : Tempo 

Code:
   while(TRUE)
    {

        Tempo++;
        if (Tempo>30)
        {
            GestionSprite();
            Tempo=0;
        }


        // Affichage Sprite
        for(i=10;i--;)
        {
            RoutineAffichage(i);
        }

        SPR_update();
        VDP_waitVSync();
    }
}

Maintenant, on va voire notre routine :
Code:
void GestionSprite()
{

    u8 TamponID=0;
    fix16 TamponY;

    // Init Traitement
    for(i=0;i<9;i++)
    {
        // On détruit tous nos sprites.
        SPR_releaseSprite(Sprites[i].SpriteA);
        // Init Tableau Tampon
        SpritesTampon[i].ID=i;
        SpritesTampon[i].CoordY=Sprites[i].CoordY;
    }

    // On va effectué le tri Y des 4 premiers sprites
    for (i=0;i<5;i++)
    {
        for (j=i+1;j<5;j++)
        {
                if (SpritesTampon[j].CoordY>=SpritesTampon[i].CoordY)
                {
                    // ID
                    TamponID=SpritesTampon[i].ID;
                    SpritesTampon[i].ID=SpritesTampon[j].ID;
                    SpritesTampon[j].ID=TamponID;
                    // CoordY
                    TamponY=SpritesTampon[i].CoordY;
                    SpritesTampon[i].CoordY=SpritesTampon[j].CoordY;
                    SpritesTampon[j].CoordY=TamponY;
                }
        }
    }

    // Construction liste
    for (i=0;i<5;i++)
    {
        u8 IDZ=SpritesTampon[i].ID;
        if (IDZ==0) Sprites[IDZ].SpriteA= SPR_addSprite(&Exemple1, Sprites[0].CoordX, Sprites[0].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
        if (IDZ==1) Sprites[IDZ].SpriteA= SPR_addSprite(&Exemple2, Sprites[0].CoordX, Sprites[0].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
        if (IDZ>=2) Sprites[IDZ].SpriteA= SPR_addSprite(&Exemple3, Sprites[0].CoordX, Sprites[0].CoordY, TILE_ATTR(PAL2, TRUE, FALSE, FALSE));
    }

    //Ombres
    Sprites[5].SpriteA= SPR_addSprite(&OmbrePapi, Sprites[5].CoordX, Sprites[5].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
    Sprites[6].SpriteA= SPR_addSprite(&OmbrePapi, Sprites[5].CoordX, Sprites[5].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
    Sprites[7].SpriteA= SPR_addSprite(&OmbrePapi, Sprites[5].CoordX, Sprites[5].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
    Sprites[8].SpriteA= SPR_addSprite(&OmbrePapi, Sprites[5].CoordX, Sprites[5].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));

    SPR_update();
}

Dans le cadre de mon exemple, les 5 premiers sprites seront traités, les suivants sont les ombres, donc à afficher en tout dernier sans traitement.
On peut aussi tenir compte de la hauteur d'un sprite ou d'une autre donnée pour le traitement.

On utilise un tableau tampon SpritesTampon pour réaliser le traitement de liste.

Bon ici, cela touche un nombre réduit de sprite, j'ai eu la flemme de faire le test sur un nombre plus important, mais je pense que cela ne serait pas trop préjudiciable.
Il faut doser la tempo en fonction du nombre de sprite.

L'utilisation de pointeurs pourraient aussi faciliter la vitesse de traitement ... Je ne suis pas encore bien familiarisé avec ces concepts.

Le seul défaut, c'est que les animations sont initialisées à chaque appel de routine avec le Sprite Engine.
Il faudra sans doute passer par une gestion d'un plus bas niveau .. A moins que je me sois gouré quelque part ! Wink

Donc si la routine peut être améliorer, débugger, ou autre, n'hésitez pas à arranger ça.

Voici le projet complet en .zip
https://www.dropbox.com/s/c6mot08o6wl2kqw/Outil%20Sprite.zip?dl=0

Il y a quelques routines maisons concernant la gestion d'affichage, animation, Pathfinding IA, etc ...
Utile aussi pour les débutants ! Wink
J'en utilise quelques unes pour mon Papi Commando Tennis qui gère une trentaine d'éléments sans ralentissements.

A bientôt.
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 3778
Age : 45
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Tryphon le Ven 19 Mai 2017 - 0:25

Comment est défini ton SpritesTampon ? Je vois pas la déclaration.

C'est quoi exactement ta question ? Tu veux optimiser ça ? Y'a pas mal de choses accélérables mais ce n'est pas simple.

Tryphon
Guéri miraculeux

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

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Ven 19 Mai 2017 - 0:29

Tout est dans la source complète :
https://www.dropbox.com/s/c6mot08o6wl2kqw/Outil%20Sprite.zip?dl=0

Je ne pose aucune question, je propose une solution qui peut être certainement améliorée. Wink
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 3778
Age : 45
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Tryphon le Ven 19 Mai 2017 - 0:43

Ah OK.

Y'a plusieurs choses améliorables, mais c'est plus ou moins difficile et parfois on quitte le niveau débutant. J'ai pas trop le temps de m'y atteler pour l'instant mais si je code un jeu en vue de dessus je ferai un topo.

Ce qui me vient à l'esprit :

* l'algo de tri peut être amélioré (il est en n^2, ça veut dire que si tu doubles le nombre d'objets à trier, tu quadruples le temps de tri) ; mieux encore, vu qu'en général on ne fait que permuter deux objets, on doit pouvoir aller beaucoup plus vite en partant du tableau de la frame précédente

* SGDK utilise déjà une table de sprites en RAM, on doit pouvoir la modifier directement. De plus, on peut ne modifier que le link et ne pas toucher au reste ; mais je sais pas à quel point c'est facile en utilisant le Sprite Engine (je ne m'en sers pas)

* y'a des optimisations au niveau code : par exemple c'est plus rapide d'avoir un pointeur sur l'objet courant d'un tableau plutôt que d'accéder à un élément par tableau[i]

Mais tant que ça marche, laisse comme ça Very Happy

Tryphon
Guéri miraculeux

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

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Tryphon le Ven 19 Mai 2017 - 0:49

Par contre, je me permets juste de rebondir sur ça :

@Vetea a écrit:et à ce propos, ce sont surtout les débutant qui osent poster, à méditer.

Je pense que c'est plutôt une question de temps Wink

Tryphon
Guéri miraculeux

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

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Ven 19 Mai 2017 - 10:12

@Tryphon a écrit:
* SGDK utilise déjà une table de sprites en RAM, on doit pouvoir la modifier directement. De plus, on peut ne modifier que le link et ne pas toucher au reste ; mais je sais pas à quel point c'est facile en utilisant le Sprite Engine (je ne m'en sers pas)

* y'a des optimisations au niveau code : par exemple c'est plus rapide d'avoir un pointeur sur l'objet courant d'un tableau plutôt que d'accéder à un élément par tableau[i]

Coucou,

* Ah ça serait trop cool de pouvoir modifier la priorité d'ordre d'affichage en modifiant juste la table sans avoir à {détruire - reconstruire} !!
Je tâcherai de tester tout ça, quitte à refaire une version 2.0 après ! Wink

* Ouiiii le pointeur sur un tableau est plus rapide !! Mais j'ai encore mes habitudes "Basic" ... ^^
D'autant plus qu'en ASM, tu utilise les pointeurs d'adresse sans t'en rendre compte. Wink
Bref, une gymnastique à prendre encore. :)
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 3778
Age : 45
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par TOUKO le Ven 19 Mai 2017 - 10:32

Vous pourrez voir dans cette petite vidéo, ce que cela donne.
Ici, le calcul se fait toutes les 30 frames.
Perso je trouve le rendu très bon  Wink
J'aurai jamais cru avec 30 frames de délai .

je pense que ça:
2/ Détruire tous les sprites.
C'est inutile, vu que tu le fais lors de la reconstruction de la liste .
Sinon comme le dit tryphon, la MD dispose d'un atout pour les priorités, le link et je pense qu'il faut absolument l'utiliser, car il est fait pour ça .
avatar
TOUKO
Docteur *
Docteur *

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

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Ven 19 Mai 2017 - 11:08

Merci Touko !! Wink

En fait, j'ai réglé la tempo en fonction du rafraichissement des animations ( mécanique du Sprite Engine et sa méthode en "Streaming" ).

Et non, tu dois détruire tes sprites car à la reconstruction d'une nouvelle, ils sont ajoutés à l'ancienne !

Avec SgdK tu peux jouer avec les priorités Sprites/BG oui, sans aucun soucis !!
Mais concernant les priorités entre Sprite, je ne crois pas que le Sprite Engine ne le permette dixit Stef suite à nos conversations en privé à ce sujet.
Mais vraiment, ça serait GENIAL de pouvoir le faire en jouant juste avec le LINK via l'instruction :


u16 SPR_setSpriteTableIndex (Sprite *sprite, s16 value)
 Set the VDP sprite index to use for this sprite. 


A moins que l'on utilise :

void VDP_setSpriteLink (u16 index, u8 link)
 Set sprite link (use sprite list cache). 
VDPSprite * VDP_linkSprites (u16 index, u16 num)
 Link sprites starting at the specified index.
Links are created in simple ascending order (1 --> 2 --> 3 --> ...) 
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 3778
Age : 45
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par TOUKO le Ven 19 Mai 2017 - 11:52

Et non, tu dois détruire tes sprites car à la reconstruction d'une nouvelle, ils sont ajoutés à l'ancienne !
Ah c'est une limite du sprite engine alors !!
C'est bizarre que tu puisses pas lui donner un index de début de table  Confused
et avec spr_set() qui je pense est faite pour modifier un sprite en particulier(donc se positionner dans la table), y'a pas moyen ??
avatar
TOUKO
Docteur *
Docteur *

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

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Tryphon le Ven 19 Mai 2017 - 14:15

Non, c'est pas si bizarre. Un sprite du Sprite Engine, ça peut être formé par plusieurs sprites "hard". La routine update du sprite engine recrée certainement la SAT de 0 à chaque fois, donc l'utilisation du link n'est pas pertinente ici.

Faudrait clairement développer son propre gestionnaire de sprites "hard" (donc limité à 32x32) pour tirer partie du link, ou alors son propre Sprite Engine dans lequel la liste des sprites ne varierait pas d'une frame à l'autre, ce qui provoquerait pas mal de contraintes (toutes les frames d'animation auraient la même taille).

C'est un problème intéressant.

Tryphon
Guéri miraculeux

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

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Hpman le Ven 19 Mai 2017 - 14:37

Si le SE refait la sprite table à chaque frame, on doit pouvoir faire un Z-order en manipulant la table activeSprites et les status flag des sprites non ?

Hpman
Patient en incubation

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

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Ven 19 Mai 2017 - 16:22

On attend les conseils de Stef !! Wink
En tout cas, discussion intéressante.
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 3778
Age : 45
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Stef le Ven 19 Mai 2017 - 17:28

Merci Vetea d'avoir partagé ton code :) En effet il n'y a psa encore de fonction dans le Sprite Engine de SGDK pour trier facilement les sprites sur le Y order, ce qui est dommage car c'est quelque chose qu'on souhaite souvent avoir... Ta méthode, même si elle n'est pas la plus rapide a le mérite de fonctionner et d'autres pourront en profiter, surtout que ce n'est pas un truc vraiment trivial !


Sinon oui SGDK utilise déjà une table de pointer pour les sprites en interne, justement en prévisoin de permettre le tri (et Y sorting en autre). Dans sprite_eng.c on a ça :



Code:
// active sprites list, we use an array of pointer to allow sorting
// [0..(visibleSpriteNum-1)] = visible sprites
// [visibleSpriteNum..(spriteNum-1)] = not visible sprites
Sprite **activeSprites;
// number of active sprite
u16 spriteNum;


Je les ai pas mis en static pour qu'on puisse y accéder directement de l'extérieur. Mais en réalité ce n'est pas si simple : si on modifie l'ordre de la liste il faut également veiller à reconstruire correctement les champs link entre les différents sprites (en s'inspirant de ce que fait la méthode SPR_release(..) qui doit refaire les liens après la suppression d'un sprite).
Aussi j'ai ajouté une méthode générique de comparaison type quicksort dans SGDK il y a peu :


Code:
void qsort(void** data, u16 len, _comparatorCallback* cb);



Avec un callback pour définir la méthode de tri. Alors c'est très pratique mais c'est tout sauf quicksort MDR
Faudrait que j'utilise un autre algo que quicksort qui peut être terriblement long dans le cas d'une liste quasiment déjà triée par exemple (ce qui est un comble) ^^
J'espère ajouter une vrai fonctionnalité de tri des sprites dans la prochaine version de SGDK avec même peut être un Y sorting activable de base.

Edit:
Je n'avais pas lu tout les messages mais je complète donc..
L'ancien Sprite Engine reconstruisait la SAT à chaque SPR_update(..), ce n'est plus le cas avec le nouveau SE qui tente de la reconstruire partiellement ou quand c'est nécessaire. Du coup le link peut être utilisé mais bien sûr vu que le SE permet l'utilisation de meta sprite on doit modifier le link du dernier hard sprite du meta sprite (j'ai un pointeur interne qui va directement dessus). En regardant le code de SPR_release(..) on peut mieux comprendre comment ça fonctionne mais ce n'est pas toujours très trivial. Je trouve le code du SE assez complexe (et donc lourd) pourtant je l'ai déjà réécrit une fois pour essayer de le garder assez simple :-(
avatar
Stef
Infirmier

Masculin Nombre de messages : 3305
Age : 37
Localisation : Sevres
Date d'inscription : 04/04/2007

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Hpman le Ven 19 Mai 2017 - 18:52

Y'a un papier quelque part qui explique comment tourne SE ou faut se farcir tout le code?  study

Hpman
Patient en incubation

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

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Ven 19 Mai 2017 - 19:36

Merci Stef pour ces précisions. amoureux
Ma méthode va être améliorée avec l'ul'utilisation de pointeur sur mes tableaux pour un traitement plus rapide.
Le seul gros hic, c'est que les animations sont resetées a chaque fois, le streaming est réinitialisé. 
Une fois que j'aurai résolu ça, j'aurai ma routine maison pleinement fonctionnelle. Very Happy
Je pourrai ll'utiliser sur Papi Tennis et d'autres futurs projets. Wink

Le principal, cc'est que le concept de base fonctionne !!
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 3778
Age : 45
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Ven 19 Mai 2017 - 22:35

Coucou,

Voila, j'ai utilisé mes jolis pointeurs associés à mes tableaux ( qui sont des structures ! ), avec un peu de difficulté pour lancer la machine cérébrale ... 
Le déclic est venu grâce à mes souvenirs en ASM avec l'utilisation des pointeurs d'adresses a0-a7 que j'avais pu faire.

Bref, ça fonctionne !! Very Happy

Code:
void GestionSprite()
{

    u8 TamponID=0;
    fix16 TamponY;
    u8 *id=&SpritesTampon[0].ID;
    fix16 *CY=&SpritesTampon[0].CoordY;

    // Init Traitement
    for(i=0;i<9;i++)
    {
        // On détruit tous nos sprites.
        SPR_releaseSprite(Sprites[i].SpriteA);
        // Init Tableau Tampon
        *(id+i)=i;
        *(CY+i)=Sprites[i].CoordY;
    }

    // On va effectué le tri Y des 4 premiers sprites
    for (i=0;i<5;i++)
    {
        for (j=i+1;j<5;j++)
        {
                if (*(CY+j)>=*(CY+i))
                {
                    // ID
                    TamponID=*(id+i);
                    *(id+i)=*(id+j);
                    *(id+j)=TamponID;
                    // CoordY
                    TamponY=*(CY+i);
                    *(CY+i)=*(CY+j);
                    *(CY+j)=TamponY;
                }
        }
    }

    // Construction liste
    for (i=0;i<5;i++)
    {
        u8 IDZ=*(id+i);
        if (IDZ==0) Sprites[IDZ].SpriteA= SPR_addSprite(&Exemple1, Sprites[0].CoordX, Sprites[0].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
        if (IDZ==1) Sprites[IDZ].SpriteA= SPR_addSprite(&Exemple2, Sprites[0].CoordX, Sprites[0].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
        if (IDZ>=2) Sprites[IDZ].SpriteA= SPR_addSprite(&Exemple3, Sprites[0].CoordX, Sprites[0].CoordY, TILE_ATTR(PAL2, TRUE, FALSE, FALSE));
    }

    //Ombres
    Sprites[5].SpriteA= SPR_addSprite(&OmbrePapi, Sprites[5].CoordX, Sprites[5].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
    Sprites[6].SpriteA= SPR_addSprite(&OmbrePapi, Sprites[5].CoordX, Sprites[5].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
    Sprites[7].SpriteA= SPR_addSprite(&OmbrePapi, Sprites[5].CoordX, Sprites[5].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));
    Sprites[8].SpriteA= SPR_addSprite(&OmbrePapi, Sprites[5].CoordX, Sprites[5].CoordY, TILE_ATTR(PAL1, TRUE, FALSE, FALSE));

}

Je suis carrément heureux d'avoir pu utiliser mes premiers pointeurs sur ce format là ! Very Happy
Si j'ai fait une grosse connerie, n'hésitez pas à me corriger. Wink

Par contre, je n'ai toujours pas résolu ce problème d'initialisation d'animation.
Si la tempo de traitement est faible, on se retrouve avec des sprites pratiquement sans animation !  MDR MDR 

Je crains qu'avec cette routine, il me faille utiliser les routines sprites de bas niveau ... Sad
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 3778
Age : 45
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par TOUKO le Sam 20 Mai 2017 - 11:31

Tu fais aussi du tri sur les ombres ??
avatar
TOUKO
Docteur *
Docteur *

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

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Sam 20 Mai 2017 - 11:36

Nonnnn !! Very Happy 
Si tu regardes bien le code, je ne traite que les éléments nécessitant le traitement.
Les ombres ne sont pas traitées, et leur liste est crée en dernier. Wink
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 3778
Age : 45
Localisation : Baillargues
Date d'inscription : 22/06/2012

http://www.rolango.fr/

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

Message par TOUKO le Sam 20 Mai 2017 - 12:11

ok, parce que je voyais pas l'intérêt visuellement parlant, mais apparemment toi non plus  Very Happy
avatar
TOUKO
Docteur *
Docteur *

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

Revenir en haut Aller en bas

Re: SgdK Megadrive - Démo d'une gestion de YOrder

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