2012-06-11 75 views
4

所以我想在java中制作流行的游戏pong。我制作了矩形的播放器并设置了动作监听器,以便我可以在屏幕上上下移动播放器。但我遇到了一个问题。当我移动播放器时,我可以选择每移动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来启动TimerkeyReleased来停止它。

计时器可以安排执行一个TimerTask每20:毫秒左右,它可以更新坐标并呼叫repaint()。 (不要担心太频繁地拨打repaint()如果EDT不能跟上,它会崩溃连续调用重绘成一个油漆。)

+0

请试试这个方法谢谢。 –

+0

得到它的工作。谢谢! –

2

我如何才能理顺动漫,仍然动作快?

一种技术是如果每步移动较少的像素,将沿着它将采取的路径绘制半透明版本的移动对象。

E.G.一个10像素的举动,战平10%不透明度版本移动的第一像素,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
  • 不使用KeyListenerSwing JComponents

  • 使用KeyBindingSwing JComponents

  • 不上油漆的JFrame放在那里JPanel和使用方法的paintComponent()代替paint(),你的动作会光滑自然

2

在游戏中,传统使用游戏循环来控制应用程序,而不是使用驱动Swing的事件驱动系统。

你可以有一个存储桨运动的变量,比如UP,DOWNSTATIONARY。您的键监听器将设置此变量的值,然后游戏循环将检查变量并相应地更新桨的位置。

该技术将应用程序的速度与运行环境的速度分开。