Sokoban java

Fermé
Utilisateur anonyme - Modifié par antoriche le 11/08/2011 à 18:00
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 11 août 2011 à 20:56
Bonjour, j'essaye de faire un jeu de sokoban (le jeu ou il faut ranger les caisse) mais j'ai un problème. si vous trouvez l'erreur ce serrait sympas svp.

//terrain.java

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;

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


public class terrain extends JPanel{
int posX;
int posY;
int Xmax= 500;
int Ymax= 400;
Image img;
public terrain(){

}
public void paintComponent(Graphics g){
setX(0);
setY(0);
for(int i=getX();i==Xmax;setX(posX+50)){
for(int i2=getY();i2==Ymax;setY(posY+50)){
try{
img = ImageIO.read(new File("rien.png"));
g.drawImage(img,posX,posY,this);
}catch(IOException e){
e.printStackTrace();
}
i2=posY;
i=posX;
}
}
}
public void setCase(int x, int y){
setX(x);
setY(y);
}
public int getY(){
return posY*50;
}
public void setY(int y){
posY = y;
}
public int getX(){
return posX*50;
}
public void setX(int x){
posX = x;
}
}

//Sokoban.java

import javax.swing.JFrame;


public class Sokoban extends JFrame{
static int x = 500;
static int y =400;
public Sokoban(){
setTitle("Sokoban");
setSize(x,y);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setContentPane(new terrain());
setVisible(true);
}
public static void main(String[] args) {
new Sokoban();

}

}
A voir également:

1 réponse

KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 11/08/2011 à 19:00
Et... qu'est-ce que c'est censé faire ?

Ta boucle dans PaintComponent est absolument horrible !!!

for(int i=getX();i==Xmax;setX(posX+50))

Comme tu as fais setX(0) avant, on sait que getX()==0 d'où i==0
La condition i==Xmax ne sera donc jamais vraie !
Du coup avant même le premier appel, on quitte la boucle. Il n'y a donc aucun appel à drawImage... Il te faudrait plutôt une condition du genre i<Xmax.
Et pour en venir au setX(posX+50) tu peux directement faire posX+=50
En effet tes fonctions setX et getX ne servent pas à grand chose d'autant qu'elles ne se correspondent pas (à cause de ton *50) !

Bref, voici ce que je te propose (en espérant avoir compris ce que tu voulais) :

import java.awt.Graphics; 
import java.awt.Image; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JPanel; 

public class Terrain extends JPanel 
{ 
    private static final long serialVersionUID = 1L; 
     
    private int Xmax, Ymax; 
    private Image img; 
     
    public Terrain() throws IOException 
    { 
        img = ImageIO.read(new File("D:\\rien.png")); 
        Xdim=img.getWidth(null); 
        Ydim=img.getHeight(null); 
    } 
     
    @Override 
    public void paintComponent(Graphics g) 
    { 
        int Xmax=getWidth(); 
        int Ymax=getHeight(); 
         
        for (int x=0; x<Xmax; x+=Xdim) 
            for (int y=0; y<Ymax; y+=Ydim) 
                g.drawImage(img,x,y,this); 
    } 
} 

import javax.swing.JFrame; 

public class Sokoban extends JFrame 
{ 
    private static final long serialVersionUID = 1L; 
     
    public static final int Xmax=500, Ymax=400; 
     
    public Sokoban() throws IOException 
    { 
        setTitle("Sokoban"); 
        setSize(Xmax,Ymax); 
        setLocationByPlatform(true); 
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        //setResizable(false); 
        setContentPane(new Terrain()); 
        setVisible(true); 
    } 
     
    public static void main(String...args) throws IOException 
    { 
        new Sokoban(); 
    } 
}

La confiance n'exclut pas le contrôle
0
Utilisateur anonyme
11 août 2011 à 20:46
Merci mais a quoi sert serialVersionUID ?
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 12/08/2011 à 01:19
C'est un numéro de version de la classe. Par défaut j'ai mis 1 c'est le plus logique...
En fait ça ne sert pas à grand chose ici, mais Terrain hérite de JPanel, et Sokoban de JFrame, donc ils implémentent Serializable, c'est pour ça qu'il faut leur définir cette valeur, sinon le compilateur génére un avertissement (car ça peut provoquer des erreurs ultérieurement si tu sérialises tes composants)

Tu peux regarder une explication ici : "serializable class has no definition of serialVersionUID"
0