IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

question sur le translate


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 10
    Par défaut question sur le translate
    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();
    }



    }

  2. #2
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 10
    Par défaut
    J'ai quelque peu avancé. Mon soucis est du qu'a chaque appel de la méthode : paintComponent mon objet Graphics2D g2d est réinitialise et recentré en haut a gauche de la fenetre.
    Je suppose que cela vient la façon don je le récupère :
    g2d = (Graphics2D)g;
    g étant le paramètre de la méthode paintComponent(). Mais je n'arrive pas a le récupérer autrement, j'essaye de le stoker dans une variable et je n'obtient qu'un ecran noir. Dans mon cas il faut absolument que le graphic ai subit et garde en memoire les modifications précédentes, sinon je ne bouge pas !
    Pour contourner le problème je calcule et je stock dans deux variables, les coordonnées du vecteur de ma translation total de puis le lancement de l'appli. Et c'est ces coordonnées que j'utilise pour ma translation, du coup il reinitialise mon repère en haut a gauche puis le re-déplace au bonne endroit.
    J'aimerai faire autrement mais bon ...
    C'est normal comme comportement ? Il est impossible de conserver une translation entre deux appel de paintComponent() ?

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    C'est le comportement standard. Les Graphics sont des objets éminemment temporaires dans le contexte d'un écran. De fait il sont réinitialisé à chaque fois. Pour faire simple, à toi de stocker ta liste de modifs et de les réappliquer à chaque fois.

  4. #4
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 10
    Par défaut
    ok merci pour l'info.
    En faite il ne faut pas passer par des transformation affines. Car très vite les coordonnées des objets et leur place sur l'ecran n'ont plus rien avoir. Ce qui pose de gros problème ...
    En faite, il faut utiliser un objet de type : JViewport pour définir sa fenêtre d'affichage et bouger cette fenêtre en fonction des déplacement du vaisseau.
    Logique sauf que je ne savait pas que cela existait !!!!
    Enfin bref au cas ou cela pourrais servir a quelqu'un plus tard je répond a ma propre question.
    voilou

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo