0

学習実験として、LibGDX を使用して 2D Java ゲームの作成に取り組んでいます。ハードコーディングには本当に大きな問題がありますが、それについて何もできませんでした。最近まで、sax/dom を効果的に使用する方法を (ようやく) 理解し、JDOM を見つけました。JDOM のような優れた API を使用すると、使用されるすべてのクラスでユーザーが作成した「オブジェクト」(たとえば「ゲームオブジェクト」という名前) を実装できることがわかりました。このオブジェクトには、プログラムに含まれる任意のオブジェクトを構築できるメソッドがあります。作成されたすべてのオブジェクトを保持する ArrayList と同様に...私が直面している問題は、複数のクラスから拡張できないことです。そのため、scene2d から「Actor」クラスを取得して拡張する方法がありません。 JDOMドキュメントを解析し、その配列リストを埋めることができます...

私の質問はこれです:オブジェクト構造のハードコーディングをxmlファイルで定義することにより、オブジェクト構造のハードコーディングを完全に削除して、ハードコーディングされるオブジェクトデータを実行時に変更できるようにする方法はありますか)

ここにいくつかのサンプルコードがあります...おそらく完璧ではありませんが、うまくいけばアイデアが伝わるでしょう

GameObject... これは、すべてのオブジェクトに継承させたいクラスです

パッケージrastek.thegame;

import java.util.ArrayList;
import java.util.List;
import org.jdom2.Element;

public class GameObject
{
    Element node;
    ArrayList<GameObject> gameObjects;

    public GameObject(Element node)
    {
        this.setNode(node);
        this.parseJDOM();
    }

    public void parseJDOM()
    {
        List objectList = this.getNode().getChildren();
        for (int i = 0; i < objectList.size(); i++)
        {
            Element node = (Element) objectList.get(i);

            // ONE list of EVERY object used,
            if (node.getName() == "GameScreen")
            {
            //the idea being that since every onject extends gameobject, 
            //they would all take an element as an argument and automatically 
            //create its array structure with it
                this.getGameObjects().add(new GameScreen(node));
            }

//          if (node.getName() == "GameActor")
//          {
//              this.getGameObjects().add(new GameActor(node));
//          }


        }
    }

    public Element getNode()
    {
        return node;
    }

    public void setNode(Element node)
    {
        this.node = node;
    }

    public ArrayList<GameObject> getGameObjects()
    {
        return gameObjects;
    }

    public void setGameObjects(ArrayList<GameObject> gameObjects)
    {
        this.gameObjects = gameObjects;
    }
}

GameCore... libgdx 抽象化レイヤーのエントリポイント - アイデアはここで機能します

package rastek.thegame;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;



public class GameCore extends GameObject implements ApplicationListener
{
    public GameCore(Element node)
    {
        //call the super cunstructor, thus parsing the JDOM and creating 
        //(as per the linked xml), one GameScreen and adding it to the 
        //super's array named gameObjects

        //unlike the other objects constructors, this is passed a local method, which 
        //is simply a temporary solution to obtain the xml file, 

        //as i dont want platform
        //dependancy to come into play yet, i dont want to pass the element to GameCore
        //which comes from the application entry point, which can be android, 
        //ios, or desktop dependant
        super(createJDOM());
    }



    // currently a local static and (UGH) hardcoded method, may find another
    // place and implementation for this for this
    private static Element createJDOM()
    {
        Object object = null;
        Document document;
        try
        {
            SAXBuilder saxBuilder = new SAXBuilder();
            object = saxBuilder.build(Gdx.files.internal("data/xml/GameCore.xml").reader());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        if (object != null)
        {
            document = (Document) object;
            return document.getRootElement();
        }
        else
        {
            return null;
        }
    }
    @Override
    public void create()
    {
    }
    @Override
    public void resize(int width, int height)
    {
        // TODO Auto-generated method stub
    }

    @Override
    public void render()
    {
        // TODO Auto-generated method stub
    }

    @Override
    public void pause()
    {
        // TODO Auto-generated method stub
    }

    @Override
    public void resume()
    {
        // TODO Auto-generated method stub
    }

    @Override
    public void dispose()
    {
        // TODO Auto-generated method stub
    }
}

GameScreen ... 私が使用する予定のオブジェクトの 1 つ - アイデアはここで機能します... ご覧のとおり... このオブジェクトは作成する手間がかからず、スーパー コンストラクターが自動生成され、その配列リストの伝播が自動的に開始されます。

package rastek.thegame;

import org.jdom2.Element;
import com.badlogic.gdx.Screen;

public class GameScreen extends GameObject implements Screen
{

    public GameScreen(Element node)
    {
        super(node);
    }

    @Override
    public void render(float delta)
    {
    }

    @Override
    public void resize(int width, int height)
    {
    }

    @Override
    public void show()
    {
    }

    @Override
    public void hide()
    {
    }

    @Override
    public void pause()
    {
    }

    @Override
    public void resume()
    {
    }

    @Override
    public void dispose()
    {
    }
}

こんにちは

package rastek.thegame;
import com.badlogic.gdx.scenes.scene2d.Actor;

public class GameActor extends Actor // ,GameObject
{
    ///i cant extend GameObject on this class, and thus cant add things 
    //like texture objects, and wrappers for complex character data
}

そしてxml im using ...単純なテスター

<?xml version="1.0" encoding="UTF-8"?>
<GameCore>

    <GameScreen>
        <Actor>
            <foo>
                <bar etc="123" >
                </bar>
            </foo>
        </Actor>
    </GameScreen>

</GameCore>
4

1 に答える 1