??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
看qt下蝲?/a>的Qt的windows版本默认提供32位和64? 那个啥opengl版暂时未理会
因ؓ本hpȝ是win7 64bit, 因此毫无理由的下载了64位的qt5.2版本. ~译了hello world, l果报错:
module machine type 'x64' conflicts with target machine type 'X86'
找了半天没查到错? 后面注意到vs2012的工E编译类型选择的是win32 x86, 才想h׃qt5的所有lib?4位编? 而我使用32位的E序去链? 当然要报?
重新下蝲32位的qt5.2, ~译正确
另外一个错误也是在前面版本极ؓ见?
fatal error C1083: Cannot open include file: ’GLES2/gl2.h? No such file or directory
很多人的解决Ҏ是包含QtANGLE下的gles2目录, 但是׃我的工程内的cocos2dx本n也带有这东西. 于是研究了下为啥q版本的qt默认要搞的非要和gles有关p?
最l? 发现可以通过定义QT_NO_OPENGL宏来屏蔽opengl的渲染API使用, ~译通过
很是怀念诺Z时代的qt, 下蝲,~译一气呵?/p>
在启动前, d如下代码:
QApplication qapp(argc, argv);
qapp.addLibraryPath(QCoreApplication::applicationDirPath()+"/plugins");
QT开发目录下: Qt\4.8.2\plugins\拯到Qt的exe目录卛_
在Windows环境变量中没有找?(QTDIR)
随即在Qt的Visual Studio 插g菜单? Qt->Qt Options-> Qt Versions
讄Default Qt/Win version为新版本
选中原有的Qt工程, 在插件菜单中扑ֈQt Project Settings->Properties->Version?版本设|ؓ最新版?/p>
如果装有Visual AssitX, 此时q东西应该开始Parse新的Qt库了
have fun !
qteditorfactory.h ?/p>
QtLineEditFactorycL加如下代?U色标识
class QT_QTPROPERTYBROWSER_EXPORT QtLineEditFactory : public QtAbstractEditorFactory<QtStringPropertyManager> { Q_OBJECT public: QtLineEditFactory(QObject *parent = 0); ~QtLineEditFactory(); protected: void connectPropertyManager(QtStringPropertyManager *manager); QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property, QWidget *parent); void disconnectPropertyManager(QtStringPropertyManager *manager); private: QtLineEditFactoryPrivate *d_ptr; Q_DECLARE_PRIVATE(QtLineEditFactory) Q_DISABLE_COPY(QtLineEditFactory) Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QString &)) Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty *, const QRegExp &)) Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QString &)) Q_PRIVATE_SLOT(d_func(), void slotEditingFinished()) Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) };
qteditorfactory.cpp?/pre>class QtLineEditFactoryPrivate : public EditorFactoryPrivate<QLineEdit> { QtLineEditFactory *q_ptr; Q_DECLARE_PUBLIC(QtLineEditFactory) public: void slotPropertyChanged(QtProperty *property, const QString &value); void slotRegExpChanged(QtProperty *property, const QRegExp ®Exp); void slotSetValue(const QString &value); void slotEditingFinished(); };void QtLineEditFactoryPrivate::slotEditingFinished() { QObject *object = q_ptr->sender(); const QMap<QLineEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd(); for (QMap<QLineEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) if (itEditor.key() == object) { QtProperty *property = itEditor.value(); QtStringPropertyManager *manager = q_ptr->propertyManager(property); if (!manager) return; QString value = static_cast<QLineEdit*>(itEditor.key())->text(); manager->setValue(property, value); return; } }QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager, QtProperty *property, QWidget *parent) { QLineEdit *editor = d_ptr->createEditor(property, parent); QRegExp regExp = manager->regExp(property); if (regExp.isValid()) { QValidator *validator = new QRegExpValidator(regExp, editor); editor->setValidator(validator); } editor->setText(manager->value(property)); connect(editor, SIGNAL(editingFinished()), this, SLOT(slotEditingFinished())); connect(editor, SIGNAL(destroyed(QObject *)), this, SLOT(slotEditorDestroyed(QObject *))); return editor; }q样既可在输入回车键,或者输入框失去焦点后生一个OnValueChange事g
]]>
提示也写着在这里可以下载到以前的一些Qt?/p>
在里面终于可以找?a href="ftp://ftp.qt.nokia.com/qt/solutions/lgpl/qtpropertybrowser-2.5_1-opensource.zip">qtpropertybrowser-2.5_1-opensource.zip
下蝲后,用VisualStudio的Qt插g打开proQ有例子有设|好的工E,q愁文档么,呵呵
1. MFC
优点QVS2008以及VS2010的扩展确实很强大Q特别是原生的窗口运行时停靠以及PropertyGrid实很强?/p>
~点Q默认字体很模糊Q无Z对MFC多了解,C++多熟悉,每次写代码时依然要重新熟悉代码,更不用提分析别h写的MFC代码Q一个字Qؕ?/p>
2. WTL
优点QWindows下有个最好的例子QGoogle Chrome
~点Q缺乏设计器Q文档例子很?/p>
3. wxWidgets
优点Q虚q?~辑器在用(不是q告Q,wxAUI的布局设计器很方便QWindows原生界面很舒服,各种功能装都很C?/p>
~点Q布局没有cMGTK+的Fixedl对坐标方式QWindows SDK默认的左上角像素定位方式Q,在某些界面显得设计麻烦?动态链接库多的吓hQ工E过于臃ѝ?/p>
4. Qt, GTK+
据说Windows下不是很好用?/p>
5. DirectUI
有很多个人封装类似功能的库。界面,代码分离, ?9%都是收费
6. C# Windows Form
q是很好的选择Q语a斚w可以用C++/CLI 免得转换语言
自由停靠功能可以使用WeiFenLuo.winFormsUI.Docking 非常?/p>
7. WPF
有童鞋已l用MFC/C++通过加蝲XML昄界面Q不q通过资料昄QWPF的控件很,甚至q原生的PropertyGrid都没有,设计器倒是很华?/p>
ȝQ界面库的选择最重要的一点就是看有没有很好的设计器,q个是高效开发的重中之重。我重MFCQ敬仰MFCQ它作ؓC++的框架库来说很不错,但是对于界面设计q是q老了。我们开发的是品,出的是程序,而不是研IMFCQ怎样用好MFC?/p>
LemonpȝҎ:
1. 支持 Canvas,Sprite,ImageSetQ图片存储于一张图片,{大)
2. ImageSetExQ自由摆攄囄帧于一张图片)*
3. 支持对象无关键时用静态属性进行设|,cM于HGE里的_
4. 每个对象均可成ؓContainerQƈ拥有Child Node
5. 动画关键帧类型支持:~放Q旋转,位移Q颜Ԍ动画帧,锚点Q音?
6. 支持拑֏
7. ZXML存储的文件格?/p>
8. ZSquirrelN脚本的高速面向对象脚?
9. 囑ŞpȝGraphics抽象Q适用于Q何渲染设?/p>
10. 控gpȝ*
11. 视频回放*
所有对象均由RTTI创徏Q枚丑֝有NamePool+HashQƈ׃PropertySet的反系l?/p>
LemonComposer~辑器特?/p>
界面Z我去q开发的MotionUIQlua
8+1控制点点对象调节属?/p>
cAdobe Flash的~辑?/p>
c?DS Max的分轨道关键帧编辑,有助于优化art assert
自由调节对象层及父子关p?/p>
全功能无限制自由Redo,Undo
*在未来版本支持
2D游戏是独立游戏的LQ也是创意,投入比最的一个维度。但是基?D的大多是一些类gHGEQIndieLib{开源免?D引擎。但是面Ҏ戏中大量的动画而言Q开发者大多是使用囄帧来制作Q虽然效果很好,但是讑֤资源好用和制作难度也是很难控制的?/p>
行于去q的植物对僵和2004q发行的RO Offlinel过资源分析Q就是用类gLemonpȝQ或者说Flash的系l制作而成Q因此效果和扩展性非常好?/p>
q就是Lemon存在的理由?/p>
Flash面向的是GDI+WebQ那么Lemon是针对游戏专有的,Zg加速的游戏框架
Flash Action Script 对应的就是Lemon?a >Squirrel脚本
FlashIDE 对应的就是Lemon Composer
Lemon的目标就是让2D游戏开发更单,让游戏中充满更多的动? 让游戏开发难度降?/p>
最单的Ҏ莫过于判断鼠标点是否?个三角Ş中。但是很多判定方法都是有问题的,比如?/p>
copy自IndieLib
bool Triangle2D::Inside2( const Vector2& p ) { Vector2 v0 = mP3 - mP1; Vector2 v1 = mP2 - mP1; Vector2 v2 = p - mP1; // Compute dot products float dot00 = Vector2::DotProduct( v0, v0 ); float dot01 = Vector2::DotProduct( v0, v1 ); float dot02 = Vector2::DotProduct( v0, v2 ); float dot11 = Vector2::DotProduct( v1, v1 ); float dot12 = Vector2::DotProduct( v1, v2 ); // Compute barycentric coordinates float invDenom = 1 / (dot00 * dot11 - dot01 * dot01); float u = (dot11 * dot02 - dot01 * dot12) * invDenom; float v = (dot00 * dot12 - dot01 * dot02) * invDenom; // Check if point is in triangle return (u > 0) && (v > 0) && (u + v < 1); }
Google出的某h代码
float Triangle2D::CrossProduct3(const Vector2& p1,const Vector2& p2, const Vector2& p0 ) { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } bool Triangle2D::Inside( const Vector2& p ) { return (CrossProduct3(mP1,p,mP2)*CrossProduct3(mP3,p,mP2)<0) && (CrossProduct3(mP2,p,mP1)*CrossProduct3(mP3,p,mP1)<0) && (CrossProduct3(mP1,p,mP3)*CrossProduct3(mP2,p,mP3)<0); }
q?个方法都有缺P当点在三角Ş边上Ӟ无法得出。当用在一个正方Ş判断Ӟ正方形中心点判定ؓ没有在其内部Q显然是一个错误?
之后Q又Google出某几个大侠的算法和思想Q考虑了下Q判定点与四边Ş重心点的U段是否与四边Ş4条边怺Q相交时Q其在四边Ş外部Q反之亦然?
bool Quadrangle::Inside2( const Vector2& p ) { Vector2 c = Segement2D::GetCrossPoint( mP1, mP3, mP2, mP4 ); return !(Segement2D::Intersect( mP1, mP2, c, p) || Segement2D::Intersect( mP2, mP3, c, p) || Segement2D::Intersect( mP3, mP4, c, p) || Segement2D::Intersect( mP4, mP1, c, p) ); } bool Segement2D::Intersect( const Vector2& p1, const Vector2& p2,const Vector2& p3, const Vector2& p4 ) { float gradab, gradcd, ycptab, ycptcd, interceptX, intercepty; // In order to avoid divisions by zero //if (mP1.y == mP2.y) // mP2.y += 0.0001f; //if (mP1.x == mP2.x) // mP2.x += 0.0001f; //if (seg.mP1.y == seg.mP2.y) // seg.mP2.y += 0.0001f; //if (seg.mP1.x == seg.mP2.x) // seg.mP2.x += 0.0001f; // Calculates the intersection between the two lines gradab = (p1.y - p2.y) / (p1.x - p2.x); gradcd = (p3.y - p4.y) / (p3.x - p4.x); ycptab = p1.y - p1.x * gradab; ycptcd = p3.y - p3.x * gradcd; interceptX = (ycptab - ycptcd) / (gradcd - gradab); intercepty = (ycptab - (gradab * ycptcd) / gradcd) / (1 - gradab / gradcd); // Checking in the intersection is inside the segment if (!((interceptX >= p1.x && interceptX <= p2.x) || (interceptX >= p2.x && interceptX <= p1.x))) return 0; if (!((intercepty >= p1.y && intercepty <= p2.y) || (intercepty >= p2.y && intercepty <= p1.y))) return 0; if (!((interceptX >= p3.x && interceptX <= p4.x) || (interceptX >= p4.x && interceptX <= p3.x))) return 0; if (!((intercepty >= p3.y && intercepty <= p4.y) || (intercepty >= p4.y && intercepty <= p3.y))) return 0; return 1; } Vector2 Segement2D::GetCrossPoint(const Vector2& p1, const Vector2& p2, const Vector2& q1, const Vector2& q2) { //必须怺求出的才是线D늚交点Q但是下面的E序D|通用? /*Ҏ两点式化为标准式Q进而求U性方E组*/ Vector2 crossPoint; //求x坐标 float tempLeft = (q2.x - q1.x) * (p1.y - p2.y) - (p2.x - p1.x) * (q1.y - q2.y); float tempRight = (p1.y - q1.y) * (p2.x - p1.x) * (q2.x - q1.x) + q1.x * (q2.y - q1.y) * (p2.x - p1.x) - p1.x * (p2.y - p1.y) * (q2.x - q1.x); crossPoint.x = tempRight / tempLeft; //求y坐标 tempLeft = (p1.x - p2.x) * (q2.y - q1.y) - (p2.y - p1.y) * (q1.x - q2.x); tempRight = p2.y * (p1.x - p2.x) * (q2.y - q1.y) + (q2.x- p2.x) * (q2.y - q1.y) * (p1.y - p2.y) - q2.y * (q1.x - q2.x) * (p2.y - p1.y); crossPoint.y = tempRight / tempLeft; return crossPoint; }
q个法效率q不是很高,但对于设计器来说无所谓了Q如果有好的准确法Q可以讨?/p>
最单的Ҏ莫过于判断鼠标点是否?个三角Ş中。但是很多判定方法都是有问题的,比如?/p>
copy自IndieLib
bool Triangle2D::Inside2( const Vector2& p ) { Vector2 v0 = mP3 - mP1; Vector2 v1 = mP2 - mP1; Vector2 v2 = p - mP1; // Compute dot products float dot00 = Vector2::DotProduct( v0, v0 ); float dot01 = Vector2::DotProduct( v0, v1 ); float dot02 = Vector2::DotProduct( v0, v2 ); float dot11 = Vector2::DotProduct( v1, v1 ); float dot12 = Vector2::DotProduct( v1, v2 ); // Compute barycentric coordinates float invDenom = 1 / (dot00 * dot11 - dot01 * dot01); float u = (dot11 * dot02 - dot01 * dot12) * invDenom; float v = (dot00 * dot12 - dot01 * dot02) * invDenom; // Check if point is in triangle return (u > 0) && (v > 0) && (u + v < 1); }
Google出的某h代码
float Triangle2D::CrossProduct3(const Vector2& p1,const Vector2& p2, const Vector2& p0 ) { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } bool Triangle2D::Inside( const Vector2& p ) { return (CrossProduct3(mP1,p,mP2)*CrossProduct3(mP3,p,mP2)<0) && (CrossProduct3(mP2,p,mP1)*CrossProduct3(mP3,p,mP1)<0) && (CrossProduct3(mP1,p,mP3)*CrossProduct3(mP2,p,mP3)<0); }
q?个方法都有缺P当点在三角Ş边上Ӟ无法得出。当用在一个正方Ş判断Ӟ正方形中心点判定ؓ没有在其内部Q显然是一个错误?
之后Q又Google出某几个大侠的算法和思想Q考虑了下Q判定点与四边Ş重心点的U段是否与四边Ş4条边怺Q相交时Q其在四边Ş外部Q反之亦然?
bool Quadrangle::Inside2( const Vector2& p ) { Vector2 c = Segement2D::GetCrossPoint( mP1, mP3, mP2, mP4 ); return !(Segement2D::Intersect( mP1, mP2, c, p) || Segement2D::Intersect( mP2, mP3, c, p) || Segement2D::Intersect( mP3, mP4, c, p) || Segement2D::Intersect( mP4, mP1, c, p) ); } bool Segement2D::Intersect( const Vector2& p1, const Vector2& p2,const Vector2& p3, const Vector2& p4 ) { float gradab, gradcd, ycptab, ycptcd, interceptX, intercepty; // In order to avoid divisions by zero //if (mP1.y == mP2.y) // mP2.y += 0.0001f; //if (mP1.x == mP2.x) // mP2.x += 0.0001f; //if (seg.mP1.y == seg.mP2.y) // seg.mP2.y += 0.0001f; //if (seg.mP1.x == seg.mP2.x) // seg.mP2.x += 0.0001f; // Calculates the intersection between the two lines gradab = (p1.y - p2.y) / (p1.x - p2.x); gradcd = (p3.y - p4.y) / (p3.x - p4.x); ycptab = p1.y - p1.x * gradab; ycptcd = p3.y - p3.x * gradcd; interceptX = (ycptab - ycptcd) / (gradcd - gradab); intercepty = (ycptab - (gradab * ycptcd) / gradcd) / (1 - gradab / gradcd); // Checking in the intersection is inside the segment if (!((interceptX >= p1.x && interceptX <= p2.x) || (interceptX >= p2.x && interceptX <= p1.x))) return 0; if (!((intercepty >= p1.y && intercepty <= p2.y) || (intercepty >= p2.y && intercepty <= p1.y))) return 0; if (!((interceptX >= p3.x && interceptX <= p4.x) || (interceptX >= p4.x && interceptX <= p3.x))) return 0; if (!((intercepty >= p3.y && intercepty <= p4.y) || (intercepty >= p4.y && intercepty <= p3.y))) return 0; return 1; } Vector2 Segement2D::GetCrossPoint(const Vector2& p1, const Vector2& p2, const Vector2& q1, const Vector2& q2) { //必须怺求出的才是线D늚交点Q但是下面的E序D|通用? /*Ҏ两点式化为标准式Q进而求U性方E组*/ Vector2 crossPoint; //求x坐标 float tempLeft = (q2.x - q1.x) * (p1.y - p2.y) - (p2.x - p1.x) * (q1.y - q2.y); float tempRight = (p1.y - q1.y) * (p2.x - p1.x) * (q2.x - q1.x) + q1.x * (q2.y - q1.y) * (p2.x - p1.x) - p1.x * (p2.y - p1.y) * (q2.x - q1.x); crossPoint.x = tempRight / tempLeft; //求y坐标 tempLeft = (p1.x - p2.x) * (q2.y - q1.y) - (p2.y - p1.y) * (q1.x - q2.x); tempRight = p2.y * (p1.x - p2.x) * (q2.y - q1.y) + (q2.x- p2.x) * (q2.y - q1.y) * (p1.y - p2.y) - q2.y * (q1.x - q2.x) * (p2.y - p1.y); crossPoint.y = tempRight / tempLeft; return crossPoint; }
q个法效率q不是很高,但对于设计器来说无所谓了Q如果有好的准确法Q可以讨?/p>
微Y官方中文MSDNQ?a >http://msdn.microsoft.com/zh-cn/library/cc838158(VS.95).aspx
微Y官方英文MSDN例子Q?a >http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm#/?sref=HomePage
|上很多SilverLight和Flash比较的文章,常见的又是“Flash杀手”,“全新领域”之cȝ字眼。反观魅族M8和iPhoneQ也是这么写的。很明显都是“五毛党”的枪文Q或者一些无聊小~简单的见解?/p>
你见qSilverLight做的动画片么Q?q点不奇怪, SilverLight的核心是WPFQ也是Windows的下一代界面设计理c早期的理念诸如QMFCQ?WTLQ?Net。根据我研究看来QSilverLight的动画都是基于代码的Q所以你不希望一部动ȝ是用U手工方式编写代码来制作?
Flash是源自于FutureSplash AnimatorQ早期版本只是一个简单设计动ȝ~辑器,因ؓ对需要控Ӟ所以加入了ActionScript作ؓ其控制语a。后期逐步发展壮大Q记?002q时Q曾l见q有视频格式导成swf格式q行播放Q从此,q种技术渐渐发展成为现在流行的FLV。以至于到现在强大的RIA?/p>
所以这么看来,SilverLight即便发展到SilverLight 4Q也无法在动L面超qFlashQ除非添加一套类似Flash的动ȝ辑器。做动画Q必选FlashQ而且其可以跨q_Q装几率非常高。不q做RIAQ小受众用Visual Studio的强大工h配SilverLight/C#会大大降低开发成本?/p>
GameBryo引擎中支持原生的C++ GAME UIQ也支持直接播放flashQ这部分QScaleFormQ用的是以GameSwf为基的手动解析flash文gQ因此在~辑框等斚w做的非常好?
Flash的UI开发灵zd很高Q底层库bug,但是与现有工E结合难度大Q因此仍然{向研I以XML为基的UI库设计?
q里推荐几个参考:
WowBenchQ?http://sourceforge.net/projects/wowbench/
q是兽世界的UI的模拟器Q开源,可以从中了解兽世界的基本UI架构及API构成。同Ӟ兽的lua脚本在安全性和开发度上做的非常好Q这部分可以参考下?
Mozilla XULQ?a >https://developer.mozilla.org/En/XUL
q是Mozilla战略中的一个重要组成部分,q套UI支持cM于wxWidgets或者HTML方式的排?/p>
Dskinlite 是一ƾ轻量?span style="font-family:Arial">C++皮肤库,使用XML文gҎ规则来管?span style="font-family:Arial">GDI资源如颜Ԍ字体Q图片,q描q界面构成,最大程度的界面和E序逻辑分离Q同时ؓ软g皮肤更换Q换色等提供基础支持?span style="font-family:Arial">DSkinLite界面构成元素抽象ؓU条元素Q矩形元素,囄元素Q文本元素,q提供相应规则来使用q些元素"l合"界面?span style="font-family:Arial">DSkinlite开发团队有较深?span style="font-family:Arial">Windows界面开发的实际l历Q对软g界面处理颇有心得Q致力于实用,高效Q前沿的界面处理技术介l给q大开发h员?span style="font-family:Arial">
DSkinLite与其他界面库相比有以下特点:
没有采用Hook所有进E消息的方式Q因此没有替换系l相兛_话框?span style="font-family:Arial">DSkinLite只是采用MFCQ?span style="font-family:Arial">ATL{?span style="font-family:Arial">frameworkcM的方式,单替换窗口过E,截取界面l制{消息,对应用程序来说基本上是透明的。从q个斚wԌDSkinLite是一ƾ轻量的界面库?span style="font-family:Arial">
同时Q?span style="font-family:Arial">DSkinLite没有特别?span style="font-family:Arial">Frameword的依赖,可以?span style="font-family:Arial">Win32Q?span style="font-family:Arial">MFC,ATL,WTL{环境中使用?span style="font-family:Arial"> DSkinLite界面库?span style="font-family:Arial">XML理GDI资源q|窗口界面,用户可以方便的保持界面的一致性,同时可以很方便的构造出更多的窗口样?span style="font-family:Arial">
界面库的高效性?span style="font-family:Arial">DSkinLite专注于E序库的高效性,具体表现在内存占用,界面l制速度Q界面防止闪烁,E序加蝲囄资源、解?span style="font-family:Arial">XML文g的速度{方面,我们做了很多工作Qƈ不断持箋优化。以期望E序各方面表现最为高效的界面E序库?span style="font-family:Arial">
DSkinLite 皮肤库的E序架构考虑到可能出现的界面ҎQ得实现诸如透明Q渐隐渐显,动画{界面特效变得更加容易,目前支持大多数控件的透明效果Q后l会Ҏ用户需求,开发更多的实用的界面特效?span style="font-family:Arial">
XML语法单,易于学习和掌?span style="font-family:Arial">
支持滚动条控Ӟ同时支持所有内|滚动条控制
该网站还提到一个DirectUI的东西,q个东西是一Uwindowless的架构,具体概念cM于游戏中的UIQ不依赖q_句柄Q因此外挂只能截取诸如QQZATL的外H口Q但是无法获取窗口内部的数据