Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java Swing-Arrow键移动图像地图Terraria项目_Java_Image_Swing - Fatal编程技术网

使用Java Swing-Arrow键移动图像地图Terraria项目

使用Java Swing-Arrow键移动图像地图Terraria项目,java,image,swing,Java,Image,Swing,好的,我以前问过问题,但可能不是StackOverflow的目的。所以,我改变了我的代码和问题。我把所有的jlabel都变成了一个画图组件,不知何故,有一秒钟,图像在移动。然而,我需要分层窗格消失,所以我将其全部更改。代码如下。 我特别需要帮助的是,在这一秒工作之后,图像不再显示,即使我重新启动整个java项目。我真的不明白出了什么问题,下面的片段 BufferedImage[][] tex=new BufferedImage[16][16]; BufferedImage towie;

好的,我以前问过问题,但可能不是StackOverflow的目的。所以,我改变了我的代码和问题。我把所有的jlabel都变成了一个画图组件,不知何故,有一秒钟,图像在移动。然而,我需要分层窗格消失,所以我将其全部更改。代码如下。 我特别需要帮助的是,在这一秒工作之后,图像不再显示,即使我重新启动整个java项目。我真的不明白出了什么问题,下面的片段

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){}
                }
            }

        }
    }
BufferedImage[]tex=新的BufferedImage[16][16];
BuffereImage towie;
容器内容窗格;
int map[][]=新int[30][3000];
int cX=15,cY=15;
JButton[]picLabel=新JButton[20][30];
容器内容窗格;
类Dea扩展了JPanel
{
Dea()
{
挫折背景(颜色:黑色);
setLayout(空);

对于(int i=11;i这是我用来测试程序的类:

必须仔细选择map/tex的索引-我不知道您想用这些索引做什么,但当前程序移动地图,因此回答了以下问题:

class Move {

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


我已经选择了答案,我发现它真的很好。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();
    }
}
import java.util.*;
导入java.util.concurrent.ThreadLocalRandom;
导入javax.imageio.imageio;
导入javax.swing.*;
导入javax.swing.text.AbstractDocument.Content;
导入java.awt.event.*;
导入java.awt.*;
导入java.awt.image.*;
导入java.io.*;
类WorldriaEx扩展了JFrame
{
BuffereImage[][]tex=新的BuffereImage[16][16];
BuffereImage towie;
容器内容窗格;
BufferedImage charLeft;
BuffereImage charRight;
缓冲图像字符前端;
int map[][]=新int[40][3000];
int cX=1500,cY=15,c1=cX,c2=cY;
JButton[]picLabel=新JButton[20][30];
容器内容窗格;
int污垢=0;
类Dea扩展了JPanel
{
公共组件(图形g)
{
超级组件(g);
ImageIcon wae=新的ImageIcon(towie);
Image wde=wae.getImage();
g、 fillRect(0206020400);
g、 设置颜色(颜色为黑色);
g、 drawImage(wde,0,0620400,cX-c1+150,(c2 cY)*5+150750+cX-C1350+(c2 cY)*5,本);
int type=charLeft.getType()=0?buffereImage.type_int_ARGB:charLeft.getType();
BuffereImage resizedImage=新的BuffereImage(12,40,类型);
Graphics2D a=resizedImage.createGraphics();
a、 drawImage(charLeft,0,0,12,40,null);
a、 处置();
int-type1=charRight.getType()=0?BufferedImage.TYPE_int_ARGB:charRight.getType();
BuffereImage resizedImage1=新的BuffereImage(12,40,类型1);
Graphics2D b=resizedImage1.createGraphics();
b、 drawImage(charRight,0,0,12,40,null);
b、 处置();
int-type2=charFront.getType()=0?BufferedImage.TYPE_int_ARGB:charFront.getType();
BuffereImage resizedImage2=新的BuffereImage(20,40,类型2);
Graphics2D c=resizedImage2.createGraphics();
c、 drawImage(charFront,0,0,20,40,空);
c、 处置();

对于(int i=cY-15;iIt似乎您正在尝试大量使用您的代码,并且存在多个可能的失败点。您在哪里调用此代码?您如何执行核心游戏循环?如何使用
ImagesLoader
(因为这可能会影响渲染周期)?我不确定您的代码片段是否足以诊断问题。我个人也不会将
repaint()
事件与
KeyBind
绑定,但我已经有一段时间没有实现类似的系统了。
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(towie,0,0, this);
        g.drawImage(WholeTexture, cX, cY, this);
    }
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();
    }
}