mirror of https://github.com/axmolengine/axmol.git
BitmapFontMultiLineAlignment is ok.
This commit is contained in:
parent
5a623b9b07
commit
8854fc046f
|
@ -972,200 +972,195 @@ end
|
||||||
-- BitmapFontMultiLineAlignment
|
-- BitmapFontMultiLineAlignment
|
||||||
|
|
||||||
local LongSentencesExample = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
|
local LongSentencesExample = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
|
||||||
local LineBreaksExample = "Lorem ipsum dolor\nsit amet\nconsectetur adipisicing elit\nblah\nblah"
|
local LineBreaksExample = "Lorem ipsum dolor\nsit amet\nconsectetur adipisicing elit\nblah\nblah"
|
||||||
local MixedExample = "ABC\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt\nDEF"
|
local MixedExample = "ABC\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt\nDEF"
|
||||||
|
|
||||||
local ArrowsMax = 0.95
|
local ArrowsMax = 0.95
|
||||||
local ArrowsMin = 0.7
|
local ArrowsMin = 0.7
|
||||||
|
|
||||||
local LeftAlign = 0
|
local LeftAlign = 0
|
||||||
local CenterAlign = 1
|
local CenterAlign = 1
|
||||||
local RightAlign = 2
|
local RightAlign = 2
|
||||||
|
|
||||||
local LongSentences = 0
|
local LongSentences = 0
|
||||||
local LineBreaks = 1
|
local LineBreaks = 1
|
||||||
local Mixed = 2
|
local Mixed = 2
|
||||||
|
|
||||||
static float alignmentItemPadding = 50;
|
local alignmentItemPadding = 50
|
||||||
static float menuItemPaddingCenter = 50;
|
local menuItemPaddingCenter = 50
|
||||||
BitmapFontMultiLineAlignment::BitmapFontMultiLineAlignment()
|
|
||||||
{
|
|
||||||
this->setTouchEnabled(true);
|
|
||||||
|
|
||||||
// ask director the the window size
|
local BitmapFontMultiLineAlignment = {
|
||||||
CCSize size = CCDirector::sharedDirector()->getWinSize();
|
_pLabelShouldRetain = nil,
|
||||||
|
_pArrowsBarShouldRetain = nil,
|
||||||
// create and initialize a Label
|
_pArrowsShouldRetain = nil,
|
||||||
this->m_pLabelShouldRetain = CCLabelBMFont::create(LongSentencesExample, "fonts/markerFelt.fnt", size.width/1.5, kCCTextAlignmentCenter);
|
_pLastSentenceItem = nil,
|
||||||
this->m_pLabelShouldRetain->retain();
|
_drag = false,
|
||||||
|
|
||||||
this->m_pArrowsBarShouldRetain = CCSprite::create("Images/arrowsBar.png");
|
|
||||||
this->m_pArrowsBarShouldRetain->retain();
|
|
||||||
this->m_pArrowsShouldRetain = CCSprite::create("Images/arrows.png");
|
|
||||||
this->m_pArrowsShouldRetain->retain();
|
|
||||||
|
|
||||||
CCMenuItemFont::setFontSize(20);
|
|
||||||
CCMenuItemFont *longSentences = CCMenuItemFont::create("Long Flowing Sentences", this, menu_selector(BitmapFontMultiLineAlignment::stringChanged));
|
|
||||||
CCMenuItemFont *lineBreaks = CCMenuItemFont::create("Short Sentences With Intentional Line Breaks", this, menu_selector(BitmapFontMultiLineAlignment::stringChanged));
|
|
||||||
CCMenuItemFont *mixed = CCMenuItemFont::create("Long Sentences Mixed With Intentional Line Breaks", this, menu_selector(BitmapFontMultiLineAlignment::stringChanged));
|
|
||||||
CCMenu *stringMenu = CCMenu::create(longSentences, lineBreaks, mixed, NULL);
|
|
||||||
stringMenu->alignItemsVertically();
|
|
||||||
|
|
||||||
longSentences->setColor(ccRED);
|
|
||||||
m_pLastSentenceItem = longSentences;
|
|
||||||
longSentences->setTag(LongSentences);
|
|
||||||
lineBreaks->setTag(LineBreaks);
|
|
||||||
mixed->setTag(Mixed);
|
|
||||||
|
|
||||||
CCMenuItemFont::setFontSize(30);
|
|
||||||
|
|
||||||
CCMenuItemFont *left = CCMenuItemFont::create("Left", this, menu_selector(BitmapFontMultiLineAlignment::alignmentChanged));
|
|
||||||
CCMenuItemFont *center = CCMenuItemFont::create("Center", this, menu_selector(BitmapFontMultiLineAlignment::alignmentChanged));
|
|
||||||
CCMenuItemFont *right = CCMenuItemFont::create("Right", this, menu_selector(BitmapFontMultiLineAlignment::alignmentChanged));
|
|
||||||
CCMenu *alignmentMenu = CCMenu::create(left, center, right, NULL);
|
|
||||||
alignmentMenu->alignItemsHorizontallyWithPadding(alignmentItemPadding);
|
|
||||||
|
|
||||||
center->setColor(ccRED);
|
|
||||||
m_pLastAlignmentItem = center;
|
|
||||||
left->setTag(LeftAlign);
|
|
||||||
center->setTag(CenterAlign);
|
|
||||||
right->setTag(RightAlign);
|
|
||||||
|
|
||||||
// position the label on the center of the screen
|
|
||||||
this->m_pLabelShouldRetain->setPosition(ccp(size.width/2, size.height/2));
|
|
||||||
|
|
||||||
this->m_pArrowsBarShouldRetain->setVisible(false);
|
|
||||||
|
|
||||||
float arrowsWidth = (ArrowsMax - ArrowsMin) * size.width;
|
|
||||||
this->m_pArrowsBarShouldRetain->setScaleX(arrowsWidth / this->m_pArrowsBarShouldRetain->getContentSize().width);
|
|
||||||
this->m_pArrowsBarShouldRetain->setPosition(ccp(((ArrowsMax + ArrowsMin) / 2) * size.width, this->m_pLabelShouldRetain->getPosition().y));
|
|
||||||
|
|
||||||
this->snapArrowsToEdge();
|
|
||||||
|
|
||||||
stringMenu->setPosition(ccp(size.width/2, size.height - menuItemPaddingCenter));
|
|
||||||
alignmentMenu->setPosition(ccp(size.width/2, menuItemPaddingCenter+15));
|
|
||||||
|
|
||||||
this->addChild(this->m_pLabelShouldRetain);
|
|
||||||
this->addChild(this->m_pArrowsBarShouldRetain);
|
|
||||||
this->addChild(this->m_pArrowsShouldRetain);
|
|
||||||
this->addChild(stringMenu);
|
|
||||||
this->addChild(alignmentMenu);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BitmapFontMultiLineAlignment::~BitmapFontMultiLineAlignment()
|
function BitmapFontMultiLineAlignment.create()
|
||||||
{
|
local layer = CCLayer:create()
|
||||||
this->m_pLabelShouldRetain->release();
|
Helper.initWithLayer(layer)
|
||||||
this->m_pArrowsBarShouldRetain->release();
|
|
||||||
this->m_pArrowsShouldRetain->release();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string BitmapFontMultiLineAlignment::title()
|
layer:setTouchEnabled(true)
|
||||||
{
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string BitmapFontMultiLineAlignment::subtitle()
|
-- ask director the the window size
|
||||||
{
|
local size = CCDirector:sharedDirector():getWinSize()
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
void BitmapFontMultiLineAlignment::stringChanged(cocos2d::CCObject *sender)
|
-- create and initialize a Label
|
||||||
{
|
BitmapFontMultiLineAlignment._pLabelShouldRetain = CCLabelBMFont:create(LongSentencesExample, "fonts/markerFelt.fnt", size.width/1.5, kCCTextAlignmentCenter)
|
||||||
CCMenuItemFont *item = (CCMenuItemFont*)sender;
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:retain()
|
||||||
item->setColor(ccRED);
|
|
||||||
this->m_pLastAlignmentItem->setColor(ccWHITE);
|
|
||||||
this->m_pLastAlignmentItem = item;
|
|
||||||
|
|
||||||
switch(item->getTag())
|
BitmapFontMultiLineAlignment._pArrowsBarShouldRetain = CCSprite:create("Images/arrowsBar.png")
|
||||||
{
|
BitmapFontMultiLineAlignment._pArrowsBarShouldRetain:retain()
|
||||||
case LongSentences:
|
BitmapFontMultiLineAlignment._pArrowsShouldRetain = CCSprite:create("Images/arrows.png")
|
||||||
this->m_pLabelShouldRetain->setString(LongSentencesExample);
|
BitmapFontMultiLineAlignment._pArrowsShouldRetain:retain()
|
||||||
break;
|
|
||||||
case LineBreaks:
|
|
||||||
this->m_pLabelShouldRetain->setString(LineBreaksExample);
|
|
||||||
break;
|
|
||||||
case Mixed:
|
|
||||||
this->m_pLabelShouldRetain->setString(MixedExample);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
CCMenuItemFont:setFontSize(20)
|
||||||
break;
|
local longSentences = CCMenuItemFont:create("Long Flowing Sentences")
|
||||||
}
|
longSentences:registerScriptTapHandler(BitmapFontMultiLineAlignment.stringChanged)
|
||||||
|
local lineBreaks = CCMenuItemFont:create("Short Sentences With Intentional Line Breaks")
|
||||||
|
lineBreaks:registerScriptTapHandler(BitmapFontMultiLineAlignment.stringChanged)
|
||||||
|
local mixed = CCMenuItemFont:create("Long Sentences Mixed With Intentional Line Breaks")
|
||||||
|
mixed:registerScriptTapHandler(BitmapFontMultiLineAlignment.stringChanged)
|
||||||
|
local stringMenu = CCMenu:create()
|
||||||
|
stringMenu:addChild(longSentences)
|
||||||
|
stringMenu:addChild(lineBreaks)
|
||||||
|
stringMenu:addChild(mixed)
|
||||||
|
stringMenu:alignItemsVertically()
|
||||||
|
|
||||||
this->snapArrowsToEdge();
|
longSentences:setColor(ccc3(255, 0, 0))
|
||||||
}
|
BitmapFontMultiLineAlignment._pLastSentenceItem = longSentences
|
||||||
|
|
||||||
void BitmapFontMultiLineAlignment::alignmentChanged(cocos2d::CCObject *sender)
|
longSentences:setTag(LongSentences)
|
||||||
{
|
lineBreaks:setTag(LineBreaks)
|
||||||
CCMenuItemFont *item = (CCMenuItemFont*)sender;
|
mixed:setTag(Mixed)
|
||||||
item->setColor(ccRED);
|
|
||||||
this->m_pLastAlignmentItem->setColor(ccWHITE);
|
|
||||||
this->m_pLastAlignmentItem = item;
|
|
||||||
|
|
||||||
switch(item->getTag())
|
CCMenuItemFont:setFontSize(30)
|
||||||
{
|
|
||||||
case LeftAlign:
|
|
||||||
this->m_pLabelShouldRetain->setAlignment(kCCTextAlignmentLeft);
|
|
||||||
break;
|
|
||||||
case CenterAlign:
|
|
||||||
this->m_pLabelShouldRetain->setAlignment(kCCTextAlignmentCenter);
|
|
||||||
break;
|
|
||||||
case RightAlign:
|
|
||||||
this->m_pLabelShouldRetain->setAlignment(kCCTextAlignmentRight);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
local left = CCMenuItemFont:create("Left")
|
||||||
break;
|
left:registerScriptTapHandler(BitmapFontMultiLineAlignment.alignmentChanged)
|
||||||
}
|
local center = CCMenuItemFont:create("Center")
|
||||||
|
center:registerScriptTapHandler(BitmapFontMultiLineAlignment.alignmentChanged)
|
||||||
|
local right = CCMenuItemFont:create("Right")
|
||||||
|
right:registerScriptTapHandler(BitmapFontMultiLineAlignment.alignmentChanged)
|
||||||
|
|
||||||
this->snapArrowsToEdge();
|
local alignmentMenu = CCMenu:create()
|
||||||
}
|
alignmentMenu:addChild(left)
|
||||||
|
alignmentMenu:addChild(center)
|
||||||
|
alignmentMenu:addChild(right)
|
||||||
|
|
||||||
void BitmapFontMultiLineAlignment::ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
|
alignmentMenu:alignItemsHorizontallyWithPadding(alignmentItemPadding)
|
||||||
{
|
|
||||||
CCTouch *touch = (CCTouch *)pTouches->anyObject();
|
|
||||||
CCPoint location = touch->getLocationInView();
|
|
||||||
|
|
||||||
if (this->m_pArrowsShouldRetain->boundingBox().containsPoint(location))
|
center:setColor(ccc3(255, 0, 0))
|
||||||
{
|
BitmapFontMultiLineAlignment._pLastAlignmentItem = center
|
||||||
m_drag = true;
|
left:setTag(LeftAlign)
|
||||||
this->m_pArrowsBarShouldRetain->setVisible(true);
|
center:setTag(CenterAlign)
|
||||||
}
|
right:setTag(RightAlign)
|
||||||
}
|
|
||||||
|
|
||||||
void BitmapFontMultiLineAlignment::ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
|
-- position the label on the center of the screen
|
||||||
{
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:setPosition(ccp(size.width/2, size.height/2))
|
||||||
m_drag = false;
|
|
||||||
this->snapArrowsToEdge();
|
|
||||||
|
|
||||||
this->m_pArrowsBarShouldRetain->setVisible(false);
|
BitmapFontMultiLineAlignment._pArrowsBarShouldRetain:setVisible(false)
|
||||||
}
|
|
||||||
|
|
||||||
void BitmapFontMultiLineAlignment::ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
|
local arrowsWidth = (ArrowsMax - ArrowsMin) * size.width
|
||||||
{
|
BitmapFontMultiLineAlignment._pArrowsBarShouldRetain:setScaleX(arrowsWidth / BitmapFontMultiLineAlignment._pArrowsBarShouldRetain:getContentSize().width)
|
||||||
if (! m_drag)
|
BitmapFontMultiLineAlignment._pArrowsBarShouldRetain:setPosition( ((ArrowsMax + ArrowsMin) / 2) * size.width, BitmapFontMultiLineAlignment._pLabelShouldRetain:getPositionY() )
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CCTouch *touch = (CCTouch *)pTouches->anyObject();
|
BitmapFontMultiLineAlignment.snapArrowsToEdge()
|
||||||
CCPoint location = touch->getLocationInView();
|
|
||||||
|
|
||||||
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
|
stringMenu:setPosition(ccp(size.width/2, size.height - menuItemPaddingCenter))
|
||||||
|
alignmentMenu:setPosition(ccp(size.width/2, menuItemPaddingCenter+15))
|
||||||
|
|
||||||
this->m_pArrowsShouldRetain->setPosition(ccp(MAX(MIN(location.x, ArrowsMax*winSize.width), ArrowsMin*winSize.width),
|
layer:addChild(BitmapFontMultiLineAlignment._pLabelShouldRetain)
|
||||||
this->m_pArrowsShouldRetain->getPosition().y));
|
layer:addChild(BitmapFontMultiLineAlignment._pArrowsBarShouldRetain)
|
||||||
|
layer:addChild(BitmapFontMultiLineAlignment._pArrowsShouldRetain)
|
||||||
|
layer:addChild(stringMenu)
|
||||||
|
layer:addChild(alignmentMenu)
|
||||||
|
layer:registerScriptHandler(BitmapFontMultiLineAlignment.onNodeEvent)
|
||||||
|
layer:registerScriptTouchHandler(BitmapFontMultiLineAlignment.onTouchEvent)
|
||||||
|
return layer
|
||||||
|
end
|
||||||
|
|
||||||
float labelWidth = fabs(this->m_pArrowsShouldRetain->getPosition().x - this->m_pLabelShouldRetain->getPosition().x) * 2;
|
function BitmapFontMultiLineAlignment.onNodeEvent(tag)
|
||||||
|
if tag == "onexit" then
|
||||||
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:release()
|
||||||
|
BitmapFontMultiLineAlignment._pArrowsBarShouldRetain:release()
|
||||||
|
BitmapFontMultiLineAlignment._pArrowsShouldRetain:release()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
this->m_pLabelShouldRetain->setWidth(labelWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BitmapFontMultiLineAlignment::snapArrowsToEdge()
|
|
||||||
{
|
function BitmapFontMultiLineAlignment.stringChanged(tag, sender)
|
||||||
this->m_pArrowsShouldRetain->setPosition(ccp(this->m_pLabelShouldRetain->getPosition().x + this->m_pLabelShouldRetain->getContentSize().width/2,
|
local item = tolua.cast(sender, "CCMenuItemFont")
|
||||||
this->m_pLabelShouldRetain->getPosition().y));
|
item:setColor(ccc3(255, 0, 0))
|
||||||
}
|
BitmapFontMultiLineAlignment._pLastAlignmentItem:setColor(ccc3(255, 255, 255))
|
||||||
|
BitmapFontMultiLineAlignment._pLastAlignmentItem = item
|
||||||
|
|
||||||
|
if item:getTag() == LongSentences then
|
||||||
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:setString(LongSentencesExample)
|
||||||
|
elseif item:getTag() == LineBreaks then
|
||||||
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:setString(LineBreaksExample)
|
||||||
|
elseif item:getTag() == Mixed then
|
||||||
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:setString(MixedExample)
|
||||||
|
end
|
||||||
|
|
||||||
|
BitmapFontMultiLineAlignment.snapArrowsToEdge()
|
||||||
|
end
|
||||||
|
|
||||||
|
function BitmapFontMultiLineAlignment.alignmentChanged(tag, sender)
|
||||||
|
-- cclog("BitmapFontMultiLineAlignment.alignmentChanged, tag:"..tag)
|
||||||
|
local item = tolua.cast(sender, "CCMenuItemFont")
|
||||||
|
item:setColor(ccc3(255, 0, 0))
|
||||||
|
BitmapFontMultiLineAlignment._pLastAlignmentItem:setColor(ccc3(255, 255, 255))
|
||||||
|
BitmapFontMultiLineAlignment._pLastAlignmentItem = item
|
||||||
|
|
||||||
|
if tag == LeftAlign then
|
||||||
|
cclog("LeftAlign")
|
||||||
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:setAlignment(kCCTextAlignmentLeft)
|
||||||
|
elseif tag == CenterAlign then
|
||||||
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:setAlignment(kCCTextAlignmentCenter)
|
||||||
|
elseif tag == RightAlign then
|
||||||
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:setAlignment(kCCTextAlignmentRight)
|
||||||
|
end
|
||||||
|
|
||||||
|
BitmapFontMultiLineAlignment.snapArrowsToEdge()
|
||||||
|
end
|
||||||
|
|
||||||
|
function BitmapFontMultiLineAlignment.onTouchEvent(eventType, x, y)
|
||||||
|
-- cclog("type:"..eventType.."["..x..","..y.."]")
|
||||||
|
if eventType == "began" then
|
||||||
|
if BitmapFontMultiLineAlignment._pArrowsShouldRetain:boundingBox():containsPoint(ccp(x, y)) then
|
||||||
|
BitmapFontMultiLineAlignment._drag = true
|
||||||
|
BitmapFontMultiLineAlignment._pArrowsBarShouldRetain:setVisible(true)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
elseif eventType == "ended" then
|
||||||
|
BitmapFontMultiLineAlignment._drag = false
|
||||||
|
BitmapFontMultiLineAlignment.snapArrowsToEdge()
|
||||||
|
BitmapFontMultiLineAlignment._pArrowsBarShouldRetain:setVisible(false)
|
||||||
|
elseif eventType == "moved" then
|
||||||
|
if BitmapFontMultiLine._drag == false then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local winSize = CCDirector:sharedDirector():getWinSize()
|
||||||
|
BitmapFontMultiLineAlignment._pArrowsShouldRetain:setPosition(
|
||||||
|
math.max(math.min(x, ArrowsMax*winSize.width), ArrowsMin*winSize.width),
|
||||||
|
BitmapFontMultiLineAlignment._pArrowsShouldRetain:getPositionY())
|
||||||
|
|
||||||
|
local labelWidth = math.abs(BitmapFontMultiLineAlignment._pArrowsShouldRetain:getPositionX() - BitmapFontMultiLineAlignment._pLabelShouldRetain:getPositionX()) * 2
|
||||||
|
|
||||||
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:setWidth(labelWidth)
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BitmapFontMultiLineAlignment.snapArrowsToEdge()
|
||||||
|
BitmapFontMultiLineAlignment._pArrowsShouldRetain:setPosition(
|
||||||
|
BitmapFontMultiLineAlignment._pLabelShouldRetain:getPositionX() + BitmapFontMultiLineAlignment._pLabelShouldRetain:getContentSize().width/2, BitmapFontMultiLineAlignment._pLabelShouldRetain:getPositionY()
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function LabelTest()
|
function LabelTest()
|
||||||
|
@ -1192,7 +1187,7 @@ function LabelTest()
|
||||||
LabelTTFMultiline.create,
|
LabelTTFMultiline.create,
|
||||||
LabelTTFChinese.create,
|
LabelTTFChinese.create,
|
||||||
LabelBMFontChinese.create,
|
LabelBMFontChinese.create,
|
||||||
-- BitmapFontMultiLineAlignment,
|
BitmapFontMultiLineAlignment.create,
|
||||||
-- LabelTTFA8Test,
|
-- LabelTTFA8Test,
|
||||||
-- BMFontOneAtlas,
|
-- BMFontOneAtlas,
|
||||||
-- BMFontUnicode,
|
-- BMFontUnicode,
|
||||||
|
|
Loading…
Reference in New Issue