JPanel错误中的Java-Sprite

JPanel错误中的Java-Sprite,java,jpanel,collision-detection,sprite,Java,Jpanel,Collision Detection,Sprite,每次我运行时,面板的一角都有一条白线,其余的都是黑色的。 我想将KeyListener添加到程序中,这样当我按下“W”键时,它将为精灵设置动画,因为它似乎正在前进 如果精灵不是一直居中,那么当精灵图像块到达面板边缘时,我将如何编写碰撞检测代码以重新绘制贴图 我知道我问了不止一个问题,但我想找出一个问题 如何在平铺地图上尚未绘制的特定位置生成一个简单的NPC。让这个NPC变得棘手 我想做的是在屏幕中央有一个精灵。在背景中有一个平铺贴图,碰撞检测依赖于彩色方块。如果瓷砖层为红色,则不允许通过。如果瓷

每次我运行时,面板的一角都有一条白线,其余的都是黑色的。 我想将KeyListener添加到程序中,这样当我按下“W”键时,它将为精灵设置动画,因为它似乎正在前进

如果精灵不是一直居中,那么当精灵图像块到达面板边缘时,我将如何编写碰撞检测代码以重新绘制贴图

我知道我问了不止一个问题,但我想找出一个问题

如何在平铺地图上尚未绘制的特定位置生成一个简单的NPC。让这个NPC变得棘手

我想做的是在屏幕中央有一个精灵。在背景中有一个平铺贴图,碰撞检测依赖于彩色方块。如果瓷砖层为红色,则不允许通过。如果瓷砖层为红色,则允许通过。如果瓷砖层为黄色,则应用操作,因为它是一个宝箱

  public class gamePanel extends JPanel {
   private BufferedImage image;

    public gamePanel() throws IOException{
        this.setBackground(Color.red);  

    }
    public static void loadMap(Graphics g, int frame){
       try {
           BufferedImage bigImg = ImageIO.read(new File("C:\\Users\\czar\\Documents\\NetBeansProjects\\Inter\\src\\inter\\menu.jpg"));
       } catch (IOException ex) {
           Logger.getLogger(gamePanel.class.getName()).log(Level.SEVERE, null, ex);
       }


    }
    public static void loadSprite(Graphics g, int move_int) throws IOException{
        BufferedImage bigImg = ImageIO.read(new File("C:\\Users\\czar\\Documents\\NetBeansProjects\\Inter\\src\\inter\\sprite.jpg"));
        // The above line throws an checked IOException which must be caught.

        final int width = 25;
        final int height = 40;

        final int cols = 2;
        BufferedImage[] left_move = new BufferedImage[3];
        BufferedImage[] right_move = new BufferedImage[3];
        BufferedImage[] up_move = new BufferedImage[3];
        BufferedImage[] down_move = new BufferedImage[3];

        for(int i = 0; i < 4; i++){
            if(move_int == 0){
                left_move[i] = bigImg.getSubimage(
                0 * width, 0 * height, width, height );
            }
            if(move_int == 1){
                right_move[i] = bigImg.getSubimage(
                i * width, 1 * height, width, height );
            }
            if(move_int == 2){
                up_move[i] = bigImg.getSubimage(
                i * width, 2 * height, width, height );
            }
            if(move_int == 3){
                down_move[i] = bigImg.getSubimage(
                i * width, 3 * height, width, height );
            }
        }


    }

    @Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
     try {

         loadMap(g, 0);
         loadSprite(g, 0);

     } catch (IOException ex) {
            // handle exception...
        }
}


}
公共类游戏面板扩展JPanel{
私有缓冲图像;
public gamePanel()引发IOException{
这个.挫折背景(颜色.红色);
}
公共静态void加载图(图形g,int帧){
试一试{
BuffereImage bigImg=ImageIO.read(新文件(“C:\\Users\\czar\\Documents\\NetBeansProjects\\Inter\\src\\Inter\\menu.jpg”);
}捕获(IOEX异常){
Logger.getLogger(gamePanel.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共静态void loadSprite(图形g,int move_int)引发IOException{
BuffereImage bigImg=ImageIO.read(新文件(“C:\\Users\\czar\\Documents\\NetBeansProjects\\Inter\\src\\Inter\\sprite.jpg”);
//上面的行抛出一个必须捕获的checked IOException。
最终整数宽度=25;
最终内部高度=40;
最终整数cols=2;
BuffereImage[]左移=新的BuffereImage[3];
BuffereImage[]右键移动=新的BuffereImage[3];
BuffereImage[]向上移动=新的BuffereImage[3];
BuffereImage[]向下移动=新的BuffereImage[3];
对于(int i=0;i<4;i++){
if(move_int==0){
左移动[i]=bigImg.getSubimage(
0*宽度,0*高度,宽度,高度);
}
if(move_int==1){
右移[i]=bigImg.getSubimage(
i*宽度,1*高度,宽度,高度);
}
if(move_int==2){
向上移动[i]=bigImg.getSubimage(
i*宽度,2*高度,宽度,高度);
}
if(move_int==3){
向下移动[i]=bigImg.getSubimage(
i*宽度,3*高度,宽度,高度);
}
}
}
@凌驾
受保护组件(图形g){
超级组件(g);
试一试{
负荷图(g,0);
loadSprite(g,0);
}捕获(IOEX异常){
//处理异常。。。
}
}
}

我不确定您想做什么,但这里有一些关于解决错误的快速帮助

此代码

BufferedImage[] down_move = new BufferedImage[3];
创建一个可容纳3个图像的数组,即:

向下移动[0]
向下移动[1]
向下移动[2]

这是因为数组是基于零的。如果您这样做:

System.out.println(down_move.length);
您将看到它的输出3。这是因为您的阵列仅适合3个图像

我假设您希望阵列上有4个图像。因此,您需要将代码修改为:

BufferedImage[] down_move = new BufferedImage[4];
这将产生4个图像,即:

向下移动[0]
向下移动[1]
向下移动[2]
向下移动[3]

在您的代码中,您试图访问一个数组中的down_move[3],该数组只向上访问down_move[2]

读取错误:ArrayIndexOutofBounds异常:3

您的图像数组有3个索引(0、1和2),您试图访问第4个索引(3)

将图像数组大小更改为4而不是3(如下所示),这样就不会再出现此异常

BufferedImage[] up_move = new BufferedImage[4];
BufferedImage[] down_move = new BufferedImage[4];
BufferedImage[] left_move = new BufferedImage[4];
BufferedImage[] right_move = new BufferedImage[4];

我想在数组中保留4。。。0, 1, 2, 3. 我把3放在括号里,以为它会倒计时。down_move[0]down_move[1]down_move[2]down_move[3]这样做的目的是保存精灵动画中特定静止帧的图像。我遇到的问题是绘制精灵并对其应用动画。if(0);g、 drawImage(向左移动[0],居中,居中,空);如果按下该键,则为左箭头。如果(0)为真。所以动画是通过从增量数组中重画来应用的。我已经更新了我的答案。我希望现在更清楚了。你的代码只是为了加载精灵,对吗?您没有代码尝试在任何地方显示图像…正确。然而,我在弄清楚如何在程序中实现键侦听器时遇到了一些困难,而不是根据键输入绘制精灵。此代码根据要按下的键将精灵帧分别加载到每个数组中。我会分配像0=左这样的数字。枚举假设。问题是我如何将图像绘制到jpanel的中心。我会得到精灵图像的宽度,然后从面板的宽度除以2减去它。我认为这是中心规模的一个缩影。你可以在互联网上到处看看这些东西。在创建密钥侦听器时,请查看以下内容: