SgdK Megadrive - Démo d'une gestion de YOrder
+5
ShiningBZH
philip
Stef
Hpman
Tryphon
9 participants
Page 3 sur 5
Page 3 sur 5 • 1, 2, 3, 4, 5
Re: SgdK Megadrive - Démo d'une gestion de YOrder
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 .
Bon je m'incline, vetea est trop fort
Lol, paprium ça m'étonnerait fort mais moi oui il me tuePour la peine, je te donne jusqu'à Noel pour finir le jeu de Baston de la mort qui tue même Paprium : Chuck No Rice !!
You're welcome manHey !! It's done Touko !!
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
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.TOUKO a écrit:
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 .
Bon je m'incline, vetea est trop fortLol, paprium ça m'étonnerait fort mais moi oui il me tuePour la peine, je te donne jusqu'à Noel pour finir le jeu de Baston de la mort qui tue même Paprium : Chuck No Rice !!
Chapeau bas Vetea.
Re: SgdK Megadrive - Démo d'une gestion de YOrder
TOUKO a écrit:Ouai, hpman qui est jaloux de pas faire pareil sur NGTryphon a écrit: T'as des haters ?
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é
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Mouahaha !!
GG Hpman !
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 !
( Ah oui, et 4 types d'unités à traiter aussi ! )
@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 !!
On attend par contre la même chose sur SNES ... AlekMaul ?? Ou est tu mon petit ??
GG Hpman !
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 !
( Ah oui, et 4 types d'unités à traiter aussi ! )
@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 !!
On attend par contre la même chose sur SNES ... AlekMaul ?? Ou est tu mon petit ??
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
,j'adore ..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.
Je pensais pas que finalement tu réagirais avec une démo, mais belle réaction finalement
bon en même temps la NG n'est pas la rolls pour des clopinettes hein !!
Euh lui il anime 44 sprites réels donc 88 si tu comptes les ombresAh oui, et 4 types d'unités à traiter aussi !
Dernière édition par TOUKO le Mar 30 Mai 2017 - 19:38, édité 1 fois
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Vetea a écrit:Mouahaha !!
GG Hpman !
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 !
( Ah oui, et 4 types d'unités à traiter aussi ! )
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 .
Pour les types d'unité bah j'ai pas les spritesheet.
Ça change absolument rien niveau performance de toute façon, la bécane est no limit niveau tiles.
Hpman- Patient contaminé
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: SgdK Megadrive - Démo d'une gestion de YOrder
... Surtout que l'on sent la personne qui maitrise mieux le C que moi !
( 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.
Sacré vieux Brigand va !
Pour la peine, tu me payes l'apéro Pastaga l'ami ( et avec des olives s'il te plait !! )
( 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.
Sacré vieux Brigand va !
Pour la peine, tu me payes l'apéro Pastaga l'ami ( et avec des olives s'il te plait !! )
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
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
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
Dernière édition par TOUKO le Mar 30 Mai 2017 - 19:45, édité 1 fois
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Jsuis à sec, j'ai craqué le PEL pour acheter fatal fury 2.
Hpman- Patient contaminé
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Sérieux ??Hpman a écrit:Jsuis à sec, j'ai craqué le PEL pour acheter fatal fury 2.
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
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
Meuh oui, ne t'en fait pas copainG !
Du Poly ??
J'sais pas faire encore !!
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Même un truc ultra moisi ça marche .J'sais pas faire encore !!
Et en plus sgdk a des fonctions pour ça je crois .
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
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.
On fait tellement de truc sympa ... Après, si c'est pour un concours de Kekette, j'ai pas besoin de Test Poly hein !
En fait, je n'ai jamais aimé ça .. Mon truc, c'est plus de la 2D.
On fait tellement de truc sympa ... Après, si c'est pour un concours de Kekette, j'ai pas besoin de Test Poly hein !
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
TOUKO a écrit:Sérieux ??Hpman a écrit:Jsuis à sec, j'ai craqué le PEL pour acheter fatal fury 2.
Non c'est une vanne par rapport aux prix fous sur la machine.
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.
Hpman- Patient contaminé
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: SgdK Megadrive - Démo d'une gestion de YOrder
J'adoreHpman 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!
Seul Gamopat propose ce genre de délire de discours .... chapeau bas
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 ...
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
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 :
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 :
Kezako ce "^" ? Ca veut dire puissance normalement.
Donc randbase = randbase à la puissance randbase>>1 puissance les machins à coté ?
Euh ...
??
Bon j'arrête là.
C'est vraiment pas lisible pour un gars comme moi.
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.
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
^ 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 :
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 :
Par contre si tu tapes (pré-incrémentation) :
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 :
ptr contient l'adresse du premier élément tab[0].
si plus tard tu tapes :
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 :
Alors qu'en C on fait plutôt :
C'est plus rapide (note aussi la boucle à l'envers).
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++;
Par contre si tu tapes (pré-incrémentation) :
- Code:
a = ++i;
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- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: SgdK Megadrive - Démo d'une gestion de YOrder
D'accord, un XOR quoi.
Je ne connaissais pas la syntaxe, merci !
Pour ces histoires de pointeurs, je continue à sécher un peu, à vrai dire je n'avais pas vu le code d'avant :
D'ou résulte :
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 ?
Je ne connaissais pas la syntaxe, merci !
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 ?
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Oui, xor en Basic, eor en asm, ^ en python, tout ça c'est pareil
J'étais en train de te taper l'explication
J'étais en train de te taper l'explication
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: SgdK Megadrive - Démo d'une gestion de YOrder
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.
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é
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: SgdK Megadrive - Démo d'une gestion de YOrder
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 )
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.
upsilandre- Interne
- Nombre de messages : 5138
Age : 49
Localisation : val de marne 94
Date d'inscription : 31/05/2015
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Merci Hpman, la je comprends à peu près.
Demain je ferai des bidouilles sur mon code avec ces instructions là.
@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 !!!
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.
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.
EDIT :
Merci Tryphon, je viens de lire tes explications !!
Demain je ferai des bidouilles sur mon code avec ces instructions là.
@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 !!!
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.
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.
EDIT :
Merci Tryphon, je viens de lire tes explications !!
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Je pense aussi que si on utilise les sprites hard directement, on fait péter les 80 sprites sur MD
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: SgdK Megadrive - Démo d'une gestion de YOrder
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é
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Merci Hpman ! :)
Ah oui, autre chose :
Que signifie "?" ici ?
Ah oui, autre chose :
- Code:
aSpriteSetFlip((aSprite*)spr,(spr->Direction&0x08)?FLIP_X:FLIP_NONE);
Que signifie "?" ici ?
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
?, c'est un if en une seule ligne, donc dans ce cas :
(spr->Direction&0x08)?FLIP_X:FLIP_NONE veut dire :
(spr->Direction&0x08)?FLIP_X:FLIP_NONE veut dire :
- Code:
si (spr->Direction&0x08) != 0
je renvois FLIP_X, sinon, je renvois FLIP_NONE
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Ouai mais c'est de la triche là !!Des poly sur NG c'est possible avec une cartouche custom incorporant un framebuffer. Comme un jeu neo mais en beaucoup plus cher quoi.
Je pense que pour cette demo, tout les patterns rentrent en VRAM sur snes.C'est surtout la limite de transfert vers la VRAM qui me fait peur ... avec des sprites de 32x32 ...
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 .
Invité- Invité
Re: SgdK Megadrive - Démo d'une gestion de YOrder
Le bon vieux opérateur ternaire, le truc qu'aime bcp mon pote Vingazole ^^
Page 3 sur 5 • 1, 2, 3, 4, 5
Sujets similaires
» [ Demo Disponible !] - Papi Commando Tennis Megadrive - SGDK
» Sgdk 0.95 compilateur mégadrive
» Sgdk - Sega Megadrive / Sprite
» [MEGADRIVE][SGDK]Wrath of the demon.
» BIERE PONG MegaDrive SGDK
» Sgdk 0.95 compilateur mégadrive
» Sgdk - Sega Megadrive / Sprite
» [MEGADRIVE][SGDK]Wrath of the demon.
» BIERE PONG MegaDrive SGDK
Page 3 sur 5
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum