Événements liés
  • Démo technique du samedi #6: 30 Juin 2007
Pages: 1 [2]   Bas de page
Imprimer
Auteur Fil de discussion: [Demo] Des listes d'objets qui vous suivent  (Lu 10292 fois)
0 Membres et 1 Invité sur ce fil de discussion.
EvilTroopa Hors ligne
Hero Member
*****
Messages: 519


Voir le profil WWW
1010011010 the Number of the Beast

« Réponse #15 : 17 Juillet 2008, 16:40:27 »

Si j'ai bien compris ce que tu veux :

Tu veux que chaque tir aille dans la direction du stylet AU MOMENT du tir et continue sa route ensuite sans être influencé par les positions suivantes du stylet ?

Je vois qu'une ligne qui pollue ton truc :

Code
(c):
s8 DeplacerTir(u8 i)
{
 
 u8 n = ntir[i];
 
   // Ajust l'angle...
   tirs[n].angle = angle ; // CETTE LIGNE
 
   tirs[n].fx += (PA_Cos(tirs[n].angle)*tirs[n].vitesse);
   tirs[n].fy -= (PA_Sin(tirs[n].angle)*tirs[n].vitesse);
 

Ici tu modifies à chaque VBL l'angle de ton tir, donc au lieu de continuer sur sa route, le tir est influencé par ta variable globale angle qui est donc modifiée à chaque VBL ici dans ton main :

Code
(c):
if (Stylus.Held)
       {
           angle = PA_GetAngle(Player1.posx, Player1.posy, Stylus.X, Stylus.Y);
       }
 

Je pense que ton problème vient de là !
Journalisée

A mushroom a day, keeps the koopas away.
Toiletking Hors ligne
Mega Member
***
Messages: 1289


Voir le profil WWW
"Caca Boudin!"

« Réponse #16 : 17 Juillet 2008, 18:42:40 »

viiii vala! C'est EXACTEMENT CA!!!  Cheesy

Je me doutait bien que le problème venait de là!  Smiley seulement je vois pas comment faire pour qu'un nouvel angle soit attribué à chaque tir!

En fait, j'avais une routine (que j'ai repompé en parti dans le code de jetfighter dans un sos de cid) qui fonctionne mais qui rame pas mal, mais j'arrive pas a reprendre le code de mollusk dessus (c'est pas la même logique) :


Code
(c):
       if (Pad.Newpress.L)
       {
           bullet[Index].posx = Player1.posx; // le shoot est créer au meme x que jet, 15 pixel a coté
           bullet[Index].posy = Player1.posy;// le shoot est créer au meme x que jet,  pixel a coté
           bullet[Index].speedy =2;
//          bullet[Index].Shoot_rotset = rotset;
           bullet[Index].angle = angle;
           bullet[Index].Shooting =TRUE;
 
           PA_CreateSprite(0,Index + 20, (void*)laser2_Sprite, OBJ_SIZE_16X16, 1, 2, bullet[Index+1].posx, bullet[Index+1].posy);
           PA_CreateSprite(0, Index + 40,(void*)explosion_Sprite, OBJ_SIZE_16X16,1, 1, 0,0);
// PA_SetSpriteRotEnable(0,Index + 20, bullet[Index].Shoot_rotset); on fait tourné le shoot type laser
 
           Index++;
//          rotset++; // un rotset par laser
           if (Index >=BULLET) Index = 0;
//          if (rotset >=BULLET) rotset = 1; // C'est le rotset du laser => le rotset 0 c'est le player : donc quand on a atteint BULLET (25) le rotset revient a 1
 
       }
 
 
 
 
       for (i =0; i < BULLET; i++)
       {
           if (bullet[i].Shooting)
           {
 
               bullet[i].posx+= bullet[i].speedy * PA_Cos(bullet[i].angle) >>8;  //Player1.speedy;
               bullet[i].posy -= bullet[i].speedy * PA_Sin(bullet[i].angle)>>8; // Player1.speedy;
 
 
 
               PA_SetSpriteXY(0,i+20, bullet[i].posx, bullet[i].posy);
// PA_SetRotsetNoZoom(0, bullet[i].Shoot_rotset, bullet[i].angle); // Lazer qui prend l'orientation du joueur
 
// SHOOT_COLLISION
 
//   arret du shoot quand il touche un mur
               for (b=0;b<8;b++)
               {
                   if (PA_EasyBgGetPixel (0, 3, bullet[i].posx+b,  bullet[i].posy-1+8)==1) bullet[i].Shooting =FALSE;
                   if (PA_EasyBgGetPixel (0, 3, bullet[i].posx+b,  bullet[i].posy+8+8)==1) bullet[i].Shooting =FALSE;
                   if (PA_EasyBgGetPixel (0, 3, bullet[i].posx-1,  bullet[i].posy+i+8)==1) bullet[i].Shooting =FALSE;
                   if (PA_EasyBgGetPixel (0, 3, bullet[i].posx+8, bullet[i].posy+i+8)==1) bullet[i].Shooting =FALSE;
               }
 
// rend le sprite shoot transparent et place le sprite explosion a la place
               if ( bullet[i].Shooting==FALSE )// si l'animation s'arrete et que le sprite est dans l'écran
               {
                   PA_SetSpriteAnim(0,i+20,1);
                   PA_SetSpriteXY(0,i+40,bullet[i].posx,bullet[i].posy);
                   PA_StartSpriteAnimEx(0,i+40, 0, 7, 20, ANIM_ONESHOT);
               }
 
 
               // si le sprite est en dehors de l'écran, il s'arrete et deviens transparant
               if (bullet[i].posx>255||bullet[i].posx<0)  PA_SetSpriteAnim(0,i+20,1);
               if (bullet[i].posy>192||bullet[i].posy<0)  PA_SetSpriteAnim(0,i+20,1);
 
 
 
           }
       }

Ce code fonctionne a peu près bien mais il rame, et sature la mémoire, c'est super nettement moin optimisé et adapté que le code de Momo Azn ! Les rotsets sont en commentaires, mais il fonctionnent, pour chaque tire. Et les tires se dirige indépendament!

Et je sais pas si c'est une histoire de fixed point, mais le code de Momo est nettement plus précis : les shoots suivent beaucoup plus la trajectoire du stylet!

C'est pour ca que je voudrais partir sur le code de Momo : c'est mieux Azn

Edit : dans ce code, le shoot repère la collision au mur pour mon alien breed, il arrête le shoot dans sa lancée, et lance une anime explosion Azn mine de rien, je vais même pouvoir faire rebondire des shoots!  Cheesy
« Dernière édition: 17 Juillet 2008, 18:49:29 par Toiletking » Journalisée
Toiletking Hors ligne
Mega Member
***
Messages: 1289


Voir le profil WWW
"Caca Boudin!"

« Réponse #17 : 17 Juillet 2008, 19:05:02 »

Raaaaaaaaaah !!!

merci spoooonnnn!!!! Kiss Kiss Kiss Kiss

tu m'a mis sur la voie!!!! effectivement : CA POLLUAIT BIEN MON CODE CETTE LIGNE!!! Cheesy

Je l'ai viré et ca marche!!! en plus je l'avais mis un peu plus loin!!! nikellllllle!!!
Journalisée
Pages: 1 [2]   Haut de page
Imprimer

Aller à: