Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/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
Slick PNGDecoder错误-java.lang.UnsupportedOperationException:此图像的格式不受支持_Java_Image Processing_Png_Lwjgl_Slick - Fatal编程技术网

Slick PNGDecoder错误-java.lang.UnsupportedOperationException:此图像的格式不受支持

Slick PNGDecoder错误-java.lang.UnsupportedOperationException:此图像的格式不受支持,java,image-processing,png,lwjgl,slick,Java,Image Processing,Png,Lwjgl,Slick,我正在用Slick库用Java制作一个简单的小Galaga克隆。不幸的是,我遇到了一个问题,在这个问题中我得到了这个错误,然后游戏结束了: Mon May 12 08:54:32 EDT 2014 WARN:class org.newdawn.slick.opengl.PNGImageData failed to read the data java.lang.UnsupportedOperationException: Unsupported format for this image at

我正在用Slick库用Java制作一个简单的小Galaga克隆。不幸的是,我遇到了一个问题,在这个问题中我得到了这个错误,然后游戏结束了:

Mon May 12 08:54:32 EDT 2014 WARN:class org.newdawn.slick.opengl.PNGImageData failed to
read the data
java.lang.UnsupportedOperationException: Unsupported format for this image
at org.newdawn.slick.opengl.PNGDecoder.decode(PNGDecoder.java:272)
at org.newdawn.slick.opengl.PNGImageData.loadImage(PNGImageData.java:97)
    at org.newdawn.slick.opengl.CompositeImageData.loadImage(CompositeImageData.
    java:62)
    at org.newdawn.slick.opengl.CompositeImageData.loadImage(CompositeImageData.
    java:43)
    at org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.
    java:292)
    at org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.
    java:254)
at org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.
    java:187)
at org.newdawn.slick.Image.<init>(Image.java:192)
at org.newdawn.slick.Image.<init>(Image.java:166)
at org.newdawn.slick.Image.<init>(Image.java:154)
at org.newdawn.slick.Image.<init>(Image.java:132)
at com.othinolis.danmaku.Play.init(Play.java:21)
at com.othinolis.danmaku.Game.initStatesList(Game.java:20)
at org.newdawn.slick.state.StateBasedGame.init(StateBasedGame.java:164)
at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:393)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:317)
at com.othinolis.danmaku.Game.main(Game.java:29)
Mon May 12 08:54:35 EDT 2014 ERROR:null
java.lang.NullPointerException
at com.othinolis.danmaku.Play.render(Play.java:32)
at org.newdawn.slick.state.StateBasedGame.render(StateBasedGame.java:199)
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:688)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
at com.othinolis.danmaku.Game.main(Game.java:29)
Mon May 12 08:54:35 EDT 2014 ERROR:Game.render() failure - check the game code.
org.newdawn.slick.SlickException: Game.render() failure - check the game code.
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:691)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
at com.othinolis.danmaku.Game.main(Game.java:29)
Menu.java状态0,运行时没有问题:

package com.othinolis.danmaku;

import org.lwjgl.input.Mouse;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

public class Menu extends BasicGameState{

   Image playNow;
   Image exitGame;

   public Menu(int state){
   }

   public void init(GameContainer gc, StateBasedGame sbg) throws SlickException{
      playNow = new Image("res/playButton.png");
      exitGame = new Image("res/exitGame.png");
   }

   public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException{
      g.drawString("Danmaku Courage", 230, 50);
      g.drawString("mousex: " + Mouse.getX() + " mousey: " + Mouse.getY(), 300, 400);
      playNow.draw(200,100);
      exitGame.draw(200,200);
   }

   public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException{
      int posX = Mouse.getX();
      int posY = Mouse.getY();
      //play now button
      if((posX>237 && posX<364)&&(posY>425 && posY<460)){
         if(Mouse.isButtonDown(0)){
            sbg.enterState(1);
         }
      }

      //exit game
      if((posX>254 && posX<335)&&(posY>338 && posY<361)){
         if(Mouse.isButtonDown(0)){
            System.exit(0);
         }
      }
   }

   public int getID(){
      return 0;
   }
}
java在菜单和播放之间移动就是问题所在。与屏幕侧面碰撞的数字以及您拥有的可能不准确:

package com.othinolis.danmaku;

import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

public class Play extends BasicGameState{

   Animation player, movingLeft, movingRight; //2 animations, player will be set to one
   Image worldMap;
   boolean quit = false;
   int[] duration = {200,200}; //length of the frame
   float playerPositionX = 0; //player will start at coordinates 0,0
   float playerPositionY = 0;
   float shiftX = buckyPositionX + 320; //this will shift the screen so bucky appears in middle
   float shiftY = buckyPositionY + 160; //half the length and half the width of the screen

   public Play(int state){
   }

   public void init(GameContainer gc, StateBasedGame sbg) throws SlickException{
      worldMap = new Image("res/background.png");
      Image[] walkLeft = {new Image("res/player.png"), new Image("res/player.png")};
      Image[] walkRight = {new Image("res/player.png"), new Image("res/player.png")};

      movingLeft = new Animation(walkLeft, duration, false);
      movingRight = new Animation(walkRight, duration, false);
      player = movingDown; //by default as soon as game loads, player will be facing down
   }

   public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException{
      worldMap.draw(buckyPositionX,buckyPositionY); //draw the map at 0,0 to start
      player.draw(shiftX,shiftY); //draw player at 320, 160 (center of the screen)
      g.drawString("player's X: "+playerPositionX+"\nplayer's Y: "+playerPositionY, 400, 20); //indicator to see where player is

      //when they press escape
      if(quit==true){
         g.drawString("Resume (R)", 250, 100);
         g.drawString("Main Menu (M)", 250, 150);
         g.drawString("Quit Game (Q)", 250, 200);
         if(quit==false){
            g.clear();
         }
      }
   }

   public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException{
      Input input = gc.getInput();
      if(input.isKeyDown(Input.KEY_LEFT)){
         player = movingLeft;
         playerPositionX += delta * .1f;
         if(playerPositionX>324){
            playerPositionX -= delta * .1f;
         }
      }
      if(input.isKeyDown(Input.KEY_RIGHT)){
         player = movingRight;
         playerPositionX -= delta * .1f;
         if(playerPositionX<-840){
            playerPositionX += delta * .1f;
         }
      }

      //escape
      if(input.isKeyDown(Input.KEY_ESCAPE)){
         quit = true;
      }      

      //when they hit escape
      if(quit==true){
         if(input.isKeyDown(Input.KEY_R)){
            quit = false;
         }
         if(input.isKeyDown(Input.KEY_M)){
            sbg.enterState(0);
            try{
               Thread.sleep(250);
            }catch(InterruptedException e){
               e.printStackTrace();
            }
         }
         if(input.isKeyDown(Input.KEY_Q)){
            System.exit(0);
         }
      }
   }

   public int getID(){
      return 1;
   }
}

我对slick的了解来自于我在论坛上读到的几篇关于这类问题的帖子,其中没有一篇有确切的问题或解决方案,当然还有Bucky的slick教程。如果您想下载该项目,以便导入并查看是否可以帮助我,我已将其扔到Dropbox上。

这太多代码了,任何人都无法阅读或调试。但是关于实际问题:AFAIK,光滑的PNG加载程序只支持很少的PNG文件类型,在读取它们时与性能有关,但这可能是一个神话。。。。应该可以在图像中加载以下内容

// "Image" here refers to a Slick Image, and NOT to java.awt.Image!
private static Image loadImage(String path) throws IOException
{
    BufferedImage bufferedImage = ImageIO.read(new File(path));
    Texture texture = BufferedImageUtil.getTexture("", bufferedImage);
    Image image = new Img(texture.getImageWidth(), texture.getImageHeight());
    image.setTexture(texture); 
    return image;
}

我在使用Slick util库加载PNG图像时也遇到了同样的错误。我所做的唯一一件事就是打开PNG文件来绘制Yes,Windows图像编辑器并保存为新的PNG图像。问题可能与PNG图像的类型有关,Paint将其另存为其他类型

我的函数如下所示,摘自:

// "Image" here refers to a Slick Image, and NOT to java.awt.Image!
private static Image loadImage(String path) throws IOException
{
    BufferedImage bufferedImage = ImageIO.read(new File(path));
    Texture texture = BufferedImageUtil.getTexture("", bufferedImage);
    Image image = new Img(texture.getImageWidth(), texture.getImageHeight());
    image.setTexture(texture); 
    return image;
}
public int loadTexture(String fileName) {
Texture texture = null;
try {                
    texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/" + fileName + ".png"));

    GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
                        GL11.GL_LINEAR_MIPMAP_LINEAR);
    GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0f);
} catch (Exception e) {
    e.printStackTrace();
    System.err.println("Tried to load texture " + fileName + ".png , didn't work");
    System.exit(-1);
}
    textures.add(texture.getTextureID());
    return texture.getTextureID();
}