-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]:スティーブ、助けてくれてありがとう!もう1つ、回答の最後の部分を少し拡張してください。「XMLを解析した後...」、例を理解するのに問題があります "((levelObjectUserData)(levelObjects.get(i).getUserData ()))。ChildID "を使用しようとすると、次のエラーが発生します:"構文エラー、"AssignmentOperatorExpression"を挿入してExpressionを完成させます"。そしてまたあなたの助けを本当にありがとう

[編集]:問題の最初の部分で、xmlファイルの一部のエンティティにidとchild_idがないことがわかり、それらを追加するとエラーが修正されました。

したがって、私の質問は、「id」と「child_id」を使用して2つのエンティティ間に線を引くにはどうすればよいかということです。したがって、2つのレベルのオブジェクトが一致したら、親エンティティの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を取得すると仮定すると、finalintxとfinalintyを使用するだけですが、子のxとyを取得する方法がわかりません。問題を明確にできたと思います

4

1 に答える 1

1

あなたには選択肢があります、

1)各エンティティの読み込み中にこれを動的に行うことができますが、child_idが指している他のエンティティへの参照が以前に作成されていることを確認する必要があります。XMLによる判断が当てはまらない場合、最初のエンティティのchild_id、2は、まだ作成されていない2番目のエンティティを指しているため、処理中の現在のエンティティ(1)とその間の線を結ぶことはできません。したがって、これを行うには、XMLを再編成し、最初に別のエンティティに線が引かれていないエンティティから開始する必要があります。

または2)すべてのエンティティが作成されたら、それらすべてを調べて、それに応じて線を引きます。これは、XMLにどのような順序で配置してもかまわないため、より良いと思います。

どちらを選択した場合でも、作成された各ButtonSpriteの情報、そのID、およびオプション2を選択した場合はChildIDを回復できる必要があります。このためには、情報を回復するためにも各ButtonSpriteへのポインター参照が必要です。

スプライトのユーザーデータにIDとChildIDを配置できます。

levelObjectUserDataというクラス、またはIDとChildIDの2つのパブリック整数フィールドを持つクラスを作成します。デフォルトでは-1に設定します。すなわち、

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の間の値です)

次に、リストにあるChildIDと一致するIDを持つスプライトボタンをもう一度見つけます(デフォルト値の-1がまだない場合)。

子xとyは、作成時のスプライトの初期位置であるため、取得します。リンクリストから子スプライトへの参照を取得したら、次のように呼び出します。

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

ここで、jは子スプライトのインデックスです。

これがお役に立てば幸いです。

于 2013-03-01T22:18:29.040 に答える