Java游戏精灵卡住了
当我通过CardLayout切换到另一个JPanel时,我遇到了一个sprite卡住的问题Java游戏精灵卡住了,java,2d,cardlayout,Java,2d,Cardlayout,当我通过CardLayout切换到另一个JPanel时,我遇到了一个sprite卡住的问题 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.sw
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
} }
现在。。从屏幕切换的角度来看,一切都是可行的。。但我的播放器精灵在切换后会卡在屏幕上,但在初始加载时,我可以用箭头键移动精灵。我不确定在新视野中传球的球员是否是罪魁祸首。。但我有一种感觉,那就是。。不知道我做错了什么
这是本书的作者:
导入java.awt.Image;导入java.awt.Rectangle;进口
java.awt.event.KeyEvent
导入java.util.ArrayList
导入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;
}
} }
私有字符串playersprite=“playersprite.png”;
私人int dx;
私家侦探;
私人INTX;
私营企业;
私有整数宽度;
私人内部高度;
私有布尔值被激发;
私有布尔可见;
私有图像;
私人ArrayList导弹;
公共玩家(){
ImageIcon ii=新的ImageIcon(this.getClass().getResource(playersprite));
image=ii.getImage();
宽度=image.getWidth(null);
高度=image.getHeight(null);
导弹=新阵列列表();
可见=真实;
isFired=false;
//默认繁殖位置
x=600;
y=400;
}
公开作废动议(){
x+=dx;
y+=dy;
如果(x=640-20){x=640-20;}如果(y=400){y=400;}
}
公共int getX(){
返回x;
}
公共int getY(){
返回y;
}
公共无效集合x(整数x){
这个.x=x;
}
公共空间设置(整数y){
这个。y=y;
}
公共映像getImage(){
返回图像;
}
公共ArrayList getfilms(){
返回导弹;
}
公共void集合可见(布尔可见){
可见的;可见的;
}
公共布尔值可见(){
返回可见;
}
公共矩形getBounds(){
返回新矩形(x,y,32,32);
}
按下公共无效键(按键事件e){
System.out.println(“X:+X+”,Y:+Y);
int key=e.getKeyCode();
if(key==KeyEvent.VK_空间){
if(isFired==false){
isFired=true;
火();
}否则返回;
}
if(key==KeyEvent.VK_左){
dx=-2;
}
if(key==KeyEvent.VK_RIGHT){
dx=2;
}
if(key==KeyEvent.VK_UP){
dy=-2;
}
if(key==KeyEvent.VK_DOWN){
dy=2;
}
}
公共场所火灾(){
System.out.println(“玩家使用的武器”);
//增加(新导弹(x,y));
}
公共无效密钥已释放(密钥事件e){
int key=e.getKeyCode();
if(key==KeyEvent.VK_左){
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_空间){
isFired=false;
}
} }
KeyListener
要求他们注册的组件是可聚焦的并且具有焦点,这意味着当您单击类似于JButton
的按钮时,焦点移动到按钮,并且具有KeyListener
的组件不再具有键盘焦点,因此将不再接收按键事件
相反,建议您使用,因为此API有能力克服这些限制播放器的
组件在哪里?我假设您正在使用keylister
移动播放器?这会给您带来问题。EA,我正在为PlayerComponent使用KeyListener。。现在补充原来的问题