2011-06-20 16 views
0

私はちょうど2dバックグラウンドでキャラクターを作る方法に関するチュートリアルをしました。基本的に重力のない非常に限定されたプラットホーマーのように動くだけで、いくつかのラグに遭遇しました。 keplressed/released worksしかし、それを最適化する方法があるのか​​どうか疑問に思っていましたが、私はアニメーションを持っていない可能性があります。左と右を押している間は、まだそれを保持しているすべての時間は、ちょうど私が行くまで、それは左と右などの間に行く遅れて、私は下のコードを貼り付けます。おかげで!: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を修正するために細部の編集をし、手動で(効果的にインライン化する衝動に抵抗)2つのキーリスナメソッドで複製される1行のコード。そのメソッド呼び出しは、がJITによってインライン化されるはずです。 moveImage()のif文のシーケンスは、チェックを半減するために強化することもできますが、やはりJVMがあなたのためにそれを処理することを確信しています。

私は最初にあなたのインタラクションモデルを変更していませんでしたが、反対の2つの移動キーを押し続けていると、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()メソッドで、私が気づいた2つのことを除いて、それは停止時にはうまくいっていますが、左右の両方が押されていると言うなら、あなたはまだ上下に移動できるはずですか?しかし、上下に動かすことはできますが、上下に動かすこともできます。 – CMOS

+0

イベントを終了すると、Swingは3番目のキーイベントを発生させていないことに気づくでしょう。あなたの場合、それはパターンを持っているようです。 Mac OS X Java 6 SEでは、ctr-alt-shiftなどがすべて予想通りにイベントを発生させますが、3番目のキーのイベントは(矢印を使用して)取得されません。私は論理に問題があるとは思わない。 (私は上記のバリアントmoveImage()を使用しています。) – alphazero