忍者ブログ
  • 2024.03
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.05
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/04/18 14:04 】 |
cocos2d-xで文字送り
RPGとかノベルゲームでよくある、1文字ずつ表示する仕組み。


◯cocos2d-xの内部
文字を表示するのはLabelクラス。
これはSpriteBatchNodeの一種で、1文字を1つのSpriteで保持している。
文字数分だけ、子ノードにSpriteを持っているという構造になっている。
で、◯文字めのSpriteを返す getLetter() というメソッドがある。これを使う。


Label* label = Label::createWithTTF(text, FONT_NAME, fontSize);
label->setPosition(pos);
label->setAlignment(TextHAlignment::LEFT);
label->setVisible(false);
parent->addChild(label);

int textLength = label->getStringLength();
for (int letterIndex = 0; letterIndex < textLength; ++letterIndex) {
Sprite *sp = label->getLetter(letterIndex);
if (sp) {
sp->runAction(Sequence::create(
DelayTime::create(0.1 * letterIndex), //1文字0.1秒
CallFunc::create([sp](){
sp->setVisible(true); //ここで表示
SimpleAudioEngine::getInstance()->playEffect("se_name"); //文字表示の音を鳴らしたり
}),
NULL));
}
}



という感じ。


◯注意点
labelは使い回しできない。
一度runActionして1文字ずつ表示した後、
label->setString("another string");
して、再度runActionすると、文字の表示位置がずれまくり、そして落ちるという謎現象が起きた。
その場合、label->removeFromParent(); してから再度 Label::create() すれば正しく動いた。

◯注意点その2
int textLength = label->getStringLength();
の文字数が合っていない。textLengthの文字数だけでwhileをまわすと、たまに末尾の1〜2文字が表示されないことがあった。
どうやらcocos2d-x内部での文字の数え方に差異があるようだ。
面倒なので、textLength + 2 でループをまわしたりした。
ちゃんと調べたい



PR
【2015/02/24 21:07 】 | cocos2d-x | 有り難いご意見(0)
<<ローカル通知が多重に来る | ホーム | cocos2dでスプライトが白くフェードアウトする>>
有り難いご意見
貴重なご意見の投稿














<<前ページ | ホーム | 次ページ>>