锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
Horizontal hAlignment,Vertical vAlignment,bool rich)
{
if(typeFace_ != 0 && !rich)
{
typeFace_->setColor(color);
if(isMultiLine)
{
renderMultiline(color,string,area,hAlignment);
}
else
{
Vector2f position(typeFace_->penX(string,area,hAlignment),baseLineY(area,vAlignment));
typeFace_->render(string,position);
}
}
else if(typeFace_)
{
if(!isMultiLine)
{
auto cmdlist = parseString(string);
Vector2f position(typeFace_->penX(string,area,hAlignment),baseLineY(area,vAlignment));
typeFace_->render(String(),position,cmdlist);
}
else
{
auto cmdlist = parseString(string);
renderMultiline(color,cmdlist,area,hAlignment);
}
}
}
{
String text(content);
std::list<textRenderCmdUnit> cmdList;
String current;
auto list = text.split('<');
for(int i=0;i<list.size();i++)
{
current = list[i];
if(current.startWith(L"/>"))
{
textRenderCmdUnit unit;
unit.undo = true;
cmdList.push_back(unit);
String remain = current.substr(2);
if(!remain.empty())
{
unit.text = remain;
unit.undo = false;
cmdList.push_back(unit);
}
}
else if(current.find('>') != String::InvalidPos)
{
textRenderCmdUnit unit;
unit.tag = current.substr(0,current.find('>'));
unit.undo = false;
cmdList.push_back(unit);
int32_t find = current.find('>');
if(find < current.size()-1)
{
unit.tag.clear();
unit.text = current.substr(find+1);
cmdList.push_back(unit);
}
}
else
{
textRenderCmdUnit unit;
unit.text = current;
unit.undo = false;
cmdList.push_back(unit);
}
}
return cmdList;
}
void TypeFace::render(const FloatRect& area,const std::list<textRenderCmdUnit>& queue,Horizontal hAlignment,float vpos)
{
const float availableWidth = area.width_ - 2.0f;
textRenderCmdUnit unit;
String line,lineRemain;
String tag;
std::queue<String> cmdStack;
float y = vpos;
float x = penX(String(),area,hAlignment);
auto itr = queue.begin();
while(itr != queue.end())
{
unit = *itr;
if(unit.undo)
{
if(!cmdStack.empty())
{
tag = cmdStack.front();
cmdStack.pop();
if(tag == "bold")
bold_ = false;
else if(tag == "italic")
italic_ = false;
else if(tag == "underline")
underline_ = false;
else
applyColor(tag);
}
}
else if(!unit.tag.empty())
{
tag = unit.tag;
cmdStack.push(tag);
if(tag == "bold")
bold_ = true;
else if(tag == "italic")
italic_ = true;
else if(tag == "underline")
underline_ = true;
else
applyColor(tag);
}
else
{
line += unit.text;
while(true)
{
size_t pos = hitCharacterIndex(line,availableWidth-x);
if(pos == 0)
{
x = penX(String(),area,hAlignment);
y += lineHeight();
continue;
}
if(pos == String::InvalidPos)
pos = line.size();
String current = line.substr(0,pos);
lineRemain = line.substr(pos);
line = current;
auto linefeed = line.get().find_first_of('\n');
if(linefeed != std::basic_string<uint32_t>::npos)
{
line = line.substr(0,linefeed);
lineRemain = line.substr(linefeed+1) + lineRemain;
}
render(line,Vector2f(x,y),std::list<textRenderCmdUnit>());
x += width(line);
if(linefeed != String::InvalidPos)
{
x = penX(String(),area,hAlignment);
y += lineHeight();
}
line = lineRemain;
if(lineRemain.empty())
break;
}
}
itr ++;
}
}
{
Vector2f position(0.0f,0.0f);
size_t leftChar = 0;
textRenderCmdUnit unit;
String tag;
std::queue<String> cmdStack;
std::list<textRenderCmdUnit>::const_iterator itr = cmd.begin();
while(itr != cmd.end())
{
unit = *itr;
if(unit.tag.empty() && !unit.undo)
{
position = renderGlyphs(unit.text,position);
}
else if(!unit.tag.empty())
{
tag = unit.tag;
cmdStack.push(tag);
if(tag == "bold")
bold_ = true;
else if(tag == "italic")
italic_ = true;
else if(tag == "underline")
underline_ = true;
else
applyColor(tag);
}
else if(unit.undo)
{
if(!cmdStack.empty())
{
tag = cmdStack.front();
cmdStack.pop();
if(tag == "bold")
bold_ = false;
else if(tag == "italic")
italic_ = false;
else if(tag == "underline")
underline_ = false;
else
applyColor(tag);
}
}
itr ++;
}
}
涓涓緥瀛愭槸:
]]>
鍙互璇碐UI鎵闇瑕佺殑褰撳墠鍩烘湰閮芥槸瀹炵幇浜?br />
鍐嶄笂涓涓嬌鐢ㄤ緥瀛?
using namespace bge;
int main(int argc, char* argv[])
{
FileSystem::instance().initial(argv[0]);
FileSystem::instance().setResourcePackage("data.zip");
WindowManager::instance().initialize("simkai.ttf",true);
Device* device = Device::create();
device->initial();
device->createWindow(640,480,bge::String("BGE Window"));
WindowManager::instance().propertyScheme()->load(":skin1.xml");
Window* window = WindowManager::instance().createWindow(":grid-layout-window.xml");
WindowManager::instance().addWindow(window);
while(device->isRunning())
{
device->preRender();
WindowManager::instance().update();
device->swapBuffers();
device->pollEvents();
}
WindowManager::instance().terminate();
device->closeWindow();
device->terminate();
device->deleteLater();
return 0;
}
涓漢鎰熻鍐欑殑榪樻槸姣旇緝娓呮櫚錛屾病浠涔堥渶瑕佺壒鍒鏄庣殑
浣跨敤鐨勫紑婧愬簱鏈塴ibpng,glfw,freetype,sigslot,physfs
涓嶈繃浠g爜鏈夌偣澶э紝鏈夊叴瓚g殑鍙互鐣欎釜閭
]]>
涓涓畝鍗曠殑渚嬪瓙鏄?
涔嬪墠鎴戣鐪嬬數(shù)瑙嗭紝鍙渶瑕佹墦寮鐢?shù)瑙嗘満鍗冲?br>浣嗘槸鐜板湪鏈変簡(jiǎn)鏈洪《鐩掕繖涓笢瑗匡紝瑕佺湅鐢?shù)瑙嗛渶瑕?涓楠?鎵撳紑鐢?shù)瑙嗘満锛屾墦寮鏈洪《鐩掞紝鍙嶈岀箒鐞愪簡(jiǎn)銆?br>鍋氫釜姊︼紝濡傛灉涓澶╂垜鎯崇湅鐢?shù)瑙嗘垜鍙璇翠竴鍙?鎴戣鐪嬬數(shù)瑙嗭紝鐒跺悗鑷姩鎵撳紑鐢?shù)瑙嗘満鍜屾満椤剁洅銆傞偅璇ュ濂姐?br>
鍙互鐪嬪嚭錛屽湪瀹為檯寮鍙戣繃紼嬩腑錛屽浜庨偅浜涙病鏈夊榪囪璁℃ā寮忔淮娣紝浠栦滑涔熷彲鑳戒嬌鐢ㄨ繃璇ユā寮忥紝鍙笉榪囦笉鐭ラ亾鍚嶅瓧緗簡(jiǎn)
闂ㄩ潰妯″紡鐨勪竴涓緥瀛?
寰堢畝鍗曟淮:
娉ㄦ剰榪欓噷A,B,C涓嶅叿鏈夊叡鍚屽熀綾?br>
涓嶇浠涔堟ā寮忥紝閮芥槸涓轟簡(jiǎn)搴旂敤鏈嶅姟鐨勶紝濡傛灉浣嗘槸灝嗗鏉傚寲錛岄珮娣卞寲錛岄偅鏄笉鍙彇鐨勩傛兂鎯沖綋鏃朵拱浜?jiǎn)璁捐妯″紡涓涔︼紝鐪嬬殑紼閲岀硦娑傜殑銆?br>
PS錛氶棬闈㈡ā寮?綆鍖栧鎴風(fēng)鎿嶄綔(緇熶竴鍖呰)