2017-01-23 76 views
0

好的,我之前提出過問題,但可能不是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){} 
       } 
      } 

     } 
    } 
+0

看起來你似乎試圖在這裏用你的代碼做很多事情,並且有多種可能的失敗點。你在哪裏調用這個代碼?你如何執行你的核心遊戲循環?如何使用ImagesLoader(因爲這會影響渲染週期)?我不確定你的片段是否足以診斷問題。我個人也不會將'repaint()'事件綁定到'KeyBind',但是我實現了一個類似的系統已經有一段時間了。 – Gorbles

回答

0

這是我以前用過測試程序類:

指標映射/特克斯必須仔細選擇 - 我不知道你想這些,但目前的計劃做什麼移動地圖從而回答了這個問題:

class Move { 

public Move() { 
    JFrame f=new JFrame(); 
    f.setSize(500, 500); 
    Dea d=new Dea(); 
    f.add(d); 
    f.setVisible(true); 
    d.requestFocus(); 

}

BufferedImage[][] tex=new BufferedImage[16][16]; 
BufferedImage towie; 
int map[][]=new int[30][3000]; 
int cX=15,cY=15; 
class Dea extends JPanel 
{ 
    Dea() 
    { 

    new ImagesLoader(); 

//   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; 
      } 
     } 
     Random r=new Random(); 
     for(int j=0;j<3000;j++) 
     { 
      map[9][j]=3; 
      int randomNum = r.nextInt(1+ 1); 
      map[10][j]=2; 
      if(randomNum==0)map[11][j]=2; 
      randomNum = r.nextInt(3 + 1); 
      if(randomNum==1&&map[11][j]==2)map[12][j]=2; 
     } 
     addKeyListener(new KeyListener(){ 
      public void keyReleased(KeyEvent e) { } 
      public void keyTyped(KeyEvent e) { } 
      public void keyPressed(KeyEvent e) 
       { 
       System.out.println("keys"); 
       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(); 
       } 
      }); 
    } 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     g.drawImage(towie,0,0, this); 
     for(int i=0;i<map.length;i++) 
     { 
      for(int j=0;j<map[0].length;j++) 
      { 
       g.drawImage(tex[map[i][j]/100][map[i][j]/100],cX+j*20,cY+i*20,this); 
      } 
     } 
    } 
} 

-

您還可以通過具有這種移動整個地圖 - 無需擔心其部分:

public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.drawImage(towie,0,0, this); 
     g.drawImage(WholeTexture, cX, cY, this); 
    } 
0

我所選擇的答案,而且我發現它真的很不錯。 Paintcomponent使它能夠自由移動。所以,這裏是源代碼。

import java.util.*; 
import java.util.concurrent.ThreadLocalRandom; 
import javax.imageio.ImageIO; 
import javax.swing.*; 
import javax.swing.text.AbstractDocument.Content; 
import java.awt.event.*; 
import java.awt.*; 
import java.awt.image.*; 
import java.io.*; 
class WorldriaEx extends JFrame 
{ 
    BufferedImage[][] tex=new BufferedImage[16][16]; 
    BufferedImage towie; 
    Container contentpane; 
    BufferedImage charLeft; 
    BufferedImage charRight; 
    BufferedImage charFront; 
    int map[][]=new int[40][3000]; 
    int cX=1500,cY=15,c1=cX,c2=cY; 
    JButton[][] picLabel=new JButton[20][30]; 
    Container contentPane; 
    int dirt=0; 
    class Dea extends JPanel 
    { 
     public void paintComponent(Graphics g) 
     { 
      super.paintComponent(g); 
      ImageIcon wae=new ImageIcon(towie); 
      Image wde=wae.getImage(); 
      g.fillRect(0,200,620,400); 
      g.setColor(Color.BLACK); 
      g.drawImage(wde,0,0,620,400,cX-c1+150,(c2-cY)*5+150,750+cX-c1,350+(c2-cY)*5,this); 
      int type = charLeft.getType() == 0? BufferedImage.TYPE_INT_ARGB : charLeft.getType(); 
      BufferedImage resizedImage = new BufferedImage(12,40,type); 
      Graphics2D a = resizedImage.createGraphics(); 
      a.drawImage(charLeft,0,0,12,40,null); 
      a.dispose(); 
      int type1 = charRight.getType() == 0? BufferedImage.TYPE_INT_ARGB : charRight.getType(); 
      BufferedImage resizedImage1 = new BufferedImage(12,40,type1); 
      Graphics2D b = resizedImage1.createGraphics(); 
      b.drawImage(charRight,0,0,12,40,null); 
      b.dispose(); 
      int type2 = charFront.getType() == 0? BufferedImage.TYPE_INT_ARGB : charFront.getType(); 
      BufferedImage resizedImage2 = new BufferedImage(20,40,type2); 
      Graphics2D c = resizedImage2.createGraphics(); 
      c.drawImage(charFront,0,0,20,40,null); 
      c.dispose(); 
      for(int i=cY-15;i<cY+5;i++) 
      { 
       for(int j=cX-15;j<cX+16;j++) 
       { 
        if(i<0)continue; 
        ImageIcon w=new ImageIcon(tex[map[i][j]/100][map[i][j]%100]); 
        Image we=w.getImage(); 
        if(map[i][j]!=815)g.drawImage(we,(j-cX+15)*20,(i-cY+15)*20,(j-cX+15)*20+20,(i-cY+15)*20+20,0,0,20,20,this); 
       } 
      } 
      if(dirt==1)g.drawImage(resizedImage,304,140,12,40,this); 
      else if(dirt==0)g.drawImage(resizedImage2,300,140,20,40,this); 
      else g.drawImage(resizedImage1,304,140,12,40,this); 
      Fall(cX,cY); 
      repaint(); 
     } 
    } 
    class ImagesLoader{ 
     ImagesLoader() 
     { 
      BufferedImage WholeTexture = null; 
      try { 
       WholeTexture = ImageIO.read(new File("textures/terrain_765082.png")); 
       towie=ImageIO.read(new File("Backgrounds/Background.jpg")); 
       charLeft=ImageIO.read(new File("textures/Char Left.png")); 
       charRight=ImageIO.read(new File("textures/Char Right.png")); 
       charFront=ImageIO.read(new File("textures/Char Front.png")); 
      }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(32*i,32*j,32,32); 
        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){} 
       } 
      } 

     } 
    } 
    WorldriaEx() 
    { 
     setTitle("Worldria Project - Andrew Woo"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     getContentPane(); 
     setLayout(new BorderLayout()); 
     ImagesLoader aw = new ImagesLoader(); 
     for(int i=11;i<40;i++) 
     { 
      for(int j=0;j<3000;j++) 
      { 
       map[i][j]=1; 
      } 
     } 
     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; 
     } 
     Dea mainPanel = new Dea(); 
     add(mainPanel,BorderLayout.CENTER); 
     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--; 
        repaint(); 
        break; 
       case KeyEvent.VK_DOWN: 
        if(map[cY+2][cX]!=815)cY++; 
        repaint(); 
        break; 
       case KeyEvent.VK_LEFT: 
        cX--; 
        dirt=1; 
        repaint(); 
        break; 
       case KeyEvent.VK_RIGHT : 
        cX++; 
        dirt=2; 
        repaint(); 
        break; 
      } 
       switch(key) { 
       case 'w': 
       case 'W': 
        cY--; 
        repaint(); 
        break; 
       case 'a': 
       case 'A': 
        dirt=1; 
        cX--; 
        repaint(); 
        break; 
       case 'd': 
       case 'D': 
        dirt=2; 
        cX++; 
        repaint(); 
        break; 
      } 
       if(cX<=0||cX>2999)cX=c1; 
       if(cY<=0||cY>39)cY=c2; 
       repaint(); 
      } 
     }); 
     add(mainPanel); 
     requestFocusInWindow(); 
     this.requestFocus(); 
     setSize(620,400); 
     setVisible(true); 
    } 
    public void Fall(int a,int b) 
    { 
     if(map[b+2][a]==815) 
     { 
      try { 
        // thread to sleep for 1000 milliseconds 
        Thread.sleep(50); 
        cY++; 
        repaint(); 
        } catch (Exception f) { 
        System.out.println(f); 
        } 
     } 
     repaint(); 
    } 
} 
public class Main{ 
    public static void main(String[] args) { 
     new WorldriaEx(); 
    } 
}