Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Gerer la collision entre deux balles
Darkysun Hors ligne Membre Points: 1747 Défis: 52 Message

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


1, 2 Suivante
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

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...
Voila si vous avez un quelconque merci de me la soumettre

Cartix Hors ligne Membre Points: 2748 Défis: 98 Message

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
Dodormeur Hors ligne Ancien rédacteur Points: 3964 Défis: 82 Message

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
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
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

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
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 !
-florian66- Hors ligne Ancien rédacteur Points: 2370 Défis: 20 Message

Citer : Posté le 01/01/2015 21:22 | #


Faut donc les multiplier entre eux
In Arch, I trust ! And you ?
Darkysun Hors ligne Membre Points: 1747 Défis: 52 Message

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
Si je ne réponds pas à un post depuis trop longtemps : envoyez-moi un message pour me le rappeler !




Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

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.
Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

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.

int carre(int n) {
    [b][blue]return[/blue][/b] n*n
}


Et on remplace :
return ( ((b1.x-b2.x)*(b1.x-b2.x))+((b1.y-b2.y)*(b1.y-b2.y))<=(b1.r+b2.r)*(b1.r+b2.r) );

par :
return ( carre(b1.x-b2.x) + carre(b1.y-b2.y) <= carre(b1.r+b2.r) );
Dark storm En ligne Labélisateur Points: 11542 Défis: 176 Message

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.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Dodormeur Hors ligne Ancien rédacteur Points: 3964 Défis: 82 Message

Citer : Posté le 02/01/2015 13:15 | #


autant utiliser les fonctions inline, c'est plus propre et aussi rapide
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
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

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
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 !
Lephenixnoir En ligne Administrateur Points: 21031 Défis: 143 Message

Citer : Posté le 02/01/2015 14:04 | #


Le SDK en veut pas, elles sont de la norme C99.
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 02/01/2015 14:41 | #


@Louloux Oui c'est plus propre ;).
Dark storm En ligne Labélisateur Points: 11542 Défis: 176 Message

Citer : Posté le 02/01/2015 14:49 | #


Enfin, pour la fonction carré, un peu de préprocesseur et c'est plié

#define carre(x) x*x

Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir En ligne Administrateur Points: 21031 Défis: 143 Message

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 !
Darkysun Hors ligne Membre Points: 1747 Défis: 52 Message

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
Si je ne réponds pas à un post depuis trop longtemps : envoyez-moi un message pour me le rappeler !




Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 02/01/2015 15:17 | #


Darkysun a écrit :
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...
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Lephenixnoir En ligne Administrateur Points: 21031 Défis: 143 Message

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é:
a b | ^
-------
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0

Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 02/01/2015 15:19 | #


Ah oui c'est le Xor...
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Darkysun Hors ligne Membre Points: 1747 Défis: 52 Message

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
Si je ne réponds pas à un post depuis trop longtemps : envoyez-moi un message pour me le rappeler !




Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

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 :

Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 02/01/2015 15:30 | #


Darkysun a écrit :
Oui je connais le Xor mais je ne comprends pas en quoi il est noté ^2


le Xor est noté ^

Darkysun a écrit :
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
1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 86 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd