:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Développement Amateur :: > Aide au développement

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 19/03/2008, 19h42   #1
Delca
Membre confirmé
 
Date d'inscription: 09/01/2008
Messages: 267
Par défaut Impossible de changer les angles

Bonsoir à tous,

Aloir voila ce qui se passse : je voudrais faire en sorte qu'un petit bonhomme, dont le sprite est le n°0, puisse tirer des petits missile, dont les sprites s'étalent du n°1 au n°4.

Je récupère donc l'angle de tir avec le stylet, puis je le stocke dans une variable, afin de pouvoir m'en servir avec PA_Cos et PA_Sin pour le faire avancer :
Code:
	if (Stylus.Newpress){	   
           i++;
   	   missile[i].angle = PA_GetAngle(bfight.x+16, bfight.y+32, Stylus.X, Stylus.Y);
	   PA_CreateSprite(0, i, (void*) Missile_Sprite, OBJ_SIZE_8X8, 1, 1, missile[i].x, missile[i].y);
	   missile[i].x=PA_GetSpriteX(0, 0)+16; 
	   missile[i].y=PA_GetSpriteY(0, 0)+32;
	   PA_StartSpriteAnim(0, i, 0, 3, 15);	   
	   missile[i].exist=true;}
Ensuite, j'utilise ça pour placer les missiles (avec les quatre chiffres) :

Code:

if (missile[1].exist==true){
	missile[1].x += PA_Cos(missile[1].angle)*0.01;
	missile[1].y += PA_Sin(missile[1].angle)*0.01;
	PA_SetSpriteXY(0, 1, missile[1].x, missile[1].y);}
Seulement, quand je touche l'écran avec le stylet, l'angle est toujours le même, à moins que le personnages soit en l'air.

Et après, on ne peut pas le changer en touchant un autre endroit.

Si quelqu'un trouve une solution, je suis preneur! Une heure que je me casse la tête là-dessus...
__________________
Mon (seul et unique) projet : Un autre pong (Only for Nintendo DS)

Mon Devblog

Coloration terminée, attente de réactions sur certaines couleurs : TETRIS

21.59091 au Geek Test
Delca est déconnecté   Réponse avec citation

Publicité

Vieux 22/03/2008, 11h33   #2
Cortes48
Modérateur
 
Date d'inscription: 28/02/2007
Localisation: Grenoble
Messages: 576
Par défaut

Delca merci encor de t occupé de sa.

Je sais pas si sa peut t aider mais ta variable i doit retourné a 0

Code:
 
if (i==3) i=0;
et pourquoi dans

Code:
if (missile[1].exist==true){
	missile[1].x += PA_Cos(missile[1].angle)*0.01;
	missile[1].y += PA_Sin(missile[1].angle)*0.01;
	PA_SetSpriteXY(0, 1, missile[1].x, missile[1].y);}
tu met missile[1]

fait plutot ca

Code:
int j;
for(j=0;j<nb_de_missile_tiré;j++){
       if (missile[j].exist==true){
	missile[j].x += PA_Cos(missile[j].angle)*0.01;
	missile[j].y += PA_Sin(missile[j].angle)*0.01;
	PA_SetSpriteXY(0, 1, missile[j].x, missile[j].y);}
et aussi le PA_StartSpriteAnim(0, i, 0, 3, 15); du premier if{}; ne doit pa se trouver la car il sera exucuté qu une frame a cause de Stylus.Newpress essay de le mettre dans une boucle

Dernière modification par Cortes48 ; 22/03/2008 à 11h40.
Cortes48 est déconnecté   Réponse avec citation
Vieux 22/03/2008, 20h00   #3
Delca
Membre confirmé
 
Date d'inscription: 09/01/2008
Messages: 267
Par défaut

-Pour la variable qui retourne à 0, c'est déjà fait, mais je n'ai pas jugé utile de le poster ici...

-Ici, j'ai mis 1 pour faire un test sur le premier missile uniquement. Je changerais quand tout fonctionneras bien.

-Quant au PA_StartSpriteAnim, il démarre l'animation, et une fois lancée, elle n'a plus besoin de rien pour continuer. Donc une frame suffit.
__________________
Mon (seul et unique) projet : Un autre pong (Only for Nintendo DS)

Mon Devblog

Coloration terminée, attente de réactions sur certaines couleurs : TETRIS

21.59091 au Geek Test
Delca est déconnecté   Réponse avec citation
Vieux 23/03/2008, 03h01   #4
Nesgba
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 830
Par défaut

GCC doit certainement prononcer quelques insultes à la compilation, quelles sont elles ?

tu devrai plutôt passer par des nombres fixed (c'est dans la logique du middleware que tu utilises)

en admettant que ta structure ressembles globalement a ça:
Code PHP:
typedef struct{
char exist ;
long x,;
unsigned short angle ;
...
}
sMISSILE ;

sMISSILE missile[25] ; 
et sachant que les tables sin et cos de palib sont en fixed 8.8, il me parait logique de continuer dans ce sens la

Code PHP:
#define FL2FX8(i)  ( (long) ((((float)(i))*256.0)+0.5) )

if (missile[1].exist==true){
missile[1].+= (PA_Cos(missile[1].angle)*FL2FX8(0.1))>>;
missile[1].+= (PA_Sin(missile[1].angle)*FL2FX8(0.1))>>;

PA_SetSpriteXY(01, (missile[1].x>>8)+(256/2), (missile[1].y>>8)+(192/2));

Nesgba est déconnecté   Réponse avec citation
Vieux 23/03/2008, 09h52   #5
Arialia
Elite
 
Date d'inscription: 10/04/2006
Localisation: Pays de la moutarde
Messages: 901
Par défaut

un petit exemple tiré du post baby-foot de Cyberced

dur à retrouver en plus je savais plus où je l'avais posté


http://www.playeradvance.org/forum/s...&postcount=110

j'espère que cela pourra t'aider
__________________
Mon blog de dev - - Mon tutoriel sur la libfat -- DSPhoto
Un bon programmeur est fainéant : il déteste refaire la même chose, il fait donc des fonctions
Il est impossible de tout savoir
28.59848% au Geek Test
Arialia est déconnecté   Réponse avec citation
Vieux 23/03/2008, 12h03   #6
Delca
Membre confirmé
 
Date d'inscription: 09/01/2008
Messages: 267
Par défaut

Merci à vous deux pour vos réponses, mais le problème est toujours présent:

-nesgba, si c'est bien ce que j'ai compris, je n'ai aucune erreur de compilation. Et pour ton code (auquel je n'ai rien compris...), il donne exactement le même résultat qu'avant, c'est à dire qu'il y a un angle impossible à changer.

-Arialia, ton message à l'air de concerner plus le déplacement à l'aide des angle, ce que j'ai réussi à faire. Chez moi, le problème, c'est que l'angle récupéré est toujours le même.

Au passage, je viens de remarquer que l'angle récupéré est toujours supérieur à 65.000. Il me semblait que ça ne pouvait pas dépasser 256....
__________________
Mon (seul et unique) projet : Un autre pong (Only for Nintendo DS)

Mon Devblog

Coloration terminée, attente de réactions sur certaines couleurs : TETRIS

21.59091 au Geek Test
Delca est déconnecté   Réponse avec citation
Vieux 23/03/2008, 18h52   #7
Arialia
Elite
 
Date d'inscription: 10/04/2006
Localisation: Pays de la moutarde
Messages: 901
Par défaut

Citation:
Envoyé par Delca Voir le message
Merci à vous deux pour vos réponses, mais le problème est toujours présent:

-nesgba, si c'est bien ce que j'ai compris, je n'ai aucune erreur de compilation. Et pour ton code (auquel je n'ai rien compris...), il donne exactement le même résultat qu'avant, c'est à dire qu'il y a un angle impossible à changer.

-Arialia, ton message à l'air de concerner plus le déplacement à l'aide des angle, ce que j'ai réussi à faire. Chez moi, le problème, c'est que l'angle récupéré est toujours le même.

Au passage, je viens de remarquer que l'angle récupéré est toujours supérieur à 65.000. Il me semblait que ça ne pouvait pas dépasser 256....
Oula oui j'étais complètement à côté de la plaque moi (pas encore bien réveillée surement )

c'est pas encore la grande forme d'ailleurs

sinon j'ai vu que le tuto PALib a été mis à jour il y a pas très longtemps, et on y trouve des choses très intéressantes surtout sur les angles et les collisions :
http://www.palib.info/wikifr/doku.php?id=day6

pour l'instant je ne fais pas de commentaires sur ton code car :
  1. Les bulles de champagne n'aident pas à la réflexion
  2. La réponse à ton problème se trouve dans le tuto me semble-t-il
__________________
Mon blog de dev - - Mon tutoriel sur la libfat -- DSPhoto
Un bon programmeur est fainéant : il déteste refaire la même chose, il fait donc des fonctions
Il est impossible de tout savoir
28.59848% au Geek Test
Arialia est déconnecté   Réponse avec citation
Vieux 24/03/2008, 13h04   #8
Delca
Membre confirmé
 
Date d'inscription: 09/01/2008
Messages: 267
Par défaut

Même après une sixième relecture du tuto, je ne vois pas ce qui cloche dans mon code.

Par contre, je viens de remarquer un nouveau fait étrange : en utilisant PA_GetAngle avec comme cible la position du stylet, je me suis aperçu que l'angle ne changeais que selon la position du personnage à l'écran. C'est à dire que le stylet n'est pas pris en compte malgré l'utilisation de Stylus.X et Stylus.Y.
__________________
Mon (seul et unique) projet : Un autre pong (Only for Nintendo DS)

Mon Devblog

Coloration terminée, attente de réactions sur certaines couleurs : TETRIS

21.59091 au Geek Test
Delca est déconnecté   Réponse avec citation
Vieux 24/03/2008, 16h35   #9
Arialia
Elite
 
Date d'inscription: 10/04/2006
Localisation: Pays de la moutarde
Messages: 901
Par défaut

Bon je me suis un peu penchée sur le problème et j'ai pondu un petit exemple
Code:
// Includes, only one sprite
#include <PA9.h>

// PAGfx Include
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"


// Main function
int main(void){
	// PAlib init
	PA_Init();
	PA_InitVBL();
	PA_InitText(1, 0);
	
// Load the sprite palette, for both screens
	PA_LoadSpritePal(0, // Screen
					0, // Palette number
					(void*)sprite0_Pal);	// Palette name
	
	// Now, let's copy the image of the sprite to VRAM :
	// First screen
	u16 gfx0 = PA_CreateGfx(0, // screen
				(void*)vaisseau_Sprite, // Image
				OBJ_SIZE_32X32, // Size
				1); // 256 color sprite
	// Same thing for the top screen : 
//	u16 gfx1 = PA_CreateGfx(1, (void*)vaisseau_Sprite, OBJ_SIZE_32X32, 1);
	
	// The gfx0 and gfx1 variables stock the number of the gfx, this will allow us to create sprites later on
	u8 nsprites0 = 0; // Number of sprites on the bottom screen
	s32 x = (128-16) << 8; // ship x position in 8bit fixed point
	s32 y = (96-16) << 8; // Y
	u16 angle = 0; // direction in which to move !
	
		PA_CreateSpriteFromGfx(0, // screen
								nsprites0, // Next sprite to load...
								gfx0, // image to use in memory, no image copying !
								OBJ_SIZE_32X32, 1, 0, x>>8, y>>8); // The rest is like normal sprites
	
	
	PA_SetSpriteRotEnable(0,0,0);// Enable rotations and use Rotset 0... 
	
	
	while(1)
	{
	// si le stylet appuie sur l'écran ... on tourne le sprite 
	if (Stylus.Held){ // Move forward
	angle=PA_GetAngle((x>>8) +16, (y>>8) +16, Stylus.X, Stylus.Y);
	PA_OutputText(1, 5, 5, "Angle : %d  ", angle);
	PA_SetRotsetNoZoom(0, 0, angle-128); // Turn the ship in the correct direction
 
		x += PA_Cos(angle);
		y -= PA_Sin(angle);
	}	
		PA_SetSpriteXY(0, 0, x>>8, y>>8); // Sprite position converted to normal...

	PA_WaitForVBL();
	//La boucle infinie du programme
	}
	return 0;
}
le problème dans ton code vient de la multiplication par 0,01 , j'avoue que je pige pas trop pourquoi tu fais ça ....
Fichiers attachés
Type de fichier : zip getangle.zip (144,4 Ko, 123 affichages)
__________________
Mon blog de dev - - Mon tutoriel sur la libfat -- DSPhoto
Un bon programmeur est fainéant : il déteste refaire la même chose, il fait donc des fonctions
Il est impossible de tout savoir
28.59848% au Geek Test
Arialia est déconnecté   Réponse avec citation
Vieux 25/03/2008, 15h01   #10
Delca
Membre confirmé
 
Date d'inscription: 09/01/2008
Messages: 267
Par défaut

Je multiplie par 0.01 pour ralentir les missiles, parce que moi et les points fixes, ça fait deux. (j'ai compris le principe, mais je vois pas l'utilité....)

La bonne nouvelle, c'est que c'était les points fixes le problème : en fait, dans la fonction PA_GetAngle, j'avais oublié le >>8 derrière bfight.x et bfight.y. Du coup, tout marche bien maintenant. Merci pour ton aide!
__________________
Mon (seul et unique) projet : Un autre pong (Only for Nintendo DS)

Mon Devblog

Coloration terminée, attente de réactions sur certaines couleurs : TETRIS

21.59091 au Geek Test
Delca est déconnecté   Réponse avec citation
Vieux 25/03/2008, 19h40   #11
Cobain
Membre confirmé
 
Date d'inscription: 24/05/2007
Localisation: devant mon pc
Messages: 2 027
Par défaut

les points fixes servent a remplacer les float sur les systeme ou ça merde
Cobain est déconnecté   Réponse avec citation
Vieux 25/03/2008, 19h57   #12
Delca
Membre confirmé
 
Date d'inscription: 09/01/2008
Messages: 267
Par défaut

Et sur DS, les floats merdent, comme tu dis? Je croyais qu'ils étaient juste très lent à gérer.
__________________
Mon (seul et unique) projet : Un autre pong (Only for Nintendo DS)

Mon Devblog

Coloration terminée, attente de réactions sur certaines couleurs : TETRIS

21.59091 au Geek Test
Delca est déconnecté   Réponse avec citation
Vieux 25/03/2008, 20h35   #13
Cobain
Membre confirmé
 
Date d'inscription: 24/05/2007
Localisation: devant mon pc
Messages: 2 027
Par défaut

c'est la meme chose...
...enfin presque
Cobain est déconnecté   Réponse avec citation
Vieux 26/03/2008, 13h03   #14
Cortes48
Modérateur
 
Date d'inscription: 28/02/2007
Localisation: Grenoble
Messages: 576
Par défaut

Peut etre que ton angle=PA_GetAngle(...); doit sortir de la condition if(Stylus.Held){}
car l angle est toute le temp égal a PA_GetAngle(...); Il n est pas égal a ca que si on touche l écran
Cortes48 est déconnecté   Réponse avec citation
Vieux 26/03/2008, 15h02   #15
Delca
Membre confirmé
 
Date d'inscription: 09/01/2008
Messages: 267
Par défaut

Je n'ai besoin de redéfinir l'angle que lorsque le stylet touche l'écran.
Une fois que je lui ai donner une valeur, il la garde tant que je ne décide pas de la changer (ou que je ferme l'émulateur)
__________________
Mon (seul et unique) projet : Un autre pong (Only for Nintendo DS)

Mon Devblog

Coloration terminée, attente de réactions sur certaines couleurs : TETRIS

21.59091 au Geek Test
Delca est déconnecté   Réponse avec citation
Vieux 27/03/2008, 00h36   #16
Arialia
Elite
 
Date d'inscription: 10/04/2006
Localisation: Pays de la moutarde
Messages: 901
Par défaut

au fait Delca je t'ai mis volontairement un exemple de PA_CreateSpriteFromGfx et de PA_CreateGfx dans mon code : cela me semble très approprié ( voire recommandé ) pour tes missiles, grâce à cela tes 4 sprites pourront se partager le même gfx ( à tester avec les anims mais d'après ce que j'ai compris des sources de la PALib ça devrait marcher sans problème .... chapeau Mollusk )

[Edit]
argh non c'est pas compatible avec les anims : la palib changeant le graphique du sprite à chaque frame.

Donc si deux sprites se partagent une animation mais ne sont pas synchro , tu est obligé de les considérer comme différents
__________________
Mon blog de dev - - Mon tutoriel sur la libfat -- DSPhoto
Un bon programmeur est fainéant : il déteste refaire la même chose, il fait donc des fonctions
Il est impossible de tout savoir
28.59848% au Geek Test

Dernière modification par Arialia ; 27/03/2008 à 01h03.
Arialia est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



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

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h20.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2023, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince