avis aux amateurs(trices) de la SDL !!
Il y'a quelque mois j'avais posté,sur ce forum, un sujet parlant d'un probleme en ce qui concerne les diagonales en SDL. Je l'ai recherché mais il semble qu'on l'ait effacé !
Si par exemple, en appuyant ,sur le clavier, SDLK_DOWN et SDLK_RIGHT, mon personnage(SDL_Surface *heros que je blite dans SDL_Rect rectheros) je voulais que *heros se déplace vers le bas et la droite en même temps. Mais ce n'etait pas possible. Et de plus une personne(un VIP) m'avait dis qu'il faudrait REPROGRAMMER LE CLAVIER mais qu'elle ne savait pas comment le faire.
Eureka (J'ai trouvé!)
le principe est simple, j'ai crée 4 bool:
Code:
1 2
|
bool Up, Left, Right, Down; |
en appuyant sur SDLK_DOWN, j'intialise bool Down = true; de même pour SDLK_RIGHT
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
if(event.type == SDL_KEYDOWN)
{
if(event.key.state == SDL_PRESSED)
{
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE :*game = false; break;
case SDLK_UP :Right = true;
break;
case SDLK_DOWN :Down = true;
break;
case SDLK_LEFT :Left = true;
break;
case SDLK_RIGHT : Right = true;
break;
}
}
} |
et biensûr en restant APPUYE !
Et en relâchant ils sont initialisés à false.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
if(event.type == SDL_KEYUP)
{
switch(event.key.keysym.sym)
{
case SDLK_UP : Up = false;
break;
case SDLK_DOWN : Down = false;
break;
case SDLK_LEFT : Left = false;
break;
case SDLK_RIGHT : Right = false;
break;
}
} |
et nous nous voulons que le *heros aille en bas et a droite en même temps. et donc on aura une COMBINAISON de touche PRESSEES
vX et vY sont des distances qui correspondent à des "int"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
if(Up == true && Left == false && //up
Right == false && Down == false && )
{rectheros.y = rectheros.y - vY;}
else if(Up == false && Left == true && //left
Right == false && Down == false &&)
{rectheros.x = rectheros.x - vX;}
else if(Up == true && Left == true && //leftup
Right == false && Down == false &&)
{rectheros.y = rectheros.y - vY;
rectheros.x = rectheros.x - vX;}
else if(Up == false && Left == false && //right
Right == true && Down == false && )
{rectheros.x = rectheros.x + vX;}
else if(Up == true && Left == false && //rightup
Right == true && Down == false &&)
{rectheros.y = rectheros.y - vY;
rectheros.x = rectheros.x + vX;}
else if(Up == false && Left == true && //leftdown
Right == false && Down == true &&)
{rectheros.y = rectheros.y + vY;
rectheros.x = rectheros.x - vX;}
else if(Up == false && Left == false && //rightdown
Right == true && Down == true &&)
{rectheros.y = rectheros.y + vY; // <- c'est ce que nous
rectheros.x = rectheros.x + vX;} // voulons
else if(Up == false && Left == false && //down
Right == false && Down == true && )
{rectheros.y = rectheros.y + vY;} |
De cette manière notre *heros(SDL_Surface *heros) se deplace comme on le souhaite, en changeant, tout simplement, ses coordonnées(SDL_Rect rectheros)
Et voilà j'ai reussi !