1

en couleurs :
#include <lynx.h> #include <lynxlib.h> #include <stdlib.h> #define JOY_RIGHT  0x10 #define JOY_LEFT   0x20 #define JOY_DOWN   0x40 #define JOY_UP     0x80 #define BUTTON_OPTION1 0x08 #define BUTTON_OPTION2 0x04 #define BUTTON_INNER   0x02 #define BUTTON_OUTER   0x01 #define BUTTON_PAUSE   0x01 #include ".\sprites\bg.pal" extern char clsSCB[]; extern uchar cls_color; extern char Sprite1[]; extern char Sprite2[]; extern char Sprite3[]; extern char Sprite4[]; extern uint Sprite1col; extern uint Sprite2col; extern uint Sprite3col; extern uint Sprite4col; #asm           xref _bg000000, _bg000001, _bg000002, _bg000003 ; sprite used to clear the collision buffer                 dc.w 0                          ; lieu de collision _clsSCB:        dc.b $c0,$90,$00                ; collision number is 0!                 dc.w 0,cls_data                 dc.w 0,0                        ; X,Y                 dc.w 160*$100,102*$100          ; scaled to 160*102 pixels _cls_color:     dc.b $00 ; data: 1*1 pixel cls_data        dc.b 2,$10,0 _Sprite1col:           dc.w 0             ; lieu de collision de Sprite1! _Sprite1:           dc.b $c4, $10, $01 ; collision number is 1           dc.w 0             ; PTR_NEXT (sprite seul)           dc.w _bg000000     ; PTR_DATA            dc.w 0, 0          ; x,y outside the visible screen area           dc.w $100, $100    ;           ; seul l'index 1 de la palette est utilisé!           dc.b $0b,   $23, $45, $67, $89, $ab, $cd, $ef _Sprite2col:           dc.w 0             ; lieu de collision de Sprite2! _Sprite2:           dc.b $c4, $10, $02 ; collision number is 2           dc.w 0             ; PTR_NEXT            dc.w _bg000001     ; PTR_DATA            dc.w 32+8, 32+8    ; x,y           dc.w $100, $100    ;            dc.b $09,   $23, $45, $67, $89, $ab, $cd, $ef _Sprite3col:           dc.w 0             ; lieu de collision de Sprite3! _Sprite3:           dc.b $c4, $10, $03 ; collision number is 3           dc.w 0             ; PTR_NEXT            dc.w _bg000002     ; PTR_DATA            dc.w 64+8, 64+8    ; x,y           dc.w $100, $100    ;            dc.b $0a,   $23, $45, $67, $89, $ab, $cd, $ef _Sprite4col:           dc.w 0             ; lieu de collision de Sprite4! _Sprite4:           dc.b $c4, $10, $04 ; collision number is 4           dc.w 0             ; PTR_NEXT            dc.w _bg000003     ; PTR_DATA            dc.w 96+8, 32+8    ; x,y           dc.w $100, $100    ;            dc.b $0c,   $23, $45, $67, $89, $ab, $cd, $ef #endasm uchar posx; uchar posy; char szTemp[20+1];      // for text messages char szText1[] = "SPRDEMO5"; char szText2[] = "by M.Domin"; /*****************************************************/ extern uchar VBLflag; #asm _VBLflag = $a0 #endasm #define VSYNC {++VBLflag;while( VBLflag );} VBL() interrupt {    VBLflag = 0; /* VBL a eu lieu */ } HBL() interrupt { } /****************************************/ /* Converts an uint into a ASCII-string */ /****************************************/ UintToASCII(uNr, pStr) uint uNr; char * pStr; {    strcpy(pStr, "00000");    while(uNr >= 10000)       {       uNr -= 10000;       (*pStr)++;       }    pStr++;    while(uNr >= 1000)       {       uNr -= 1000;       (*pStr)++;       }    pStr++;    while(uNr >= 100)       {       uNr -= 100;       (*pStr)++;       }    pStr++;    while(uNr >= 10)       {       uNr -= 10;       (*pStr)++;       }    pStr++;    *pStr += (uint) uNr; } /***********************************************/ /* Clears the screen _and_ the collsion buffer */ /***********************************************/ CLS(nColor) uchar nColor; {    cls_color = nColor;  // méthode un peu brutale...    DrawSprite(clsSCB); } /****************************************/ /* Paints the screen                    */ /****************************************/ ShowScreen() {    //DrawFBox(0,0,160,102, 0);  // BACKGRND-sprite, clears the screen                                 // but not the collision buffer!    CLS(0);      // comment this line and uncomment the above DrawFBox-line to                 // watch the affect of not initializing the collision buffer:                 // The sprites will "collide" with themselves!    // Si un sprite est en collision, on double son volume    if (Sprite1col == 2)       {       SCBHS(Sprite2) = 0x200;       SCBVS(Sprite2) = 0x200;       }    else       {       SCBHS(Sprite2) = 0x100;       SCBVS(Sprite2) = 0x100;       }    if (Sprite1col == 3)       {       SCBHS(Sprite3) = 0x200;       SCBVS(Sprite3) = 0x200;       }    else       {       SCBHS(Sprite3) = 0x100;       SCBVS(Sprite3) = 0x100;       }    if (Sprite1col == 4)       {       SCBHS(Sprite4) = 0x200;       SCBVS(Sprite4) = 0x200;       }    else       {       SCBHS(Sprite4) = 0x100;       SCBVS(Sprite4) = 0x100;       }    // Affichage des sprites    DrawSprite(Sprite2);    DrawSprite(Sprite3);    DrawSprite(Sprite4);    // le notre en dernier de sorte que la collision puisse être détectée en une fois.    SCBX(Sprite1) = posx;    SCBY(Sprite1) = posy;    DrawSprite(Sprite1);    // On affiche les valeurs des registres de collision (après conversion)    UintToASCII(Sprite1col, szTemp);    TextOut2(0,102-4*8, 11, 0, szTemp);    UintToASCII(Sprite2col, szTemp);    TextOut2(0,102-3*8,  9, 0, szTemp);    UintToASCII(Sprite3col, szTemp);    TextOut2(0,102-2*8, 10, 0, szTemp);    UintToASCII(Sprite4col, szTemp);    TextOut2(0,102-1*8, 12, 0, szTemp);    // Un peu de pub :)    TextOut2(12*8,102-(16+6)+2, 14, 0, szText1);    TextOut2(10*8,102-(16+6)+2+8+2, 14, 0, szText2); } /*************************************************************/ main() { register uchar joy;    InitIRQ();    InstallIRQ(2,VBL);    EnableIRQ(2);    CLI;    // l'offset du registre de collision est fixé à -2 !!!(la conversion des uint utilise des valeurs sur 2 octets...) #asm    lda #$fe     ;on charge la valeur immédiate fe (en hexa)    sta $fc24 ;on la stocke à l'adresse mémoire fc24 (un registre, celui des collisions part 1)    lda #$ff ;idem (en fait on stock une valeur sur 16 bits donc faut le faire en 2 fois)    sta $fc25 #endasm    // Faut s'assurer que la détection de collision est activée:    sprsys = _sprsys = _sprsys & 0xdf;//(on agit par masque bit à bit)    SetBuffers(0xa000, 0xc000, 0x8000);    _SetRGB(pal);    // position initiale...:    posx = 64+8;  // +8 pour calculer le centre (16*16)    posy = 0+8;     // On affiche le premier écran    ShowScreen();    //  main loop => ratage fait main ? LOL    for(;;)       {       VSYNC;       SwapBuffers();       ShowScreen();       while (!(joy = joystick))   // on attends que qq chose se passe sur les touches de la console (en interdisant les sorties d'écran)          ;       if (joy & JOY_LEFT)          {          if (posx > 0+8)             {             --posx;             }          }       if (joy & JOY_RIGHT)          {          if (posx < 160-8)             {             ++posx;             }          }       if (joy & JOY_UP)          {          if (posy > 0+8)             {             --posy;             }          }       if (joy & JOY_DOWN)          {          if (posy < 102-8)             {             ++posy;             }          }       }  // jusqu'à la fin de ta mort, toute ta vie } // main

et en n&b sans n° de lignes...

#include <lynx.h>
#include <lynxlib.h>
#include <stdlib.h>

#define JOY_RIGHT  0x10
#define JOY_LEFT   0x20
#define JOY_DOWN   0x40
#define JOY_UP     0x80

#define BUTTON_OPTION1 0x08
#define BUTTON_OPTION2 0x04
#define BUTTON_INNER   0x02
#define BUTTON_OUTER   0x01

#define BUTTON_PAUSE   0x01




#include ".\sprites\bg.pal"

extern char clsSCB[];
extern uchar cls_color;

extern char Sprite1[];
extern char Sprite2[];
extern char Sprite3[];
extern char Sprite4[];

extern uint Sprite1col;
extern uint Sprite2col;
extern uint Sprite3col;
extern uint Sprite4col;

#asm
          xref _bg000000, _bg000001, _bg000002, _bg000003


; sprite used to clear the collision buffer
                dc.w 0                          ; lieu de collision
_clsSCB:        dc.b $c0,$90,$00                ; collision number is 0!
                dc.w 0,cls_data
                dc.w 0,0                        ; X,Y
                dc.w 160*$100,102*$100          ; scaled to 160*102 pixels
_cls_color:     dc.b $00

; data: 1*1 pixel
cls_data        dc.b 2,$10,0





_Sprite1col:
          dc.w 0             ; lieu de collision de Sprite1!
_Sprite1:
          dc.b $c4, $10, $01 ; collision number is 1
          dc.w 0             ; PTR_NEXT (sprite seul)
          dc.w _bg000000     ; PTR_DATA 
          dc.w 0, 0          ; x,y outside the visible screen area
          dc.w $100, $100    ;
          ; seul l'index 1 de la palette est utilisé!
          dc.b $0b,   $23, $45, $67, $89, $ab, $cd, $ef

_Sprite2col:
          dc.w 0             ; lieu de collision de Sprite2!
_Sprite2:
          dc.b $c4, $10, $02 ; collision number is 2
          dc.w 0             ; PTR_NEXT 
          dc.w _bg000001     ; PTR_DATA 
          dc.w 32+8, 32+8    ; x,y
          dc.w $100, $100    ; 
          dc.b $09,   $23, $45, $67, $89, $ab, $cd, $ef


_Sprite3col:
          dc.w 0             ; lieu de collision de Sprite3!
_Sprite3:
          dc.b $c4, $10, $03 ; collision number is 3
          dc.w 0             ; PTR_NEXT 
          dc.w _bg000002     ; PTR_DATA 
          dc.w 64+8, 64+8    ; x,y
          dc.w $100, $100    ; 
          dc.b $0a,   $23, $45, $67, $89, $ab, $cd, $ef

_Sprite4col:
          dc.w 0             ; lieu de collision de Sprite4!
_Sprite4:
          dc.b $c4, $10, $04 ; collision number is 4
          dc.w 0             ; PTR_NEXT 
          dc.w _bg000003     ; PTR_DATA 
          dc.w 96+8, 32+8    ; x,y
          dc.w $100, $100    ; 
          dc.b $0c,   $23, $45, $67, $89, $ab, $cd, $ef

#endasm


uchar posx;
uchar posy;



char szTemp[20+1];      // for text messages
char szText1[] = "SPRDEMO5";
char szText2[] = "by M.Domin";


/*****************************************************/
extern uchar VBLflag;
#asm
_VBLflag = $a0
#endasm

#define VSYNC {++VBLflag;while( VBLflag );}

VBL() interrupt
{
   VBLflag = 0; /* VBL a eu lieu */
}

HBL() interrupt
{
}


/****************************************/
/* Converts an uint into a ASCII-string */
/****************************************/
UintToASCII(uNr, pStr)
uint uNr;
char * pStr;
{
   strcpy(pStr, "00000");
   while(uNr >= 10000)
      {
      uNr -= 10000;
      (*pStr)++;
      }
   pStr++;
   while(uNr >= 1000)
      {
      uNr -= 1000;
      (*pStr)++;
      }
   pStr++;
   while(uNr >= 100)
      {
      uNr -= 100;
      (*pStr)++;
      }
   pStr++;
   while(uNr >= 10)
      {
      uNr -= 10;
      (*pStr)++;
      }
   pStr++;
   *pStr += (uint) uNr;
}

/***********************************************/
/* Clears the screen _and_ the collsion buffer */
/***********************************************/
CLS(nColor)
uchar nColor;
{
   cls_color = nColor;  // méthode un peu brutale...
   DrawSprite(clsSCB);
}


/****************************************/
/* Paints the screen                    */
/****************************************/
ShowScreen()
{
   //DrawFBox(0,0,160,102, 0);  // BACKGRND-sprite, clears the screen
                                // but not the collision buffer!
   CLS(0);      // comment this line and uncomment the above DrawFBox-line to
                // watch the affect of not initializing the collision buffer:
                // The sprites will "collide" with themselves!


   // Si un sprite est en collision, on double son volume
   if (Sprite1col == 2)
      {
      SCBHS(Sprite2) = 0x200;
      SCBVS(Sprite2) = 0x200;
      }
   else
      {
      SCBHS(Sprite2) = 0x100;
      SCBVS(Sprite2) = 0x100;
      }

   if (Sprite1col == 3)
      {
      SCBHS(Sprite3) = 0x200;
      SCBVS(Sprite3) = 0x200;
      }
   else
      {
      SCBHS(Sprite3) = 0x100;
      SCBVS(Sprite3) = 0x100;
      }

   if (Sprite1col == 4)
      {
      SCBHS(Sprite4) = 0x200;
      SCBVS(Sprite4) = 0x200;
      }
   else
      {
      SCBHS(Sprite4) = 0x100;
      SCBVS(Sprite4) = 0x100;
      }


   // Affichage des sprites
   DrawSprite(Sprite2);
   DrawSprite(Sprite3);
   DrawSprite(Sprite4);

   // le notre en dernier de sorte que la collision puisse être détectée en une fois.
   SCBX(Sprite1) = posx;
   SCBY(Sprite1) = posy;
   DrawSprite(Sprite1);

   // On affiche les valeurs des registres de collision (après conversion)
   UintToASCII(Sprite1col, szTemp);
   TextOut2(0,102-4*8, 11, 0, szTemp);

   UintToASCII(Sprite2col, szTemp);
   TextOut2(0,102-3*8,  9, 0, szTemp);

   UintToASCII(Sprite3col, szTemp);
   TextOut2(0,102-2*8, 10, 0, szTemp);

   UintToASCII(Sprite4col, szTemp);
   TextOut2(0,102-1*8, 12, 0, szTemp);

   // Un peu de pub :)
   TextOut2(12*8,102-(16+6)+2, 14, 0, szText1);
   TextOut2(10*8,102-(16+6)+2+8+2, 14, 0, szText2);

}

/*************************************************************/
main()
{
register uchar joy;

   InitIRQ();
   InstallIRQ(2,VBL);

   EnableIRQ(2);
   CLI;


   // l'offset du registre de collision est fixé à -2 !!!(la conversion des uint utilise des valeurs sur 2 octets...)
#asm
   lda #$fe	;on charge la valeur immédiate fe (en hexa)
   sta $fc24 ;on la stocke à l'adresse mémoire fc24 (un registre, celui des collisions part 1)
   lda #$ff ;idem (en fait on stock une valeur sur 16 bits donc faut le faire en 2 fois)
   sta $fc25
#endasm

   // Faut s'assurer que la détection de collision est activée:
   sprsys = _sprsys = _sprsys & 0xdf;//(on agit par masque bit à bit)

   SetBuffers(0xa000, 0xc000, 0x8000);

   _SetRGB(pal);

   // position initiale...:
   posx = 64+8;  // +8 pour calculer le centre (16*16)
   posy = 0+8; 

   // On affiche le premier écran
   ShowScreen();

   //  main loop => ratage fait main ? LOL
   for(;;)
      {
      VSYNC;
      SwapBuffers();

      ShowScreen();

      while (!(joy = joystick))   // on attends que qq chose se passe sur les touches de la console (en interdisant les sorties d'écran)
         ;

      if (joy & JOY_LEFT)
         {
         if (posx > 0+8)
            {
            --posx;
            }
         }

      if (joy & JOY_RIGHT)
         {
         if (posx < 160-8)
            {
            ++posx;
            }
         }

      if (joy & JOY_UP)
         {
         if (posy > 0+8)
            {
            --posy;
            }
         }

      if (joy & JOY_DOWN)
         {
         if (posy < 102-8)
            {
            ++posy;
            }
         }
      }  // jusqu'à la fin de ta mort, toute ta vie
} // main


Vala smile
c la fin d'un tite série bien sympathique...
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

2

Merci pour tout cela ! Promis dès que j'aurai un peu plus de temps, je me lancerai la dedant smile

3

C'est pas la #4 c'est la 5, erreur de copier collé désolé smile
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

4

Super boulot Vince,
Avec ça on dispose d'une bonne quantité d'informations en français pour commencer sur la Lynx top
Previously known as Damdam