:: PlayerAdvance.org ::  

Pr嶰嶮ent   :: PlayerAdvance.org :: > :: Forums H嶵erg廥 :: > 無ibrary

無ibrary Official 無ibrary forum (English / Fran蓷is)

Publicit

R廧onse
 
Outils de la discussion Modes d'affichage
Vieux 02/07/2008, 18h11   #1
sdevilcry
Membre
 
Date d'inscription: 02/05/2008
Messages: 22
Par d嶨aut Angle, trigonom彋rie

Salut tous, c'est encore moi

Voila je suis encore face a un autre probl鋗e :s, j'aimerai afficher la bonne frame de mon sprite en fonction de l'appuie de mon styler.

Pour cela, le plus simple aurait 彋 de comparer l'angle en fonction de mon personnage et de l'appuie du styler, je calcule les distance adjacent et opposer, et je fait une tanjante -1 pour avoir mon angle en degrer, le b幦ole c''est que ca fonctionne mal pourtant a 4 dessus le code et a verifier le debug, on se demande si ca vient pas d'ailleur...

illustration :



code :
Code:
float           get_angle(t_quest *var, float nx, float ny)
{
  float hyp;
  float a;
  float angle;

//j'ai fait different test, d'ou des declaration "hyp, a..."
angle = atanf(ny/nx);
  return (angle);
}

void            check_direction(t_quest *var)
{
  float         nx;
  float         ny;

  var->player.left = 0;
  var->player.up = 0;
  if (ul_keys.touch.x  < ((var->player.x >> 4) + 8))
  {
    nx = (((var->player.x >> 4) + 8) - ul_keys.touch.x);
  }
  else
  {
    nx = ul_keys.touch.x - (var->player.x >> 4) - 8;
  }
  if (ul_keys.touch.y < ((var->player.y >> 4) + 8))
  {
    ny = (((var->player.y >> 4) + 8) - ul_keys.touch.y);
  }
  else
  {
    ny = ul_keys.touch.y - (var->player.y >> 4) - 8;
  }
  var->player.angle = get_angle(var, nx, ny);
J'ai fait des define pour les -8 +8 qui corresponde a la moitier de la largeur ou hauteur de mon sprite (16*16);

Pour en conclure que m'on angle trouver a la fin n'est pas vraiment celui qu'on esp鋨er...

Si quelqu'un sait comment avoir cette angle en fonction de ces criti鋨es ou bien a d'autre solution, je suis prenant

merci encore
sdevilcry est d嶰onnect   R廧onse avec citation

Publicit

Vieux 02/07/2008, 19h13   #2
sdevilcry
Membre
 
Date d'inscription: 02/05/2008
Messages: 22
Par d嶨aut

Bon probl鋗e r廥olue, j'ai utiliser atan2f, il fait meme le cafer

il renvoit un radian, juste a convertir, pour ceux que ca interesser de connaitre l'angle en fonction d'un point pr嶰is et du styler, voici le code


Code:
float           get_angle(t_quest *var, float nx, float ny)
{
  float angle;

  angle = 0;
  if (((var->player.x >> 4) + 8) < ul_keys.touch.x && ((var->player.y >> 4) + 8) > (ul_keys.touch.y))
   angle = (atan2f(ny, nx) * 180.0) / M_PI;
  else if (((var->player.x >> 4) + 9) > ul_keys.touch.x && ((var->player.y >> 4) + 8) > (ul_keys.touch.y))
    angle = 180 - ((atan2f(ny, nx) * 180.0) / M_PI);
  else if (((var->player.x >> 4)) > ul_keys.touch.x && ((var->player.y >> 4)) < (ul_keys.touch.y))
    angle = 180 + ((atan2f(ny, nx) * 180.0) / M_PI);
  else if (((var->player.x >> 4)) < ul_keys.touch.x && ((var->player.y >> 4)) < (ul_keys.touch.y))
    angle = 360 - ((atan2f(ny, nx) * 180.0) / M_PI);
  return (angle);
}
Merci a tous
sdevilcry est d嶰onnect   R廧onse avec citation
Vieux 02/07/2008, 20h11   #3
Arcadia
Mod廨ateur saisonnier
 
Date d'inscription: 17/02/2006
Localisation: Compi銶ne
Messages: 2 942
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par d嶨aut

Pas tr鋊 bon pour le CPU les float
__________________
.

Mes homebrews GBA : 1942 - Ghost'n Goblins




Mes autres passions, les flippers : Restauration d'un High Speed (Williams - 1985)

Derni鋨e modification par Arcadia ; 02/07/2008 20h20.
Arcadia est d嶰onnect   R廧onse avec citation
Vieux 02/07/2008, 22h14   #4
archipel
Kikoolol
 
Date d'inscription: 22/01/2007
Messages: 2 847
Par d嶨aut

ouep j'ai entendu dire que ca coulait le CPU
__________________
DevBlog qui a aboutit Aanaa
archipel est d嶰onnect   R廧onse avec citation
Vieux 02/07/2008, 23h01   #5
Nesgba
Membre confirm
 
Date d'inscription: 10/11/2005
Messages: 830
Par d嶨aut

mieux vaut utiliser les double avec quelques divisions
le code de base 彋ant d嶴a tr鋊 optimis je me suis permis d'ajouter des optimisations (des divisions, tou蓷...)...

Code PHP:
double           get_angle(t_quest *var, double nxdouble ny)
{
  
double angle;
  
double playerx,playerytouchx,touchy;
  
angle 0.0;
  
playerx = (double)var->player.;
  
playery = (double)var->player.;
  
touchx  = (double)ul_keys.touch.;
  
touchy  = (double)ul_keys.touch.;

  if (((
playerx/16.0) + 8.0) < touchx && ((playery/16.0) + 8.0) > (touchy))
   
angle = (atan2f(nynx) / (1.0/180.0)) / M_PI;
  else if (((
playerx/16.0) + 9) > touchx && ((playery/16.0) + 8.0) > (touchy))
    
angle 180.0 - ((atan2f(nynx) / (1.0/180.0)) / M_PI);
  else if (((
playerx/16.0)) > touchx && ((playery/16.0)) < (touchy))
    
angle 180.0 + ((atan2f(nynx) / (1.0/180.0)) / M_PI);
  else if (((
playerx/16.0)) < touchx && ((playery/16.0)) < (touchy))
    
angle 360.0 - ((atan2f(nynx) / (1.0/180.0)) / M_PI);
  return (
angle);

Nesgba est d嶰onnect   R廧onse avec citation
Vieux 02/07/2008, 23h05   #6
Arcadia
Mod廨ateur saisonnier
 
Date d'inscription: 17/02/2006
Localisation: Compi銶ne
Messages: 2 942
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par d嶨aut

Erf nes, je pige pas. Pourquoi des divisions ? Tant qu' optimiser, le d嶰alage de bit est bien plus rapide non ?
__________________
.

Mes homebrews GBA : 1942 - Ghost'n Goblins




Mes autres passions, les flippers : Restauration d'un High Speed (Williams - 1985)
Arcadia est d嶰onnect   R廧onse avec citation
Vieux 02/07/2008, 23h07   #7
YoBoY
Membre confirm
 
Date d'inscription: 10/11/2005
Localisation: Chez moi
Messages: 736
Par d嶨aut

+1 pour les floats, c'est super gourmand, qui plus est que dans ton cas moins d'avoir des millions de sprites suivant tes directions calcul嶪s super finement...
Au final tu ne dois avoir besoin que de quelques valeurs bien choisies regroup嶪s dans une table de valeurs.
Ou plus vraissemblablement des secteurs d'嶰rans d幨imiter pour savoir dans quelle direction regarde ton personnage.

Libre toi de choisir la solution qui te semblera la plus facile mettre en place.
YoBoY est d嶰onnect   R廧onse avec citation
Vieux 02/07/2008, 23h11   #8
Arcadia
Mod廨ateur saisonnier
 
Date d'inscription: 17/02/2006
Localisation: Compi銶ne
Messages: 2 942
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par d嶨aut

Ce tuto pourra peut-皻re 皻re utile...
__________________
.

Mes homebrews GBA : 1942 - Ghost'n Goblins




Mes autres passions, les flippers : Restauration d'un High Speed (Williams - 1985)
Arcadia est d嶰onnect   R廧onse avec citation
Vieux 02/07/2008, 23h25   #9
Nesgba
Membre confirm
 
Date d'inscription: 10/11/2005
Messages: 830
Par d嶨aut

Citation:
Envoy par Arcadia Voir le message
Erf nes, je pige pas. Pourquoi des divisions ? Tant qu' optimiser, le d嶰alage de bit est bien plus rapide non ?
c'etait du second degr , j'ai m瘱e mis les trois petits points pour 皻re sur que ca ne loupe pas
Nesgba est d嶰onnect   R廧onse avec citation
Vieux 02/07/2008, 23h33   #10
sdevilcry
Membre
 
Date d'inscription: 02/05/2008
Messages: 22
Par d嶨aut

faut savoir ce qui est plus gourmand entre float et double, nos assistant nous ont dit d'utiliser les float, le traitement sur la ds sera plus rapide ... je pige plus rien la

Citation:
Envoy par Arcadia Voir le message
Erf nes, je pige pas. Pourquoi des divisions ? Tant qu' optimiser, le d嶰alage de bit est bien plus rapide non ?
Eu ouai vaut mieux faire des decalages de bits, le traitement des divisions est assez lent...

Par contre je vois l'interet de faire une division de "/ (1.0/180.0)" dans le code que tu as refais, les divisions c'est lent

Citation:
Envoy par YoBoY Voir le message
Libre toi de choisir la solution qui te semblera la plus facile mettre en place.
Hum j'ai besoin d'un groupement de 8 valeurs, le probleme c est que mon personnage bouge et je peux pas hardcoder le business... sinon je ne me serait pas emb皻er a calculer les angles
merci de vos conseil

Derni鋨e modification par sdevilcry ; 02/07/2008 23h42.
sdevilcry est d嶰onnect   R廧onse avec citation
Vieux 03/07/2008, 01h36   #11
thoduv
Membre confirm
 
Date d'inscription: 10/11/2005
Localisation: ...
Messages: 1 464
Par d嶨aut

nes faisait de l'ironie l.
Des floats sur DS c'est mal, parce que c'est pas g廨 en hard. Les doubles, c'est pire.
Si tu as beaucoup de calculs de ce genre faire, il faudra absolument passer aux fixed points. Apr鋊, si c'est qu'une ou deux fois par frame par exemple, tu peux sacrifier un peu de rapidit pour la simplicit.
__________________
"S'il n'y a pas de solutions c'est qu'il n'y a pas de probl鋗e ..."
< mon devblog > ... < Lapinou Jumps ! - un jeu de plate-forme "vertical" avec un mignon petit lapin. >
thoduv est d嶰onnect   R廧onse avec citation
Vieux 03/07/2008, 10h05   #12
archipel
Kikoolol
 
Date d'inscription: 22/01/2007
Messages: 2 847
Par d嶨aut

Il n'y a pas une technique qui consiste multiplier la valeur trouv嶪 par un grand nombre puis de le troncaturer pour en faire un entier.
Apr廥, pour s'en resservir on le divise pas ce grand nombre
__________________
DevBlog qui a aboutit Aanaa
archipel est d嶰onnect   R廧onse avec citation
Vieux 03/07/2008, 11h25   #13
YoBoY
Membre confirm
 
Date d'inscription: 10/11/2005
Localisation: Chez moi
Messages: 736
Par d嶨aut

Les calculs d'angles (180 pfff nul), les flottants, les divisions... tout 蓷 pour savoir dans laquelle des 8 directions regarde un perso suivant la position du stylet, mon avis c'est une perte 幯orme de ressources alors qu'il est tr鋊 simple de le faire autrement.

je m'explique, tu as 8 positions donc je suppose que c'est gauche, droite, haut, bas, et les 4 diagonales 45 ce qui fait de m瘱e 8 secteurs angulaires pour savoir dans quelle direction regarde le perso soit en angles les espaces [-22.5, 22.5財, [22.5, 67.5財, [67.5, 112.5財... secteurs que l'on va appeler respectivement A, B, C, D, E, F, G et H

Prenons maintenant tes nx, ny valeurs enti鋨es sign嶪s qui repr廥entent la position du stylet par rapport au perso on a les relations suivantes

Code:
si nx >= 0 on est dans A B C G ou H
   si ny >= 0 on est dans A B ou C
      si nx >= ny on est dans A ou B
        si 24 * ny <= 10 nx (approximation  partir de la droite y=tan(22.5)*x pour 皻re en dessous) alors on est dans A
        sinon dans B
      sinon
        si ...
Bref je vais pas tout d彋ailler, comme tu peux le voir avec 4 tests et un peu de calculs sur les entier tu peux savoir direct quel sprite utiliser.

je sais pas si c'est moins gourmand que des floats et du atan2f suivi d'une conversion, mais vu de nez je dirais que 蓷 l'est
YoBoY est d嶰onnect   R廧onse avec citation
Vieux 03/07/2008, 13h04   #14
sdevilcry
Membre
 
Date d'inscription: 02/05/2008
Messages: 22
Par d嶨aut

hum mouai, a 4 if pr廥, je sais pas si les ressources prenne une claque... si je ferait 50 calculs de float a la suite je comprendrai mais la je le fait une fois et puis je reste assez pr嶰is sur la frame a afficher
Sinon la j'utilise des float car le prototypage de atan2f prend en argument deux floats et renvoie un float .

Apr廥 tous mes autres calculs que je fais se font en d嶰alage de bits

merci quand m瘱e YoBoY pour ton explication, mais je vais garder ma m彋hode, je vois d嶴 la pille de if grandir si je le fait avec la tienne :s

Derni鋨e modification par sdevilcry ; 03/07/2008 13h53.
sdevilcry est d嶰onnect   R廧onse avec citation
Vieux 03/07/2008, 20h21   #15
Arcadia
Mod廨ateur saisonnier
 
Date d'inscription: 17/02/2006
Localisation: Compi銶ne
Messages: 2 942
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par d嶨aut

Citation:
Envoy par archipel Voir le message
Il n'y a pas une technique qui consiste multiplier la valeur trouv嶪 par un grand nombre puis de le troncaturer pour en faire un entier.
Apr廥, pour s'en resservir on le divise pas ce grand nombre
Si, tu lis mon tuto...
__________________
.

Mes homebrews GBA : 1942 - Ghost'n Goblins




Mes autres passions, les flippers : Restauration d'un High Speed (Williams - 1985)
Arcadia est d嶰onnect   R廧onse avec citation
Vieux 03/07/2008, 20h42   #16
archipel
Kikoolol
 
Date d'inscription: 22/01/2007
Messages: 2 847
Par d嶨aut

yep je viens de trouver
en meme temps, je savais d嶴a faire donc je n'y avait pas pr彋 attention
__________________
DevBlog qui a aboutit Aanaa
archipel est d嶰onnect   R廧onse avec citation
Vieux 04/07/2008, 14h20   #17
sdevilcry
Membre
 
Date d'inscription: 02/05/2008
Messages: 22
Par d嶨aut

c'est ce que je fais pour la position de mon joueur, je fait un d嶰alage de << 4, et pour le redessiner a la fin, bah on remet 蓷 valeur toute petite (>> 4)
sdevilcry est d嶰onnect   R廧onse avec citation
R廧onse

Liens sociaux

Publicit



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invit(s))
 
Outils de la discussion
Modes d'affichage

R銶les de messages
Vous ne pouvez pas cr嶪r de nouvelles discussions
Vous ne pouvez pas envoyer des r廧onses
Vous ne pouvez pas envoyer des pi鋃es jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activ嶪s : oui
Les smileys sont activ廥 : oui
La balise [IMG] est activ嶪 : oui
Le code HTML peut 皻re employ : non
Navigation rapide

Discussions similaires
Discussion Auteur Forum R廧onses Dernier message
NDS Faire suivre un sprite anim au stylet AgentCisco Aide au d憝eloppement 5 12/04/2008 22h00
NDS Cr嶪r des collisions entre deux sprites en fonction d'un angle CyBeRCeD Aide au d憝eloppement 1 15/04/2007 12h03
NDS Rotation sprite OK mais angle Bizzare sensei Aide au d憝eloppement 3 12/03/2007 21h00
Tutorial Gestion de trajectoire de tir ou de bille, les virgules fixes mises en pratique Bobby Sixkilla Tutoriels 5 14/11/2006 04h40


Fuseau horaire GMT +2. Il est actuellement 00h58.


丼it par : vBulletin® version 3.7.2
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Tous droits r廥erv廥.
Version fran蓷ise #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince