Slick2d Animation не работает - PullRequest
       30

Slick2d Animation не работает

0 голосов
/ 22 марта 2012

Я делаю свою первую игру с использованием Slick2d, но у меня возникли проблемы при попытке использовать анимацию.

То, что я пытаюсь сделать, это иметь основной класс Entity, компоненты движения и рендеринга. То, что я хочу, - это когда игрок нажимает на клавишу со стрелкой, начинает воспроизводиться анимация ходьбы для этого направления, а когда они не нажимаются, анимация останавливается.

Когда я впервые протестировал компоненты, я использовал только одно изображение для разных направлений, и оно работало нормально. Что только делает меня более запутанным. Экран игры появляется, и пока я не нажимаю ни одну из клавиш со стрелками. Когда я это делаю, начинается надлежащая (по направлению) анимация спрайта, и позиция меняется правильно, но когда она достигает последнего кадра, окно игры закрывается, и я получаю ошибку. Вот что говорит мне на консоли:

Wed Mar 21 13:20:47 PDT 2012 INFO:Slick Build #274
Wed Mar 21 13:20:47 PDT 2012 INFO:LWJGL Version: 2.0b1
Wed Mar 21 13:20:47 PDT 2012 INFO:OriginalDisplayMode: 1366 x 768 x 32 @60Hz
Wed Mar 21 13:20:47 PDT 2012 INFO:TargetDisplayMode: 750 x 600 x 0 @0Hz
Wed Mar 21 13:20:48 PDT 2012 INFO:Starting display 750x600
Wed Mar 21 13:20:48 PDT 2012 INFO:Use Java PNG Loader = true
Wed Mar 21 13:20:49 PDT 2012 INFO:Controllers not available
Wed Mar 21 13:20:52 PDT 2012 ERROR:null
java.lang.NullPointerException
at bunny.component.render.RenderComponent.render(RenderComponent.java:22)
at bunny.entity.Entity.render(Entity.java:177)
at bunny.game.BunnyGame.render(BunnyGame.java:56)
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:681)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:408)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:318)
at bunny.game.BunnyGame.main(BunnyGame.java:66)
Wed Mar 21 13:20:52 PDT 2012 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:684)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:408)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:318)
at bunny.game.BunnyGame.main(BunnyGame.java:66)

Поскольку кажется, что у него возникают проблемы при рендеринге, я проверил, чтобы везде, где используется спрайт, он не пытался обрабатывать его как изображение вместо анимации. Я также удостоверился, что рендер имеет правильные параметры, вызывает draw, и когда это все еще не работало, я попытался сделать так, чтобы он рендерил только текущий кадр, так как я знал, что рендер работает на Image. Ничто из этого не заставило мою проблему уйти.

Я давно искал в Интернете, и теперь я уверен, что проблема, возможно, в моем компоненте движения или в моем рендеринге. Дело в том, что единственный учебник, который я нашел, в некоторой степени посвященный этому, это http://slick.cokeandcode.com/wiki/doku.php?id=entity_tutorial

Это мой класс компонентов рендеринга:

public class RenderComponent extends Component {    
Image image;

public RenderComponent(String id)
{
    this.id = id;
}

public void render(GameContainer gc, StateBasedGame sb, Graphics gr) 
{
    Vector2f pos = owner.getPosition();
    image.draw(pos.x, pos.y);
}

@Override
public void update(GameContainer gc, StateBasedGame sb, int delta) {
    image = owner.getDirection().getCurrentFrame();
}
}

Это мой класс Движений со Стрелками:

public class ArrowKeyMovement extends Component{

float direction;
float speed;

public ArrowKeyMovement( String id )
{
    this.id = id;
}

public float getSpeed()
{
    return speed;
}

@Override
public void update(GameContainer gc, StateBasedGame sb, int delta)
{
    // 0 - up, 1 - down, 2 - left, 3 - right
    Input input = gc.getInput();
    Vector2f position = owner.getPosition();

    if (input.isKeyDown(Input.KEY_UP))
    {
        owner.setSprite(0);
        if (owner.getDirection().isStopped()) {
            owner.getDirection().restart();
        }
        owner.getDirection().update(delta);
        position.y -= delta * 0.2f;
    }
    else if (input.isKeyDown(Input.KEY_DOWN))
    {
        owner.setSprite(1);
        if (owner.getDirection().isStopped()) {
            owner.getDirection().restart();
        }
        owner.getDirection().update(delta);
        position.y += delta * 0.2f;
    }
    else if (input.isKeyDown(Input.KEY_LEFT))
    {
        owner.setSprite(2);
        if (owner.getDirection().isStopped()) {
            owner.getDirection().restart();
        }
        owner.getDirection().update(delta);
        position.x -= delta * 0.2f;
    }
    else if (input.isKeyDown(Input.KEY_RIGHT))
    {
        owner.setSprite(3);
        if (owner.getDirection().isStopped()) {
            owner.getDirection().restart();
        }
        owner.getDirection().update(delta);
        position.x += delta * 0.2f;
    }
    else 
    {
        if (!(owner.getDirection().isStopped())){
            owner.getDirection().stop();
        }
    }

    owner.setPosition(position);
}
}

Внутри моего класса Entity я называю RenderComponent следующим образом:

public void render(GameContainer gc, StateBasedGame sb, Graphics gr)
{
    if(renderComponent != null)
        renderComponent.render(gc, sb, gr);
}

Извините, я не совсем понимаю, в чем заключается моя проблема, но клянусь, я действительно пытался разобраться сам. Если я не дал достаточно информации, скажите мне, и я предоставлю больше. Спасибо за ваше время! И если у вас есть более подробный учебник, я действительно ценю его.

1 Ответ

0 голосов
/ 21 декабря 2012

вы уверены, что изображение инициализируется в вашем классе RenderComponent до вызова метода render (), который использует переменную image?

Другими словами, вы уверены, что метод update () вызывается хотя бы один раз в RenderComponent до вызывается метод render ()?

...