【发布时间】:2014-06-29 21:21:52
【问题描述】:
我正在使用 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)
这发生在我尝试将状态从主菜单移动到游戏中,第一次加载 PNG 时。我所有的资源都是PNG。这是我的其他类文件:
Game.java:
package com.othinolis.danmaku;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;
public class Game extends StateBasedGame{
public static final String gamename = "Danmaku Courage";
public static final int menu = 0;
public static final int play = 1;
public Game(String gamename){
super(gamename);
this.addState(new Menu(menu));
this.addState(new Play(play));
}
public void initStatesList(GameContainer gc) throws SlickException{
this.getState(menu).init(gc, this);
this.getState(play).init(gc, this);
this.enterState(menu);
}
public static void main(String[] args) {
AppGameContainer appgc;
try{
appgc = new AppGameContainer(new Game(gamename));
appgc.setDisplayMode(600, 600, false);
appgc.start();
}catch(SlickException e){
e.printStackTrace();
}
}
}
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;
}
}
和 Play.java(在 Menu 和 Play 之间移动是问题所在。与屏幕侧面发生碰撞的数字以及您所遇到的可能不准确。):
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 教程 here。如果您想下载该项目以便将其导入并查看是否可以帮助我,我已将其发送到 Dropbox here。
【问题讨论】:
标签: java image-processing png lwjgl slick