Java: mon MMORPG ne marche pas

Utilisateur anonyme -  
KX Messages postés 19031 Statut Modérateur -
Bonjour, je crée un MMORPG en java qui ne marche pas. je fais tout mon possible mais je ne comprend pas le problème: mon personnage ne veut pas se déplacer et l'updater ne marche pas(j'ai créer un fichier "fichier.txt"). voici le code ( deso si il est un peu crad):

Fen.java:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Toolkit;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class Fen extends JFrame{
public Fen(){
setTitle("MMORPG");
setSize(700,500);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setContentPane(new Map());
}
public static void main(String[] args) {
Updater mise_a_jour = new Updater();
Fen f = new Fen();
f.setVisible(true);
Map m = new Map();
}
}

Map.java:

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Map extends JPanel{
int coorX = 50;
int coorY = 50;
Graphics g;
public Map(){
addMouseListener(new Action());
}
public void paintComponent(Graphics g){
Image img;
Image img_perso;
try {
img = ImageIO.read(new File( "map.jpg"));
g.drawImage(img,0,0,getWidth(),getHeight(),this);
img_perso = ImageIO.read(new File("pinguin.png"));
g.drawImage(img_perso,coorX,coorY,this);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public void deplacement(int MX,int MY){

while(coorX != MX && coorY != MY){
System.out.println("bonjour");
if (coorX < MX){
coorX++;
}
else if(coorX > MX){
coorX--;
}
if (coorY < MY){
coorY++;
}
else if(coorY > MY){
coorY--;
}
try{
Thread.sleep(6);
}catch (Exception e1){
e1.printStackTrace();
}
repaint();
}

}

public class Action implements MouseListener{
public void mouseRelased(MouseEvent e) {
int MX = e.getX();
int MY = e.getY();
deplacement(MX,MY);
}

@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}

}
}

updater.java:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Updater {
File code_source = new File("src/Fen.java");
File fichier = new File("fichier.txt");
PrintWriter ecrire;
String chaine ="";
String chaine2 ="";
public Updater(){
try {
InputStream is2 = new FileInputStream(code_source);
InputStreamReader ipsr2=new InputStreamReader(is2);
BufferedReader br2 =new BufferedReader(ipsr2);
String ligne;
while ((ligne=br2.readLine())!=null){
chaine+=ligne+"\n";
}
br2.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
InputStream f = new FileInputStream(fichier);
InputStreamReader ipsr=new InputStreamReader(f);
BufferedReader br=new BufferedReader(ipsr);
String ligne;
while ((ligne=br.readLine())!=null){
chaine2+=ligne+"\n";
}
br.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

if (chaine == chaine2){
System.out.println("oui");
}else{

try {
ecrire = new PrintWriter(new BufferedWriter
(new FileWriter(fichier)));

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ecrire.print(chaine);
ecrire.close();
System.out.println("non");
}

}
}

Si vous trouvez le probleme dites le moi SVP.

A voir également:

3 réponses

KX Messages postés 19031 Statut Modérateur 3 020
 
J'ai jeté un coup d'oeil rapide à ton code, et j'ai trouvé une erreur "évidente", dans la classe Action, ta méthode mouseRelased devrait en fait être la méthode @Override MouseReleased

Au moment de l'exécution, j'ai un problème avec les ImageIO.read qui ne trouve pas les images en relatif, donc je les ai mises en absolues, mais tu n'as peut-être pas ce problème chez toi.

Remarque :
Plutôt que de charger l'image dans paintComponent (et donc de la recharger à chaque fois), il serait bien mieux de la charger une fois pour toute à l'initialisation...
Et ton System.out.println("bonjour") ne sert à rien...

private Image img, img_perso;
    
public Map()
{
    try 
    {
        img = ImageIO.read(new File("D:\\map.png"));
        img_perso = ImageIO.read(new File("D:\\pinguin.png"));
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }    
    
    addMouseListener(new Action());
}

public void paintComponent(Graphics g)
{
    g.drawImage(img,0,0,getWidth(),getHeight(),this);
    g.drawImage(img_perso,coorX,coorY,this);
}

// ...

@Override
public void mouseReleased(MouseEvent e) {
    deplacement(e.getX(),e.getY());
}

Pour ton updater, explique mieux ce que tu veux faire...
1
KX Messages postés 19031 Statut Modérateur 3 020
 
Remarque : si le personnage n'est pas à la position cliquée c'est parce que tu t'es trompé dans le while, il faut mettre un OU, et non pas un ET dans ta méthode de déplacement.

public void deplacement(int MX,int MY) 
{     
    while(coorX != MX || coorY != MY) 
    { 
        System.out.println("("+coorX+","+coorY+") --> ("+MX+","+MY+")"); 
         
        if (coorX < MX) 
            coorX++; 
        else if(coorX > MX) 
            coorX--; 
             
        if (coorY < MY) 
            coorY++; 
        else if(coorY > MY) 
            coorY--; 
         
        try  
        { 
            Thread.sleep(6); 
        } 
        catch (InterruptedException e) 
        { 
        } 
        repaint();     
    } 
}

Mais tout cela est inutile car le repaint attendra la fin de la boucle pour redessiner...
Tu peux donc directement faire ceci :

@Override 
public void mouseReleased(MouseEvent e) { 
    coorX=e.getX(); 
    coorY=e.getY(); 
    repaint(); 
}
0
Utilisateur anonyme
 
Et n'y a-t-il pas un moyen de redessiner avant la fin de la boucle?
0
KX Messages postés 19031 Statut Modérateur 3 020
 
En voici un, ça provoque quelques bugs, mais ça progresse (on est encore loin d'un MMORPG ;-)

@Override
public void mouseReleased(MouseEvent e) 
{            
    new Thread()
    {
        private MouseEvent ev;
        
        @Override
        public void run()
        {
            deplacement(ev.getX()-8,ev.getY()-8);
        }
        
        public Thread set(MouseEvent e)
        {
            ev=e;
            return this;
        }
    }.set(e).start();
}
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Un peu mieux quand même, pour éviter que le pingouin n'ait la tremblote (un comble ^^)
Remarque : c'était du à un accès conccurentiel des threads, celui-ci va toujours exister (ce qui va modifier la vitesse du pingouin) mais cela va permettre de modifier la trajectoire du pingouin en cours de déplacement, plutôt que de le figer (je ne sais pas si c'est ce que tu veux pour autant :p)

public static int MX, MY; // dans la classe Map
    
public void deplacement()
{
    // idem qu'avant, mais MX et MY ne sont plus paramètres mais désormais static
}

@Override
public void mouseReleased(MouseEvent e) 
{            
    new Thread()
    {
        @Override
        public void run()
        {
            deplacement();
        }
        
        public Thread set(MouseEvent e)
        {
            MX=e.getX()-8;
            MY=e.getY()-8;
            return this;
        }
    }.set(e).start();
}
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Une version sans bug du tout ^^

private int MX, MY;  
private boolean bouge = false;  

public void deplacement()  
{  
    while(coorX != MX || coorY != MY)  
    {  
        if (coorX < MX)  
            coorX++;  
        else if(coorX > MX)  
            coorX--;  
          
        if (coorY < MY)  
            coorY++;  
        else if(coorY > MY)  
            coorY--;  
      
        repaint();  
          
        try { Thread.sleep(10); } catch (InterruptedException e) {}  
    }  
      
    bouge = false;  
}  

@Override  
public void mouseReleased(MouseEvent e)   
{  
    MX=e.getX()-8; // 8=largeur/2 du pingouin  
    MY=e.getY()-8; // 8=hauteur/2 du pingouin  
      
    if (!bouge)  
    {  
        bouge = true;  
          
        new Thread()  
        {  
            @Override  
            public void run()  
            {  
                deplacement();  
            }  
        }.start();  
    }  
}
0
Utilisateur anonyme
 
Merci mais n'y a-t-il pas moyen que le pinguin se déplace jusqu'au centre de l'image car si je click a un endroit , c'est le coin de l'image de mon pinguin qui se déplace en position cliquée, et pas le centre de l'image (le pinguin). En gros il y a toujour un décalage entre le pinguin et la position du clique de la souris.

Aussi , malgré le Thread.sleep(6); mon pinguin attend 6 sec (et non 6/1000) puis se déplace instentanément jusqu'au clique.

Et pour l'updater je voudrait que mon programme vérifie si le fichier.txt est a jour, donc qu'il est égale au fichier Fen.java (se trouvant dans le dossier src).
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Thread.sleep est bien en millisecondes (voir même en nanosecondes), mais effectivement le déplacement est instantané comme je l'ai signalé tout à l'heure, je pense que cela est du au fait que la méthode de déplacement est appelée par l'évènement mouseReleased, et que celui-ci bloque le repaint qui ne peut être appelé qu'une fois l'évènement terminé (lorsque coorX==MX && coorY==MY)

Pour centrer ton pinguin, il suffit de décaler ton MX (respectivement ton MY) de la moitié de la largeur (resp. de la hauteur) de l'img_perso lors de l'appel à redessiner :

redessiner(e.getX()-8,e.getY()-8); // chez moi img_perso est un carré 16x16
0
Utilisateur anonyme
 
J'ai continué mon projet mais il y a une erreur que je ne comprend pas. Voici le code:
(dans le fichier mot_de_passe.txt j'ai écris 27021997)
(le socket ne marche pas encore)
(et le nom d'utilisateur non plus)
//Connexion.java

public class Connexion extends JFrame{
File acces = new File("mot_de_passe.txt");
JTabbedPane onglet = new JTabbedPane();
JButton inscription = new JButton("s\'inscrire");
String ligne="";
JTextField nomUtilisateur = new JTextField("antoriche",10);
JPasswordField mp = new JPasswordField("27021997",10);
JButton ok = new JButton("Connexion");
Socket soc;

JPanel pan = new JPanel();
JLabel incorrecte = new JLabel("Votre Pseudo ou votre mot de passe est incorrecte");
public Connexion(){
incorrecte.setVisible(false);
try{
soc = new Socket("localhost",1111);
}catch(IOException e){
e.printStackTrace();
}
setTitle("Connexion");
setSize(345,160);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);

add(pan);
pan.add(new JLabel("nom d\'utilisateur:"));
pan.add(nomUtilisateur);
pan.add(new JLabel(" mot de passe:"));
pan.add(mp);
pan.add(ok);
pan.add(inscription);
pan.add(incorrecte);
ok.addActionListener(new Action());
inscription.addActionListener(new Action());
setVisible(true);
}
public class Action implements ActionListener{

@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent e) {
if(e.getSource()==ok){

try {
InputStream is2 = new FileInputStream(acces);
InputStreamReader ipsr2=new InputStreamReader(is2);
BufferedReader br2 =new BufferedReader(ipsr2);
ligne=br2.readLine();
br2.close();
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(ligne == mp.getText()){
Fen f =new Fen();
f.setVisible(true);

}else{
/*j'ai essayer de régler le probleme mais la console m'affiche ceci:
true
27021997
27021997
false
false
*/
System.out.println(acces.canRead());
incorrecte.setVisible(true);
System.out.println(ligne+"\n"+mp.getText());
System.out.println(ligne=="27021997");
System.out.println(mp.getText()=="27021997");

}
}
if(e.getSource()==inscription){

pan.add(new Inscription());
}

}
}
}
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Il serait bien que tu explique ce que tu veux faire... en particulier pourquoi ce que ça donne ne correspond pas à ce que tu attends ! Personnellement chez moi ça ne donne rien, vu qu'il n'y a pas de méthode main à lancer !

Ton problème peut venir d'ici : il ne faut jamais comparer deux objets avec == (comparaison physique sur les références), il faut utiliser la méthode equals qui compare le contenu de deux objets !
De plus getText() est déprécié il vaut donc mieux le remplacer par getPassword()

public void actionPerformed(ActionEvent e)  
{   
    if(e.getSource().equals(ok))  
    {  
        try  
        {  
            Scanner sc = new Scanner(acces);  
            if (sc.hasNextLine())  
                ligne = sc.nextLine();  
            sc.close();  
        }  
        catch (FileNotFoundException fnfe)  
        {  
            fnfe.printStackTrace();  
        }  
          
        String pw = new String(mp.getPassword());  
          
        if (ligne.equals(pw))  
        {   
            new Fen().setVisible(true);   
        }  
        else  
        {  
            System.out.println(acces.canRead());  
            incorrecte.setVisible(true);   
            System.out.println(ligne+"\n"+pw);   
            System.out.println(ligne.equals("27021997"));   
            System.out.println(pw.equals("27021997"));  
        }   
    }  
      
    if (e.getSource().equals(inscription))  
    {  
        pan.add(new Inscription());   
    }          
}

Il y a encore plein d'autre choses à dire sur ton code, en particulier sur toutes les initialisations qui se font en dehors d'une méthode, cela ne doit se faire que pour les champs static, dans le cas général tu dois faire ces initialisations à l'intérieur du constructeur !
0