Path: chuka.playstation.co.uk!news From: Arnaud Lemaire Newsgroups: scee.yaroze.freetalk.french Subject: afficher un sprite Date: Wed, 20 May 1998 19:42:00 +0200 Organization: PlayStation Net Yaroze (SCEE) Lines: 167 Message-ID: <356315E8.FB47FF8B@epita.fr> NNTP-Posting-Host: 163.5.44.14 Mime-Version: 1.0 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 4.04 [en] (Win95; I) Salut ,
Pour mieux comprendre la gestion de graphismes en 2d je vous
transmet un code qui affiche un sprite 8 bits (d'ou présence de la clut) positionné a l'adresse TIM_ADDRESS :

#include <libps.h>

#define TIM_ADDRESS 0x80090000

#define  padselect   1<<8
#define LARGEUR_ECRAN 320
#define HAUTEUR_ECRAN 256
#define TAILLE_OT 1
#define MAX_SIZEOF_PRIMITIVE 24

GsSPRITE sprite,sprite1;
int activeBuffer;
volatile u_char *bb0,*bb1;

GsOT            OT[2];
GsOT_TAG        OT_Tag[2][1<<TAILLE_OT];

PACKET  GpuPacketArea[2][1000 * MAX_SIZEOF_PRIMITIVE];
u_long pad1,pad2;

 // prototypes
int main (void);
void Initialise(void);
u_long pad_read(volatile u_char);

        // fonctions
u_long Pad_Read(volatile u_char * buf)
{ return(~( *(buf+3) | *(buf+2)<<8   ));}

void Initialise (void)
{       RECT r_pixel,c_pixel;
        GsIMAGE Image;
        int i;

        SetVideoMode( MODE_PAL );
        GetPadBuf(&bb0,&bb1);

        GsInitGraph(LARGEUR_ECRAN,HAUTEUR_ECRAN,GsOFSGPU|GsNONINTER,0,0);
        GsDefDispBuff(0,0,0,HAUTEUR_ECRAN);

    for (i = 0; i < 2; i++)
     {         OT[i].length = TAILLE_OT;
                OT[i].org    = OT_Tag[i];   }

        GsGetTimInfo( (u_long *)(TIM_ADDRESS+4), &Image);

        c_pixel.x=LARGEUR_ECRAN;
        c_pixel.y=180;
        c_pixel.w=Image.cw;
        c_pixel.h=Image.ch;
        LoadImage(&c_pixel,Image.clut);
        DrawSync(0);
 
        GsGetTimInfo( (u_long *)(TIM_ADDRESS+4), &Image);

        r_pixel.x = 320; //en dehors du buffers
        r_pixel.y = 0;
        r_pixel.w = Image.pw;
        r_pixel.h = Image.ph;
        LoadImage(&r_pixel,Image.pixel);
        DrawSync(0);

       sprite.tpage = GetTPage(1, 0, r_pixel.x,r_pixel.y);
        sprite.attribute = 1<<24;
        sprite.h = 180;
        sprite.w = 195;
        sprite.x = 0;
        sprite.y = 0;
        sprite.cx =c_pixel.x;
        sprite.cy =c_pixel.y;
        sprite.mx=0;
        sprite.my=0;
        sprite.r=0x80;
        sprite.g=0x80;
        sprite.b=0x80;
        sprite.scalex=ONE;
        sprite.scaley=ONE;
        sprite.u=0;
        sprite.v=0;
 }
 int main (void)
{
   Initialise();
        for (;;)
             {
                pad1=Pad_Read(bb0);
                if (pad1&padselect) break;
 
                activeBuffer =GsGetActiveBuff();
                GsSetWorkBase( (PACKET *) GpuPacketArea[activeBuffer] );
                GsClearOt(0,0,&OT[activeBuffer]);
 
                GsSortSprite(&sprite,&OT[activeBuffer], 0);
 
                DrawSync(0);
                GsSwapDispBuff();
                GsSortClear(0,0,0,&OT[activeBuffer]);
                GsDrawOt(&OT[activeBuffer]);              }
       ResetGraph(3);
       return(0);
}

La présence d'une clut n'est obligatoire que pour les formats de couleur inferieur a 16bits .
Pour mieux expliquer le déroulement :
1 downloader votre image en memoire centrale (ici TIM_ADDRESS).
2 créer une instance GsImage qui vat récuperer les infos de votre image  grace a la
   fonction GetTimInfo.
3 si vous travaillez en 16 bits passer directement a 4 sinon :
   vous créer une variable RECT (ici c_pixel)qui vat recevoir les infos de la clut (la
   palette ) en suite vous la loader en memoire video ,vous récuperer sa position et sa
   taille grace a c_pixel.
4 réiterer le meme processus avec les données graphiques (r_pixel ).
 Voila votre image est loader en memoire video c'est a vous de la positionner dans
le buffer mais vous pouvez vous aider de timtool.
Vous n'avez plus qu'a découper vos sprite comme vous le désirez ,en utilisant les
champs u et v ,pour obtenir leur position et h et w pour leur taille.

Et c'est finit vous pouvez afficher votre sprite .