2015-03-09 4 views
1

Je crée un cube qui rebondit sur un cadre. Pour détecter la limite du cadre, j'ai utilisé getHeight() et getWidth() du composant JComponent dans le JFrame et calculé la limite possible afin que le cube puisse rebondir.Pourquoi getHeight() n'est pas égal à la hauteur du cadre?

Cela fonctionne très bien pour getWidth(). Cependant, je ne peux pas le faire rebondir sur la limite de getHeight().

Lorsque le cu * be arrive en haut de la fenêtre, il continue de tourner pendant environ 10 pixels avant de rebondir.

Voici la capture d'écran pour ce problème.

enter image description here

Voici mon code:

public class Cube { 
    final public static int DIMENSION = 100; 
    private final static int D_X = 20; 
    private final static int D_Y = -20; 
    private final static int SPEED = 1; 
    private int xVelBK; 
    private int yVelBK; 
    private int xVel; 
    private int yVel; 
    private CubePoint[] pts; 

    public Cube(int x, int y){ 
    xVel = SPEED; 
    yVel = SPEED; 

    pts = new CubePoint[8]; 

    pts[0] = new CubePoint(x,y); 
    pts[1] = new CubePoint(x,y - DIMENSION); 
    pts[2] = new CubePoint(x + DIMENSION,y - DIMENSION); 
    pts[3] = new CubePoint(x + DIMENSION,y); 

    pts[4] = new CubePoint(x + D_X,y + D_Y); 
    pts[5] = new CubePoint(x + D_X,y + D_Y - DIMENSION); 
    pts[6] = new CubePoint(x + D_X + DIMENSION,y + D_Y - DIMENSION); 
    pts[7] = new CubePoint(x + D_X + DIMENSION,y + D_Y); 
    } 

    public void move(int componentWidth, int componentHeight){ 
    ...... 

    //bug in here 
    if (pts[0].getY() - DIMENSION - D_Y <= 0) { 
     yVel = SPEED; 
    } 

    ....... 
    } 
.......... 
} 

Voici le composant:

public class CubeComponent extends JComponent { 
    ........... 

    private Cube cube; 
    private Timer timer; 
    private CubePoint originMousePos; 
    private CubePoint closest; 
    private Font font; 
    private int mode; 


    private int delay = DEFAULT_DELAY ; 

    private int mouseToClosestX; 
    private int mouseToClosestY; 

    class CubeMoveListener implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     cube.move(getWidth(),getHeight()); 
     repaint(); 
    } 

    } 



    @Override 
    public void paintComponent(Graphics g){ 
    Graphics2D g2 = (Graphics2D)g; 

    cube.draw(g2); 
    } 

} 
+0

Le titre de la fenêtre est inclus dans la taille de la fenêtre. Il y a une fonction qui vous indique la taille de la "partie intérieure" de la fenêtre, mais je ne me rappelle pas comment elle s'appelle maintenant. (Quelqu'un d'autre pourrait) – immibis

+0

'public void paintComponent (Graphics g) {..' devrait être public void paintComponent (Graphics g) {super.paintComponent (g); .. »(pour la 5ème fois aujourd'hui). –

+0

duplication possible de [JFrame: obtention de la taille réelle du contenu] (http://stackoverflow.com/questions/7154633/jframe-getting-actual-content-size) – fdsa

Répondre

4

Pour autant que je peux dire:

if (pts[0].getY() - DIMENSION - D_Y <= 0) { 

DEVRAIT être utilisé déterminer lorsque le cube atteint le fond de la pièce de sorte que vous devriez tester pour « > »

et

if (pts[0].getY() >= componentHeight) { 

DEVRAIT être utilisé pour le test lorsque le cube atteint le sommet. Il doit donc être:

if (pts[0].getY() <= 0) { 

Le point clé est que:

  1. L'un des tests verticaux doit tester "< = 0".
  2. La structure du test horizontal et vertical doit être la même, il suffit de changer les noms des variables.