Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : pb pour effectuer plusieur evenement en meme temps !! [ Multimédia / Java2D ] (jeremeclip)

samedi 24 novembre 2007 à 16:18:34 | pb pour effectuer plusieur evenement en meme temps !!

jeremeclip


bonjours  voila j'ai un probleme dans une application que je cree une table de pingpong avec une interface autour donc au debut j'ai cree les raquette et la balle avec un Graphics tout va bien  puis je commence a coder une partit pour faire bouger  les raquette du joueur par rapport au coordonner  la tout va bien aussi mais quand je crre le code pour faire bouger la balle pour la renvoyer de l'autre coter de la table la  probleme  l'application ne d'affiche plus

voila une partit du code oui je mes les evennement des raquettes et la balles

[QUOTE]

[....]
final JPanel pane2 = new JPanel(){
            
            private int balle_X = BALLE_X_DEPART;
            private int balle_Y = BALLE_Y_DEPART;
        
            public void paint(Graphics g) {
                super.paint(g);
                
                //dessine la table verte
                g.setColor(new Color(couleur1, couleur2,couleur3));
                g.fillRect(DISTANCE_BORD_X_TABLE , DISTANCE_BORD_Y_TABLE, LARGEUR_TABLE,HAUTEUR_TABLE );
                //dessine la profondeur de la table
                g.setColor(new Color(couleur4,couleur5,couleur6));
                g.fillRect(DISTANCE_BORD_Y_TABLE_FONCER, DISTANCE_BORD_X_TABLE_FONCER, LONGUEUR_FONCER, LARGEUR_FONCER);
                g.fillRect(DISTANCE_BORD2_Y_TABLE, DISTANCE_BORD2_X_TABLE, LARGEUR_FONCER2, LONGUEUR_FONCER2);
                

                                  [...coupeure trop long.........]
        
                
                //Dessine le filet
                g.setColor(new Color(couleur16, couleur17, couleur18));
                g.drawLine(POINT_LIGNE_HAUT, LIGNE_COMMENCE, POINT_LIGNE_BAS, LONGUEUR_LIGNE);
                g.drawLine(POINT_LIGNE_HAUT2, LIGNE_COMMENCE, POINT_LIGNE_BAS2, LONGUEUR_LIGNE);
                g.drawLine(POINT_LIGNE_HAUT3, LIGNE_COMMENCE, POINT_LIGNE_BAS3, LONGUEUR_LIGNE);
                
                //dessine l'ombre du filet
                g.setColor(new Color(couleur19, couleur20, couleur21));
                g.drawLine(POINT_LIGNE_HAUT4, LIGNE_COMMENCE, POINT_LIGNE_BAS4, LONGUEUR_LIGNE);
                
                //dessine la balle de ping pong
                g.setColor(new Color(couleur22,couleur23 , couleur24 ));
                g.fillOval(balle_X, balle_Y, 10, 10);
                
//                indique les coordoner de la souris  a effacer par la suite
                g.drawString("Y: "+Y+" X: "+X+" i:"+i, 30, 10);
                    
                run1();
                if(nouvelle2 == true){
                    Graphics2D surface = (Graphics2D) g;
                    surface.setPaint(new Color(0, 0, 255, 64));
                      surface.setFont(new Font("SansSerif", Font.ITALIC+Font.BOLD, 30));
                      surface.drawString("Nouvelle Partie", 30, 110);
                      surface.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                   
                }
                
                if(pointJoueur >= 21 && texteGagant2 == true){
                    texteGagant = true;
                }else if (texteGagant2 == false){
                    texteGagant = false;
                }
                if(texteGagant == true && pointJoueur > pointOrdi && pointJoueur-2 >= pointOrdi ){
                    Graphics2D surface = (Graphics2D) g;
//                      // tracé du texte en transparence sur l'image
                      surface.setPaint(new Color(0, 0, 255, 64));
                      surface.setFont(new Font("SansSerif", Font.ITALIC+Font.BOLD, 30));
                      surface.drawString("Vous avez gagné", 30, 110);
                      surface.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                      quiterPartie = true;
                     
                    repaint();
                }else if (texteGagant == false){
                    repaint();
                }
                quitter();
                serviceEnfant();
                run();
            }
            
            public void run(){
                while(true){
                    if(balleService){//si la balle est en mouvement
                        //Etape1. La balle se deplace t'elle vers la gauche?
                        if(déplacementGauche  && balle_X > BALLE_X_MIN){
                            rebondPossible = (balle_Y >= departRaquetteOrdi
                                    && balle_Y < (departRaquetteOrdi +
                                    departRaquetteOrdi) ? true : false);
                            balle_Y -= deplacmentVertical;
                            balle_X -= INCREMENTATION_BALLE;
                        }
                    
                        
                    }
                }
            }    
            

            public void run1(){
                if(nouvelle == true){
                    nouvelle2 = true;
                i++;
                RAQUETTE_ENFANT_Y_DEPART = 95;
                RAQUETTE_ENFANT_Y2 = 226;
                RAQUETTE_ENFANT_Y3 = 226;
                
                if(i == 200){
                        nouvelle = false;
                    }
            
                }else if(nouvelle == false){
                    nouvelle2 = false;
                    i = 0;
                }
            }
            
            private void serviceEnfant(){
                int raquetteJoueur = RAQUETTE_ENFANT_Y_DEPART;
                balleService = true;
                balle_X = RAQUETTE_ENFANT_X -5;
                balle_Y = raquetteJoueur +10;
                
                if(service == false && balle_Y > HAUTEUR_TABLE / 2){
                    deplacmentVertical = -1;
                }else{
                    deplacmentVertical = 1;
                }
                
            }
            
            public void quitter(){
                if(quiterPartie1 == true && quiterPartie == true){
                    System.exit(0);
                }else if (quiterPartie1 == false){}
            }};
            
        

            pane2.addMouseMotionListener(new MouseAdapter(){
                public void mouseMoved(MouseEvent événement) {
                    if(nouvelle == false){
                    int souris_Y = événement.getY();
                    int souris_X = événement.getX();
                    Y = souris_Y;
                    X = souris_X;
                    
                    //actionne la raquette principale du joueur
                    if(souris_Y < RAQUETTE_ENFANT_Y_DEPART +15  && RAQUETTE_ENFANT_Y_DEPART + blocageRaquette33  > HAUT_TABLE +15 ){
                        RAQUETTE_ENFANT_Y_DEPART -= 4;
                        pane2.repaint();
                    }else if (souris_Y > RAQUETTE_ENFANT_Y_DEPART   
                                            [.....coupure du code tros long....]


                        pane2.repaint();
                    }else if(souris_X > RAQUETTE_ENFANT_Y3 +15 && RAQUETTE_ENFANT_Y3 + blocageRaquette44 < LARGEUR_TABLE -6 && souris_Y < LIGNE2_COMMENCE){
                        RAQUETTE_ENFANT_Y3 += 3;
                        pane2.repaint();
                    }}}});

[...]
[/QUOTE]



et j'ai appris lors de mon tuto que l'ordinateur ne pouviat pas effectuer deux tache en meme temps donc on ma dit de mettre ce code

[QUOTE]

public void actionPerformed(ActionEvent evt){
        //cree un fil et execute le code "tuer le temps"
        //sans bloquer la fenetre.
        Thread travailleur = new Thread(this);
        travailleur.start();//Ceci appelle la methode run()
    }
    public void run(){...}

[/QUOTE]

donc je pense que ce code suffirait pour faire marcher les 2 taches en meme temps  mais je voudrias savoir ou doje le placer pour qu il marche  et est ce que le code  c'est bine celui ou il ya t i ldes modification a faire sur celui ci??

meric d'avance


samedi 24 novembre 2007 à 17:53:37 | Re : pb pour effectuer plusieur evenement en meme temps !!

Ombitious_Developper

Réponse acceptée !
Salut:

Il ne faut pas utiliser trop de Threads, toutes les animations dans le jeu peuvent être faites dans un seul thread (Game Loop).

samedi 24 novembre 2007 à 18:19:23 | Re : pb pour effectuer plusieur evenement en meme temps !!

jeremeclip

Réponse acceptée !
ouai mais le code

[CODE]

public void actionPerformed(ActionEvent evt){
        //cree un fil et execute le code "tuer le temps"
        //sans bloquer la fenetre.
        Thread travailleur = new Thread(this);
        travailleur.start();//Ceci appelle la methode run()
    }
    public void run(){...}

[/CODE]

il faut que je place ou??  dans mon code pour pouvoir mettre un public void run ou je mettrais tout mes animation ?

samedi 24 novembre 2007 à 20:43:37 | Re : pb pour effectuer plusieur evenement en meme temps !!

Ombitious_Developper

Réponse acceptée !
Salut:

Si j'ai bien compris, le jeu de tu es en train de développer est un jeu de ping-pong opposant un joueur avec un ordinateur.
Si tu veux gérer le mouvements du ballon et du raquette adversaire tu peux procéder ainsi:

Il y a une technique inspirée du domain de l'éléctronique dite [Time Base]. En utilisant cette technique la boucle principale du jeu
[Game Loop] doit s'arrêter pendant une durée qui est égale au plus grand commun diviseur [PGCD] des temps de rafraîchissement que les acteurs du jeu nécessitent.

Suppons que la balle bouge une fois par seconde et que le raquette bouge 4 fois par seconde, ceci implique que ces acteurs (balle, raquette) aura son tour le 1 seconde, 0.25 seconde respectivement.
Ici le plus grand commun diviseur est 0.25 seconde, c'est le temps qu'on va choisir comme [Time Base] pour arrêter de temps en temps notre [Game Loop]. Les autres temps de rafraîchissement du jeu seront calculés en fonction de ce [Time Base].
Par exemple, pour la balle, on a: 1 seconde / 0.25 seconde = 4 ticks.

// Classe parent de tout les acteurs du jeu
public abstract class Actor {
    protected int x;
    protected int y;

    // Nombre de ticks pour chaque acteur, ceci est calculé en utilisant le Time Base
    protected int ticks;

    // Getters & setters

    // Animer l'acteur: mettre à jour ses coordonnées
    public abstract void act();
}


// Classe Balle
public class Ball extends Actor {

    public static final int BALL_TOTAL_TICKS = 4;

    public void act() {
       ++ticks;
       if (ticks%BALL_TOTAL_TICKS == 0) {
          // Mettre à jour les coordonnées x et y de la balle
       }
    }
}

// Classe Raquette adversaire, PC
public class Raquette extends Actor {

    public static final int RAQUETTE_TOTAL_TICKS = 1;

    public void act() {
       ++ticks;
       if (ticks%RAQUETTE_TOTAL_TICKS == 0) {
          // Mettre à jour les coordonnées x et y de la raquette
       }
    }
}


// Classe principale
public static final int TIME_BASE = 250; // Exprimé en milliseconde = 0.25 seconde

private Ball ball = ...;
private Raquette pc = ...;

public void gameLoop() {
    while(true) {
    
       // Actionner les acteurs
       pc.act();
       ball.act();

       // Pause
       try {
          Thread.sleep(TIME_BASE);
        } catch (InterruptedException ie) {}
    }
}

Bye.

samedi 24 novembre 2007 à 20:57:58 | Re : pb pour effectuer plusieur evenement en meme temps !!

jeremeclip

Réponse acceptée !
donc tout cela je le positionne ou dans mon code ?  je le mes avec les   les public void run.... ou je les mais  dans la partie ou il y a les  recepteru des mouvement de souris et out le reste ??



samedi 24 novembre 2007 à 21:02:55 | Re : pb pour effectuer plusieur evenement en meme temps !!

Ombitious_Developper

Réponse acceptée !
Salut:

Tout dépendera de ta conception.

Bye.

samedi 24 novembre 2007 à 23:59:42 | Re : pb pour effectuer plusieur evenement en meme temps !!

jeremeclip

Réponse acceptée !
bon je viasessayer cela , je te tine au courant

lundi 26 novembre 2007 à 20:29:16 | Re : pb pour effectuer plusieur evenement en meme temps !!

jeremeclip

Réponse acceptée !
bon j'ai essayerton code je n'arrive pas tro pa la faire marcher donc j'ai obter pour les Thread  et sa marche impect  j'utilise 1 Thread et sa marche merci beaucoup comme meme  j'essaye de le faire marcher apres avec ton code

jerem721



Cette discussion est classé dans : ligne, table, raquette, balle, if


Répondre à ce message

Sujets en rapport avec ce message

JTable, problème d'affichage [ par Kanouch ] Bonjour,j'essaie de créer une JTable à deux colonnes dans laquelle j'ajoute des éléments ligne par ligne. Je tape dans deux zones de texte et je stock Deplacement [ par jeremeclip ] bonjours a tous  voila j'ai un petit probleme sur mon code qui fait 1200 lignes ^^ voila le probleme je cree une application pour jouer au ping pong d Requête SQL [ par puman ] Bonjour tout le monde,g une petite kestion, je vais essayer d'être le plus clair possible.Voilà je souhaiterais insérer une ligne dans une table d'une JDBC ne supprime pas les ligne des table, pk??!! [ par iscalibar ] try{Statement st=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);int res=st.executeUpdate("DELETE FROM PATIENT WHERE P un CheckBox a chaque ligne d'une table [ par hlimaiem ] Limaiem heykelComment inserrer un CheckBox dans chaque ligne d'un JTable (la syntaxe exacte) puisque ce checkbox designera si l'element sera supprimer couleur de cellule dans une JTable [ par javateux ] bonjour, voila mn probleme:j veu colorer des cellules selectionnées dans une table et les garder en couleur, existe-t-il des proprietés pour la table string[] --> ligne Excel ... [ par javateux ] comment puis-je effectuer une telle manipulation?je veu envoyer un tableau de chaine ([]) ds un fichier excel(une ligne). Positionnement : JScrollPane et cie [ par hadriel ] Bonjour,Je soufaite faire un fenetre en deux parties :à gauche, l'affichage d'une JTable, à droite des donnés représentées par une case.Pour le moment JTable et JScrollPane [ par hadriel ] Je soufaite faire un fenetre en deux parties :à gauche, l'affichage d'une JTable, à droite des donnés représentées par une case.Pour le moment je tent Traiter les arguments en ligne de commande [ par bouba ] Bonjour, je dois écrire un programme qui prend beaucoup d'arguments en ligne de commande. J'ai tout d'abord essayer de traiter les arguments moi-même


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.