2015-05-02 33 views
-1

我正在用Java做一个游戏 - 我有控制字符,但它的工作原理很奇怪。当我打开游戏 - 控制不成立。我必须尽量减少游戏,回到它然后控制工作!也许有人知道为什么? 我添加一些代码中可能会有一些错误(编译器不检测错误!)控制操作的奇怪形式--java

游戏窗口:

package game; 
 
    
 
import java.awt.Color; 
 
import java.awt.Dimension; 
 
import java.awt.Graphics; 
 
import java.awt.Graphics2D; 
 
import java.awt.GridBagConstraints; 
 
import java.awt.GridBagLayout; 
 
import java.awt.Insets; 
 
import java.awt.event.ActionEvent; 
 
import java.awt.event.ActionListener; 
 
import java.awt.event.KeyEvent; 
 
import java.awt.event.KeyListener; 
 
import java.io.IOException; 
 
    
 
import javax.swing.Timer; 
 
import javax.swing.JPanel; 
 
    
 
/** 
 
* Tworzenie okna gry 
 
* @author szaroket 
 
*/ 
 
    
 
public class GameFrame extends JPanel implements ActionListener{ 
 
    
 
    private GameBar game_bar; 
 
    private TileMap map; 
 
    private Timer timer; 
 
    Configuration conf = new Configuration(); 
 
    Player player; 
 
    Controller con; 
 
    
 
    public float power = 1f; 
 
    public int yspeed = 0; 
 
    public int xspeed = 0; 
 
    public float gravity = 0.1f; 
 
    public float friction = 0.95f; 
 
    
 
    /** 
 
    * Tworzy elementy planszy oraz przyciski. 
 
    * 
 
    * @param parent Sprawia, że ten panel jest w stanie wywołać metody jego rodzica. 
 
    * @throws IOException 
 
    */ 
 
    
 
    public GameFrame(MainMenu parent) throws IOException{ 
 
     setLayout(new GridBagLayout()); 
 
     GridBagConstraints constraints = new GridBagConstraints(); 
 
     constraints.insets = new Insets(0,400,0,0); 
 
    
 
     map = new TileMap("Map.txt", 32); 
 
     player = new Player(); 
 
     con = new Controller(); 
 
    
 
    
 
     game_bar=new GameBar(parent); 
 
     constraints.gridx = 0; 
 
     constraints.gridy = 0; 
 
     constraints.weighty = 1; 
 
     constraints.anchor = GridBagConstraints.PAGE_START; 
 
     add(game_bar, constraints); 
 
    
 
     this.setOpaque(false); 
 
     this.setFocusable(true); 
 
     this.addKeyListener(con); 
 
     this.setDoubleBuffered(true); 
 
     this.requestFocusInWindow(); 
 
    
 
     timer = new Timer(10, this); 
 
     timer.start(); 
 
    } 
 
    
 
    public void actionPerformed(ActionEvent e) { 
 
     //Player.player_y ++; 
 
     repaint();   
 
     ckeck_controls(); 
 
    } 
 
    
 
    private void ckeck_controls() { 
 
     if(con.down){ 
 
      yspeed += power; 
 
     } 
 
     if(con.up){ 
 
      yspeed -= power; 
 
     } 
 
     if(con.right){ 
 
      xspeed += power; 
 
     } 
 
     if(con.left){ 
 
      xspeed -= power; 
 
     } 
 
    
 
     //yspeed += gravity; 
 
    
 
     Player.player_x += xspeed; 
 
     Player.player_y += yspeed; 
 
    
 
    } 
 
    
 
    public Dimension getPreferredSize() { 
 
     return new Dimension(getParent().getSize()); 
 
    } 
 
    
 
    public void paintComponent(Graphics g) { 
 
     map.draw(g); 
 
     game_bar.repaint(); 
 
     getParent().repaint(); 
 
    
 
     Graphics2D g2d = (Graphics2D) g; 
 
    
 
     g2d.setColor(Color.RED); 
 
     g2d.fillOval((int) Player.player_x, (int) Player.player_y, 40, 40); 
 
    } 
 
}

控制器:

package game; 
 
    
 
import java.awt.event.KeyEvent; 
 
import java.awt.event.KeyListener; 
 
    
 
public class Controller implements KeyListener{ 
 
    //public int power = 1; 
 
    //public int yspeed = 0; 
 
    //public int xspeed = 0; 
 
    //public float gravity = 0.1f; 
 
    
 
    boolean left = false; 
 
    boolean right = false; 
 
    boolean down = false; 
 
    boolean up = false; 
 
    
 
    public void keyReleased(KeyEvent e) { 
 
     if(e.getKeyCode() == KeyEvent.VK_RIGHT){ 
 
      //Player.player_x += power; 
 
      //xspeed += power; 
 
      right = false; 
 
     } 
 
     if(e.getKeyCode() == KeyEvent.VK_LEFT){ 
 
      //Player.player_x -= power; 
 
      //xspeed -= power; 
 
      left = false; 
 
     } 
 
     if(e.getKeyCode() == KeyEvent.VK_UP){ 
 
      //Player.player_y -= power; 
 
      //yspeed -= power; 
 
      up = false; 
 
     } 
 
     if(e.getKeyCode() == KeyEvent.VK_DOWN){ 
 
      //Player.player_y += power; 
 
      //yspeed += power; 
 
      down = false; 
 
     } 
 
    } 
 
    
 
    public void keyPressed(KeyEvent e) { 
 
     if(e.getKeyCode() == KeyEvent.VK_RIGHT){ 
 
      //Player.player_x += power; 
 
      //xspeed += power; 
 
      right = true; 
 
     } 
 
     if(e.getKeyCode() == KeyEvent.VK_LEFT){ 
 
      //Player.player_x -= power; 
 
      //xspeed -= power; 
 
      left = true; 
 
     } 
 
     if(e.getKeyCode() == KeyEvent.VK_UP){ 
 
      //Player.player_y -= power; 
 
      //yspeed -= power; 
 
      up = true; 
 
     } 
 
     if(e.getKeyCode() == KeyEvent.VK_DOWN){ 
 
      //Player.player_y += power; 
 
      //yspeed += power; 
 
      down = true; 
 
     } 
 
    
 
     //yspeed += gravity; 
 
    
 
     //Player.player_x += xspeed; 
 
     //Player.player_y += yspeed; 
 
    } 
 
    
 
    public void keyTyped(KeyEvent e) {   
 
    } 
 
    
 
    
 
}

回答

0

我猜你的requestFocusInWindow()正在返回false。这意味着请求不成功。您必须确保在帧已显示之后致电requestFocusInWindow()

所以,一旦你打电话JFrame.setVisible(true),那么请致电requestFocusInWindow()它应该给予适当的焦点。

+0

在我看来,我有这正确的配置。 你认为可以是别人? – szarlotte