4

KomikaTitle というカスタム フォントを使用しています。場合によっては、最初の文字の左側でフォントが途切れて表示されることがあります。これは、Arial などのネイティブ フォントを使用している場合には発生しません。

以下は私が使用しているコードです:

scoreDisplayLabel = [CCLabelTTF labelWithString:@"0" dimensions:CGSizeMake(200,30) hAlignment:UITextAlignmentLeft fontName:@"KomikaTitle" fontSize:18];
scoreDisplayLabel.color = (ccc3(r,b,g));
[self addChild:scoreDisplayLabel z:2];
[scoreDisplayLabel setPosition:ccp(115,wins.height-73)];

これを防ぐにはどうすればよいですか?問題のスクリーンショットを添付しています。

http://www.cocos2d-iphone.org/forums/topic/custom-font-being-cut-off/で提案されているようにいじってみましたが、うまくいきませんでした。

ここに画像の説明を入力

みんなありがとう!

4

3 に答える 3

3

これは本当の答えではないかもしれませんが、私が作成した古い cocos2d プロジェクトでそのフォントに同じ問題がありました。余分なスペースと行を追加しただけです。

于 2013-06-27T08:56:37.577 に答える
0

cocos2dx を使用している Android ユーザーがいる場合、これは必ずしも簡単に解決できる問題ではありません。Cocos2dxBitmap.java ファイルを編集する必要があります。つまり、行った変更は更新によって上書きされる可能性があります。基本的に、テキストを測定するために使用される方法は、間違っているわけではありませんが、不十分です。

まず、新しい変数をTextPropertyに追加する必要があります

private final int mX;

次に、computeTextPropertyコードを次のように置き換えます。

private static TextProperty computeTextProperty(final String pString, final int unusedWidth, final int unusedHeight, final Paint pPaint) { final FontMetricsInt fm = pPaint.getFontMetricsInt(); final int h = (int) Math.ceil(fm.bottom - fm.top); int maxContentWidth = 0; final String[] lines = Cocos2dxBitmap.splitString(pString, 0, 0, pPaint); /* Compute the max width. */ int temp = 0; float left = 0; for (final String line : lines) { //get a path from text Path path = new Path(); pPaint.getTextPath(line, 0, line.length(), 0, 0, path); RectF bounds = new RectF(); path.computeBounds(bounds, true); temp = (int) FloatMath.ceil(bounds.width()); //if the text extends to the left of 0 if (bounds.left < left) { left = bounds.left; } if (temp > maxContentWidth) { maxContentWidth = temp; //extend the width to account for text rendered to the left of 0 if (left < bounds.left) { maxContentWidth += (int) FloatMath.ceil(Math.abs(left)); } } } left = Math.abs(left); return new TextProperty(maxContentWidth, h, lines, (int) FloatMath.ceil(left)); }

基本的に起こったことは、テキスト パスによって返された情報を使用して、左境界が 0 未満であるかどうかを取得したことです。これは、ビットマップの外にレンダリングされることを意味します。また、複数行のテキストがある場合は幅を拡張します。左の境界に合わせてすべてをシフトするため、右の境界もシフトする必要があります。

最後に、computeXを次のように置き換えます。

private static int computeX(final String pText, final int pMaxWidth, final int pHorizontalAlignment, final int pX) { int ret = 0; int expectedWidth = pX + pMaxWidth; switch (pHorizontalAlignment) { case HORIZONTALALIGN_CENTER: ret = expectedWidth / 2; break; case HORIZONTALALIGN_RIGHT: ret = expectedWidth; break; case HORIZONTALALIGN_LEFT: ret = pX; default: break; } return ret; }

すべての接続を自分で行う必要がありますが、これにより最も正確なテキスト レンダリングが得られます。

于 2015-05-07T00:18:36.700 に答える