Pong : Calcule des rebondissement "maison" - JAVA

Discutez d'informatique ici !
rXp
Messages: 1
Enregistré le: 05 Nov 2009, 15:32

Pong : Calcule des rebondissement "maison" - JAVA

par rXp » 05 Nov 2009, 15:35

Bonjour,

Tout d'abord j'aimerais vous féliciter pour ce forum que j'observe depuis un moment :) Mais cela est mon premier poste, alors commençons :

Je suis entrain de faire un simple pong, avec les calcule de rebondissement un peu comme dans brickbreaker.
Cela veut dire : Plus la balle tape près du bord de la barre, plus elle va partir dans cette direction.
Le problème c'est qu'elle rebondie comme elle veut, parfois juste, parfois l'inverse, parfois il stabilise la balle...

J'ai décidé que si la balle tape le dernier pixel du bord, l'angle sera 50% plus vertical.
Voici des graphique de comment j'ai pensé les calcules :
Quand il y a collision avec la bar du joueur :
Image
Les calculs pour renvoyé la balle comme il faut :
Image

Et ici le code java des calcules. Le problème ne peut venir que de ce code car les variable d'angle et de vitesse sont parfois aléatoire, et je ne comprend vraiment pas pourquoi. Mais les méthodes utilisées la dedans comme getBallOnPlancheYPourcent sont correctes !
Code: Tout sélectionner
public void bounceBallIntoPlanche(Sprite s1){
        //calcule vitesse pixel/sec
        double v = Math.sqrt(Math.pow(ballSpeedX, 2)+Math.pow(ballSpeedY, 2));
        //calcule de l'angle de début
        double cosA = ballSpeedX / v;
        double A = Math.toDegrees(Math.acos(cosA));
        if(A == 180 || A == 0){
            A = 1;
        }
        //calcule de l'angle de destination
        double angleFinal = A + A*(getBallOnPlancheYPourcent(s1)/100);
        // augmentation de la vitesse de la balle
        v = v++;
        //recalcule des vitesse X et Y de la balle
        double newBallSpeedX = Math.cos(angleFinal) * v;
        double newBallSpeedY = Math.sin(angleFinal) * v;

        //verification si le X ou le Y doit êter positif ou négatif
        if(ballSpeedX  0){
            ballSpeedX = newBallSpeedX * -1;
        }else{
        }

        if(ballSpeedY  0 || ballSpeedY == 0){
            ballSpeedY = newBallSpeedY;
        }else{
        }

        System.out.println(ballSpeedY+":"+ballSpeedX+":"+angleFinal);
    }


Merci de m'aider,

Cordialement,

rXp>!<



Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 05 Nov 2009, 16:04

salut,

le mieux, c'est tu prends ton crayon.
Tu testes avec une balle qui arrive de plein fouet sur le mur.
Une balle en biai.
Une balle très en biai.

Tu calcules chaque étape a la main.
Tu fais chaque etape a cout de system.out.println.

Et tu compares.
Rq : comme ya pas tout le code, forcément ca na pas d'intéret de foutre direct, je n'exclue pas la possibilité d'accès concurrents.
Comme t'es probablement dans une classe et que tutilises pe des variables de ta classe accessibles partout depuis tes méthodes, pe que tu as le moteur qui modifie en plein cours dexecution (genre si t'es en thread).
Si c'est le cas, ben insiste plusieurs fois sur la même fonction.
la vie est une fête :)

Doraki
Habitué(e)
Messages: 5021
Enregistré le: 20 Aoû 2008, 11:07

par Doraki » 06 Nov 2009, 08:35

On peut savoir à quoi sert ton Math.toDegrees à part tout foutre en l'air ?
C'est normal que t'aies l'impression que l'angle est aléatoire, vu que tu le multiplies par 180/pi...

En outre, une balle avec un angle presque vertical qui touche le bord de la barre va prendre un angle qui l'enverra à l'envers (vx < 0), c'est sûr que ça n'aura pas le comportement que tu aurais voulu.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 9 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite