【问题标题】:Move rectangle on processing?在处理中移动矩形?
【发布时间】:2015-02-21 15:23:01
【问题描述】:

我有以下代码(我没有在这里编写设置和绘图),我想在处理中移动一个矩形。如果我按“a”则向左,如果按“d”则向右。 使用此代码我会这样做,但如果 moveTo 是一个小数字,则矩形移动太慢,如果 moveTo 是一个大数字,则矩形移动不平稳。不是流体... 如何制作这个动画?

int moveTo = 5;
void keyPressed()
{
  if (key == 'a')
  {
       xTopRect = xTopRect - moveTo;
       xBottomRect = xBottomRect - moveTo;
       xFstPointTriangle = xFstPointTriangle - moveTo;
       xSndPointTriangle = xSndPointTriangle - moveTo;
       xTrdPointTriangle = xTrdPointTriangle - moveTo;
  }
  else if (key == 'd')
  {
       xTopRect = xTopRect + moveTo;
       xBottomRect = xBottomRect + moveTo;
       xFstPointTriangle = xFstPointTriangle + moveTo;
       xSndPointTriangle = xSndPointTriangle + moveTo;
       xTrdPointTriangle = xTrdPointTriangle + moveTo;
   }  
}

我找到了这个解决方案并且它有效(不要看变量) 我在 draw() 中调用 move()

void move()
{
  if (keyPressed) {
    if (key == 'a') {
      x = x - speed;
    } else if (key == 'd') {
      x = x + speed;
    }
  }
}

【问题讨论】:

  • 左右移动意味着你只需要将右上角移动到一个新的位置。
  • 更频繁地轮询密钥。
  • 我找到了这个解决方案,而且它有效!! void move() { if (keyPressed) { if (key == 'a') { x = x - speed; } else if (key == 'd') { x = x + speed; } } }

标签: java animation processing


【解决方案1】:
int moveTo = 5;
int MAX_MOVE_TO=100;
int counter=0;
void keyPressed()
{

  counter++;
  if(counter==(MAX_MOVE_TO-moveTo))
  {
     if (key == 'a')
     {
           xTopRect = xTopRect - 1;
           xBottomRect = xBottomRect - 1;
           xFstPointTriangle = xFstPointTriangle - 1;
           xSndPointTriangle = xSndPointTriangle - 1;
           xTrdPointTriangle = xTrdPointTriangle - 1;
     }
     else if (key == 'd')
     {
           xTopRect = xTopRect + 1;
           xBottomRect = xBottomRect + 1;
           xFstPointTriangle = xFstPointTriangle + 1;
           xSndPointTriangle = xSndPointTriangle + 1;
           xTrdPointTriangle = xTrdPointTriangle + 1;
     }  
     counter=0;
  }
}

请尝试 0 到 99 之间的不同 moveTo 值。它应该以所有速度平稳移动。

您正在通过按键移动对象,但您可以在不同的线程中执行此操作,以便在您不按键时也可以移动。

【讨论】:

    【解决方案2】:

    目前,我假设您的代码使用KeyListener 来触发移动。您可以做的一件事是创建和ArrayList<Integer> 来保存已关闭键的值。然后,在一个循环中,检查 ArrayList 中的 A 和 D 键值,如果它们在其中,则移动。

    现在的问题是KeyListener 只注册一个KeyEvent 经常做。使用此解决方案,您将能够控制矩形位置更新的频率。

    ArrayList<Integer> keysDown = new ArrayList<Integer>();
    void keyPressed(KeyEvent e) {
        if (!keysDown.contains(e.getKeyCode()) {
            keysDown.add(e.getKeyCode());
        }
    }
    void keyReleased(KeyEvent e) {
    if (keysDown.contains(e.getKeyCode()) {
            keysDown.remove(e.getKeyCode());
        }
    }
    

    然后在你的更新或绘制循环中,

    if (keysDown.contains(KeyEvent.VK_A)) {
        xTopRect = xTopRect - moveTo;
        xBottomRect = xBottomRect - moveTo;
        xFstPointTriangle = xFstPointTriangle - moveTo;
        xSndPointTriangle = xSndPointTriangle - moveTo;
        xTrdPointTriangle = xTrdPointTriangle - moveTo;
    } else if (keysDown.contains(KeyEvent.VK_D)) {
       xTopRect = xTopRect + moveTo;
       xBottomRect = xBottomRect + moveTo;
       xFstPointTriangle = xFstPointTriangle + moveTo;
       xSndPointTriangle = xSndPointTriangle + moveTo;
       xTrdPointTriangle = xTrdPointTriangle + moveTo;
    } 
    

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 2021-03-21
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多