Java 基于玩家X,Y切换JPanel?
我有以下代码。。。(加上一个不包括getX、getY、setX、setY、render()、tick()等的通用播放器类) 我想让播放器在ViewB中加载,当它到达边缘时。。我希望ViewB关闭并被ViewA或ViewC替换(取决于是左边缘命中还是右边缘)。。。我似乎无法完成这件事,我不知道我做错了什么。。。。玩家类是在MainGameThread.java中创建的。。。并传递到新的JPanel上,因此我仍在使用创建的原始播放器对象/精灵。。Java 基于玩家X,Y切换JPanel?,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我有以下代码。。。(加上一个不包括getX、getY、setX、setY、render()、tick()等的通用播放器类) 我想让播放器在ViewB中加载,当它到达边缘时。。我希望ViewB关闭并被ViewA或ViewC替换(取决于是左边缘命中还是右边缘)。。。我似乎无法完成这件事,我不知道我做错了什么。。。。玩家类是在MainGameThread.java中创建的。。。并传递到新的JPanel上,因此我仍在使用创建的原始播放器对象/精灵。。 System.out.println(“应将此处的屏
System.out.println(“应将此处的屏幕更改为ViewA”)代码>命令在到达边缘时似乎不会触发。。我在这里做错了什么????我要修什么课
MainGameThread类:
import java.util.LinkedList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainGameThread extends JFrame {
private LinkedList<JPanel> screens = new LinkedList<JPanel>();
private ViewA va;
private ViewB vb;
private ViewC vc;
private ViewD vd;
private Player player;
public MainGameThread() {
player = new Player();
// load player settings from server
// ..
//
// va = new ViewA(player);
//vc = new ViewC(player);
//vd = new ViewD(Player)
vb = new ViewB(player);
screens.add(0,ViewB);
screens.add(1,ViewA);
screens.add(2,ViewB);
screens.add(3,ViewC);
add(screens.get(0)); // starting from view B
//go to end of view B (x=0), change to View A, close view B
if(player.getX()<=5){
System.out.println("Should change screens here to ViewA");
vb = null;
va = new ViewA(player);
remove(screens.get(0));
add(screens.get(1));
}
if(player.getX()>=615){
System.out.println("Should change screens here to ViewC");
vb = null;
vc = new ViewC(player);
remove(screens.get(0));
add(screens.get(2));
}
setSize(652, 480);
setLocationRelativeTo(null);
setTitle("GAME");
setResizable(false);
setVisible(true);
}
public static void main(String[] args) {
new MainGameThread();
}
}
- 用于在视图(ViewA、ViewB、ViewC、ViewD)之间切换,否则您必须为
JFrame
调用(重新)验证和repaint
(在对已经可见的Swing GUI执行所有更改后,作为最后一行代码)
- 自定义绘制由
paintComponent()
而不是paint()
- 删除void
public void addNotify(){
而不是覆盖此void,则JPanel
中对象的所有坐标都基于getWeight/Height
“删除void public void addNotify(){而不是此void来覆盖getPreferredSize,那么JPanel中对象的所有坐标都基于getWeight/Height”--所以将addNotify()全部删除?或者执行此public void addNotify(){super.addNotify();B_WIDTH=getWidth();B_Height=getHeight();super.setPreferredSize(新尺寸(B_宽度,B_高度));}
删除整个代码块,没有任何原因需要通知,请尝试通过鼠标单击链接代码到getPreferredSize,然后您可以进行比较,顺便说一句,在此处搜索paintComponent+getPreferredSize,按最新顺序排序,然后您可以看到一些奇迹
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.Timer;
public class ViewA extends JPanel implements ActionListener {
private Player player;
private Timer timer;
private int B_WIDTH;
private int B_HEIGHT;
private boolean ingame;
public ViewA(Player player) {
this.player = player;
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.RED);
setDoubleBuffered(true);
setSize(652, 480);
ingame = true;
timer = new Timer(5, this);
timer.start();
}
public void addNotify() {
super.addNotify();
B_WIDTH = getWidth();
B_HEIGHT = getHeight();
}
public void paint(Graphics g) {
super.paint(g);
if (ingame) {
Graphics2D g2d = (Graphics2D)g;
if (player.isVisible())
g2d.drawImage(player.getImage()
, player.getX(), player.getY(), this);
g2d.setColor(Color.BLACK);
g2d.drawString("ViewA: ", 5, 15);
}
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
@Override
public void actionPerformed(ActionEvent e) {
player.move();
checkCollisions();
repaint();
}
public void checkCollisions() {
}
private class TAdapter extends KeyAdapter {
public void keyReleased(KeyEvent e) {
player.keyReleased(e);
}
public void keyPressed(KeyEvent e) {
player.keyPressed(e);
}
}
}