2012-06-11 4 views
4

Так что я пытаюсь сделать популярный понг в java. Я сделал прямоугольник игрока и настроил прослушиватель действий, поэтому я готов переместить плеер вверх и вниз по экрану. Но я столкнулся с проблемой. Когда я перемещаю плеер, у меня есть выбор перемещения X пикселей за ход.Java-движущийся прямоугольник быстрее?

Но если я установил перемещаемые X пиксели, давайте скажем 1. Затем игрок движется слишком медленно. Если я установил X пикселей на 10, то он пропустит 9 пикселей, а анимация будет выглядеть грубо. Как я могу сгладить анимацию и все еще двигаться быстро?

здесь некоторый код:

public void keyPressed(KeyEvent e) { 
       if(e.getKeyCode() == keyUp){ 
        playerYCordinate -= 10; 
       }else if(e.getKeyCode() == keyDown){ 
        playerYCordinate += 10; 
       } 
       repaint(); 
      } 

      public void keyReleased(KeyEvent e) { 
       if(e.getKeyCode() == keyUp){ 

       }else if(e.getKeyCode() == keyDown){ 

       } 
       repaint(); 
      } 
+0

для лучшей помощи скорее отправить сообщение [SSCCE] (http://sscce.org/) – mKorbel

ответ

4

Не надейтесь на ключ-повтор функции, обеспечиваемой система. Они могут возникать с низкой скоростью (что вызывает проблемы, которые вы описываете) и зависят от настроек системной клавиатуры.

Я рекомендую вам использовать keyPressed, чтобы начать Timer и keyReleased, чтобы остановить его.

Таймер может планировать выполнение TimerTask каждые 20 миллисекунды или около того, что может обновить координаты и вызвать repaint(). (Не беспокойтесь о частом вызове repaint().Если EDT не может идти в ногу, он будет сжимать последовательные вызовы, чтобы перекрасить в одну краску.)

+0

Попробуй этот метод, спасибо. –

+0

Получил работу. Благодаря! –

2

Как я могу сглаживает анимацию и еще быстро двигаться?

Один из способов заключается в том, чтобы нарисовать полупрозрачные версии движущегося объекта вдоль пути, который он выполнил бы, если бы шаг за шагом уменьшался на один шаг.

E.G. для 10 пикселей шага, сделать версию на 10% непрозрачности для 1-го пикселя перемещения, 20% для второго и т.д.

Moving Block

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class MovingBlock { 

    MovingBlock() { 
     final JPanel gui = new JPanel() { 

      private static final long serialVersionUID = 1L; 
      int x = 0; 
      int step = 60; 

      public void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       Graphics2D g2 = (Graphics2D)g; 
       x+=10; 
       Color fg = getForeground(); 
       for (int ii=x-step; ii<x; ii+=4) { 
        double transparency = (double)(x-ii)/(double)step; 
        Color now = new Color(
          fg.getRed(), 
          fg.getGreen(), 
          fg.getBlue(), 
          (int)(255*(1-transparency))); 
        g2.setColor(now); 
        g2.fillRect(ii, 3, 5, 10); 
       } 
       if (x>getWidth()) { 
        x=0; 
       } 
      } 
     }; 
     gui.setBackground(Color.BLACK); 
     gui.setForeground(Color.GREEN.darker()); 
     gui.setPreferredSize(new Dimension(400,16)); 

     ActionListener listener = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       gui.repaint(); 
      } 
     }; 
     Timer timer = new Timer(20, listener); 
     timer.start(); 

     JFrame f = new JFrame("Moving Block"); 
     f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     f.setContentPane(gui); 
     f.pack(); 
     f.setLocationByPlatform(true); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) throws Exception { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new MovingBlock(); 
      } 
     }); 
    } 
} 
+0

, а затем установить прозрачность, когда игрок перемещается по области с полупрозрачным? –

+0

Я не уверен, что вы подразумеваете под этим. –

+1

Это оптическая гладкая, как тропа, но на самом деле не решает вашу проблему. – rotsch

0

Пока вы зависите от нажатия клавиш для управления вашими прямоугольниками, вы можете двигаться только так быстро, как события keyrepeat (или так же быстро, как пользователь может ввести). Либо послушайте что-то еще, как движение мыши, либо настройте клавиатуру для более высокой частоты повторения.

1
  • не используют KeyListener для Swing JComponents

  • использования KeyBinding для Swing JComponents

  • не рисуйте на JFrame поставить там JPanel и метод использования paintComponent() вместо paint(), ваше движение будет гладкие и природные

2

В играх традиционно используется игровой цикл для управления приложением, а не система, управляемая событиями, которая управляет Swing.

У вас может быть переменная, которая хранит движение весла, например, перечисление с UP, DOWN и STATIONARY. Ваш слушатель ключей установит значение этой переменной, а затем игровой цикл проверит переменную и соответственно обновит положение весла.

Этот метод отделяет скорость приложения от скорости среды, в которой он работает.

Смежные вопросы