-1

[编辑 4]Nvm 我忘了添加:

childInt_id[i] = Integer.parseInt(childString_id[i]);

[编辑 3]所以现在我希望能够让父实体有多个子实体

 <entity x="640" y="224" type="gamebutton1" id="1" child_id="2, 3"/>

我现在将 child_id 解析为字符串,通过 .split(",") 将其转换为字符串数组,并将字符串数组转换为 int 数组

final String child_id = SAXUtils.getAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_CHILD_ID);
String[] childString_id = child_id.split(",");
int[] childInt_id = new int[childString_id.length];

我已将 levelObjectUserData 中的 ChildID 声明为数组

public int[] ChildID = {-1};

我正在循环遍历 ButtonSpriteChild 数组以查看它是否与 ButtonSpriteID 匹配

for (int k = 0; k < ButtonSpriteChild.length; k++){
if (ButtonSpriteChild[k] == ButtonSpriteID){ ... } }

运行游戏时我没有收到任何错误,但现在实体之间没有画线。我想问我是否遗漏了什么?顺便说一句,这就是我画线的方式:

float parentX = levelObjects.get(i).getX();
float parentY = levelObjects.get(i).getY();
float childX = levelObjects.get(j).getX();
float childY = levelObjects.get(j).getY();
Line line = new Line(parentX, parentY, childX, childY, 10,vbom);
line.setColor(Color.GREEN);
attachChild(line);

[编辑 2]:非常感谢史蒂夫的帮助!还有一件事可以在你的答案的最后一点上扩展一点 - “现在在你解析 XML 之后......”,我无法理解你的例子“((levelObjectUserData)(levelObjects.get(i).getUserData ())).ChildID”,当我尝试使用它时出现以下错误:“语法错误,插入“AssignmentOperator 表达式”以完成表达式”。再次感谢您的帮助

[编辑]:我已经弄清楚了我的问题的第一部分,xml 文件中的一些实体缺少 id 和 child_ids,并添加这些修复了错误。

所以我的问题变成了,我如何使用“id”和“child_id”在两个实体之间画一条线。因此,一旦匹配了两个级别对象,我需要获取父实体的 x 和 y 值以及子实体的 x 和 y 值,以便可以在它们之间绘制一条线,即

<entity x="640" y="224" type="gamebutton1" id="1" child_id="2"/> 
<entity x="512" y="224" type="gamebutton2" id="2"/>
Line line = new Line(parentX, parentY, childX, childY, 5, vbom);

所以这就是我解析 levelObjects 的方式

levelLoader.registerEntityLoader(new EntityLoader<SimpleLevelEntityLoaderData>(TAG_ENTITY) {

        @Override
        public IEntity onLoadEntity(String pEntityName, IEntity pParent, Attributes pAttributes, SimpleLevelEntityLoaderData pEntityLoaderData) throws IOException {
            final int x = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_X);
            final int y = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_Y);
            final String type = SAXUtils.getAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_TYPE);
            final int id = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_ID);
            final int child_id = SAXUtils.getIntAttributeOrThrow(pAttributes, TAG_ENTITY_ATTRIBUTE_CHILD_ID);

            final ButtonSprite levelObject;

            if (type.equals(TAG_ENTITY_ATTRIBUTE_VALUE_GAMEBUTTON1)) {
                levelObject = new ButtonSprite(x, y, resourcesManager.gamebutton1_region, vbom, new OnClickListener() {

                    @Override
                    public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) {                           

                    }
                });
            }

            else if (type.equals(TAG_ENTITY_ATTRIBUTE_VALUE_GAMEBUTTON2)) {
                levelObject = new ButtonSprite(x, y, resourcesManager.gamebutton2_region, resourcesManager.gamebuttonpressed_region, vbom, new OnClickListener() {

                    @Override
                    public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) {

                    }
                });
            }

            else if (type.equals(TAG_ENTITY_ATTRIBUTE_VALUE_GAMEBUTTON3)) {
                levelObject = new ButtonSprite(x, y, resourcesManager.gamebutton3_region, resourcesManager.gamebuttonpressed_region, vbom, new OnClickListener() {

                    @Override
                    public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) {

                    }
                });
            }

            else if (type.equals(TAG_ENTITY_ATTRIBUTE_VALUE_GAMEBUTTON4)) {
                levelObject = new ButtonSprite(x, y, resourcesManager.gamebutton4_region, resourcesManager.gamebuttonpressed_region, vbom, new OnClickListener() {

                    @Override
                    public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) {

                    }
                });
            }

            else if (type.equals(TAG_ENTITY_ATTRIBUTE_VALUE_GAMEBUTTON5)) {
                levelObject = new ButtonSprite(x, y, resourcesManager.gamebutton5_region, resourcesManager.gamebuttonpressed_region, vbom, new OnClickListener() {

                    @Override
                    public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) {

                    }
                });
            }

            else if (type.equals(TAG_ENTITY_ATTRIBUTE_VALUE_GAMEBUTTON6)) {
                levelObject = new ButtonSprite(x, y, resourcesManager.gamebutton6_region, resourcesManager.gamebuttonpressed_region, vbom, new OnClickListener() {

                    @Override
                    public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) {

                    }
                });
            }

            else {
                throw new IllegalArgumentException();
            }

            levelObject.setCullingEnabled(true);
            registerTouchArea(levelObject);
            setTouchAreaBindingOnActionDownEnabled(true);
            return levelObject;
        }
    });

基于此,我假设获得父 x 和 y,我会简单地使用 final int x 和 final int y,但我不确定如何获得子 x 和 y。我希望我能够澄清我的问题

4

1 回答 1

1

你有选择,

1)您可以在加载每个实体时动态执行此操作,但您需要确保对 child_id 指向的另一个实体的引用之前已创建。根据您的 XML 判断,情况并非如此,您的第一个实体的 child_id 2 指向尚未创建的第二个实体,因此您无法在当前正在处理的实体 (1) 和那个之间加入一条线。因此,要做到这一点,您需要重新组织 XML 并从一个最初没有与另一个实体划线的实体开始。

或 2)一旦创建了所有实体,您将遍历所有实体并相应地画线,我觉得这会更好,因为您将它们放在 XML 中的顺序无关紧要。

无论您选择哪种方式,您都需要能够恢复创建的每个 ButtonSprite 的信息、其 ID 以及 ChildID(如果您选择选项 2)。为此,您还需要一个指向每个 ButtonSprite 的指针引用来恢复信息。

您可以将 ID 和 ChildID 放在 Sprite 的用户数据中,即

创建一个名为 levelObjectUserData 的类或具有两个公共整数字段 ID 和 ChildID 的类。默认情况下将它们设置为 -1。IE,

public class levelObjectUserData {
    public int ID = -1;
    public int ChildID = -1;
}

然后对于您在加载程序中创建的每个 levelObject,即,之后

levelObject.setCullingEnabled(true);

放置如下内容,

final levelObjectUserData MyData = new levelObjectUserData ();
MyData.ID = id;
MyData.ChildID = child_id;
levelObject.setUserData(MyData);

现在,将每个 levelObject 添加到某种列表中(我使用链表)。即,在

levelLoader.registerEntityLoader...

声明你的链表

LinkedList<Shape> levelObjects = new LinkedList<Shape>();

然后,每次您在加载程序中创建一个时,将其添加到列表中,即,在

levelObject.setCullingEnabled(true);

将 levelObject 添加到列表中,

levelObjects.add(levelObject);

现在,在您解析 XML 之后,在您的加载器完成之后,您可以访问通过遍历您的链表并在它们之间画线来创建的每个 levelObject。通过获取该项目的用户数据,您可以轻松找到要从当前 levelObject 绘制线条的按钮精灵,即

for (int i = 0;i<levelObjects.size();i++)
{

        final int ButtonSpriteChild  = ((levelObjectUserData) (levelObjects.get(i).getUserData())).ChildID;
        for (int j = 0;j<levelObjects.size();j++)
        {
            final int ButtonSpriteID = ((levelObjectUserData) (levelObjects.get(j).getUserData())).ID;

            if (ButtonSpriteChild  == ButtonSpriteID)
            {
                //Draw your line here between ButtonSprite levelObjects.get(i)
                //and ButtonSprite levelObjects.get(j) - the child that matches up
            }
        }

}

(其中 i 是介于 0 和 levelObjects.size() - 1 之间的值)

然后再次找到 ID 与列表中的 ChildID 匹配的精灵按钮(假设它仍然没有默认值 -1)。

您会得到子 x 和 y,因为它们是 Sprite 创建时的初始位置。一旦您从链表中获得对子 Sprite 的引用,只需调用,

levelObjects.get(j).getInitialX()...
levelObjects.get(j).getInitialy()...

其中 j 是子 Sprite 的索引。

希望这是有帮助的。

于 2013-03-01T22:18:29.040 回答