2011-06-20 187 views
0

我只是做了一个教程,如何使一个2D背景上的人物基本上像一个非常有限的平台游戏,没有重力或任何东西,我已经遇到了一些滞后,我假设因为它的方式按键/释放的作品,但我想知道是否有任何方法来优化它,可能是因为我没有动画它只是一个块,但林不知道,就像如果我举起,离开,然后我放手左边,并按下权利,而所有的时间仍然举起它只是上升,直到我放手,它滞后于左右等我将粘贴下面的代码。谢谢!:Java代码优化

//@@@MAIN CLASS, NAMED CHECKERS ARBITRARILY 

import javax.swing.*; 

public class Checkers { 

public static void main(String[] args) { 
    JFrame frame = new JFrame("2D Game"); 

    frame.add(new Board()); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(1200,326); 
    frame.setVisible(true); 
} 
} 


//@@@@@@@@@@@@@@@@@ 
//class called Dude this is my character(circle) 

import javax.swing.ImageIcon; 
import java.awt.Image; 
import java.awt.event.KeyEvent; 


public class Dude { 
int x, dx, y, dy; 
Image still; 

public Dude(){ 
    ImageIcon i = new ImageIcon("C:/still.png"); 
    still = i.getImage(); 
    x = 10; 
    y = 150; 
} 

public void move(){ 
    x = x + dx; 
    y = y + dy; 

} 

public int getX(){ 
    return x; 
} 

public int getY(){ 
    return y; 
} 

public Image getImage(){ 
    return still; 
} 

public void keyPressed(KeyEvent e){ 
    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_LEFT) 
     dx = -2; 

    if (key == KeyEvent.VK_RIGHT) 
     dx = 2; 

    if (key == KeyEvent.VK_UP) 
     dy = -2; 

    if (key == KeyEvent.VK_DOWN) 
     dy = 2; 

} 

    public void keyReleased(KeyEvent e){ 
    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_LEFT); 
     dx = 0; 

    if (key == KeyEvent.VK_RIGHT); 
     dx = 0; 

    if (key == KeyEvent.VK_UP) 
     dy = 0; 

    if (key == KeyEvent.VK_DOWN) 
     dy = 0; 

} 

} 


//@@@@@@@@@@@@@@@@@@@ 
//this is my board class (background) 



import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 

public class Board extends JPanel implements ActionListener{ 

Dude p; 
Image img; 
Timer time; 

public Board(){ 
    p = new Dude(); 
    addKeyListener(new AL()); 
    setFocusable(true); 
    ImageIcon i = new ImageIcon("C:/test.png"); 
    img = i.getImage(); 
    time = new Timer(5, this); 
    time.start(); 
} 
public void actionPerformed(ActionEvent e){ 
    p.move(); 
    repaint(); 
} 

public void paint(Graphics g){ 
    super.paint(g); 
      Graphics2D g2d = (Graphics2D) g; 

      g2d.drawImage(img, 0, 0, null); 
      g2d.drawImage(p.getImage(), p.getX(), p.getY(), null); 
} 

private class AL extends KeyAdapter{ 
    public void keyReleased(KeyEvent e){ 
     p.keyReleased(e); 
    } 
    public void keyPressed (KeyEvent e){ 
     p.keyPressed(e); 
    } 
} 

} 
+0

你有关键重复吗?即你是否收到bazillion'keyPressed'事件? – Bringer128

+0

您可以通过开关使keyPressed和keyReleased方法更优化。现在所有4个检查都必须执行。这可能不会对您的整体表现造成太大的影响,这就是为什么这是一个评论,而不是一个答案。 –

回答

1

这个工作对我来说:

package sof_6406645; 

import javax.swing.*; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

public class Checkers { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("2D Game"); 

     frame.add(new Board()); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(1200,326); 
     frame.setVisible(true); 
    } 
    public static class Board extends JPanel implements ActionListener { 

     final Image img; 
     Point p; 
     final boolean[] dynamics = new boolean[4]; 

     public Board() { 
      addKeyListener(new AL()); 
      setFocusable(true); 
      ImageIcon i = new ImageIcon("dude.png"); 
      img = i.getImage(); 
      p = new Point(0,0); 
      Timer timer = new Timer(5, this); 
      timer.start(); 
     } 
     public void actionPerformed(ActionEvent e){ 
      moveImage(); 
     } 
     public void moveImage(){ 
      int dx = 0; 
      int dy = 0; 
      if(dynamics[0]) dx = -2; 
      if(dynamics[1]) dy = -2; 
      if(dynamics[2]) dx = 2; 
      if(dynamics[3]) dy = 2; 
      p.move((int)p.getX() + dx, (int)p.getY() + dy); 
      repaint(); 
     } 

     public void paint(Graphics g){ 
      super.paint(g); 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.drawImage(img, (int)p.getX(), (int)p.getY(), null); 
     } 

     private class AL extends KeyAdapter{ 
      public void keyReleased(KeyEvent e){ 
       updateDynamics(e, false); 
      } 
      public void keyPressed (KeyEvent e){ 
       updateDynamics(e, true); 
      } 
     } 
     final void updateDynamics(KeyEvent e, boolean v) { 
      int i = e.getKeyCode() - KeyEvent.VK_LEFT; 
      dynamics[i] = v; 
     } 
    } 
} 

[编辑]:

发了小修改,以纠正updateDynamics()的SIG和抵制的冲动,手动内联(有效)将在两个关键侦听器方法中复制的1行代码。该方法调用应该由JIT内联。在moveImage()中的if语句的顺序也可以被收紧以减半,但我很确定JVM会为你处理这些事情。

说到if s,我最初并没有改变你的互动模式,但我想如果你继续按下两个相反的移动键,Dude应该会停止冷,你不觉得吗?

 public void moveImage(){ 
      int dx = 0; 
      int dy = 0; 
      if(dynamics[0]) dx -= 2; 
      if(dynamics[1]) dy -= 2; 
      if(dynamics[2]) dx += 2; 
      if(dynamics[3]) dy += 2; 
      p.move((int)p.getX() + dx, (int)p.getY() + dy); 
      repaint(); 
     } 
+0

只想说谢谢!工作完美,并修复了我注意到的奇怪的滞后,你摇滚,谢谢你!除了我注意到的两件事,用你的新moveImage()方法,它在停止时效果很好,但是说左右键都被按下了,那么你仍然应该能够上下移动?但你只能向下移动,并且同样向上和向下移动,如果你持有它们,你只能向右移动,而不是离开......想法? – CMOS

+0

如果你将事件系统化,你会注意到Swing没有引发第三个关键事件。在你的情况下,它似乎有一个模式;在Mac OS X Java 6 SE上,我根本没有得到第三个键的事件(使用箭头),尽管ctr-alt-shift等都会按预期提升事件。我不相信这个逻辑有问题。 (注意我使用上面的变体moveImage()。) – alphazero