Bonjour,
j'aurai besoin de d'avis plus expérimentés avant de continuer dans une voie qui ne me semble pas bonne du tout.
Je m'explique, je développe un petit jeu de shoot, ou je déplace à la souris un petit vaisseau sur une map. Je veux que mon vaisseau reste centré a l'écran, et que la carte défile à l'écran en fonction de mes mouvement.
Pour l'instant ma solution consiste, à dessiner mon vaisseau sur des coordonnées fixes au centre de l'écran et de modifier les coordonnées de tous les autres objets en fonction des déplacements de mon vaisseaux. Autrement si je bouge de 2 pixels à gauche, je fais bouger tout les autres objets de deux pixels à droite !
J'ai peur que cela devienne vite un peu lourd au niveau des perfs, sans parler que c'est un peu compliqué à gérer à la longue.
J'aurais aimer faire autrement, en utilisant le translate pour faire bouger le centre du repère sur mon vaisseau après chaque déplacement de celui-ci.
Or quand j'essaye de faire cela, il repositionne systématiquement mon vaisseau en haut à gauche de l'écran en position 0,0 !
Il y a t 'il un moyen de faire en sorte que le centre du repère ne soit pas toujours affiché en haut a gauche de la fenêtre !
Sur ma frame j'ai essayer avec ou sans : setLocationRelativeTo(null);, mais je n'observe aucun changement. Je vous joins le bout de mon code concerné s'il y a des motivés.
Comme vous pouvez le voir il y a des "-dx", "-dy" et des "update " de coordonnées dans tout les sens, c'est parce que je dois mettre à jour toutes les coordonnées à chaque mouvement.
J'en suis a un moment de mon développement ou soit je continue dans ce sens et du coup je vais essayer d'organiser cette merde de façon plus propre, soit je casse tout et je fais quelque chose de mieux (mais pour l'instant j'arrive à rien). Mais il faudrait que je fixe cette partie avant de m'occuper du reste.
Quand au reste de mon code je suis bien évidement ouverte aux critiques, je n'ai quasiment pas d'expérience en java2D, donc je ne connait pas les "best pratice" en awt-swing.
Par exemple j'ai commencé par utiliser des getters et des setters pour les attributs de mes objets(comme j'ai appris a l'école!!!), puis j'ai arrêté en me disant que cela générai un double appel par rapport à définir ces attributs en publique au niveau de l'objet. Est ce que cela peux avoir un impact ?
De la même façon j'hésite à réorganiser ma méthode : paintComponent en la décomposant en sous fonction décomposé elle même en sous-fonctions. J'ai peur que cela plombe les perf étant donné quelle est appelé a chaque fois ?
Merci d'avance pour vos conseils
public class Skeleton extends JFrame {
public Skeleton() {
add(new Board());
setTitle("Skeleton");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(1000,800);
setLocationRelativeTo(null);
setVisible(true);
GraphicsDevice graphDevice = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
}
public static void main(String[] args) {
new Skeleton();
}public Board() {
addKeyListener(new TAdapter());
addMouseMotionListener(new MAdapter());
addMouseListener(new MAdapter());
addMouseWheelListener(new MAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setDoubleBuffered(true);
listeObject= new ArrayList<SpaceObject>();
ImageLoader.loadImage();
ingame = true;
craft = new Craft(500,350, this);
initAliens();
timer = new Timer(3, this);
timer.start();
SpaceObject.setBoardHeith(getHeight());
SpaceObject.setBoardWidth(getWidth());
fondEcran = new FondEcran(this);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
try {
if (boardWidth!=getWidth()) {
boardWidth =getWidth();
SpaceObject.setBoardWidth(getWidth());
fondEcran.update(craft);
}
if (boardHeith!=getHeight()) {
boardHeith =getHeight();
SpaceObject.setBoardHeith(getHeight());
fondEcran.update(craft);
}
float dx= craft.lastDx;
float dy= craft.lastDy;
if (ingame) {
g2d = (Graphics2D)g;
if (isDrivingMode()) {
fondEcran.setX(fondEcran.getX()-dx);
fondEcran.setY(fondEcran.getY()-dy);
}
g2d.drawImage(fondEcran.getFond(),Math.round(fondEcran.getX()), Math.round(fondEcran.getY()),new Long(Math.round(fondEcran.width+zoom)).intValue(),new Long(Math.round(fondEcran.heigt+zoom)).intValue(), this);
Image currentCraft= craft.getImage();
AffineTransform ancienne_Transf =g2d.getTransform();
AffineTransform at = AffineTransform.getRotateInstance(craft.dx,craft.dy,Math.round(craft.getCordX()), Math.round(craft.getCordY()));
g2d.translate(craft.getCordX(), craft.getCordY());
g2d.setTransform(at);
g2d.drawImage(currentCraft, Math.round(craft.x), Math.round(craft.y), new Long(Math.round(craft.width+zoom)).intValue(), new Long(Math.round(craft.height+zoom)).intValue(),null);
g2d.setTransform(ancienne_Transf);
UpdateAllCoord(dx,dy);
redrawAllObject();
drawInterface();
} else
{
g2d = (Graphics2D)g;
String msg = "Game Over";
g2d.setColor(Color.WHITE);
g2d.drawImage(over, boardWidth/2, boardHeith/2, this);
}
}
catch (Exception e) {
System.out.println("e : "+e.getMessage());
}
finally {
g2d.dispose();
}
}
Partager