1

現在、に値を追加していHashMap<String, SpriteSheetAnimation>ます。また、入力クラスのLoadFileメソッドのハッシュマップに追加しています。FileLoaderで参照が作成されるGameObjectクラスの一部であるハッシュマップに追加すると。ハッシュマップを変更し、それにキーと値を追加します。すべて問題ありません。

次に、GameObjectオブジェクトをobjectManagerに追加し、ゲームのすべてのオブジェクトを保存します。ただし、ArrayListでオブジェクトを参照すると、SpriteSheetAnimation値と、ファイルローダーに追加したその値のキーが存在しなくなります。それらを追加した後、FileLoader内からそれらにアクセスしようとすると、それらはそこにあります。私は少し混乱しています。ここでスコープの問題が発生している可能性はありますか?

私はあなたが私を助けるかもしれない何かに気づきました..(System.out.println)

これを実行すると、.toStringを使用してフェッチしようとしたときに、コンポーネントが存在しません。

private void LoadControllableEntity(XMLEventReader eventReader, int x, int y)
{
    entities.ControllableEntity entity = new entities.ControllableEntity(x, y);
    entity.addComponent(new components.InputComponent(entity), "input");
    while(eventReader.hasNext())
    {
        try
        {

            XMLEvent event = eventReader.nextEvent();
            if(event.isEndElement())
            {
                if(event.asEndElement().getName().getLocalPart().equals("ControllableEntity"))
                {
                    break;
                }
            } else if(event.isStartElement())
            {
                String element = (String) event.asStartElement().getName().getLocalPart();
                if(element.equals("renderable"))
                {
                    entity.addComponent(new components.Renderable(entity), "renderer");
                }
                else if(element.equals("animationComponent"))
                {

                    entity.addComponent(getAnimationComponent(entity, event.asStartElement().getAttributes(), eventReader), "animation");

                }
            }
        } catch(XMLStreamException e)
        {
            e.printStackTrace();
        }
        System.out.println(entity.getComponent("animation").toString());
        managers.ObjectManager.getInstance().addObject(entity);

    }

}

ただし、このコードを実行すると、コンポーネントを正常にフェッチできます(コンポーネントを取得しようとしている場所を変更したことに注意してください)。

private void LoadControllableEntity(XMLEventReader eventReader, int x, int y)
{
    entities.ControllableEntity entity = new entities.ControllableEntity(x, y);
    entity.addComponent(new components.InputComponent(entity), "input");
    while(eventReader.hasNext())
    {
        try
        {

            XMLEvent event = eventReader.nextEvent();
            if(event.isEndElement())
            {
                if(event.asEndElement().getName().getLocalPart().equals("ControllableEntity"))
                {
                    break;
                }
            } else if(event.isStartElement())
            {
                String element = (String) event.asStartElement().getName().getLocalPart();
                if(element.equals("renderable"))
                {
                    entity.addComponent(new components.Renderable(entity), "renderer");
                }
                else if(element.equals("animationComponent"))
                {

                    entity.addComponent(getAnimationComponent(entity, event.asStartElement().getAttributes(), eventReader), "animation");
                    System.out.println(entity.getComponent("animation").toString());
                }
            }
        } catch(XMLStreamException e)
        {
            e.printStackTrace();
        }

        managers.ObjectManager.getInstance().addObject(entity);

    }

}
4

1 に答える 1

1

最初のコード スニペットの問題は、エンティティを追加する前であっても、ループを通過するたびanimationにエンティティを取得して出力することですが、2 番目のコード スニペットでは、エンティティを追加した直後に取得して出力するだけなので、明らかにその問題はありません。

これを変更したいと思います:

        System.out.println(entity.getComponent("animation").toString());
        managers.ObjectManager.getInstance().addObject(entity);

    }

これに:

    }

    System.out.println(entity.getComponent("animation").toString());
    managers.ObjectManager.getInstance().addObject(entity);

whileつまり、各反復の最後に実行するのではなく、ループが完了した後に最後のいくつかのステップを実行する必要があると思います。

于 2012-11-25T04:57:15.133 に答える