2013-07-18 5 views
0

CardLayout을 통해 다른 JPanel로 전환하자마자 멈추는 스프라이트에 문제가 있습니다.Java Game Sprite Stuck

import java.awt.CardLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game extends JFrame implements Runnable { 

    private viewA v1; 
    private viewB v2; 
    private viewC v3; 
    private viewD v4; 
    private Player player; 
    private CardLayout c1; 
    private JPanel contPanel; 

    // ############## VIEW A BUTTONLISTENER 
    public class ViewAButtonList implements ActionListener{ 

     public void actionPerformed(ActionEvent ev){ 
      try{ 
      c1.show(contPanel, "1"); 

      } catch (Exception ex){ 

      ex.printStackTrace(); 
      } 

     } 


    } 
    // ############## VIEW B BUTTON LISTENER 
    public class ViewBButtonList implements ActionListener{ 

     public void actionPerformed(ActionEvent ev){ 
      try{ 
      c1.show(contPanel, "2"); 

      } catch (Exception ex){ 

      ex.printStackTrace(); 
      } 

     } 


    } 
    // ############## VIEWC BUTTON ACTIONEVENT 
    public class ViewCButtonList implements ActionListener{ 

     public void actionPerformed(ActionEvent ev){ 
      try{ 
      c1.show(contPanel, "3"); 

      } catch (Exception ex){ 

      ex.printStackTrace(); 
      } 

     } 


    } 
    // ############## VIEW D BUTTON ACTION EVENT 
    public class ViewDButtonList implements ActionListener{ 

     public void actionPerformed(ActionEvent ev){ 
      try{ 
      c1.show(contPanel, "4"); 

      } catch (Exception ex){ 

      ex.printStackTrace(); 
      } 

     } 


    } 





    public Game() { 
     player = new Player(); 
     // load player settings from server 
     // .. 
     // contPanel = new JPanel(); 
    //load views v1 = new ViewA(Player); v2=new ViewB(Player); v3 = new ViewC(Player); v4 =new ViewD(Player); 

    c1 = new CardLayout(); 

    contPanel.setLayout(c1); 


    contPanel.add(v1,"1"); 

    contPanel.add(v2,"2"); 

    contPanel.add(v3"3"); 

    contPanel.add(v4,"4"); 

     c1.show(contPanel, "2"); 
     currPos =2; 

     this.add(contPanel); 

     setSize(652, 480); 
     setLocationRelativeTo(null); 
     setTitle("GAME"); 
     setResizable(false); 
     setVisible(true);//go to end of view B (x=0), change to View A, close view B 


     // Create 4 of each button to place in each seperate view (to swtich back and forth) 
     // ................ 


    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Game(); 
      } 
     }); 
    } 

    @Override public void run() {   // TODO Auto-generated method stub 
    } } 

지금 .. 모든 화면 사이를 전환의 관점에서 작동합니다 ..하지만 내 플레이어 스프라이트는 스위치 다음에 화면에 걸리면하지만, 초기로드에 나는 화살표 키를 사용하여 스프라이트를 이동할 수 있습니다. 나는 새로운 ViewA (Player) 플레이어를 통과시키는 것이 범인이 될지 모르지만 .. 내가 잘못한 것을 알아낼 수 없다는 느낌이 들었습니다.

다음은 선수입니다 :

import java.awt.Image; import java.awt.Rectangle; import java.awt.event.KeyEvent;

import java.util.ArrayList;

import javax.swing.ImageIcon;

공용 클래스 플레이어 {

private String playersprite = "playersprite.png"; 

private int dx; 
private int dy; 
private int x; 
private int y; 
private int width; 
private int height; 
private boolean isFired; 
private boolean visible; 
private Image image; 
private ArrayList missiles; 


public Player() { 
    ImageIcon ii = new ImageIcon(this.getClass().getResource(playersprite)); 
    image = ii.getImage(); 
    width = image.getWidth(null); 
    height = image.getHeight(null); 
    missiles = new ArrayList(); 
    visible = true; 
    isFired=false; 
    //default spawn location 
    x = 600; 
    y = 400; 
} 


public void move() { 

    x += dx; 
    y += dy; 


    if(x<=0){x=0;}  if(x>=640-20){x=640-20;}  if(y<=0){y=0;} 
    if(y>=400){y=400;} 
} 

public int getX() { 
    return x; 
} 

public int getY() { 
    return y; 
} 

public void setX(int x){ 
    this.x=x; 
} 
public void setY(int y){ 
    this.y=y; 
} 

public Image getImage() { 
    return image; 
} 

public ArrayList getMissiles() { 
    return missiles; 
} 

public void setVisible(boolean visible) { 
    this.visible = visible; 
} 

public boolean isVisible() { 
    return visible; 
} 

public Rectangle getBounds() { 
    return new Rectangle(x, y, 32, 32); 
} 


public void keyPressed(KeyEvent e) { 

    System.out.println("X: "+x+",Y: "+y); 


    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_SPACE) { 
     if(isFired==false){ 
      isFired=true; 
     fire(); 
     } else return; 
    } 

    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 fire() { 

    System.out.println("Player used weapon"); 
    // missiles.add(new Missile(x, y)); 
} 

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; 
    } 
    if (key == KeyEvent.VK_SPACE) { 
     isFired=false; 
    } 
} } 
+0

을 극복 할 수있는 능력을 가지고 당신이 Key Bindings를 사용하는 것이 좋습니다 어디'Player' 구성 요소입니까? 당신이'KeyListener'를 사용하여 플레이어를 움직이고 있다고 가정합니까? 이것은 당신에게 문제를 일으킬 것입니다 – MadProgrammer

+0

네, PlayerComponent에 KeyListener를 사용하고 있습니다 .. 지금 원래의 ​​질문에 추가하십시오. – user2556304

답변

1

KeyListener들이 등록되어있는 구성 요소가 포커스되어 초점을 할 것을 요구하고,이 즉, 당신은 버튼에 JButton 포커스가 이동하고 구성 요소와 같은 것을 클릭하면 KeyListener에는 더 이상 키보드 포커스가 없으므로 더 이상 키 이벤트를 수신하지 않습니다.

대신,이 API는 이러한 제한