我目前正在为HashMap<String, SpriteSheetAnimation>
添加值。我也在我的输入类的LoadFile方法中添加了hashmap。当我添加到hashmap时,它是GameObject类的一部分,它在FileLoader中创建了一个引用。我改变了hashmap,为它添加了键和值,一切都很好。
然后我继续将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);
}
}
答案 0 :(得分:1)
第一个代码段的问题是,您在每次传递循环时检索并打印animation
实体 - 甚至在添加该实体之前 - 而在您的第二个代码中-snippet你只需在添加实体后立即检索并打印它,所以很明显它没有那个问题。
我想你想改变这个:
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
- 循环完成后执行最后几步,而不是在每次迭代结束时执行。