0

Slick2dを使用して初めてのゲームを作成していますが、アニメーションを使用しようとすると問題が発生しました。

私がやろうとしているのは、メインのEntityクラスと、移動およびレンダリングコンポーネントを用意することです。プレーヤーが矢印キーを押すと、その方向の歩行アニメーションの再生が開始され、押されていない場合はアニメーションが停止します。

コンポーネントを最初にテストしたとき、さまざまな方向に1つの画像だけを使用しましたが、正常に機能しました。それは私をもっと混乱させるだけです。ゲーム画面が表示され、矢印キーを押さない限り表示されます。そうすると、適切な(方向方向の)スプライトアニメーションが開始され、位置が正しく変更されますが、最後のフレームに達すると、ゲームウィンドウが閉じて、エラーが発生します。これは、コンソールで私に伝えていることです。

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)

レンダリングに問題があるように思われるので、スプライトが使用されているすべての場所で、アニメーションではなくイメージとして処理されていないことを確認しました。また、renderに正しいパラメーターがあり、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);
}

私の問題が何であるかについて漠然としていて申し訳ありませんが、私は本当に自分でそれを理解しようとしたことを誓います。十分な情報を提供しなかった場合は、教えてください。さらに提供します。お時間をいただきありがとうございます!さらに詳細なチュートリアルがある場合は、本当に感謝しています。

4

1 に答える 1

0

イメージ変数を使用するrender()メソッドが呼び出される前に、RenderComponentクラスでイメージが初期化されることを確信していますか?

つまり、render() メソッドが呼び出される前に、 RenderComponent で update() メソッドが少なくとも 1 回呼び出されると確信していますか?

于 2012-12-21T09:03:40.447 に答える