Невозможно получить правильные условия - PullRequest
1 голос
/ 13 июня 2011

Я пытаюсь составить программу из прыгающего мяча. Я попробовал некоторые условия в нем. Но я не получил то, что хотел. Мяч продолжает двигаться вперед и назад в диагональном направлении кадра. Я выделил основную логику этой программы.

Вот программа:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MovingBall2D extends JPanel{
 int x_Pos=0;
 int y_Pos=0;
 int speedX=1;
 int speedY=1;
 int diameter=30;
 int height=30;
 int frameX=500;
 int frameY=500;

 MovingBall2D() {
  ActionListener taskPerformer = new ActionListener() {
   public void actionPerformed(ActionEvent ae) {
    if( x_Pos > ( frameX - diameter ) ) {       //  <------ logic starts from here
      x_Pos =  frameX - diameter;
      speedX = -1; 
    }
    else if(x_Pos < 0) {
      x_Pos = 0;
      speedX = 1;
     }
    else if( y_Pos > ( frameY - diameter ) ) {
      y_Pos =  frameY - height; 
      speedY = -1;
     }
    else if(y_Pos < 0) {
     y_Pos = 0;
     speedY = 1;
    } 
    x_Pos = x_Pos + speedX;
    y_Pos = y_Pos + speedY;    
    repaint();
   }
  };
  new Timer(10,taskPerformer).start();   // <------- logic ends here
 }

public void paintComponent(Graphics g) {
 super.paintComponent(g);
 g.setColor(Color.red);
 g.fillOval(x_Pos,y_Pos,diameter,height);
}
}

class Main2D {
 Main2D() {
 JFrame fr=new JFrame();
 MovingBall2D o = new MovingBall2D();
 fr.add(o);
 fr.setSize(500,500);
 fr.setVisible(true);
 fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

 public static void main(String args[]) {
  new Main2D();
 }
}  

РЕДАКТИРОВАТЬ - Мяч движется вперед и назад. Почему это происходит? Я ожидаю вывод , показанный здесь . Если вопрос не понятен никому, скомпилируйте, а затем запустите, чтобы увидеть вывод.

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

Мяч начинается в позициях 0, 0. На каждом временном шаге с тех пор, пока он не коснется стены, его позиции x и y увеличиваются на 1. Таким образом, в момент 471 его позиция равна (471, 471).В этот момент оба условия x и y выполняются, поэтому оба переключаются, и шар полностью поворачивается.

Если вы измените начальную позицию на что-то вроде (0, 30) или измените одно изпри скорости, отличной от 1 или -1, вы увидите, что ваш код работает.Мяч всегда будет следовать некоторой петле, но из-за размера кадра и расположения мяча у вас получится очень мало.

Однако я бы посоветовал вам удалить остальные условия.В одном кадре возможно, чтобы шар находился слишком далеко влево и слишком далеко вниз, поэтому в этом кадре должны быть зафиксированы оба условия, а не одно.Кроме того, вы можете заметить, что мяч продолжает падать с экрана в направлении y.Это потому, что ваш основной кадр установлен на той же высоте, что и панель.Высота рамки включает часть, используемую для верхней панели окна, поэтому она должна быть немного больше, чем панель, на которой она держится.

2 голосов
/ 13 июня 2011

Во всех четырех ваших случаях вы устанавливаете соответствующую скорость на -1:

speedX = -1;
//...
speedY = -1;

Но вы хотите, чтобы оно было отрицательным, только если X больше ширины или Y больше высоты. В двух других случаях вы хотите, чтобы скорость была положительной.

Или, может быть, вы хотели получить

speedX *= -1;

Что бы переключать скорость в противоположном направлении.

1 голос
/ 14 июня 2011

Я думаю, что у вас есть вся логика, но ваша инициализация гарантирует, что она будет подпрыгивать по диагонали (снизу слева вверху справа)

Измените их, используйте случайные значения ИЛИ жестко закодируйте их, как это так

 int x_Pos=100; // These are changed so the ball no longer starts at bottom left
 int y_Pos=20;
 int speedX=1;  //This should be fine as long as your initial position is different
 int speedY=1;
 int diameter=30;
 int height=30;
 int frameX=500;
 int frameY=500;

Я также думаю, что это будет работать

int x_Pos = 100* Math.Rand(1);

и т.д.

1 голос
/ 13 июня 2011

Мне кажется, что speedX и speedY не обновлены должным образом. Я думаю, что это должно быть так:

if( x_Pos > ( frameX - diameter ) ) {       //  <------ logic starts from here
  x_Pos =  frameX - diameter;
  speedX = -1; 
}
else if(x_Pos < 0) {
  x_Pos = 0;
  speedX = 1;
 }
else if( y_Pos > ( frameY - diameter ) ) {
  y_Pos =  frameY - height; 
  speedY = -1;
 }
else if(y_Pos < 0) {
 y_Pos = 0;
 speedY = 1;
} 
x_Pos = x_Pos + speedX;
y_Pos = y_Pos + speedY;    
...