好的,我之前提出過問題,但可能不是StackOverflow的用途。所以,我已經改變了我的代碼和問題。我已經將所有JLabel變成了一個繪畫組件,並且不知何故,第一個圖像正在移動。但是,我需要分層窗格消失,所以我改變了一切。代碼如下。 我特別需要幫助的是,在第二次工作之後,即使重新啓動整個Java項目,圖像也不再顯示。下面的代碼段我並沒有真正明白。使用Java Swing-箭頭鍵移動的圖像地圖Terraria項目
BufferedImage[][] tex=new BufferedImage[16][16];
BufferedImage towie;
Container contentpane;
int map[][]=new int[30][3000];
int cX=15,cY=15;
JButton[][] picLabel=new JButton[20][30];
Container contentPane;
class Dea extends JPanel
{
Dea()
{
setBackground(Color.BLACK);
setLayout(null);
for(int i=11;i<30;i++)
{
for(int j=0;j<3000;j++)
{
map[i][j]=0;
}
}
for(int i=0;i<9;i++)
{
for(int j=0;j<3000;j++)
{
map[i][j]=815;
}
}
for(int j=0;j<3000;j++)
{
map[9][j]=3;
int randomNum = ThreadLocalRandom.current().nextInt(0, 1+ 1);
map[10][j]=2;
if(randomNum==0)map[11][j]=2;
randomNum = ThreadLocalRandom.current().nextInt(0, 3 + 1);
if(randomNum==1&&map[11][j]==2)map[12][j]=2;
}
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e)
{
int c1=cX;
int c2=cY;
int keyCode = e.getKeyCode();
char key=e.getKeyChar();
switch(keyCode) {
case KeyEvent.VK_UP:
cY++;
break;
case KeyEvent.VK_DOWN:
cY--;
break;
case KeyEvent.VK_LEFT:
cX--;
break;
case KeyEvent.VK_RIGHT :
cX++;
break;
}
switch(key) {
case 's':
case 'S':
cY++;
System.out.println(cX+" "+cY);
break;
case 'w':
case 'W':
cY--;
System.out.println(cX+" "+cY);
break;
case 'a':
case 'A':
cX--;
System.out.println(cX+" "+cY);
break;
case 'd':
case 'D':
cX++;
System.out.println(cX+" "+cY);
break;
}
if(cX<0||cX>2999)cX=c1;
if(cY<0||cY>30)cY=c2;
repaint();
}
});
this.requestFocus();
setVisible(true);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
ImageIcon wae=new ImageIcon(towie);
Image wde=wae.getImage();
g.drawImage(wde,0,0,600,200,0,0,600,200,this);
for(int i=cY-15;i<cY+5;i++)
{
for(int j=cX-15;j<cX+15;j++)
{
ImageIcon w=new ImageIcon(tex[map[i][j]/100][map[i][j]%100]);
Image we=w.getImage();
g.drawImage(we,j*20,i*20,j*20+20,i*20+20,0,0,20,20,this);
}
}
}
}
class ImagesLoader{
ImagesLoader()
{
BufferedImage WholeTexture = null;
try {
WholeTexture = ImageIO.read(new File("textures/terrain_765082.jpg"));
towie=ImageIO.read(new File("Backgrounds/Background.jpg"));
}catch(IOException e){System.out.println("Image Texture Loading Error");}
for(int i=0;i<16;i++)
{
for(int j=0;j<16;j++)
{
BufferedImage xy2 = WholeTexture.getSubimage(80*i,80*j,80,80);
int type = xy2.getType() == 0? BufferedImage.TYPE_INT_ARGB : xy2.getType();
BufferedImage resizedImage = new BufferedImage(20,20,type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(xy2,0,0,20,20,null);
g.dispose();
tex[j][i]=resizedImage;
// File outputfile = new File("textures/0"+(i*16+j)+".jpg");
// try{
// ImageIO.write(tex[i][j], "png", outputfile);
// }catch(IOException e){}
}
}
}
}
看起來你似乎試圖在這裏用你的代碼做很多事情,並且有多種可能的失敗點。你在哪裏調用這個代碼?你如何執行你的核心遊戲循環?如何使用ImagesLoader(因爲這會影響渲染週期)?我不確定你的片段是否足以診斷問題。我個人也不會將'repaint()'事件綁定到'KeyBind',但是我實現了一個類似的系統已經有一段時間了。 – Gorbles