Slick2D 无法加载图像,尽管图像存在

不知为何,我的游戏在关卡开始时不会卡死,而菜单加载得非常顺畅!然而,当Boss音乐开始时,游戏就会卡死。编辑:抱歉,我发现屏幕卡死是因为canMove变量被卡在了false状态。但是,游戏仍然会随机崩溃,并提示找不到图像。

这是我的代码:

这是菜单(运行正常):

//Sprite sheetingprivate SpriteSheet sleepSpriteSheet;private Animation sleepAnimation;private SpriteSheet walkSpriteSheet;private Animation walkAnimation;//System infoprivate String operatingSystem = Client.getOS();//Game texuringprivate static String IntroBackground = "res/images/level/IntroBackground.png";private static String KnightQuestLogo = "res/images/icons/KnightQuestLogo.png";//Menu Infoprivate static boolean readyForIntro = false;private static boolean readyForPlay = false;private static boolean showArrow = false;private static String playButton = Button.PlayButton;private static boolean playerSleeping = true;private static boolean knightWalking = false;private static float knightX = 145;private static float knightY = 456;private static float knightQuestLogoX = -750;private static float knightQuestLogoY = 75;private static boolean soundStarted = false;public GameMenu(int State) {}// Render the game@Overridepublic void render(GameContainer GameContainer, StateBasedGame SBG,        Graphics G) throws SlickException {    //Draw Background Image    G.drawImage(new Image(IntroBackground), 0, 0);    //Choose what animation to use    if(playerSleeping) {        sleepAnimation.draw(145, 406, 250, 250);    }    else {        walkAnimation.draw(knightX, knightY, 175, 200);    }    //Draw Floor    G.drawImage(new Image(Block.GroundTile), 0, 656);    //Draw The Logo    G.drawImage(new Image(KnightQuestLogo), knightQuestLogoX, knightQuestLogoY);    //Draw the Play Button    if(readyForPlay) {        G.drawImage(new Image(playButton), 750, 315);        if(showArrow) {            G.drawImage(new Image(Icon.Arrow), 730, 335);        }    }    //System Info    G.drawString("Game State: " + this.getID(), 10, 30);    G.drawString("X:" + Mouse.getX() + " Y:" + Mouse.getY(), 10, 50);    G.drawString("Your OS: " + operatingSystem, 10, 70);}// Update the game@Overridepublic void update(GameContainer GameContainer, StateBasedGame SBG,        int Delta) throws SlickException {    //Start Sound (Would be started in init(), But the StopSound function will not work if done so.    if(!soundStarted) {        PlaySound.playSound("res/sounds/startup/MainMenu.wav");        soundStarted = true;    }    //When ready, slide the logo to the right    if (readyForIntro) {        if (knightQuestLogoX < 750.0) {            knightQuestLogoX += Delta * .5f;        }    }    //When ready, allow the player the press the play button    if(readyForPlay) {        if(Mouse.getX() > 755 && Mouse.getX() < 875 && Mouse.getY() > 345 && Mouse.getY() < 400) {            showArrow = true;            if(Mouse.isButtonDown(0)) {                playerSleeping = false;                knightWalking = true;            }        }        else {            showArrow = false;        }    }    //If the knight is walking in the intro, slide him off the screen    if(knightWalking) {        if(knightX < 1290) {            knightX += Delta* .5f;        }        else {            SBG.enterState(1, new FadeOutTransition(new Color(Color.black)), new FadeInTransition(new Color(Color.black)));            PlaySound.stopSound();            PlaySound.playSound("res/sounds/events/LeaveState.wav");        }    }}// Initialize the GameState@Overridepublic void init(GameContainer GameContainer, StateBasedGame SBG)        throws SlickException {    //Start the thread for the Intro    new Thread(new MenuIntro()).start();    //Create the Sprite sheets    sleepSpriteSheet = new SpriteSheet("res/images/characters/knight/spritesheets/SleepAnimation.png", 52, 50);    sleepAnimation = new Animation(sleepSpriteSheet, 250);    walkSpriteSheet = new SpriteSheet("res/images/characters/knight/spritesheets/WalkAnimation.png", 35, 48);    walkAnimation = new Animation(walkSpriteSheet, 75);}// Get the ID of the GameState@Overridepublic int getID() {    return 0;}// MenuIntro threadstatic class MenuIntro implements Runnable {    @Override    public void run() {        try {            Thread.sleep(3000);            readyForIntro = true;            Thread.sleep(4000);            readyForPlay = true;        } catch (Exception e) {            e.printStackTrace();        }    }}

这是游戏关卡(出现问题):

//Colors RGBprivate static String Grey = "rgb/Grey.png";private static String Blue = "rgb/Blue.png";private static String Red = "rgb/Red.png";// Level Variablesprivate static boolean stateStarted = false;private static boolean startBossBattle = false;private static boolean startedBossBattle = false;private static boolean startedBossMusic = false;private static boolean BothTouching = false;// Player Variables/* Coordinates, And Direction */private static float PlayerX = 25;private static float PlayerY = 470;private static String Knight = "res/images/characters/knight/Knight.png";private static String PlayerDirection = "right";private static int PlayerHealth = 100;private static boolean PlayerWalking = false;private static boolean PlayerJumping = false;private static boolean PlayerJumped = false;private static float AmountPlayerJumped;private static boolean PlayerAttacking = false;private static boolean PlayerCanAttack = true;private static int PlayerRegenTime = 100;/* Sprite Sheets */private static String PlayerLeftSword = "res/images/icons/sword/SwordLeft.png";private static String PlayerLeftAttackSword = "res/images/icons/sword/SwordLeftAttacking.png";private static String PlayerRightSword = "res/images/icons/sword/SwordRight.png";private static String PlayerRightAttackSword = "res/images/icons/sword/SwordRightAttacking.png";private static String PlayerCurrentSword = PlayerRightSword;private static String RightKnight = "res/images/characters/knight/ResizedKnightRight.png";private static String LeftKnight = "res/images/characters/knight/ResizedKnightLeft.png";/* Everything Else */private static boolean PlayerCanMove = false;// AI Variables/* Coordiantes and Direction */private static float EnemyX = 1000;private static float EnemyY = 470;private static String EnemyKnight = "res/images/characters/knight/Knight.png";private static String EnemyDirection = "right";private static int EnemyHealth = 100;private static boolean EnemyWalking = false;private static boolean DecidedJump = false;private static int JumpPossibility = 1;private static boolean EnemyJumping = false;private static boolean EnemyJumped = false;private static float AmountEnemyJumped;private static boolean EnemyAttacking = false;private static boolean EnemyCanAttack = true;private static int EnemyRegenTime = 100;/* Sprite Sheets */private static String EnemyLeftSword = "res/images/icons/sword/SwordLeft.png";private static String EnemyLeftAttackSword = "res/images/icons/sword/SwordLeftAttacking.png";private static String EnemyRightSword = "res/images/icons/sword/SwordRight.png";private static String EnemyRightAttackSword = "/res/images/icons/sword/SwordRightAttacking.png";private static String EnemyCurrentSword = EnemyRightSword;private static String RightEnemy = "res/images/characters/knight/ResizedKnightRight.png";private static String LeftEnemy = "res/images/characters/knight/ResizedKnightLeft.png";/* Everything Else */private static boolean EnemyTalking = false;private static String EnemyMessage = "";private static boolean EnemyCanMove = false;// Mixed Variables/* Sprite Sheets */private static SpriteSheet WalkRightSpriteSheet;private static Animation WalkRightAnimation;private static SpriteSheet WalkLeftSprite;private static Animation WalkLeftAnimation;private static int SpriteSheetWidth = 135;private static int SpriteSheetHeight = 188;// System Variablesprivate String operatingSystem = Client.getOS();// Constructorpublic FinalBattle(int State) {}@Overridepublic void render(GameContainer GameContainer, StateBasedGame SBG,        Graphics G) throws SlickException {    //GameContainer Things    GameContainer.setShowFPS(false);    //Level    /* Draw Background */    G.drawImage(new Image("res/images/level/FinalBattle.png"), 0, 0);    /* Draw Floor */    G.drawImage(new Image(Block.GroundTile), 0, 656);    //Player    /* Draw Player */    if(PlayerWalking) {        if(PlayerDirection.equalsIgnoreCase("right")) {            if(!PlayerJumping) {                WalkRightAnimation.draw(PlayerX, PlayerY, SpriteSheetWidth, SpriteSheetHeight);            }            else {                G.drawImage(new Image(RightKnight), PlayerX, PlayerY);            }            G.drawImage(new Image(PlayerCurrentSword), PlayerX + 60, PlayerY + 90);        }        if(PlayerDirection.equalsIgnoreCase("left")) {            if(!PlayerJumping) {                WalkLeftAnimation.draw(PlayerX, PlayerY, SpriteSheetWidth, SpriteSheetHeight);            }            else {                G.drawImage(new Image(LeftKnight), PlayerX, PlayerY);            }            G.drawImage(new Image(PlayerCurrentSword), PlayerX + 6, PlayerY + 90);        }    }    /* Draw his/her sword */    else {        if(PlayerDirection.equalsIgnoreCase("right")) {            G.drawImage(new Image(RightKnight), PlayerX, PlayerY);            G.drawImage(new Image(PlayerCurrentSword), PlayerX + 60, PlayerY + 90);        }        if(PlayerDirection.equalsIgnoreCase("left")) {            G.drawImage(new Image(LeftKnight), PlayerX, PlayerY);            G.drawImage(new Image(PlayerCurrentSword), PlayerX + 6, PlayerY + 90);        }    }    /* Draw his/her power level */    G.setColor(new Color(Color.blue.darker()));    G.drawString("Knight Power Level", 10, 20);    G.setColor(new Color(Color.white));    G.drawImage(new Image(Grey).getScaledCopy(100, 10), 10, 40);    G.drawImage(new Image(Blue).getScaledCopy(PlayerRegenTime, 10), 10, 40);    /* Draw his/her health level */    G.setColor(new Color(Color.red.darker()));    G.drawString("Knight Health", 10, 60);    G.setColor(new Color(Color.white));    G.drawImage(new Image(Grey).getScaledCopy(100, 10), 10, 80);    G.drawImage(new Image(Red).getScaledCopy(PlayerHealth, 10), 10, 80);    /* Draw his/her name */    G.setColor(new Color(Color.red.darker()));    G.drawString("You\n |\n\\ /", PlayerX + 50, PlayerY - 70);    G.setColor(new Color(Color.white));    //Enemy     if(EnemyWalking) {        if(EnemyDirection.equalsIgnoreCase("right")) {            if(!EnemyJumping) {                WalkRightAnimation.draw(EnemyX, EnemyY, SpriteSheetWidth, SpriteSheetHeight);            }            else {                G.drawImage(new Image(RightKnight), EnemyX, EnemyY);            }            G.drawImage(new Image(EnemyCurrentSword), EnemyX + 60, EnemyY + 90);        }        if(EnemyDirection.equalsIgnoreCase("left")) {            if(!EnemyJumping) {                WalkLeftAnimation.draw(EnemyX, EnemyY, SpriteSheetWidth, SpriteSheetHeight);            }            else {                G.drawImage(new Image(LeftKnight), EnemyX, EnemyY);            }            G.drawImage(new Image(EnemyCurrentSword), EnemyX + 6, EnemyY + 90);        }    }    /* Draw enemy sword */    else {        if(EnemyDirection.equalsIgnoreCase("right")) {            if(!EnemyAttacking) {                EnemyCurrentSword = EnemyRightSword;            }            G.drawImage(new Image(RightKnight), EnemyX, EnemyY);            G.drawImage(new Image(EnemyCurrentSword), EnemyX + 60, EnemyY + 90);        }        if(EnemyDirection.equalsIgnoreCase("left")) {            if(!EnemyAttacking) {                EnemyCurrentSword = EnemyLeftSword;            }            G.drawImage(new Image(LeftKnight), EnemyX, EnemyY);            G.drawImage(new Image(EnemyCurrentSword), EnemyX + 6, EnemyY + 90);        }    }    /* Draw enemy power level */    G.setColor(new Color(Color.blue.darker()));    G.drawString("Enemy Power Level", 1115, 20);    G.setColor(new Color(Color.white));    G.drawImage(new Image(Grey).getScaledCopy(100, 10), 1165, 40);    G.drawImage(new Image(Blue).getScaledCopy(EnemyRegenTime, 10), 1165, 40);    /* Draw enemy health level */    G.setColor(new Color(Color.red.darker()));    G.drawString("Enemy Health", 1115, 60);    G.setColor(new Color(Color.white));    G.drawImage(new Image(Grey).getScaledCopy(100, 10), 1165, 80);    G.drawImage(new Image(Red).getScaledCopy(EnemyHealth, 10), 1165, 80);    // System Info (Not used currently)    /*G.drawString("Game State: " + this.getID(), 10, 30);    G.drawString("X:" + Mouse.getX() + " Y:" + Mouse.getY(), 10, 50);    G.drawString("Your OS: " + operatingSystem, 10, 70);    G.drawString("Player X: " + PlayerY + " Enemy X:" + EnemyX, 10, 170);*/}@Overridepublic void update(GameContainer GameContainer, StateBasedGame SBG,        int Delta) throws SlickException {    // Fixes for some stuff that might happen    if(PlayerY > 470) {        PlayerY = 470;    }    if(EnemyY > 470) {        EnemyY = 470;    }    // Enemy    if(!EnemyTalking) {        new Thread(new startFight()).start();        EnemyTalking = true;    }    /* Boss Battle Music */    if(startBossBattle && !startedBossBattle) {        if(!startedBossMusic) {            PlaySound.playSound("res/sounds/events/BossBattleLoop.wav");            PlaySound.startLoop(1000);            startedBossMusic = true;        }        startedBossBattle = true;    }    // Player    /* Player Movement */    if(PlayerCanMove) {        Input playerInput = GameContainer.getInput();        if(playerInput.isKeyDown(Input.KEY_A)) {            PlayerX -= Delta*.3f;            PlayerWalking = true;            PlayerDirection = "left";            if(!PlayerAttacking) {                PlayerCurrentSword = PlayerLeftSword;            }        }        else if(playerInput.isKeyDown(Input.KEY_D)) {            PlayerX += Delta*.3f;            PlayerWalking = true;            PlayerDirection = "right";            if(!PlayerAttacking) {                PlayerCurrentSword = PlayerRightSword;            }        }        else {            PlayerWalking = false;        }        /* Player Jumping */        if(playerInput.isKeyPressed(Input.KEY_SPACE)) {            if(!PlayerJumped) {                new Thread(new playerJump()).start();            }        }        if(PlayerJumping) {            PlayerY -= Delta*.5f;            AmountPlayerJumped = PlayerY;        }        else {            if(PlayerY < 470) {                PlayerY += Delta*.5f;            }            if(Math.round(PlayerY) == 470 || Math.round(PlayerY) == 471) {                PlayerJumped = false;            }        }        /* Player Attack */        if(playerInput.isKeyPressed(Input.KEY_ENTER)) {            if(PlayerCanAttack) {                new Thread(new playerAttack()).start();            }            else {            }        }    }    /* Player Collision Detection */    if(PlayerX < 0) {        PlayerX = 0;    }    if (PlayerX > 1155) {        PlayerX = 1155;    }    //Enemy    /* Enemy Movement and Jumping */    if(EnemyCanMove) {            if(PlayerX < EnemyX) {                if(PlayerDirection.equalsIgnoreCase("right")) {                    if(!(EnemyX - 125 < PlayerX)) {                        EnemyX -= Delta*.2f;                        EnemyDirection = "right";                        EnemyWalking = true;                        BothTouching = false;                        if(!(EnemyX - 50 < PlayerX)) {                            if(!DecidedJump) {                                int Jump = GenerateNumber.generateNumber(JumpPossibility);                                if(Jump == JumpPossibility) {                                    new Thread(new enemyJump()).start();                                }                                DecidedJump = true;                            }                        }                        else {                            DecidedJump = false;                        }                    }                    else {                        EnemyWalking = false;                        BothTouching = true;                        if(EnemyRegenTime == 100) {                            if(EnemyCanAttack) {                                new Thread(new enemyAttack()).start();                            }                        }                    }                }                if(PlayerDirection.equalsIgnoreCase("left")) {                    if(!(EnemyX - 110 < PlayerX)) {                        EnemyX -= Delta*.2f;                        EnemyDirection = "left";                        EnemyWalking = true;                        BothTouching = false;                        if(!(EnemyX + 50 < PlayerX)) {                            if(!DecidedJump) {                                int Jump = GenerateNumber.generateNumber(JumpPossibility);                                if(Jump == JumpPossibility) {                                    new Thread(new enemyJump()).start();                                }                                DecidedJump = true;                            }                        }                        else {                            DecidedJump = false;                        }                    }                    else {                        EnemyWalking = false;                        BothTouching = true;                        if(EnemyRegenTime == 100) {                            if(EnemyRegenTime == 100) {                                if(EnemyCanAttack) {                                    new Thread(new enemyAttack()).start();                                }                            }                        }                    }                }                EnemyDirection = "left";            }            if(PlayerX > EnemyX) {                if(PlayerDirection.equalsIgnoreCase("right")) {                    if(!(EnemyX + 119 > PlayerX)) {                        EnemyX += Delta*.2f;                        EnemyDirection = "right";                        EnemyWalking = true;                        BothTouching = false;                        if(!(EnemyX - 50 < PlayerX)) {                            if(!DecidedJump) {                                int Jump = GenerateNumber.generateNumber(JumpPossibility);                                if(Jump == JumpPossibility) {                                    new Thread(new enemyJump()).start();                                }                                DecidedJump = true;                            }                        }                        else {                            DecidedJump = false;                        }                    }                    else {                        EnemyWalking = false;                        BothTouching = true;                        if(EnemyRegenTime == 100) {                            if(EnemyRegenTime == 100) {                                if(EnemyCanAttack) {                                    new Thread(new enemyAttack()).start();                                }                            }                        }                    }                }                if(PlayerDirection.equalsIgnoreCase("left")) {                    if(!(EnemyX + 135 > PlayerX)) {                        EnemyX += Delta*.2f;                        EnemyDirection = "left";                        EnemyWalking = true;                        BothTouching = false;                        if(!(EnemyX + 50 < PlayerX)) {                            if(!DecidedJump) {                                int Jump = GenerateNumber.generateNumber(JumpPossibility);                                if(Jump == JumpPossibility) {                                    new Thread(new enemyJump()).start();                                }                                DecidedJump = true;                            }                        }                        else {                            DecidedJump = false;                        }                    }                    else {                        EnemyWalking = false;                        BothTouching = true;                        if(EnemyRegenTime == 100) {                            if(EnemyRegenTime == 100) {                                if(EnemyCanAttack) {                                    new Thread(new enemyAttack()).start();                                }                            }                        }                    }                }                EnemyDirection = "right";            }            /* Enemy Jumping */            if(EnemyJumping) {                EnemyY -= Delta*.5f;                AmountEnemyJumped = EnemyY;            }            else {                if(EnemyY < 470) {                    EnemyY += Delta*.5f;                }                if(Math.round(EnemyY) == 470 || Math.round(EnemyY) == 471) {                    EnemyJumped = false;                }            }    }}

回答:

原来,我没有将它添加到构建路径中。如果你也遇到了这个问题,请确保在Eclipse(或NetBeans)中将其添加到构建路径中。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注