BitmapFontMultiLineAlignment is ok.

This commit is contained in:
James Chen 2013-03-29 18:03:10 +08:00
parent 5a623b9b07
commit 8854fc046f
1 changed files with 162 additions and 167 deletions

View File

@ -986,186 +986,181 @@ 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,