Gerer la collision entre deux balles
Posté le 01/01/2015 18:36
Salut à tous !
J'avais déjà parlé de ce projet a Fab mais je lavais abandonné (pour je ne sais quel raison
) mais j'aimerais bien le reprendre !
Mon but etant de faire une petite lib permettant de gerer les collisions et les rebondissements entre 2 balles afin de... euh... pouvoir faire des jeux contenant des ballons facilement on va dire
En fait j'applique une formule toute simple (je bloque dès le début :boulet: ) mais je sais qu'elle ne marche pas, je sais ou ca marche pas mais je ne sais pas comment changer la formule afin de la rendre opérationnelle
le tout petit bout de code ici a pour but de detecter une collision entre deux balles :
[brown]#include [gray]"fxlib.h"[/gray][/brown]
[brown]#include [gray]"MonochromeLib.h"[/gray][/brown]
[brown]#include [gray]"stdio.h"[/gray][/brown]
[purple]int[/purple] AddIn_main(int isAppli, unsigned short OptionNum){
[purple]int[/purple] balle2[3]={[maroon]1[/maroon], [maroon]1[/maroon], [maroon]10[/maroon]}, balle1[3]={[maroon]20[/maroon], [maroon]30[/maroon], [maroon]15[/maroon]};
[purple]int[/purple] vecteur2_x=[maroon]1[/maroon], vecteur2_y=[maroon]1[/maroon], vecteur1_x=[maroon]1[/maroon], vecteur1_y=-1;
Bdisp_AllClr_DDVRAM();
[b][blue]while[/blue][/b](1){
balle1[0]+=vecteur1_x;
balle1[1]+=vecteur1_y;
balle2[0]+=vecteur2_x;
balle2[1]+=vecteur2_y;
ML_clear_vram();
[b][blue]if[/blue][/b](((balle1[0]-balle2[0])^2)+((balle1[1]-balle2[1])^2)<=(balle1[2]+balle2[2])^2){
PrintMini(1, [maroon]1[/maroon], [gray]"collision"[/gray], [maroon]1[/maroon]);
}
ML_circle(balle1[0], balle1[1], balle1[2], [maroon]1[/maroon]);
ML_circle(balle2[0], balle2[1], balle2[2], [maroon]1[/maroon]);
ML_display_vram();
Sleep(100);
}
}
[brown]#pragma section _BR_Size[/brown]
unsigned long BR_Size;
[brown]#pragma section[/brown]
[brown]#pragma section _TOP[/brown]
[purple]int[/purple] InitializeSystem(int isAppli, unsigned short OptionNum)
{
[b][blue]return[/blue][/b] INIT_ADDIN_APPLICATION(isAppli, OptionNum);
}
[brown]#pragma section[/brown]
voila c'est tout
. Ici la premiere (donc balle1[0]) case de chaque tableau balle est sa position X, la deuxieme (balle[1]) représente son Y et balle[2] représente le rayon de la balle
Voila si vous avez un quelconque merci de me la soumettre
Citer : Posté le 01/01/2015 21:11 | #
Alors moi j'y avait reflechit pour mon AGB.
Déjà, je pense qu'il faut que tu fasses des structures "Balle", ca sera plus propre avec un x, un y, une vx et une vy, et un rayon, et après pour la collision, soit tu fais un truc réaliste avec de la trigo, soit tu trouves le moyen de faire un truc qui ressemble...
Citer : Posté le 01/01/2015 21:15 | #
Pourquoi ta formule n'est-elle pas opérationnelle ? C'est peut-être une connerie, mais mathématiquement c'est correct
Citer : Posté le 01/01/2015 21:17 | #
déjà balle2[0])^2 ne veut sans doute pas dire ce que tu penses
La tu fais une comparaison XOR binaire entre balle2 et 0b10, et non pas un exposant deux
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 01/01/2015 21:22 | #
Faut donc les multiplier entre eux
Citer : Posté le 01/01/2015 23:02 | #
a ok c'est meme pas un 'au carré'
@theprogr en effet cela serait plus propre mais je n'ai toujours pas compris, ni meme essayé en fait , de comprendre les structures ensuite pour le calcul il est mathématiquement correct cartix : jutilise le théorème de pythagore version 'coordonnées' et pour la collision je ferais ca plus tard, fab m'avait donné une technique, je l'ai pas bien retenue mais c'est du choc elastique il me semble
je vais essayer comme ca et je vous dit le résultat
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 02/01/2015 02:17 | #
Avec les structures :
[brown]#include [gray]"fxlib.h"[/gray][/brown]
[brown]#include [gray]"MonochromeLib.h"[/gray][/brown]
[brown]#include [gray]"stdio.h"[/gray][/brown]
typedef [purple]struct[/purple] tVector [green]//structure définissant un vecteur[/green]
{
[purple]int[/purple] dx;
[purple]int[/purple] dy;
} tVector;
typedef [purple]struct[/purple] tMovingCircle [green]//structure définissant une balle[/green]
{
[purple]int[/purple] x; [green]//position en x[/green]
[purple]int[/purple] y; [green]//position en y[/green]
[purple]int[/purple] r; [green]// rayon du cercle[/green]
tVector displacementVector; [green]//vecteur de déplacement[/green]
} tMovingCircle;
[purple]int[/purple] main()
{
tMovingCircle balle1;
tMovingCircle balle2;
balle1 = Init_tMovingCircle(1,[maroon]1[/maroon],[maroon]10[/maroon],[maroon]1[/maroon],[maroon]1[/maroon]);
balle2 = Init_tMovingCircle(20,[maroon]30[/maroon],[maroon]15[/maroon],[maroon]1[/maroon],-1);
[b][blue]while[/blue][/b](1){
balle1 = Move_tMovingCircle(balle1); [green]//on déplace balle1[/green]
balle2 = Move_tMovingCircle(balle2); [green]//on déplace balle2[/green]
ML_clear_vram();
[b][blue]if[/blue][/b] ( IsCollision_tMovingCircle(balle1, balle2) ) [green]//on teste s'il y a collision[/green]
PrintMini(1, [maroon]1[/maroon], [gray]"collision"[/gray], [maroon]1[/maroon]);
Display_tMovingCircle(balle1);
Display_tMovingCircle(balle2);
ML_display_vram();
Sleep(100);
}
}
tMovingCircle Move_tMovingCircle( tMovingCircle c)
{
c.x += c.displacementVector.dx;
c.y += c.displacementVector.dy;
[b][blue]return[/blue][/b] c;
}
tMovingCircle Init_tMovingCircle(int x, [purple]int[/purple] y, [purple]int[/purple] r, [purple]int[/purple] dx, [purple]int[/purple] dy)
{
tMovingCircle c
c.x = x;
c.y = y;
c.r = r;
c.displacementVector.dx = dx;
c.displacementVector.dy = dy;
[b][blue]return[/blue][/b] c;
}
bool IsCollision_tMovingCircle( tCircle b1, tCircle b2)
{
[b][blue]return[/blue][/b] ( ((b1.x-b2.x)*(b1.x-b2.x))+((b1.y-b2.y)*(b1.y-b2.y))<=(b1.r+b2.r)*(b1.r+b2.r) );
}
void Display_tMovingCircle(tMovingCircle c)
{
ML_circle(c.x, c.y, c.r, [maroon]1[/maroon]);
}
[brown]#pragma section _BR_Size[/brown]
unsigned long BR_Size;
[brown]#pragma section[/brown]
[brown]#pragma section _TOP[/brown]
[purple]int[/purple] InitializeSystem(int isAppli, unsigned short OptionNum)
{
[b][blue]return[/blue][/b] INIT_ADDIN_APPLICATION(isAppli, OptionNum);
}
#pragma section
Je n'ai pas testé le code, il se peut qu'il y ait des erreurs de compilations.
Citer : Posté le 02/01/2015 11:43 | #
Smashmaster je pense qu'une fonction auxiliaire carre() est plus propre que de multiplier à chaque fois les expressions par 2.
[b][blue]return[/blue][/b] n*n
}
Et on remplace :
par :
Citer : Posté le 02/01/2015 11:52 | #
C'est un (tout petit) peu plus lent par contre, mais c'est sûr que c'est bien plus propre.
Citer : Posté le 02/01/2015 13:15 | #
autant utiliser les fonctions inline, c'est plus propre et aussi rapide
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 02/01/2015 14:04 | #
Le SDK en veut pas, elles sont de la norme C99.
Citer : Posté le 02/01/2015 14:41 | #
@Louloux Oui c'est plus propre ;).
Citer : Posté le 02/01/2015 14:49 | #
Enfin, pour la fonction carré, un peu de préprocesseur et c'est plié
Citer : Posté le 02/01/2015 14:52 | #
Ah non, parce que du coup tu fais comme Smashmaster et il refait les soustractions à chaque fois !
Citer : Posté le 02/01/2015 14:56 | #
En tout cas merci à vous ca marche mtn c'était juste a cause du '^2'
smash je suis désolé mais je ne maitrise pas du tout les structures et je n'ai rien compris à ton code (enfin pas tout quoi ) mais cepandant j'ai une question : si je veux faire une lib donc avec une fonction IsCollision par exemple, puis-je quand même utiliser des structures ? Je pense qu'envoyer les valeurs une par une qui seront récupérées dans un tableau serait plus simple d'utilisation non ?
Ajouté le 02/01/2015 à 15:02 :
par contre la fab cette question s'adresse à toi en particulier (pasque tu mavais déjà répondu) mais tout ceux qui peuvent m'aider sont bienvenus : Comment gérer les angles de façon a faire un beau rebondissement ? Je suis en seconde mais on a toujours pas fait le cercle trigonométrique (chose qui me manque bcp )
Pour les rebondissements avec une surface plane ça ca va mais entre deux balles
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 02/01/2015 15:17 | #
En tout cas merci à vous ca marche mtn c'était juste a cause du '^2'
smash je suis désolé mais je ne maitrise pas du tout les structures et je n'ai rien compris à ton code (enfin pas tout quoi ) mais cepandant j'ai une question : si je veux faire une lib donc avec une fonction IsCollision par exemple, puis-je quand même utiliser des structures ? Je pense qu'envoyer les valeurs une par une qui seront récupérées dans un tableau serait plus simple d'utilisation non ?
Ajouté le 02/01/2015 à 15:02 :
par contre la fab cette question s'adresse à toi en particulier (pasque tu mavais déjà répondu) mais tout ceux qui peuvent m'aider sont bienvenus : Comment gérer les angles de façon a faire un beau rebondissement ? Je suis en seconde mais on a toujours pas fait le cercle trigonométrique (chose qui me manque bcp )
Pour les rebondissements avec une surface plane ça ca va mais entre deux balles
Alors sur le coup, les coordonnées dan les structures c'est quand même beaucoup plus beau (après tu pourrais faire un objet Balle qui hériterait de Geom et qui pourrait redéfinir une fonction collisionne()... oublie ça Il y a un cours pour ça ici : http://openclassrooms.com/courses/apprenez-a-programmer-en-c/creez-vos-propres-types-de-variables
Pour la trigo, Je peux pas vraiment t'aider, on en a jamais fait en seconde et pas encore en première...
Coïncidence ? Je ne pense pas.
Citer : Posté le 02/01/2015 15:18 | #
Pour info ^2 n'a rien à voir avec une puissance, c'est un opérateur bit-à-bit.
Table de vérité:
-------
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0
Citer : Posté le 02/01/2015 15:19 | #
Ah oui c'est le Xor...
Coïncidence ? Je ne pense pas.
Citer : Posté le 02/01/2015 15:27 | #
Oui je connais le Xor mais je ne comprends pas en quoi il est noté ^2
Drac je vais lire tout ca après c'est peut etre plus joli et plus propre mais si ca doit rester accessible a tout le monde je pense que c'est plus compréhensible sans structures
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 02/01/2015 15:27 | # | Fichier joint
Pour la collision entre deux balles , j'ai fait un schéma vite fait, je vais donner quelques explications lorsque je serais sur mon PC :
Citer : Posté le 02/01/2015 15:30 | #
Oui je connais le Xor mais je ne comprends pas en quoi il est noté ^2
le Xor est noté ^
après c'est peut etre plus joli et plus propre mais si ca doit rester accessible a tout le monde je pense que c'est plus compréhensible sans structures
:double facepalm: :triple facepalm: ........ :n facepalm:
Tu n'as absolument rien compris aux structures