我创建了一个帮助器类,它将根据我给出的自定义字体和文本返回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
}
请帮我解释一下代码。
答案 0 :(得分:6)
据我所知,您正在使用 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)的内容。那不行。
我希望这有帮助!
答案 1 :(得分:1)
正如游戏机器人所指出的,问题在于文本长度。不过,我想同时回答这个问题和下一个问题。接下来的问题是,如何在将文本从一个值更改为另一个值时避免延迟,解决方案是使用您计划使用的所有字符初始化文本,如下所示:
Text text = new Text(x, y, this.font, "1234567890%",activity.getVertexBufferObjectManager());
text.setText("0%");
这种形式的构造函数将最大文本长度设置为初始字符串的长度,因此在本例中为11。
答案 2 :(得分:0)
文字只设置你的文字值,你不能改变那个文字,
如果您想更改文字,请使用ChangeableText。
ChangeableText changeableText = new ChangeableText(x, y, Font, "Your Text");
yourscene.attachChild(changeableText);
changeableText.setText("Your New Text");