作为一个不那么经验丰富的程序员,像你一样精彩的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)
我希望我能尽快得到一些帮助,不胜感激:) 多谢你们, - 第一个计时器
答案 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)
这一切都是缺少需要宣布的某些事情,它现在正在工作,看起来很漂亮!