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; } } }
을 극복 할 수있는 능력을 가지고 당신이 Key Bindings를 사용하는 것이 좋습니다 어디'Player' 구성 요소입니까? 당신이'KeyListener'를 사용하여 플레이어를 움직이고 있다고 가정합니까? 이것은 당신에게 문제를 일으킬 것입니다 – MadProgrammer
네, PlayerComponent에 KeyListener를 사용하고 있습니다 .. 지금 원래의 질문에 추가하십시오. – user2556304