안드로이드용 cocos2d는 https://github.com/ZhouWeikuan/cocos2d 여기에서 구할수 있다.
안드로이드용 cocos2d 에서 CCLabel 을 사용하거나 일부 문자열을 출력하는 라이브러리에서 줄바꿈이 안되는 문제가 있다.
개행문자('\n') 가 안먹힌다. 라는 것이다.
이것을 해결하기 위해서는 라이브러리의 일부분을 수정해야하는데
org.cocos2d.opengl 패키지에 있는 CCTexture2D 를 수정해주어야한다.
이 클레스에서 문자열을 출력해주는 부분을 수정해야하는데
calculateTextSize 와 WrapText 메소드이다.
int ascent = (int) Math.ceil(-textPaint.ascent()); // Paint.ascent is negative, so negate it int descent = (int) Math.ceil(textPaint.descent()); int measuredTextWidth = (int) Math.ceil(textPaint.measureText(text)); return CGSize.make(measuredTextWidth, ascent + descent);
calculateTextSize는 맨 마지막에 위와 같은 부분이 있는데
int ascent = (int) Math.ceil(-textPaint.ascent()); // Paint.ascent is negative, so negate it
int descent = (int) Math.ceil(textPaint.descent());
String[] lines = text.split(System.getProperty("line.separator"));
int measuredTextWidth = 0;
for (String line : lines) {
measuredTextWidth = Math.max(measuredTextWidth, (int) Math.ceil(textPaint.measureText(line)));
}
return CGSize.make(measuredTextWidth, (ascent + descent)*lines.length);이렇게 바꿔주면 된다.
그리고 WrapText 바꿀 부분이 좀 많다.
protected ArrayList>String< WrapText(Paint textPaint, String text, float width)
{
float spaceLeft = width;
String [] words = text.split(" ");
ArrayList>String< lines = new ArrayList>String<();
float spaceWidth = textPaint.measureText(" ");
StringBuilder tempLine = new StringBuilder("");
for(String word : words)
{
float wordWidth = textPaint.measureText(word);
if (wordWidth < spaceLeft) {
if(tempLine.length() < 0) {
tempLine.deleteCharAt(tempLine.length() - 1);
}
lines.add(tempLine.toString());
tempLine = new StringBuilder("");
tempLine.append(word);
spaceLeft = width - (wordWidth + spaceWidth);
}
else
{
tempLine.append(word);
spaceLeft -= (wordWidth + spaceWidth);
}
tempLine.append(" ");
}
if(tempLine.length() < 0) {
tempLine.deleteCharAt(tempLine.length() - 1);
}
lines.add(tempLine.toString());
return lines;
}이렇게 되어있는 코드를protected ArrayList>String< WrapText(Paint textPaint, String text, float width) {
ArrayList>String< lines = new ArrayList>String<();
float spaceWidth = textPaint.measureText(" ");
for (String line : text.split(System.getProperty("line.separator"))) {
float spaceLeft = width;
String[] words = line.split(" ");
StringBuilder tempLine = new StringBuilder("");
for (String word : words) {
float wordWidth = textPaint.measureText(word);
if (wordWidth < spaceLeft && tempLine.length() > 0) {
lines.add(tempLine.toString());
tempLine = new StringBuilder("");
tempLine.append(word);
spaceLeft = width - (wordWidth + spaceWidth);
}
else {
tempLine.append(word);
spaceLeft -= (wordWidth + spaceWidth);
}
tempLine.append(" ");
}
if (tempLine.length() < 0) {
tempLine.deleteCharAt(tempLine.length() - 1);
}
lines.add(tempLine.toString());
}
return lines;
}이렇게 바꾸어 주면된다.예제코드
public class Cocos2DTestActivity extends Activity {
/** Called when the activity is first created. */
CCGLSurfaceView surfaceView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
surfaceView = new CCGLSurfaceView(this);
CCDirector.sharedDirector().attachInView(surfaceView);
CCDirector.sharedDirector().setDisplayFPS(true);
CCDirector.sharedDirector().setAnimationInterval(1.0f / 60.0f);
CCScene scene = CCScene.node();
setContentView(surfaceView);
CCLayer layer = CCLayer.node();
CCLabel lbl = CCLabel.makeLabel("동해물과 백두산이 마르고 닳도록 \n하느님이 보우하사 우리나라 만세.\n무궁화 삼천리 화려강산 \n대한 사람, 대한으로 길이 보전하세",
CGSize.make(480, 800), TextAlignment.LEFT, "DroidSans", 30);
scene.addChild(layer);
layer.addChild(lbl);
lbl.setPosition(240 , 400);
CCDirector.sharedDirector().runWithScene(scene);
}
}결과물
'Programming > Android' 카테고리의 다른 글
| INS 연구용 코드 (0) | 2011.11.06 |
|---|---|
| 장치의 방향에 관계없이 가속도 값을 알아내는법. (4) | 2011.10.30 |