2011-06-20 33 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