这些bug可能依赖的编译器不同也会有不同的表现吧……至少以前xp下vs2005的debug版没有问题……orz
第一个bug:guilabel没有初始化rect.x1,rect.y1
解决方法:
构造函数改为
第二个bug:guiProbar的goToIndex()依赖的一个TimeLast在Update()里声明为static,并初始化为零,这样做只能保证进度条一被创建就执行GoToInedex时可以正确执行。
解决方法:
将guiProbar.h中的类定义改为
第三个问题:vista不能使用FontSprite
解决方法:使用FontSprite的继承类GDIFont(中文输入都是微妙的平衡的代码,在这里感谢他)
对了,由于类型改了,调用的构造函数也不同了。
第一个bug:guilabel没有初始化rect.x1,rect.y1
解决方法:
构造函数改为
- GUILabel::GUILabel(int _id, float x, float y, GdiFont *fnt, char* text, DWORD color, int align)
- : GUIObject () ,m_Font(0),m_FontCN(0)
- {
- bStatic=true;
- bVisible=true;
- bEnabled=true;
- id = _id;
- m_FontCN = fnt;
- m_Pos.x = x;
- m_Pos.y = y;
- m_Color = color;
- rect.x1 = x;
- rect.y1 = y;
- m_Align = align;
- ZeroMemory(m_wText,sizeof(m_wText));
- MultiByteToWideChar(CP_ACP,0,text,-1,m_wText,strlen(text));
- SetText(m_wText);
- }
- void GUILabel::SetText(wchar_t *text){
- SIZE sizeTxt = m_FontCN->GetTextSize(m_wText);
- rect.x2 = rect.x1 + sizeTxt.cx;
- rect.y2 = rect.y1 + sizeTxt.cy;
- }
- void GUILabel::SetText(char* text) {
- m_Text = text;
- ZeroMemory(m_wText,sizeof(m_wText));
- MultiByteToWideChar(CP_ACP,0,text,-1,m_wText,strlen(text));
- SIZE sizeTxt = m_FontCN->GetTextSize(m_wText);
- rect.x2 = rect.x1 + sizeTxt.cx;
- rect.y2 = rect.y1 + sizeTxt.cy;
- }
第二个bug:guiProbar的goToIndex()依赖的一个TimeLast在Update()里声明为static,并初始化为零,这样做只能保证进度条一被创建就执行GoToInedex时可以正确执行。
解决方法:
将guiProbar.h中的类定义改为
- //进度条控件
- class GUIProbar : public GUIObject {
- public:
- GUIProbar(int id,int x,int y,int w,int h,GdiFont *font,float nmin = 0,float nmax = 999);
- ~GUIProbar();
- void SetBound(float min,float max);
- void SetIndex(float index);
- float GetIndex();
- void SetSprite(const char* backFileName,const char* frontFileName);
- void GoToIndex(float index,float mm);
- void Update(float dt);
- virtual void Render();
- private:
- GdiFont* m_Font; //
- hgeSprite* backSpr;
- hgeSprite* frontSpr;
- float m_min;
- float m_max;
- float m_Index;
- float m_IndexRemain;
- float m_TimeRemain;
- float m_TimeLast;
- };
- void GUIProbar::GoToIndex(float index,float mm)
- {
- m_TimeRemain = mm;
- m_IndexRemain = index - m_Index;
- m_TimeLast = 0;
- }
- void GUIProbar::Update(float dt)
- {
- GUIObject::Update(dt);
- float nTemp;
- float nTempIndex;
- m_TimeLast += dt;
- if (m_TimeLast < 0.1)
- {
- return;
- }
- else
- {
- m_TimeLast -= 0.1f;
- }
- if (m_TimeRemain > 0 && m_IndexRemain != 0)
- {
- nTemp = m_IndexRemain * 0.1 / m_TimeRemain;
- nTempIndex = m_IndexRemain;
- if (m_IndexRemain > 0)
- {
- m_IndexRemain -= nTemp;
- if (m_IndexRemain < 0)
- {
- m_IndexRemain = 0;
- m_Index += nTempIndex;
- m_TimeRemain = 0;
- return;
- }
- else
- {
- m_Index += nTemp;
- m_TimeRemain -= 0.1;
- }
- }
- else
- {
- m_IndexRemain -= nTemp;
- if (m_IndexRemain > 0)
- {
- m_IndexRemain = 0;
- m_Index += nTempIndex;
- m_TimeRemain = 0;
- return;
- }
- else
- {
- m_Index += nTemp;
- m_TimeRemain -= 0.1;
- }
- }
- }
- }
解决方法:使用FontSprite的继承类GDIFont(中文输入都是微妙的平衡的代码,在这里感谢他)
- //原先的代码
- GUILabel(int id, float x, float y, FontSprite *fnt, char* text, DWORD color = 0xFFFFFFFF, int align = HGETEXT_LEFT);
- //改为
- GUILabel(int id, float x, float y, GdiFont *fnt, char* text, DWORD color = 0xFFFFFFFF, int align = HGETEXT_LEFT);
- //只要把所有的FontSprite*改为GdiFont*就行。这样vista就能运行,不过字体放大后较丑。
- void kStageManager::Init(HGE *Hge)
- {
- hge = Hge;
- gui = new GUI(hge);
- // 创建矢量字体指针
- m_font[0] = new GdiFont("楷体", 36);//这两行要改
- m_font[1] = new GdiFont("楷体", 24);//这两行要改
- m_font[0]->SetColor(0xff00ffff);
- m_font[1]->SetColor(0xff00ffff);
- cout<<"gui字体创建成功!"<<endl;
- m_Stage[0] = new kStartStage();
- m_Stage[0]->Init();
- cout<<"StartStage创建成功!"<<endl;
- m_Stage[1] = new kTalkStage();
- m_Stage[1]->Init();
- cout<<"TalkStage创建成功!"<<endl;
- m_Stage[2] = new kBattleStage();
- m_Stage[2]->Init();
- cout<<"BattleStage创建成功!"<<endl;
- bChanged = false;
- }