【问题标题】:AndEngine Text.setText not workingAndEngine Text.setText 不工作
【发布时间】:2013-03-19 03:08:46
【问题描述】:

我创建了一个帮助类,它将根据我提供的自定义字体和文本返回 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

    }

请帮我写代码。

【问题讨论】:

    标签: android andengine


    【解决方案1】:

    据我所知,您正在使用 AndEngine GLES2,因此 Matim 已经说过您可以更改 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”,则可以(如果可以,将它们缩小以节省内存)。

    你不能在之后重新设置文本大小——这意味着,一旦你创建了一个长度为 5 的Text object,你就不能在里面放 6 个字母,也不能调用像 setSize(6) 这样的东西。那不是工作。

    我希望这会有所帮助!

    • 克里斯托夫

    【讨论】:

      【解决方案2】:

      正如游戏机器人所指出的,问题在于文本长度。但是,我想同时回答这个问题和下一个问题。下一个问题是,如何避免将文本从一个值更改为另一个值时出现延迟,解决方案是使用您计划使用的所有字符初始化文本,如下所示:

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

      这种形式的构造函数将最大文本长度设置为初始字符串的长度,因此在本例中为 11。

      【讨论】:

        【解决方案3】:

        文本只是设置你的文本值,你不能改变那个文本,

        如果您想更改文本,请使用 ChangeableText。

        ChangeableText changeableText = new ChangeableText(x, y, Font, "Your Text");
        yourscene.attachChild(changeableText);
        changeableText.setText("Your New Text");
        

        【讨论】:

        • 这完全取决于他使用的引擎的哪个分支,如果他在 GLES2 版本(和更新版本)中使用 GLES1(旧的,过时的,他不应该使用),你是对的更长的 ChangeableText,而我们只有 Text,还可以在运行时更新文本。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多