使用图像序列和数组绘制动画?

时间:2014-11-09 03:24:21

标签: java lwjgl slick2d

作为一个不那么经验丰富的程序员,像你一样精彩的Stack超级英雄,我正在把我的头发从我认为可能非常简单的东西中拉出来。

我的目标是为我正在制作的游戏的标题画面设置动画背景。 (使用Slick2D) 就像 Minecraft 在标题画面上有动画背景一样。 在寻找答案后,我一直试图使用这个方法,有人在论坛上建议。 但是我似乎无法掌握它。

以下是代码:

package com.polython.game;

import org.lwjgl.input.Mouse;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

public class Menu extends BasicGameState{
    Image[] bg;
    Image logo;

    public Menu(int State){}

    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException{
        //Bit of code that generates a .png sequence. 
        //A.K.A. The magic of the Main Menu.

        final int bgFrames = 251;

        Image[] bg = new Image[bgFrames];
        String fileLocation = new String();
        for (int i = 1; i < bgFrames; i++){ 
            fileLocation = "res/img/bg/" + i + ".png";
            bg[i] = new Image(fileLocation); 
        }       
    }

    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException {
        logo.draw(145, 25, .5f); //Centering the logo
        g.drawRect(100, 100, 200, 50); 
        g.drawString("Play", 180, 115);
    }

    public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {
        int posX = Mouse.getX();
        int posY = Mouse.getY();

        //Not sure why this is here so early. 
        if((posX > 100 && posX<311) && (posY > 209 && posY < 260)){
            if(Mouse.isButtonDown(0)){
                sbg.enterState(1);
            }
        }
    }
    public int getID(){
        return 0;
    }
}

图片全部位于“/ res / img / bg”中,从1.png到250.png

我得到的错误通常是这样的:

  

Sat Nov 08 21:08:35 CST 2014 INFO:Slick Build#237 Sat Nov 08 21:08:35   CST 2014 INFO:LWJGL版本:2.9.0星期六08月11日21:08:35 CST 2014   信息:OriginalDisplayMode:768 x 1360 x 32 @ 60Hz Sat Nov 08 21:08:35   CST 2014 INFO:TargetDisplayMode:640 x 360 x 0 @ 0Hz Sat Nov 08   21:08:35 CST 2014 INFO:开始显示640x360 Sat Nov 08 21:08:35   CST 2014 INFO:使用Java PNG Loader = true Sat Nov 08 21:08:35 CST 2014   信息:控制器不可用[Lorg.newdawn.slick.Image; @ 26d0fffc   [Lorg.newdawn.slick.Image; @ 46446e0c Sat Nov 08 21:08:37 CST 2014   错误:null java.lang.NullPointerException at   com.polython.game.Menu.render(Menu.java:35)at   org.newdawn.slick.state.StateBasedGame.render(StateBasedGame.java:199)     在   org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:688)     在   org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)     在   org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)     在com.polython.game.Game.main(Game.java:29)星期六08月11日21:08:37 CST   2014年错误:Game.render()失败 - 检查游戏代码。   org.newdawn.slick.SlickException:Game.render()失败 - 检查   游戏代码。在   org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:691)     在   org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)     在   org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)     在com.polython.game.Game.main(Game.java:29)

我希望我能尽快得到一些帮助,不胜感激:) 多谢你们, - 第一个计时器

2 个答案:

答案 0 :(得分:0)

首先,我建议你改用ArrayList。此外,看起来错误来自g.drawString()。如何尝试删除该行并查看是否有效,如果确实如此,那么原因是因为X和Y正在使字符串绘制在JFrame之外。这是一个愚蠢的事情,但我总是从那些错误。这是主要问题,因为您甚至没有绘制bg[]图像。您还要在Image[] bg方法中创建另一个init()变量。这不是必要的。首先在方法之外创建private个变量。

private static List<BufferedImage> bg = new ArrayList<BufferedImage>();
private static Integer time = 0;

ArrayList更好。然后在init()方法内部,将其添加到将列表添加到列表的位置。

public void init() {
    Integer max = 250;
    for (int i = 0; i < max; i++) {
        try {
            bg.add(ImageIO.read(new File("res/img/bg/" + i + ".png")));
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然后在render()方法内执行此操作

public void render(Graphics g) {
    Graphics2D g2;
    if (g instanceof Graphics2D) {
        g2 = (Graphics2D) g;
    }
    // The stuff you already had
    g.drawImage(g.get(time), X, Y, null);
}

然后在update()方法内部,将时间加起来。

public void update() {
    if (time < bg.size()) {
        time++;
    }
    else {
        time = 0;
    }
}

那么这应该创建动画。现在,如果您没有设置FPS系统,那么在您调用update()render()方法的主类文件中,键入

之后
try {
    Thread.sleep(1000/FPS);
catch (Exception e) {}

你应该把FPS设为60.那么这应该有效。如果有问题,抱歉因为我只是在没有Eclipse的情况下键入代码。我只是从记忆中做到这一点,因为我总是编写这些类型的程序/游戏。

答案 1 :(得分:0)

这一切都是缺少需要宣布的某些事情,它现在正在工作,看起来很漂亮!