Posté le 06/01/2005 à 00:00 Membre depuis le 28/06/2004, 528 messages
Sinon je pense limiter le dédoublement des pistes parce que c'est vraiment gore à gérer (algo récursif qui n'en fini plus de me ronger le cerveau sick)
De toute facon avec une map de 64x64 tiles y'a pas trop la place de faire des milliers de dédoublements (au fait quand je parle du nombre de dédoublements c'est les dédoublements imbriqués, on peut faire des dédoublements successifs s'ils sont sur la branche principale (je sais pas si c'est compréhensible ce charrabia tongue))
Enfin bref je pensais limiter le nombre de dédoublements à 1, si c'est trop peu à votre avis dites le moi et je bataillerais pour faire en sorte que ca soit 2 ou +.
Merci de vos réponses smile

PS : oui il y a bien 7 fois le mot dédoublement dans ce post grin
Posté le 07/01/2005 à 11:01 Membre depuis le 20/07/2001, 10663 messages
super ton projet, et ton shot! toptop
naPO a été productif sur les maps, mais c'est dommage il n'y a pas un seul saut!?

Par contre je pense qu'il faudrait vraiment que ton jeu soit compatible PedRom; ou alors je me représente mal le nombre d'heures que cela implique, mais je pense qu'il y a pas mal de gens qui utilise PedRom(dont moi bien sûr..)

Courage, ça promet vraiment. happy
avatarL'homme qu'a vu l'homme qu'a vu l'ours, qu'a mangé l'facteur..
Posté le 07/01/2005 à 11:58 Membre depuis le 28/06/2004, 528 messages
C'est PedroM qui n'a qu'a devenir compatible avec AMS tongue
En fait c'est parce que j'utilise des flottants je crois...

Sinon les circuits de naPO sont super ! il n'y a pas besoin d'avoir des sauts partout dans tous les circuits.
En regle générale les circuits les plus simples sont les plus appreciés smile (c'est d'ailleurs pour ca que je pense limiter les dédoublements)
Posté le 07/01/2005 à 12:12 Membre depuis le 20/07/2001, 10663 messages
Va expliquer ça à PpHd il sera ravi...hum

Wiwi j'aime bien les circuits de naPO mais un petit saut par-ci par-là, enfin tu en auras sur d'autres je pense.happy
avatarL'homme qu'a vu l'homme qu'a vu l'ours, qu'a mangé l'facteur..
Posté le 07/01/2005 à 12:13 Membre depuis le 29/10/2003, 25433 messages
Si on se démerde bien, on peut placer des sauts sur les côtés afin de faire des raccourcis par-dessus le décor tripo
Posté le 07/01/2005 à 12:15 Membre depuis le 30/06/2001, 37146 messages
Des floats ? pourquoi faire ?
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
Posté le 07/01/2005 à 12:21Edité par Boo le 07/01/2005 à 12:23 Membre depuis le 29/10/2003, 25433 messages
Pour péter les records de temps du circuits, par exemple, dans Mario Kart Super Circuit, il y a des circuits où on peut gruger et s'économiser qq secondes grin

(bon j'en fais quoi de ce post maintenant cheeky ?)
Posté le 07/01/2005 à 12:22 Membre depuis le 30/06/2001, 37146 messages
(je parlais des flottants mentionnés par LionelA)
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
Posté le 07/01/2005 à 12:32 Membre depuis le 28/06/2004, 528 messages
Pour PedroM je pense pas pouvoir faire grand chose tant qu'il ne supporte pas les flottants (je en suis pas au courant de l'actualité de PedroM donc je sais pas si ça a été fait)

Je les utilise pour l'init :
1) Pour créer la table des cosinus et sinus (mais bon à la limite je pourrais les caler en dur)
2) Pour la création de la matrice de projection (en virgule fixe y'a pas moyen d'obtenir la meme precision ou alors je m'y prend mal)
donc résultat je suis obligé d'utiliser les floats sad

Sinon oui on peut rajouter quelques jumps pour mettre un peu de piment smile
Posté le 07/01/2005 à 12:41 Membre depuis le 12/12/2001, 1779 messages
1) tu pourrais surtout les calculer en virgule fixe
2) tu t'y prends mal
Posté le 07/01/2005 à 12:52 Membre depuis le 28/06/2004, 528 messages
1) c'est pas ma faute si les fonctions cos et sin renvoient des floats
2) J'ai bataillé au maximum et Fisch2 aussi sans arriver à un resultat convaincant donc j'ai un peu laissé tombé pour l'instant.
Par contre si tu veux t'amuser je t'en prie smile http://www.tigen.org/pws/forum/index.php?action=sujet&forum=5&cat=20&topic=1007&page=3#38
Posté le 07/01/2005 à 13:04 Membre depuis le 30/10/2001, 31564 messages
j'ai jeté un oeil à m7_CreateMatrix (c'est bien ça ?), et les floats sont pas vraiment nécessaires...

tu as besoin des (short)(k * tabstep), càd (short)(k * (float)K1 / (K2*val)) ; tu peux donc écrire :
int log2(long x) {
  if (x<0) x=-x;
  int j=-1;
  while (x)
    x>>=1, j++;
  return j;
}

puis
  long q = K2*val;
  int z = log2(q)-15;
  if (z<0) z=0;
  K1>>=z; q>>=z;
  for (k...)
    Horz[...] = (short) (k * K1 / (short)q);


Et la division est en réalité un simple opcode divs, donc plutôt efficace smile

[EDIT : cross, les sources que j'ai regardées sont celles que tu m'avais passées, pas les plus récentes ^^]
Posté le 07/01/2005 à 16:33 Membre depuis le 28/06/2004, 528 messages
Heu c'est normal que j'y pige rien tongue ?

Ca serait super cool si tu pouvais faire les optimisations sur la derniere version du code ^^
merci
Posté le 07/01/2005 à 17:00 Membre depuis le 30/10/2001, 31564 messages
en fait le code avait pas changé tripaf

bon voilà ce que ça donnerait : (pas testé, dis-moi si ça marche)
(ancienne version)
...
float tabstep[SIZE_Y];
...
void m7_CreateMatrix(short SizeHorz, short ViewL, short ViewF)
{
  register short i,j;
  K3 = SizeHorz * (SIZE_Y * (ViewF - 1));
  const long K1 = -K3*ViewL*ViewL;
  const long K2 = 2*SIZE_X*ViewF;
  K4 = (SizeHorz-1)*ViewF;
  
  K5 = SizeHorz*(-(ViewF-1)*ViewL);
  
  long val = ((SIZE_Y - 1) * K4 - K3);

  for(i=SIZE_Y; i--; )
  {
      tabstep[SIZE_Y - i - 1] = (float)K1/(K2 * val);
      Vert[SIZE_Y - i - 1] = (i*K5)/(val + val);
      val -= K4;
  }
  
  for(j=SIZE_Y; j--; )
  {
    const float _tabstep = tabstep[j];
    float _tabstep1 = ((SIZE_X/2)+1)*_tabstep;
    float _tabstep2 = (-((SIZE_X/2)-1))*_tabstep;
    const short offset = SIZE_X * j;
    
    for(i=SIZE_X/2; i--; )
    {
      Horz[((SIZE_X/2) - i%(SIZE_X/2) - 1) + offset] = _tabstep1;
      Horz[((SIZE_X/2) + i%(SIZE_X/2)) + offset] = _tabstep2;
      
      _tabstep1 -= _tabstep;
      _tabstep2 += _tabstep;
    }
  }
}

(nouvelle version)
...
int log2(long x) { 
  if (x<0) x=-x; 
  int j=-1; 
  while (x) 
    x>>=1, j++; 
  return j; 
}
void m7_CreateMatrix(short SizeHorz, short ViewL, short ViewF)
{
  register short i,j;
  K3 = SizeHorz * (SIZE_Y * (ViewF - 1));
  const long K1 = -K3*ViewL*ViewL;
  const long K2 = 2*SIZE_X*ViewF;
  K4 = (SizeHorz-1)*ViewF;
  
  K5 = SizeHorz*(-(ViewF-1)*ViewL);
  
  long val = ((SIZE_Y - 1) * K4 - K3);

  for(i=SIZE_Y; i--; )
  {
      long q = K2 * val;
      int z = log2(q) - 15;
      if (z<0) z=0;
      long K1z = K1>>z; q>>=z;
      Vert[SIZE_Y - i - 1] = (i*K5)/(val + val);
      val -= K4;

      int j1 = (SIZE_X/2)+1;
      int j2 = -(SIZE_X/2)+1;
      const short offset = SIZE_X * (SIZE_Y - i - 1);
      for(j=SIZE_X/2; j--; )
      {
	  Horz[((SIZE_X/2) - j - 1) + offset] = (short)(j1 * K1z / (short)q);
	  Horz[((SIZE_X/2) + j) + offset] = (short)(j2 * K1z / (short)q);

	  j1--, j2++;
      }
  }
}
Posté le 07/01/2005 à 17:37 Membre depuis le 28/06/2004, 528 messages
eek y'a comme un petit probleme en fait tongue :
fzeropollux.gif
Posté le 07/01/2005 à 17:39 Membre depuis le 30/10/2001, 31564 messages
gni

Est-ce que ça marche si tu remplaces
long K1z = K1>>z; q>>=z;
par
float K1z = K1;
?
Posté le 07/01/2005 à 17:51 Membre depuis le 28/06/2004, 528 messages
heu grin
fzeropollux2.gif

Si tu veux je peux t'envoyer le projet complet ?
Posté le 07/01/2005 à 17:54 Membre depuis le 30/10/2001, 31564 messages
oups, il faut aussi remplacer (short)q par q tout court, dans ce cas-là, dsl ^^ (je veux bien le projet complet, éventuellement cheeky)
Posté le 07/01/2005 à 18:00 Membre depuis le 28/06/2004, 528 messages
Oui avec le q à la place du (short) q ca marche smile
je te maile le projet (au fait je me servait de tabstep dans la partie projection des sprites, je sais pas si ta technologie est adaptable là aussi (fonction m7_ProjXYZ))
Posté le 07/01/2005 à 18:07 Membre depuis le 30/10/2001, 31564 messages
d'accord, c'est juste que je m'étais planté dans log2() : mets j=0 au lieu de j=-1, en principe ça devrait marcher smile
Posté le 07/01/2005 à 18:12 Membre depuis le 28/06/2004, 528 messages
Merci beaucoup !!! bisoo
T'es vraiment un boss !
(je t'envoie le projet où c'est pas la peine ?)

edit : envoyé finallement
edit² : finallement pas (mail erroné)
Posté le 07/01/2005 à 19:53 Membre depuis le 30/06/2001, 12332 messages
#73>pas mal l'effet graphique^^
avatarMembre fondateur de la Ligue Anti-MacIntoc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Un expert est quelqu'un qui en sait de plus en plus sur de moins en moins
de choses, jusqu'à ce qu'il connaisse absolument tout à propos de rien.
Posté le 08/01/2005 à 11:41 Membre depuis le 28/06/2004, 528 messages
lol, c'est clair smile
J'en ai obtenu des bien sympa aussi quand je faisais mes tests pour trouver la formule
Posté le 08/01/2005 à 11:57 Membre depuis le 28/06/2004, 528 messages
Grâce à Pollux j'ai réussi à me débarrasser des floats à l'endroit où je croyais que c'était impossible.

Maintenant reste le problème des cos et sin :
voici le source

// Cos and Sin
#define NBDIR 128
#define SINCOS 4

signed char CosTable[NBDIR];
signed char SinTable[NBDIR];


static inline void m7_CosAndSin()
{
  register short i;
     
    for(i = NBDIR; i--;) {
      const float angle = (i+i)*(PI/NBDIR);  // Now, PI/NBDIR will be a constant value and (i+i) is faster than i*2
      CosTable[i] = (signed char)(cos(angle)*(1<<SINCOS));
      SinTable[i] = (signed char)(sin(angle)*(1<<SINCOS));
    }
}



Comment je pourrais faire ?
Merci
Posté le 08/01/2005 à 11:59 Membre depuis le 30/10/2001, 31564 messages
table précalculée, si tu veux pas te prendre la tête...
Posté le 08/01/2005 à 12:01 Membre depuis le 28/06/2004, 528 messages
J'y ai pensé mais le probleme c'est que je voulais que le NBDIR et SINCOS soient parametrables...
Posté le 08/01/2005 à 12:01 Membre depuis le 30/10/2001, 31564 messages
eek, tu fais varier que de -16 à +16 ? t'as besoin de si peu de précision que ça ?

(et sinon tu peux aussi utiliser la même table pour le sinus et le cosinus, avec juste 25% d'éléments en plus)
Posté le 08/01/2005 à 12:03 Membre depuis le 30/10/2001, 31564 messages
lionelA :
J'y ai pensé mais le probleme c'est que je voulais que le NBDIR et SINCOS soient parametrables...

ah, pkoi ?
Posté le 08/01/2005 à 12:08 Membre depuis le 28/06/2004, 528 messages
Ben ouais grin (ca se voit pas quand on joue (c'est la limite ultime car de -8 à +8 c'est horrible quand on tourne))
Je pensais a stocker une table contenant une precision jusqu'à -128 à +128 et de partir de là afin de ne plus utiliser les fonction cos et sin d'AMS, qu'en pense tu ?
Posté le 08/01/2005 à 12:10 Membre depuis le 28/06/2004, 528 messages
86> je sais plus trop mais je crois que c'était pour permettre d'augmenter la précision si on a des cartes plus petites (enfin dans un autre jeu qui utiliserait mon moteur de mode7)
Posté le 08/01/2005 à 12:32 Membre depuis le 30/10/2001, 31564 messages
ben je sais pas, moi j'utilise des valeurs de -32767 à +32767, et je multiplie (enfin, décale) après par ce qu'il faut, c'est bcp plus précis... je pense pas que tu aies besoin de bcp de vitesse pour ça, non ?