0

指定したカスタムフォントとテキストに基づいてTextオブジェクトを返すヘルパークラスを作成しました。

ここにコードがあります:

public class CustomFontTextHelper {
    private Font font;
    private ITexture fontTexture; 
    private Text text;
    public Text getTextWithFont(String myText,String fontPath,BaseGameActivity activity,float x,float y,int fontsize,int color){
        fontTexture = new BitmapTextureAtlas(activity.getTextureManager(), 256, 256, TextureOptions.BILINEAR);
        FontFactory.setAssetBasePath("fonts/");
        this.font = FontFactory.createFromAsset(activity.getFontManager(), fontTexture, activity.getAssets(), fontPath, fontsize, true, color);
        this.font.load();
        text = new Text(x, y, this.font, myText, activity.getVertexBufferObjectManager());
        return text;
    }
}

このヘルパークラスを使用して、テキストを作成し、シーンに添付します。その完璧に動作します。しかし、text.setTextメソッドを使用してテキストを変更しようとすると、クラッシュします。

以下は、テキストを変更するために使用するコードです。

public class StartingScreen extends BaseGameActivity {
    // ===========================================================
        // Constants
        // ===========================================================

        private static final int CAMERA_WIDTH = 480;
        private static final int CAMERA_HEIGHT = 720;

        // ===========================================================
        // Fields
        // ===========================================================

        public Text loadingPercentage;
        public float percentLoaded;
        public CustomFontTextHelper fontHelper;
    @Override
    public EngineOptions onCreateEngineOptions() {
        final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
        return new EngineOptions(true, ScreenOrientation.PORTRAIT_SENSOR, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
    }
    @Override
    public void onCreateResources(
            OnCreateResourcesCallback pOnCreateResourcesCallback)
            throws Exception {
        pOnCreateResourcesCallback.onCreateResourcesFinished();

    }
    @Override
    public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)
            throws Exception {
        this.mEngine.registerUpdateHandler(new FPSLogger());
        final Scene scene = new Scene();
        scene.setBackground(new Background(0, 0, 0));
        fontHelper = new CustomFontTextHelper();
        percentLoaded = 0;
        loadingPercentage = fontHelper.getTextWithFont("0%", "MyriadPro-Cond.ttf", this, CAMERA_WIDTH-120, 100, 64, Color.BLACK);
        scene.attachChild(loadingPercentage);
        pOnCreateSceneCallback.onCreateSceneFinished(scene);
    }
    @Override
    public void onPopulateScene(Scene pScene,
            OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception {
        pOnPopulateSceneCallback.onPopulateSceneFinished();
        loadingPercentage.setText("5%");
        new Thread(new Runnable(){

            @Override
            public void run() {
                int incr;
                for (incr = 0; incr <= 100; incr+=5) {
                    StartingScreen.this.runOnUpdateThread(new Runnable(){

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            StartingScreen.this.loadingPercentage.setText(Float.toString(StartingScreen.this.percentLoaded) + "%");
                        }

                    });

                            try {
                                Thread.sleep(5*1000);
                            } catch (InterruptedException e) {

                            }
                }

                // TODO Auto-generated method stub

            }

        }).start();
        // TODO Auto-generated method stub

    }

コードを手伝ってください。

4

3 に答える 3

6

私が見る限り、あなたはAndEngine GLES2を使用しているので、マティムがすでにインスタンスを変更できると言ったようにText。問題はText、最初にオブジェクトをインスタンス化するときに、テキストを含める必要があるか、それよりも良いオブジェクトに保持する必要がある文字数 (最大) を伝える必要があることです。だから代わりに

 text = new Text(x, y, this.font, myText, activity.getVertexBufferObjectManager());

あなたがやる

 int textLength = 4;
 text = new Text(x, y, this.font, myText, textLength, activity.getVertexBufferObjectManager());

長さをパーセンテージとして使用するため、長さを 4 に設定しました。パーセンテージは0%から100%の間しか指定できないため、最大 4 文字です。もちろん、必要に応じてテキストの長さを設定できます。1000 に設定し、テキストに「hello」のみを入力する場合は問題ありません (可能であれば、メモリを節約するために小さくします)。

後でテキスト サイズをリセットすることはできません。つまり、Text object長さ 5 の を作成すると、6 文字を入れることも、setSize(6) のようなものを呼び出すこともできません。これは機能しません。

これが役立つことを願っています!

  • クリストフ
于 2013-03-19T14:05:49.427 に答える
1

ゲームドロイドが指摘しているように、問題はテキストの長さにあります。しかし、私はこの質問と次の質問に同時に答えたいと思います。次の質問は、テキストをある値から別の値に変更するときの遅延を回避するにはどうすればよいですか。解決策は、次のように、使用する予定のすべての文字でテキストを初期化することです。

Text text = new Text(x, y, this.font, "1234567890%",activity.getVertexBufferObjectManager());
text.setText("0%");

この形式のコンストラクターは、最大テキスト長を最初の文字列の長さに設定します。したがって、この場合は11です。

于 2013-03-21T02:07:10.217 に答える
0

テキストはテキスト値を設定するだけで、そのテキストを変更することはできません。

テキストを変更したい場合は、ChangeableTextを使用してください。

ChangeableText changeableText = new ChangeableText(x, y, Font, "Your Text");
yourscene.attachChild(changeableText);
changeableText.setText("Your New Text");
于 2013-03-19T04:40:42.620 に答える