Java: mon MMORPG ne marche pas
Fermé
antoriche
-
5 août 2011 à 15:28
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 13 août 2011 à 14:04
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 13 août 2011 à 14:04
A voir également:
- Java: mon MMORPG ne marche pas
- Jeux java itel ✓ - Forum Jeux vidéo
- Telecharger java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Scanf en java ✓ - Forum Java
- Java heap space ✓ - Forum Java
3 réponses
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 004
5 août 2011 à 16:18
5 août 2011 à 16:18
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...
Pour ton updater, explique mieux ce que tu veux faire...
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...
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).
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).
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 004
5 août 2011 à 17:33
5 août 2011 à 17:33
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 :
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
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());
}
}
}
}
(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());
}
}
}
}
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 004
Modifié par KX le 13/08/2011 à 14:10
Modifié par KX le 13/08/2011 à 14:10
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()
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 !
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 !
Modifié par KX le 5/08/2011 à 16:49
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(); }5 août 2011 à 17:37
5 août 2011 à 17:40
@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(); }5 août 2011 à 17:55
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(); }Modifié par KX le 5/08/2011 à 21:21
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(); } }