Non, ce n'est pas ça le problème, je ne pas sauté de label voici le code:
//Le programme pour la gestion du curseur sous Windows ST
Cursor.h
#define DesinstallCursor_Timer DesinstallCursor
#define XCursor system->XCursor
#define YCursor system->YCursor
#define CursorKeys system->CursorKeys
//Variables pour prévention des erreurs et calibrage du curseur
short HeightCursor;
#define StateCursorTimer system->Cursor_TimerState
#define StateCursorEnabled system->Cursor_State
//Structure de sauvegarde de l'horloge de gestion du curseur: Cursor_Timer
#define TimerCursor system->CursorTimer
//Enumérations Curseurs standard
enum CursorsSprite {C_Pointer = 0, C_Sablier = 130, C_Stop = 260, C_Help = 390};
enum CursorButtons {C_NOTHING=0, C_ENTER=1, C_APPS=2, C_ALL=3};
//Structure d'état des touches directionnels
GX_joypad Cursor_JoyPad;
/*-------------------------------------------------------------
Install/Desinstall l'horloge système pour la gestion du curseur
-------------------------------------------------------------*/
void InstallCursor_Timer(void) {if (StateCursorTimer==FALSE) {TimerCursor=GX_CreateTimer (Cursor_Timer,CursorSpeed); StateCursorTimer=TRUE;}}
void DesinstallCursor(void) {if (StateCursorTimer==TRUE) {GX_DestroyTimer (TimerCursor); StateCursorTimer=FALSE;}}
/*--------------------------------------------------------
Install l'horloge du curseur, affiche le curseur à l'écran
--------------------------------------------------------*/
void ActivateCursor(void)
{
if (StateCursorEnabled==FALSE) {
InstallCursor_Timer();
AdjustCursor();
AdjustHeightCursor();
SaveCursorBuffer(XCursor,YCursor);
SaveExtrenumCursorBuffer(XCursor,YCursor);
DrawCursor();
LoadExtrenumCursorBuffer(XCursor,YCursor);
StateCursorEnabled=TRUE;}
}
/*------------------------------------------------------------
Desinstall l'horloge du curseur et efface le curseur à l'écran
------------------------------------------------------------*/
void DesactivateCursor(void)
{
if (StateCursorEnabled==TRUE) {
DesinstallCursor_Timer();
RestoreCursorBuffer(XCursor,YCursor);
LoadExtrenumCursorBuffer(XCursor,YCursor);
StateCursorEnabled=FALSE;}
}
/*---------------------------------------------------------
Selectionne par défaut le pointeur et le centre sur l'écran
---------------------------------------------------------*/
void InstallCursor(void)
{
CenterCursorInScreen(); //Installation du curseur
SelectCursor(C_Pointer);
}
/*-------------------------------------------------------------------------------------------
Teste l'état des touches directionnel et déplace le curseur en fonction de XCursor et YCursor
---------------------------------------------------------------------------------------------*/
void TestCursorKeys(void)
{
Cursor_JoyPad=GX_ReadJoypad();
if (StateCursorEnabled==1 && (Cursor_JoyPad.down || Cursor_JoyPad.up || Cursor_JoyPad.right || Cursor_JoyPad.left)) {
DesactivateCursor();
if (Cursor_JoyPad.down) {if (Cursor_JoyPad.hand) YCursor+=StepCursorY; else {YCursor++; CursorKeys|=0x01;}}
if (Cursor_JoyPad.up) {if (Cursor_JoyPad.hand) YCursor-=StepCursorY; else {YCursor--; CursorKeys|=0x02;}}
if (Cursor_JoyPad.right) {if (Cursor_JoyPad.hand) XCursor+=StepCursorX; else {XCursor++; CursorKeys|=0x04;}}
if (Cursor_JoyPad.left) {if (Cursor_JoyPad.hand) XCursor-=StepCursorX; else {XCursor--; CursorKeys|=0x08;}}
ActivateCursor();} else CursorKeys=0x00;
}
/*----------------------------------------------------------------------
Sauvegarde/Charge dans le buffer l'image précédent l'affichage du curseur
------------------------------------------------------------------------*/
void SaveCursorBuffer(short X,short Y)
{
if (X>Screen_Xmax-15) X=Screen_Xmax-15;
if (Y>Screen_Ymax-HeightCursor+1) Y=Screen_Ymax-HeightCursor+1;
W_GetGraySprite16(X,Y,HeightCursor,GetPlane(LIGHT_PLANE),GetPlane(DARK_PLANE),system->Cursor_BufferSave[0],system->Cursor_BufferSave[1]);
}
void RestoreCursorBuffer(short X,short Y)
{
if (X>Screen_Xmax-15) X=Screen_Xmax-15;
if (Y>Screen_Ymax-HeightCursor+1) Y=Screen_Ymax-HeightCursor+1;
W_GraySprite16_MASK(X,Y,HeightCursor,system->Cursor_BufferSave[0],system->Cursor_BufferSave[1],system->Cursor_BufferSave[0],system->Cursor_BufferSave[1],GetPlane(LIGHT_PLANE),GetPlane(DARK_PLANE));
}
/*-----------------------------------------------
Sauvegarde/Charge dans le buffer l'image extrème
-------------------------------------------------*/
void SaveExtrenumCursorBuffer(short X,short Y)
{
short X1=0,Y1=0; //,X2=0,Y2=0;
if (X>Screen_Xmax-15) {X1=0;Y1=Y;}
if (Y>Screen_Ymax-15) Y1=Screen_Ymax-15;
if (X>Screen_Xmax-15) {
W_GetGraySprite16(X1,Y1,16,GetPlane(LIGHT_PLANE),GetPlane(DARK_PLANE),system->Cursor_BufferExtrenum[0],system->Cursor_BufferExtrenum[1]);}
}
void LoadExtrenumCursorBuffer(short X,short Y)
{
short X1=0,Y1=0; //,X2=0,Y2=0;
if (X>Screen_Xmax-15) {X1=0;Y1=Y;}
if (Y>Screen_Ymax-15) Y1=Screen_Ymax-15;
if (X>Screen_Xmax-15) {
W_GraySprite16_MASK(X1,Y1,16,system->Cursor_BufferExtrenum[0],system->Cursor_BufferExtrenum[1],system->Cursor_BufferExtrenum[0],system->Cursor_BufferExtrenum[1],GetPlane(LIGHT_PLANE),GetPlane(DARK_PLANE));}
}
/*--------------------------
Affiche à l'écran le curseur
----------------------------*/
void DrawCursor(void)
{
if (system->Cursor_XOR==FALSE)
W_GraySprite16_MASK(XCursor,YCursor,HeightCursor,system->Cursor_Buffer[0],system->Cursor_Buffer[1],system->Cursor_Buffer[2],system->Cursor_Buffer[3],GetPlane(LIGHT_PLANE),GetPlane(DARK_PLANE));
else {
W_GraySprite16_XOR(XCursor,YCursor,HeightCursor,system->Cursor_Buffer[0],system->Cursor_Buffer[1],GetPlane(LIGHT_PLANE),GetPlane(DARK_PLANE));}
}
/*----------------------------------------------------------------
Ajuste la hauteur du sprite pour ne pas planter le système en YMax
------------------------------------------------------------------*/
void AdjustHeightCursor(void)
{
if (YCursor>Screen_Ymax-16) HeightCursor=(Screen_Ymax+1)-YCursor;
else HeightCursor=15;
}
/*-------------------------------------
Fonction ajustant le curseur à l'écran.
Le curseur ne d"épassera pas l'écran.
--------------------------------------*/
void AdjustCursor(void)
{
if (XCursor<0) XCursor=0;
if (XCursor>Screen_Xmax) XCursor=Screen_Xmax;
if (YCursor<0) YCursor=0;
if (YCursor>Screen_Ymax) YCursor=Screen_Ymax;
}
/*----------------------------------------
Selectionne un curseur par défaut de 0 à 3
------------------------------------------*/
void SelectCursor(short CursorNumber)
{
InitCursor(extract_data(0,W_GetSymByName("windows\wingfx"))+CursorNumber);
}
/*----------------------------------------------------------------------------
Initialise les variables XCursor et YCursor pour centrer le curseur à l'écran
-----------------------------------------------------------------------------*/
void CenterCursorInScreen(void) {XCursor=(Screen_Xmax/2)-8;YCursor=(Screen_Ymax/2)-8;}
/*-----------------------------------------------------
Place le curseur à la postion X et Y souhaité.
Attention ses valeurs sont pour l'affichage du sprite
------------------------------------------------------*/
void PlaceCursor(short X,short Y)
{
DesactivateCursor();
XCursor=X; YCursor=Y;
ActivateCursor();
}
/*---------------------------------------------------------------------------------------
Renvoie 1 si le curseur et dans la zone x0,y0,x1,y1 et un bouton du type Cu_... et pressé
-----------------------------------------------------------------------------------------*/
BOOL GetCursorIn(short x0_CurInt,short y0_CurInt,short x1_CurInt,short y1_CurInt,short CurButtonInt)
{
if ((XCursor+system->Cursor_ActionX>=x0_CurInt && XCursor+system->Cursor_ActionX<=x1_CurInt && YCursor+system->Cursor_ActionY>=y0_CurInt && YCursor+system->Cursor_ActionY<=y1_CurInt) && ((CurButtonInt==C_NOTHING) || (CurButtonInt==C_ENTER && (_TestKey(RR_ENTER) || _TestKey(RR_ENTER2)==TRUE)) || (CurButtonInt==C_APPS && (_TestKey(RR_APPS)==TRUE)) || (CurButtonInt==C_ALL && (_TestKey(RR_ENTER) || _TestKey(RR_ENTER2) || _TestKey(RR_APPS)==TRUE)))) return 1;
else return 0;
}
/*-----------------------------------------------------------------------------
Cette fonction place le curseur au centre d'un rectangle défini par x0,y0,x1,y1
-------------------------------------------------------------------------------*/
void CenterCursor_In(short x0,short y0,short x1,short y1) {PlaceCursor(GetCenterX(1,x0,x1)+system->Cursor_ActionX,GetCenterY(1,y0,y1)+system->Cursor_ActionY);}
/*-----------------------------------------------
Copie les données du curseur dans les buffers...
-------------------------------------------------*/
void InitCursor(void *Data)
{
DesactivateCursor();
system->Cursor_ActionX=*(BYTE*)(Data);
system->Cursor_ActionY=*(BYTE*)(Data+1);
memset(system->Cursor_Buffer[0],0,32);
memset(system->Cursor_Buffer[0],0,32);
memset(system->Cursor_Buffer[0],0,32);
memset(system->Cursor_Buffer[0],0,32);
memcpy(system->Cursor_Buffer[0],Data+2,32);
memcpy(system->Cursor_Buffer[1],(Data+2+32),32);
memcpy(system->Cursor_Buffer[2],(Data+2+64),32);
memcpy(system->Cursor_Buffer[3],(Data+2+96),32);
ActivateCursor();
}
BOOL CursorIn(short x0,short y0,short x1,short y1)
{
if ((XCursor+15)<x0 || XCursor>x1 || (YCursor+15)<y0 || YCursor>y1) return 0;
else return 1;
}
void DesactivateCursor2(short x0,short y0,short x1,short y1)
{
if (CursorIn(x0,y0,x1,y1)) DesactivateCursor();
else SelectCursor(C_Sablier);
}
void ActivateCursor2(void) {SelectCursor(C_Pointer); ActivateCursor();}
//La librarie WinAPI
/*------
Cursor.h
-------*/
#define CursorSpeed winapi__0000
#define StepCursorX winapi__0001
#define StepCursorY winapi__0002
#define InstallCursor_Timer winapi__0003
#define DesinstallCursor winapi__0004
#define ActivateCursor winapi__0005
#define DesactivateCursor winapi__0006
#define InitCursor winapi__0007
#define InstallCursor winapi__0008
#define TestCursorKeys winapi__0009
#define SaveCursorBuffer winapi__000A
#define RestoreCursorBuffer winapi__000B
#define SaveExtrenumCursorBuffer winapi__000C
#define LoadExtrenumCursorBuffer winapi__000D
#define DrawCursor winapi__000E
#define AdjustHeightCursor winapi__000F
#define AdjustCursor winapi__0010
#define SelectCuror winapi__0011
#define CenterCursorInScreen winapi__0012
#define PlaceCursor winapi__0013
#define GetCursorIn winapi__0014
#define CenterCursor_In winapi__0015
#define CursorIn winapi__0016
#define ActivateCursor2 winapi__0017
#define DesactivateCursor2 winapi__0018
#include "Cursor.h"
Je résume le problème: Pour initialisé l'événement curseur, je doit utiliser une fonction CursorTimer mais cette fonction n'hésite pas dans la librarie mais plutôt dans le programme principal (des applications à Windows ST et Windows ST lui même).
Je préférerais faire ça sous forme de ROM_CALLS mais je voudrais bien que Pphd m'explique comment faire et quels sont les limites des ROM_CALLS.
