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

Page 3 sur 5 Précédent  1, 2, 3, 4, 5  Suivant

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

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

Message par TOUKO le Mar 30 Mai 2017 - 19:09

Mr. Green
bon même si ça ramouille un peu, tu vois ça n'a pas explosé, et je suis sur qu'avec un peu d'optimisation tu peux rendre tout ça bien fluide .
Wink

Bon je m'incline, vetea est trop fort   Razz

Pour la peine, je te donne jusqu'à Noel pour finir le jeu de Baston de la mort qui tue même Paprium : Chuck No Rice !!
Lol, paprium ça m'étonnerait fort mais moi oui il me tue  Mr. Green

Hey !! It's done Touko !! 
You're welcome man  cheers

TOUKO
Docteur *
Docteur *

Nombre de messages : 11754
Date d'inscription : 08/07/2010

Revenir en haut Aller en bas

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

Message par philip le Mar 30 Mai 2017 - 19:20

@TOUKO a écrit:Mr. Green
bon même si ça ramouille un peu, tu vois ça n'a pas explosé, et je suis sur qu'avec un peu d'optimisation tu peux rendre tout ça bien fluide .
Wink

Bon je m'incline, vetea est trop fort   Razz

Pour la peine, je te donne jusqu'à Noel pour finir le jeu de Baston de la mort qui tue même Paprium : Chuck No Rice !!
Lol, paprium ça m'étonnerait fort mais moi oui il me tue  Mr. Green
C'est là une véritable démonstration de la puissance de traitement des sprites du vdp. Même la neo geo serait à la peine d'afficher tout ses personnages, et chacun avec leur ombre... sans de très sévères ralentissements.
Chapeau bas Vetea. thumleft
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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Hpman le Mar 30 Mai 2017 - 19:21

@TOUKO a écrit:
@Tryphon a écrit:Shocked T'as des haters ?
Ouai, hpman qui est jaloux de pas faire pareil sur NG  Mr. Green

Jeune insolent, saches qu'on ne se moque pas impunément de la glorieuse reine des 16!


Du haut de cette vidéo, 12Mhz vous contemplent.

Ici on se respecte, il y a un standing. On Z-order l'ensemble des sprites à chaque frame.
Ici on sait se tenir, on ne clignotte pas, on ne rame pas du boule.
J'en ai aussi profité pour remanier un peu le code à mon gout, ici les fonctions qui se pointent en baskets et cheveux long ne rentrent pas.

Votre culte de cette megadrive impie et son faux prophète le VDP touche à sa fin, tremblez mortels.
Rejoignez la NeoGeo et son LSPC, il n'est pas trop tard pour sauvez votre âme!

(Bon, ou est-ce que j'ai foutu mes cachets moi?...)

Code:
//#include <stdio.h>
//#include <stdlib.h>
#include <input.h>
#include <DATlib.h>
#include "externs.h"

typedef struct pseudoFloat_parts {
 short integer;
 ushort decimal;
} pseudoFloat_parts;

union pseudoFloat_ {
 int raw;
 pseudoFloat_parts parts;
};

typedef union pseudoFloat_ pseudoFloat;


void spawnSoldier(short,short,uint);

#define UP 1
#define DOWN 2
#define LEFT 4
#define RIGHT 8

uchar Langue=0;
uchar value=0;
ushort Systeme=0;
uchar MemDirection=0;
uchar VitesseScrolling=0;
uchar MaxSprite=0;
uchar CurrentSprite=0;
uchar i=0;
uchar j=0;
ushort ind=0;//TILE_USERINDEX;
char Texte[64];

/* Variables Fonction RND */
ushort RND[10];
pseudoFloat RNDfloat[10];
ushort RNDCount;
ushort randbase;

/* Déclaration des Sprites Commun*/
typedef struct Sprite_ {
 aSprite as;
 struct Sprite_ *shadow;
 ushort priority;
 //Sprite* SpriteA;
 uchar Block;
 uchar BlockH;
 uchar BlockB;
 uchar BlockD;
 uchar BlockG;
 uchar Ready;
 uchar Coup;
 uchar Init;
 uchar TypeShoot;
 uchar Shoot;
 pseudoFloat LongueurCoup;
 pseudoFloat LongueurCoupM;
 pseudoFloat CoordX;
 pseudoFloat CoordY;
 pseudoFloat TamponY;
 ushort TempoSprite;
 ushort TempoSpriteMax;
 ushort TempoCoup;
 ushort TempoCoupMax;
 pseudoFloat OffsetX;
 pseudoFloat OffsetY;
 pseudoFloat Velocity;
 pseudoFloat Vitesse;
 pseudoFloat VitesseD;
 pseudoFloat VitesseSprintD;
 pseudoFloat Distance;
 uchar Sprint;
 uchar Animation;
 pseudoFloat VitesseInit;
 pseudoFloat VitesseSprint;
 uchar Priority;
 uchar Count;
 uchar ID;
 uchar IDZ;
 pseudoFloat Lift;
 uchar Tampon;
 short Sens;         // 1 - Bas en Haut, 2 - Haut en bas
 uchar StandBy; //1 : Non visible, 0:Visible
 uchar Direction;    //8 : H, 2: B, 4:G, 6:D  - 84 : HG, 86:HD, 24:BG, 26:BD  44 : Latéral Gauche 66 Latéral Droite
} Sprite_;

#define MAX_OBJS 100

ushort objCount;
Sprite_ Sprites[MAX_OBJS];
Sprite_ papi;
Sprite_ MemPos;


#define drawListInsert(obj) do{*drawListPtr++=(obj);*drawListPtr=0;}while(0)
#define soldiersInsert(obj) do{*soldiersPtr++=(obj);*soldiersPtr=0;}while(0)

Sprite_* soldiers[MAX_OBJS+1];
Sprite_** soldiersPtr;
Sprite_* freeSprites[MAX_OBJS];
Sprite_** freeSpritesPtr;

spritePool drawPool;
aSprite* drawList[MAX_OBJS];
aSprite** drawListPtr;


ushort rdm_idx;

void setRandomSeed(ushort seed) {
 randbase=seed^0xD94B;
 rdm_idx=0;
}

ushort random() {
    randbase ^= (randbase >> 1) ^ volMEMWORD(0xc04200+rdm_idx);
    randbase ^= (randbase << 1);

 rdm_idx=(rdm_idx+2)&0xff;
    return randbase;
}

///////////////////////////////////////
//               COMPTEUR RANDOMIZE            /
//////////////////////////////////////
void RandomizeCounter() {
 RNDCount=++RNDCount&0xfff;
}

///////////////////////////////////////////
//           Fonction principale RANDOMIZE          /
///////////////////////////////////////////
// i = ID Variable,
// Ech = Echelle d'intervalle,
// Flo = Est ce que ca sera un nombre flottant ?,
// Div = Echelle de division lors du calcul du nombre flottant
void Randomize(uchar i,ushort Ech,uchar Flo,uchar Div) {
 do {
 //setRandomSeed(RNDCount);
 RND[i]=random() & (Ech-1);
 if (Flo==1)
 {
 RNDfloat[i].parts.integer=RND[i];
 RNDfloat[i].raw>>=Div;
 }
 } while(RND[i]<1);
}

uchar randomDirection() {
 uchar dir;
 
 RandomizeCounter();
 Randomize(0,9,0,0);
 dir=RND[0]+1;

 dir=random()&0xf;
 if(dir<0xf) dir++;
 
 if(dir&DOWN) dir&=0xe; //clear up bit
 if(dir&LEFT) dir&=0x7; //clear right bit

 return dir;
}


void GestionPAD()
{
 value=volMEMBYTE(P1_CURRENT);
 
    if((value&0x0f)==0) {
 papi.Direction=0;
 aSpriteSetAnim((aSprite*)&papi,((MemDirection&0x8)?(MemDirection^0xc):(MemDirection&0x07))+7);
 } else {
 papi.Direction=(value&0x0f);
 MemDirection=papi.Direction;
 aSpriteSetAnim((aSprite*)&papi,((papi.Direction&0x8)?(papi.Direction^0xc):(papi.Direction&0x07))-1);
 aSpriteSetFlip((aSprite*)&papi,(papi.Direction&0x08)?FLIP_X:FLIP_NONE);
 }
 
 if(volMEMBYTE(P1_EDGE)&JOY_A) spawnSoldier(papi.CoordX.parts.integer,papi.CoordY.parts.integer,0x8000);
}

void RoutineAffichage()
{
    // Gestion Déplacement Sprite //
 Sprite_ *spr,**ptr;

 //papi
 spr=&papi;
 if(spr->Direction&UP) spr->CoordY.raw-=spr->Vitesse.raw;
 if(spr->Direction&DOWN) spr->CoordY.raw+=spr->Vitesse.raw;
 if(spr->Direction&LEFT) spr->CoordX.raw-=spr->Vitesse.raw;
 if(spr->Direction&RIGHT)spr->CoordX.raw+=spr->Vitesse.raw;
 
 ((aSprite*)spr)->posX=((aSprite*)spr->shadow)->posX=spr->CoordX.parts.integer;
 spr->priority=((aSprite*)spr)->posY=((aSprite*)spr->shadow)->posY=spr->CoordY.parts.integer;
 
 //soldiers
 ptr=&soldiers[0];
 spr=*ptr++;
 while(spr) {
 if(spr->Direction&UP) spr->CoordY.raw-=spr->Vitesse.raw;
 if(spr->Direction&DOWN) spr->CoordY.raw+=spr->Vitesse.raw;
 if(spr->Direction&LEFT) spr->CoordX.raw-=spr->Vitesse.raw;
 if(spr->Direction&RIGHT)spr->CoordX.raw+=spr->Vitesse.raw;
 
 ((aSprite*)spr)->posX=((aSprite*)spr->shadow)->posX=spr->CoordX.parts.integer;
 spr->priority=((aSprite*)spr)->posY=((aSprite*)spr->shadow)->posY=spr->CoordY.parts.integer;
 
 //fixPrintf2(0,2,0,0,"%02x %08x-%08x",spr->Direction,spr->CoordX.raw,spr->CoordY.raw);
 
 spr->BlockB=0;
 spr->BlockH=0;
 spr->BlockG=0;
 spr->BlockD=0;
 
 spr=*ptr++;
 }
}

void PathIA() {
 Sprite_ *spr,**ptr;
 //soldiers
 ptr=&soldiers[0];
 spr=*ptr++;
 while(spr) {
 if (++spr->TempoSprite>spr->TempoSpriteMax) {
 spr->Direction=randomDirection();
 //update animation/flip
 aSpriteSetAnim((aSprite*)spr,((spr->Direction&0x8)?(spr->Direction^0xc):(spr->Direction&0x07))-1);
 aSpriteSetFlip((aSprite*)spr,(spr->Direction&0x08)?FLIP_X:FLIP_NONE);
 
 // Init Tempo
 spr->TempoSprite=0;
 spr->Block=0;
 }
 
 //test limites
 if((spr->CoordX.raw<0x50000)||(spr->CoordX.raw>0x12c0000)) { //5 - 300
 spr->Direction^=0xc;
 aSpriteSetAnim((aSprite*)spr,((spr->Direction&0x8)?(spr->Direction^0xc):(spr->Direction&0x07))-1);
 aSpriteSetFlip((aSprite*)spr,(spr->Direction&0x08)?FLIP_X:FLIP_NONE);
 }
 
 if((spr->CoordY.raw<0x140000)||(spr->CoordY.raw>0xdc0000)) { //20 - 220
 spr->Direction^=0x3;
 aSpriteSetAnim((aSprite*)spr,((spr->Direction&0x8)?(spr->Direction^0xc):(spr->Direction&0x07))-1);
 aSpriteSetFlip((aSprite*)spr,(spr->Direction&0x08)?FLIP_X:FLIP_NONE);
 }

 spr=*ptr++;
 }
}

void spawnSoldier(short posX,short posY,uint pf_speed) {
 Sprite_ *spr,*shdw;
 
 //spawn shadow
 shdw=*--freeSpritesPtr;
 drawListInsert((aSprite*)shdw);
 aSpriteInit((aSprite*)shdw,&PC_shadow,1,19,posX,posY,0,FLIP_NONE);
 shdw->priority=0;
 
 //spawn soldier
 spr=*--freeSpritesPtr;
 soldiersInsert(spr);
 drawListInsert((aSprite*)spr);
 
 spr->shadow=shdw;
 spr->priority=posY;
 spr->Vitesse.raw=pf_speed;
 spr->Direction=randomDirection();
 spr->CoordX.raw=posX<<16;
 spr->CoordY.raw=posY<<16;
    spr->TempoSpriteMax=(random()&0xff)+150; //150 - 405
 spr->TempoSprite=0;
 aSpriteInit((aSprite*)spr,&PC_soldat,1,18,posX,posY,((spr->Direction&0x8)?(spr->Direction^0xc):(spr->Direction&0x07))-1,(spr->Direction&0x08)?FLIP_X:FLIP_NONE);
 
 objCount++;
}

void sortDrawList(Sprite_ *list[], short count) {
 //insertion sort
 ushort x,y;
 Sprite_ *tmp;
 
 for(x=1;x<count;x++) {
 y=x;
 while(y>0 && (list[y]->priority < list[y-1]->priority)) {
 tmp=list[y];
 list[y]=list[y-1];
 list[--y]=tmp;
 }
 }
}

void main() {
 int x;
 picture BG;

 
 initGfx();
 clearFixLayer();
 jobMeterSetup(true);
 
 MemDirection=1;
 
 pictureInit(&BG,&PC_background,1,16,0,-8,FLIP_NONE);
 palJobPut(16,PC_background_Palettes.palCount,PC_background_Palettes.data);

 palJobPut(17,PC_papi_Palettes.palCount,PC_papi_Palettes.data);
 palJobPut(18,PC_soldat_Palettes.palCount,PC_soldat_Palettes.data);
 palJobPut(19,PC_shadow_Palettes.palCount,PC_shadow_Palettes.data);
 palJobPut(14,fix_sfz3font_Palettes.palCount,&fix_sfz3font_Palettes.data);
 
 spritePoolInit(&drawPool,30,350);
 
 
 drawListPtr=&drawList[0];
 *drawListPtr++=0; //1st item always 0
 *drawListPtr=0; //current end marker

 soldiersPtr=&soldiers[0];
 *soldiersPtr=0;

 freeSpritesPtr=&freeSprites[0];
 for(x=0;x<MAX_OBJS;x++)
 *freeSpritesPtr++=(Sprite_*)&Sprites[x];

 //spawn papi+shadow
 papi.Direction=0;
 papi.CoordX.raw=papi.CoordY.raw=0;
 papi.CoordX.parts.integer=150;
 papi.CoordY.parts.integer=100;
 papi.Vitesse.raw=0xd999;

 papi.shadow=*--freeSpritesPtr;
 drawListInsert((aSprite*)papi.shadow);
 aSpriteInit((aSprite*)papi.shadow,&PC_shadow,1,19,papi.CoordX.parts.integer,papi.CoordY.parts.integer,0,FLIP_NONE);
 papi.shadow->priority=0;
 
 aSpriteInit((aSprite*)&papi,&PC_papi,1,17,papi.CoordX.parts.integer,papi.CoordY.parts.integer,0,FLIP_NONE);
 drawListInsert((aSprite*)&papi);
 
 setRandomSeed(0x43e5);
 
 objCount=0;
 for(x=0;x<16;x++) { //spawn n soldiers
 spawnSoldier(
 5+(random()&0xff)+(random()&0x1f), //x:5-291
 20+(random()&0x7f)+(random()&0x3f), //y:20-210
 0x8000); //speed: 0.5
 }


 SCClose();
 while(1) {
 waitVBlank();
 while((volMEMWORD(0x3c0006)>>7)!=0x118); //wait raster line 8
 
 jobMeterColor(JOB_LIGHTBLUE);

 RandomizeCounter();
 GestionPAD();
 
 jobMeterColor(JOB_BLUE);
 PathIA();
 jobMeterColor(JOB_DARKBLUE);
 RoutineAffichage();

 //sprites Z-sort
 jobMeterColor(JOB_PURPLE);
 sortDrawList((Sprite_**)&drawList[1], drawListPtr-&drawList[1]);

 //draw main list into sprite pool
 jobMeterColor(JOB_BLACK);
 if(drawPool.way==WAY_UP)
 spritePoolDrawList(&drawPool,&drawList[1]);
 else spritePoolDrawList(&drawPool,drawListPtr);
 spritePoolClose(&drawPool);

 jobMeterColor(JOB_GREEN);
 fixPrintf2(0,30,14,3,"Entites: %d",objCount);
 SCClose();
 }
}

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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Mar 30 Mai 2017 - 19:27

Mouahaha !!  Mr. Green Mr. Green
GG Hpman ! Wink

Je comprends RienGG à ton code, mais merci pour le partage !
J'ai un seul hic :
Ou est passé la détection de collision entre les sprites ?? Sur ta vidéo ils se rentrent dedans ! Allez au boulot !  rambo rambo
( Ah oui, et 4 types d'unités à traiter aussi ! Wink )

@Philip
Merci beaucoup ! 
Mais Je pense que je peux améliorer l'optimisation .. Le problème, c'est que je suis obligé de détruire et reconstruire une nouvelle liste en utilisant le Sprite Engine.
Avec moins de 30 sprites, ça passe nickel par contre !

Après la Neo Geo, c'est pas comparable avec une MD quand même, faut se calmer !! Wink

On attend par contre la même chose sur SNES ... AlekMaul ?? Ou est tu mon petit ?? Wink
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4105
Age : 46
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 Mar 30 Mai 2017 - 19:31

Du haut de cette vidéo, 12Mhz vous contemplent.

Ici on se respecte, il y a un standing. On Z-order l'ensemble des sprites à chaque frame.
Ici on sait se tenir, on ne clignotte pas, on ne rame pas du boule.
J'en ai aussi profité pour remanier un peu le code à mon gout, ici les fonctions qui se pointent en baskets et cheveux long ne rentrent pas.
MDR ,j'adore ..
Je pensais pas que finalement tu réagirais avec une démo, mais belle réaction finalement Wink  
bon en même temps la NG n'est pas la rolls pour des clopinettes hein !!

Ah oui, et 4 types d'unités à traiter aussi !  
Euh lui il anime 44 sprites réels donc 88 si tu comptes les ombres 


Dernière édition par TOUKO le Mar 30 Mai 2017 - 19:38, édité 1 fois
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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Hpman le Mar 30 Mai 2017 - 19:37

@Vetea a écrit:Mouahaha !!  Mr. Green Mr. Green
GG Hpman ! Wink

Je comprends RienGG à ton code, mais merci pour le partage !
J'ai un seul hic :
Ou est passé la détection de collision entre les sprites ?? Sur ta vidéo ils se rentrent dedans ! Allez au boulot !  rambo rambo
( Ah oui, et 4 types d'unités à traiter aussi ! Wink )

J'avoue j'ai pas trop bité la logique de la fonction (manque un bout à l'exterieur non ?), j'ai pas trop creuse, tout façon vu le monde, vont plus bouger après Mr. Green.

Pour les types d'unité bah j'ai pas les spritesheet. saispas
Ça change absolument rien niveau performance de toute façon, la bécane est no limit niveau tiles.

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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par TOUKO le Mar 30 Mai 2017 - 19:39

On dirait une fourmilière  Very Happy
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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Mar 30 Mai 2017 - 19:40

... Surtout que l'on sent la personne qui maitrise mieux le C que moi ! Wink
( Ca fait même pas 6 mois que je m'y suis mis. )

Mais bon, je réagissais surtout à une attaque du Bandido des prairies. Wink
Sacré vieux Brigand va !  Razz Razz

Pour la peine, tu me payes l'apéro Pastaga l'ami ( et avec des olives s'il te plait !! ) Very Happy
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4105
Age : 46
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 Mar 30 Mai 2017 - 19:43

t'inquiètes vetea,c'est pour déconner, et puis des fois c'est le genre de conneries qui te font optimiser ton code plus que ce que tu aurais fait en temps normal, donc tout bénéf .

La NG est un monstre niveau sprite, par contre si tu veux calmer hpman pour de bon, fais lui afficher 1 seul polygone en temps réel,on verra si il fait le malin  Razz


Dernière édition par TOUKO le Mar 30 Mai 2017 - 19:45, édité 1 fois
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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Hpman le Mar 30 Mai 2017 - 19:43

Jsuis à sec, j'ai craqué le PEL pour acheter fatal fury 2.  What a Face

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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par TOUKO le Mar 30 Mai 2017 - 19:46

@Hpman a écrit:Jsuis à sec, j'ai craqué le PEL pour acheter fatal fury 2.  What a Face
Sérieux ??
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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Mar 30 Mai 2017 - 19:47

@TOUKO a écrit:t'inquiètes vetea,c'est pour déconner, et puis des fois c'est le genre de conneries qui te font optimiser ton code plus que ce que tu aurais fait en temps normal, donc tout bénéf .

La NG est un monstre niveau sprite, par contre si tu veux calmer hpman pour de bon, fais lui afficher 1 seul polygone en temps réel,on verra si il fait le malin  Razz

Meuh oui, ne t'en fait pas copainG ! Wink

Du Poly ??
J'sais pas faire encore !!  Mr. Green
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4105
Age : 46
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 Mar 30 Mai 2017 - 19:48

J'sais pas faire encore !!  
Même un truc ultra moisi ça marche .
Et en plus sgdk a des fonctions pour ça je crois .
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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Mar 30 Mai 2017 - 19:51

Même sur PC, je n'ai jamais touché à la 3D.
En fait, je n'ai jamais aimé ça .. Mon truc, c'est plus de la 2D. Wink
On fait tellement de truc sympa ... Après, si c'est pour un concours de Kekette, j'ai pas besoin de Test Poly hein !  Mr. Green Mr. Green Mr. Green
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4105
Age : 46
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 Hpman le Mar 30 Mai 2017 - 19:53

@TOUKO a écrit:
@Hpman a écrit:Jsuis à sec, j'ai craqué le PEL pour acheter fatal fury 2.  What a Face
Sérieux ??

Non c'est une vanne par rapport aux prix fous sur la machine. smile
Surtout que fatal 2 ça vaut peanuts.


Des poly sur NG c'est possible avec une cartouche custom incorporant un framebuffer. Comme un jeu neo mais en beaucoup plus cher quoi.  lol!

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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par alekmaul le Mar 30 Mai 2017 - 21:17

@Hpman a écrit:
Du haut de cette vidéo, 12Mhz vous contemplent.

Ici on se respecte, il y a un standing. On Z-order l'ensemble des sprites à chaque frame.
Ici on sait se tenir, on ne clignotte pas, on ne rame pas du boule.
J'en ai aussi profité pour remanier un peu le code à mon gout, ici les fonctions qui se pointent en baskets et cheveux long ne rentrent pas.

Votre culte de cette megadrive impie et son faux prophète le VDP touche à sa fin, tremblez mortels.
Rejoignez la NeoGeo et son LSPC, il n'est pas trop tard pour sauvez votre âme!
J'adore amoureux
Seul Gamopat propose ce genre de délire de discours .... chapeau bas  sunglass
Bon, avec ma petite b... SNES, je pense pas pouvoir rivaliser mais je travaille sur le code pour montrer ce que l'on peut faire. C'est surtout la limite de transfert vers la VRAM qui me fait peur ... avec des sprites de 32x32 ...

alekmaul
Patient contaminé

Masculin Nombre de messages : 387
Age : 50
Localisation : Blois
Date d'inscription : 02/11/2014

Revenir en haut Aller en bas

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

Message par Vetea le Mar 30 Mai 2017 - 21:57

Purée, la vache, il est dur à comprendre ton copde HpMan ... 

J'essais quand même de comprendre, car tu maitrises les pointeurs.
Euh .. Kezako :

Code:
 //soldiers[size=12][/size]
 ptr=&soldiers[0];[size=12][/size]
 spr=*ptr++;

Car la tu pointes sur un Tableau avec ptr ( la je comprends ! )
Mais après, euh ... spr va contenir l'adresse de ptr qui est &soldiers[0], mais kezako ce "++" ?

Et ça :
Code:
randbase ^= (randbase >> 1) ^ volMEMWORD(0xc04200+rdm_idx);

Kezako ce "^" ? Ca veut dire puissance normalement.
Donc randbase = randbase à la puissance randbase>>1 puissance les machins à coté ?
Euh ... 

Code:
Sprite_ *spr,**ptr;

??

Bon j'arrête là.
C'est vraiment pas lisible pour un gars comme moi. Wink
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4105
Age : 46
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 Mar 30 Mai 2017 - 22:15

^ en C, c'est le "ou exclusif"

C'est une opération qui s'effectue bit à bit. Sur un seul bit, ça donne a ^ b = 1 si a ou b vaut 1 mais pas les deux en même temps.

Exemple : 0xCA ^ 0x69 = 0xA3 car :

Code:
  11001010
^ 01101001
------------
  10100011

Cela dit, je ne comprends pas davantage son rand, mais je suppose que ça fait appel à des trucs neogeoesques.

Concernant le ++, ça par contre ça vaut la peine que tu le maîtrises. C'est l'opération d'incrémentation (post-incrémentation plus précisément ici).

Si i = 10 et que tu tapes :
Code:
a = i++;
alors a = 10 et i = 11
Par contre si tu tapes (pré-incrémentation) :
Code:
a = ++i;
alors i = 11 et a = 11 aussi.

La force de ce schmurtz est que c'est particulièrement puissant avec un pointeur : si ptr est un pointeur sur une structure S (donc ptr contient un nombre qui représente une adresse mémoire), alors quand tu fais ptr++, ça ne va pas rajouter 1 sur ptr, mais va lui rajouter la taille de la structure S.

Donc si tu as un tableau tab de S, si tu tapes :

Code:
ptr = &tab[0];

ptr contient l'adresse du premier élément tab[0].

si plus tard tu tapes :

Code:
val = *(ptr++);

tu fais deux choses : d'une part tu donnes à val la valeur pointée par ptr (donc l'élément 0 de ton tableau) puis tu incrémentes ptr de la taille de la structure S, de srte que ptr pointe maintenant sur tab[1]

En fait, quand tu veux parcourir un tableau, la façon BASIC de faire ça c'est :

Code:
for (i = 0 ; i < TAILLE ; i ++) {
    tab[i] = ...
}

Alors qu'en C on fait plutôt :

Code:
ptr = &tab[0];
i = TAILLE
while (i--) {
    *(ptr++) = ...
}

C'est plus rapide (note aussi la boucle à l'envers).


Dernière édition par Tryphon le Mar 30 Mai 2017 - 22:35, édité 2 fois

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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Mar 30 Mai 2017 - 22:22

D'accord, un XOR quoi.
Je ne connaissais pas la syntaxe, merci ! Wink

Pour ces histoires de pointeurs, je continue à sécher un peu, à vrai dire je n'avais pas vu le code d'avant :
Code:
 Sprite_ *spr,**ptr;

D'ou résulte :
Code:
 //soldiers
 ptr=&soldiers[0];
 spr=*ptr++;

Euh ok ... Je parle tout seul, j'essais je comprendre. 
Donc on part de la structure Sprite_ et euh ... on pointe dessus avec *spr et euuuh ( bis ) on repointe avec **ptr ( et après on tireuh peuchère ? )
Et après, avec ptr on peut pointer sur &Soldiers[0] et ensuite passer en revue la structure avec "->".
Et euh .. spr=*ptr++ c'est pour passer à l'index suivant ?
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4105
Age : 46
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 Mar 30 Mai 2017 - 22:27

Oui, xor en Basic, eor en asm, ^ en python, tout ça c'est pareil Very Happy

J'étais en train de te taper l'explication Very Happy

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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Mar 30 Mai 2017 - 22:28

( Merci beaucoup !!! amoureux )
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4105
Age : 46
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 Hpman le Mar 30 Mai 2017 - 22:31

@Vetea a écrit:Purée, la vache, il est dur à comprendre ton copde HpMan ... 

J'essais quand même de comprendre, car tu maitrises les pointeurs.
Euh .. Kezako :

Code:
 //soldiers
 ptr=&soldiers[0];
 spr=*ptr++;

Car la tu pointes sur un Tableau avec ptr ( la je comprends ! )
Mais après, euh ... spr va contenir l'adresse de ptr qui est &soldiers[0], mais kezako ce "++" ?

Et ça :
Code:
randbase ^= (randbase >> 1) ^ volMEMWORD(0xc04200+rdm_idx);

Kezako ce "^" ? Ca veut dire puissance normalement.
Donc randbase = randbase à la puissance randbase>>1 puissance les machins à coté ?
Euh ... 

Code:
Sprite_ *spr,**ptr;

??

Bon j'arrête là.
C'est vraiment pas lisible pour un gars comme moi. Wink


J'utilise des tableau de pointeurs pour gérer facilement les ressources, avec un pointeur qui indique le haut de la "pile" (dernier élément du tableau)
Après quand tu as besoin d'un objet tu le prend en haut de la pile des objets libres, puis tu le pose sur la pile des objets actif pour faire ta cuisine avec plus tard.

Le tableau soldiers contient des pointeurs vers les soldats actifs, la liste est terminé par un pointeur null (0).

ptr=&soldiers[0]; => ptr pointe vers la 1ere case du tableau
spr=*ptr++; => spr récupère le contenu de la 1ere case du tableau (un pointeur donc), puis on incrémente ptr pour passer à la case suivante.

En somme c'est :
spr=*ptr;
ptr++;
en une seule instruction.

le tableau est terminé par 0 donc on stoppe quand spr est 0.


^ est un XOR effectivement, faut pas trop regarder du coté des fonction random, j'ai modifié vite fait pour que ça tourne en tenant compte de la machine mais c'est du bricolage.


Dernière édition par Hpman le Mar 30 Mai 2017 - 22:33, édité 1 fois

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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par upsilandre le Mar 30 Mai 2017 - 22:31

@Hpman a écrit:



La en tout cas le Y-order est nickel, ca réagit a la frame (oui je suis resté fixé sur le titre du topic Razz )  

Vetea meme sur ta derniere video le Y-order m'a pas l'aire de tres bien fonctionner ou plutot avec beaucoup de latence (genre 30 frames) peut etre pour justement répartir et alléger les calcules? Mais dans ce cas ca me parait un peu trop comme latence dans la réaction du Y-order, faudrait peut etre trouver un autre compromis. Je pense que le Y-order faut le faire au moins toutes les 5 voir 10 frames au pire du pire.
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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Mar 30 Mai 2017 - 22:38

Merci Hpman, la je comprends à peu près.
Demain je ferai des bidouilles sur mon code avec ces instructions là. Wink

@Upsilandre :
Oui en effet, c'est un rendu parfait !!
Il fait un tri direct dans la SAT sans détruire et tout reconstruire comme je le fais, donc le rendu est superbe.
Et puis c'est une NEO GEO !!! Very Happy 

Vu que j'utilise le Sprite Engine du SgdK et que celui ci gère tout en haut niveau, je ne peux pas utiliser de manière spécifique le tri de la SAT.
Mais j'y suis quand même arrivé par une solution alternative pas parfaite, mais qui fonctionne. Wink

Je débute juste avec le C, et je suis quand même satisfait de ce que j'arrive à faire après juste 6 mois.
( Je compte Papi Tennis aussi ! )

En tout cas ce topic sera bien utile pour les autres. Wink

EDIT :
Merci Tryphon, je viens de lire tes explications !! amoureux
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4105
Age : 46
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 Mar 30 Mai 2017 - 22:57

Je pense aussi que si on utilise les sprites hard directement, on fait péter les 80 sprites sur MD Very Happy

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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Hpman le Mar 30 Mai 2017 - 23:06

@Vetea a écrit:
Code:
Sprite_ *spr,**ptr;

??

C'est simple, admettons un objet X en mémoire:
*bidule est un pointeurs contenant l'adresse de l'objet
**chose est un pointeur contenant l'adresse d'un pointeur contenant l'adresse de l'objet.

 

Généralement on s'arrète la mais rien n'interdit d'aller plus loin si nécessaire.

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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par Vetea le Mer 31 Mai 2017 - 5:10

Merci Hpman ! :)

Ah oui, autre chose :
Code:
aSpriteSetFlip((aSprite*)spr,(spr->Direction&0x08)?FLIP_X:FLIP_NONE);

Que signifie "?" ici ?
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4105
Age : 46
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 alekmaul le Mer 31 Mai 2017 - 5:47

?, c'est un if en une seule ligne, donc dans ce cas :
(spr->Direction&0x08)?FLIP_X:FLIP_NONE veut dire :

Code:
si (spr->Direction&0x08) != 0
      je renvois FLIP_X, sinon, je renvois FLIP_NONE

alekmaul
Patient contaminé

Masculin Nombre de messages : 387
Age : 50
Localisation : Blois
Date d'inscription : 02/11/2014

Revenir en haut Aller en bas

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

Message par TOUKO le Mer 31 Mai 2017 - 9:30

Des poly sur NG c'est possible avec une cartouche custom incorporant un framebuffer. Comme un jeu neo mais en beaucoup plus cher quoi.  
Ouai mais c'est de la triche là !!  Razz

C'est surtout la limite de transfert vers la VRAM qui me fait peur ... avec des sprites de 32x32 ...
Je pense que pour cette demo, tout les patterns rentrent en VRAM sur snes.
En tout cas même sur Md tu peux pas transférer autant(chaque sprite 32x32 fait 512 octets), les patterns sont préchargés en VRAM .
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: SgdK Megadrive - Démo d'une gestion de YOrder

Message par ichigobankai le Mer 31 Mai 2017 - 10:31

Le bon vieux opérateur ternaire, le truc qu'aime bcp mon pote Vingazole ^^
avatar
ichigobankai
Patient contaminé

Masculin Nombre de messages : 862
Age : 37
Localisation : 49
Date d'inscription : 04/04/2011

http://www.mastersystem-france.com

Revenir en haut Aller en bas

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

Message par Vetea le Mer 31 Mai 2017 - 10:52

C'est quoi un opérateur ternaire ??
avatar
Vetea
Docteur *
Docteur *

Masculin Nombre de messages : 4105
Age : 46
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 Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Page 3 sur 5 Précédent  1, 2, 3, 4, 5  Suivant

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