﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-战魂小筑-随笔分类-界面 接口</title><link>http://www.cppblog.com/sunicdavy/category/11296.html</link><description>讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu</description><language>zh-cn</language><lastBuildDate>Mon, 27 Dec 2021 17:00:48 GMT</lastBuildDate><pubDate>Mon, 27 Dec 2021 17:00:48 GMT</pubDate><ttl>60</ttl><item><title>Event对应Entitas的GetTrigger+Collector</title><link>http://www.cppblog.com/sunicdavy/archive/2021/12/27/217896.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Mon, 27 Dec 2021 11:05:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2021/12/27/217896.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/217896.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2021/12/27/217896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/217896.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/217896.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Entitas的ECS系统 1. 本来在一个对象中添加一个类字段的过程，ECS需要添加一个类代表Component，并且代码生成。 这个字段一般用于描述对象的资源，处理显示的GameObject， 表示对象的类型等。 2. 本来一个对象的业务逻辑处理过程直接用方法解决的， ECS需要新加一个System，而操作对象需要使用Filter或Group查询获得。 3. 一系列的操作， 需要拆分为多个Sy...&nbsp;&nbsp;<a href='http://www.cppblog.com/sunicdavy/archive/2021/12/27/217896.html'>阅读全文</a><img src ="http://www.cppblog.com/sunicdavy/aggbug/217896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2021-12-27 19:05 <a href="http://www.cppblog.com/sunicdavy/archive/2021/12/27/217896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt 4.8.x 升级到Qt5.x的各种坑</title><link>http://www.cppblog.com/sunicdavy/archive/2014/03/01/206000.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Sat, 01 Mar 2014 06:25:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2014/03/01/206000.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/206000.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2014/03/01/206000.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/206000.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/206000.html</trackback:ping><description><![CDATA[<p>Qt5 已易主, 脑残的事情也干的越来越多.</p> <p>看qt<a href="http://qt-project.org/downloads">下载页</a>的Qt的windows版本默认提供32位和64位, 那个啥opengl版暂时未理会</p> <p>因为本人系统是win7 64bit, 因此毫无理由的下载了64位的qt5.2版本. 编译了hello world, 结果报错:</p> <p>module machine type 'x64' conflicts with target machine type 'X86' <p>找了半天没查到错误, 后面注意到vs2012的工程编译类型选择的是win32 x86, 才想起是由于qt5的所有lib是64位编译, 而我使用32位的程序去链接, 当然要报错. <p>重新下载32位的qt5.2, 编译正确 <p>&nbsp; <p>另外一个错误也是在前面版本极为少见的: <p>fatal error C1083: Cannot open include file: ’GLES2/gl2.h’: No such file or directory <p>很多人的解决方法是包含QtANGLE下的gles2目录, 但是由于我的工程内的cocos2dx本身也带有这东西. 于是研究了下为啥这版本的qt默认要搞的非要和gles有关系 <p>最终, 发现可以通过定义QT_NO_OPENGL宏来屏蔽opengl的渲染API使用, 编译通过 <p>&nbsp; <p>很是怀念诺基亚时代的qt, 下载,编译一气呵成</p><img src ="http://www.cppblog.com/sunicdavy/aggbug/206000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2014-03-01 14:25 <a href="http://www.cppblog.com/sunicdavy/archive/2014/03/01/206000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt应用程序使用图形解码无法显示的问题</title><link>http://www.cppblog.com/sunicdavy/archive/2013/08/10/202448.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Sat, 10 Aug 2013 01:44:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2013/08/10/202448.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/202448.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2013/08/10/202448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/202448.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/202448.html</trackback:ping><description><![CDATA[<p>最近发现一个Qt写的切图软件, 导入PNG图片可以显示, 而JPEG图片无法显示. 开发机正常. Google了一下, 发现Qt通过外部插件机制支持各种扩展功能. </p> <p>在启动前, 添加如下代码:</p> <p>QApplication qapp(argc, argv);&nbsp;&nbsp;&nbsp; </p> <p>qapp.addLibraryPath(QCoreApplication::applicationDirPath()+"/plugins");<br></p> <p>将QT开发目录下: Qt\4.8.2\plugins\拷贝到Qt的exe目录即可</p><img src ="http://www.cppblog.com/sunicdavy/aggbug/202448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2013-08-10 09:44 <a href="http://www.cppblog.com/sunicdavy/archive/2013/08/10/202448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>切换Qt版本, 修改$(QTDIR)指向</title><link>http://www.cppblog.com/sunicdavy/archive/2012/07/14/183384.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Sat, 14 Jul 2012 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2012/07/14/183384.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/183384.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2012/07/14/183384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/183384.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/183384.html</trackback:ping><description><![CDATA[<p>最近从Qt4.7.0 升级到 Qt4.8.2, 装好了新的open sdk, 但是观察工程中的引用依旧是4.7.0</p> <p>在Windows环境变量中没有找到$(QTDIR)</p> <p>随即在Qt的Visual Studio 插件菜单中, Qt-&gt;Qt Options-&gt; Qt Versions</p> <p>设置Default Qt/Win version为新版本</p> <p>选中原有的Qt工程, 在插件菜单中找到Qt Project Settings-&gt;Properties-&gt;Version中,将版本设置为最新版本</p> <p>如果装有Visual AssitX, 此时这东西应该开始Parse新的Qt库了</p> <p>have fun <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="微笑" src="http://www.cppblog.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/Qt_D9F5/wlEmoticon-smile_2.png">!</p><img src ="http://www.cppblog.com/sunicdavy/aggbug/183384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2012-07-14 15:35 <a href="http://www.cppblog.com/sunicdavy/archive/2012/07/14/183384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正确收到Qt属性控件中输入框消息</title><link>http://www.cppblog.com/sunicdavy/archive/2011/05/06/145846.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Fri, 06 May 2011 13:11:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2011/05/06/145846.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/145846.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2011/05/06/145846.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/145846.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/145846.html</trackback:ping><description><![CDATA[<p>QtPropertyBrowser2.5中的字符串属性对应的修改方式是一个输入框,OnValueChange是在每次键入字符时发送一次.这个对于编辑器需要的逻辑来说是一种灾难. Ogitor修改了其源码,解决了这个问题:</p> <p>qteditorfactory.h 中</p> <p>QtLineEditFactory类添加如下代码,红色标识</p><pre class="csharpcode"><span class="kwrd">class</span> QT_QTPROPERTYBROWSER_EXPORT QtLineEditFactory : <span class="kwrd">public</span> QtAbstractEditorFactory&lt;QtStringPropertyManager&gt;
{
    Q_OBJECT
<span class="kwrd">public</span>:
    QtLineEditFactory(QObject *parent = 0);
    ~QtLineEditFactory();
<span class="kwrd">protected</span>:
    <span class="kwrd">void</span> connectPropertyManager(QtStringPropertyManager *manager);
    QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property,
                QWidget *parent);
    <span class="kwrd">void</span> disconnectPropertyManager(QtStringPropertyManager *manager);
<span class="kwrd">private</span>:
    QtLineEditFactoryPrivate *d_ptr;
    Q_DECLARE_PRIVATE(QtLineEditFactory)
    Q_DISABLE_COPY(QtLineEditFactory)
    Q_PRIVATE_SLOT(d_func(), <span class="kwrd">void</span> slotPropertyChanged(QtProperty *, <span class="kwrd">const</span> QString &amp;))
    Q_PRIVATE_SLOT(d_func(), <span class="kwrd">void</span> slotRegExpChanged(QtProperty *, <span class="kwrd">const</span> QRegExp &amp;))
    Q_PRIVATE_SLOT(d_func(), <span class="kwrd">void</span> slotSetValue(<span class="kwrd">const</span> QString &amp;))
   <font color="#ff0000"> Q_PRIVATE_SLOT(d_func(), <span class="kwrd">void</span> slotEditingFinished())</font>
    Q_PRIVATE_SLOT(d_func(), <span class="kwrd">void</span> slotEditorDestroyed(QObject *))
};
</pre><pre class="csharpcode">&nbsp;</pre><pre class="csharpcode">qteditorfactory.cpp中</pre><pre class="csharpcode"><span class="kwrd">class</span> QtLineEditFactoryPrivate : <span class="kwrd">public</span> EditorFactoryPrivate&lt;QLineEdit&gt;
{
    QtLineEditFactory *q_ptr;
    Q_DECLARE_PUBLIC(QtLineEditFactory)
<span class="kwrd">public</span>:

    <span class="kwrd">void</span> slotPropertyChanged(QtProperty *property, <span class="kwrd">const</span> QString &amp;<span class="kwrd">value</span>);
    <span class="kwrd">void</span> slotRegExpChanged(QtProperty *property, <span class="kwrd">const</span> QRegExp &amp;regExp);
    <span class="kwrd">void</span> slotSetValue(<span class="kwrd">const</span> QString &amp;<span class="kwrd">value</span>);
<font color="#ff0000">    <span class="kwrd">void</span> slotEditingFinished();</font>
};
</pre><pre class="csharpcode"><font color="#ff0000"><span class="kwrd">void</span> QtLineEditFactoryPrivate::slotEditingFinished()
{
    QObject *<span class="kwrd">object</span> = q_ptr-&gt;sender();
    <span class="kwrd">const</span> QMap&lt;QLineEdit *, QtProperty *&gt;::ConstIterator ecend = m_editorToProperty.constEnd();
    <span class="kwrd">for</span> (QMap&lt;QLineEdit *, QtProperty *&gt;::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
        <span class="kwrd">if</span> (itEditor.key() == <span class="kwrd">object</span>) {
            QtProperty *property = itEditor.<span class="kwrd">value</span>();
            QtStringPropertyManager *manager = q_ptr-&gt;propertyManager(property);
            <span class="kwrd">if</span> (!manager)
                <span class="kwrd">return</span>;
            QString <span class="kwrd">value</span> = static_cast&lt;QLineEdit*&gt;(itEditor.key())-&gt;text();
            manager-&gt;setValue(property, <span class="kwrd">value</span>);
            <span class="kwrd">return</span>;
        }
}</font>

</pre><pre class="csharpcode">QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager,
        QtProperty *property, QWidget *parent)
{

    QLineEdit *editor = d_ptr-&gt;createEditor(property, parent);
    QRegExp regExp = manager-&gt;regExp(property);
    <span class="kwrd">if</span> (regExp.isValid()) {
        QValidator *validator = <span class="kwrd">new</span> QRegExpValidator(regExp, editor);
        editor-&gt;setValidator(validator);
    }
    editor-&gt;setText(manager-&gt;<span class="kwrd">value</span>(property));

<font color="#ff0000">    connect(editor, SIGNAL(editingFinished()),
                <span class="kwrd">this</span>, SLOT(slotEditingFinished()));</font>
    connect(editor, SIGNAL(destroyed(QObject *)),
                <span class="kwrd">this</span>, SLOT(slotEditorDestroyed(QObject *)));
    <span class="kwrd">return</span> editor;
}
</pre><pre class="csharpcode">&nbsp;</pre><pre class="csharpcode">这样既可在输入回车键,或者输入框失去焦点后产生一个OnValueChange事件</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style><img src ="http://www.cppblog.com/sunicdavy/aggbug/145846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2011-05-06 21:11 <a href="http://www.cppblog.com/sunicdavy/archive/2011/05/06/145846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QtPropertyBrowser的新下载位置</title><link>http://www.cppblog.com/sunicdavy/archive/2010/12/31/137816.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Fri, 31 Dec 2010 14:36:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2010/12/31/137816.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/137816.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2010/12/31/137816.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/137816.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/137816.html</trackback:ping><description><![CDATA[<p>Qt下的属性控件QtPropertyBrowser在Google中资料很少，而且在很多介绍的文章里的<a href="http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Widgets/qtpropertybrowser">下载地址</a>都指向了<a href="http://qt.nokia.com/products/qt-addons">QtMobility</a>,这个东西跟非手机平台没有太大关系。找了很久，发现在<a href="http://qt.nokia.com/downloads">http://qt.nokia.com/downloads</a>页面的右下角有一个FTP链接：</p> <p><a title="ftp://ftp.qt.nokia.com/" href="ftp://ftp.qt.nokia.com/">ftp://ftp.qt.nokia.com/</a></p> <p>提示也写着在这里可以下载到以前的一些Qt包</p> <p>在里面终于可以找到<a href="ftp://ftp.qt.nokia.com/qt/solutions/lgpl/qtpropertybrowser-2.5_1-opensource.zip">qtpropertybrowser-2.5_1-opensource.zip</a></p> <p>下载后，用VisualStudio的Qt插件打开pro，有例子有设置好的工程，还愁文档么，呵呵</p><img src ="http://www.cppblog.com/sunicdavy/aggbug/137816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2010-12-31 22:36 <a href="http://www.cppblog.com/sunicdavy/archive/2010/12/31/137816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++界面库的抉择</title><link>http://www.cppblog.com/sunicdavy/archive/2010/07/28/121477.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Wed, 28 Jul 2010 09:22:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2010/07/28/121477.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/121477.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2010/07/28/121477.html#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/121477.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/121477.html</trackback:ping><description><![CDATA[<p>C++的界面库经过几天来的搜索，总结了下面几种的优缺点</p> <p>1. MFC</p> <p>&nbsp;&nbsp; 优点：VS2008以及VS2010的扩展确实很强大，特别是原生的窗口运行时停靠以及PropertyGrid确实很强大</p> <p>&nbsp;&nbsp; 缺点：默认字体很模糊，无论你对MFC多了解，C++多熟悉，每次写代码时依然要重新熟悉代码，更不用提分析别人写的MFC代码，一个字：乱。</p> <p>2. WTL</p> <p>&nbsp;&nbsp; 优点：Windows下有个最好的例子：Google Chrome</p> <p>&nbsp;&nbsp; 缺点：缺乏设计器，文档例子很少</p> <p>3. wxWidgets</p> <p>&nbsp;&nbsp; 优点：虚幻3编辑器在用（不是广告），wxAUI的布局设计器很方便，Windows原生界面很舒服，各种功能封装都很到位。</p> <p>&nbsp;&nbsp; 缺点：布局没有类似GTK+的Fixed绝对坐标方式（Windows SDK默认的左上角像素定位方式），在某些界面显得设计麻烦。 动态链接库多的吓人，工程过于臃肿。</p> <p>4. Qt, GTK+</p> <p>&nbsp;&nbsp;&nbsp; 据说Windows下不是很好用。</p> <p>5. DirectUI</p> <p>&nbsp;&nbsp;&nbsp; 有很多个人封装类似功能的库。界面，代码分离, 但99%都是收费</p> <p>6. C# Windows Form</p> <p>&nbsp;&nbsp;&nbsp; 这是很好的选择，语言方面可以用C++/CLI 免得转换语言</p> <p>&nbsp;&nbsp; 自由停靠功能可以使用WeiFenLuo.winFormsUI.Docking 非常简单</p> <p>7. WPF</p> <p>&nbsp;&nbsp; 有童鞋已经使用MFC/C++通过加载XML显示界面，不过通过资料显示，WPF的控件很少，甚至连原生的PropertyGrid都没有，设计器倒是很华丽</p> <p>&nbsp;</p> <p>总结：界面库的选择最重要的一点就是看有没有很好的设计器，这个是高效开发的重中之重。我尊重MFC，敬仰MFC，它作为C++的框架库来说很不错，但是对于界面设计还是过老了。我们开发的是产品，出的是程序，而不是研究MFC，怎样用好MFC。</p><img src ="http://www.cppblog.com/sunicdavy/aggbug/121477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2010-07-28 17:22 <a href="http://www.cppblog.com/sunicdavy/archive/2010/07/28/121477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LemonComposer  2D游戏动画开发工具</title><link>http://www.cppblog.com/sunicdavy/archive/2010/02/05/107257.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Fri, 05 Feb 2010 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2010/02/05/107257.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/107257.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2010/02/05/107257.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/107257.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/107257.html</trackback:ping><description><![CDATA[<p>Lemon是本人开发的一套适用于2D游戏动画和高级游戏框架及配套编辑器（LemonComposer）</p> <blockquote> <p>Lemon系统特性：</p> <p>1. 支持 Canvas,Sprite,ImageSet（图片帧存储于一张图片，等大小）</p> <p>2. ImageSetEx（自由摆放的图片帧于一张图片）*</p> <p>3. 支持对象无关键帧时使用静态属性进行设置，类似于HGE里的精灵</p> <p>4. 每个对象均可成为Container，并拥有Child Node</p> <p>5. 动画关键帧类型支持：缩放，旋转，位移，颜色，动画帧，锚点，音效*</p> <p>6. 支持拾取</p> <p>7. 基于XML存储的文件格式</p> <p>8. 基于<a href="http://squirrel-lang.org/">Squirrel</a>松鼠脚本的高速面向对象脚本*</p> <p>9. 图形系统Graphics抽象，适用于任何渲染设备</p> <p>10. 控件系统*</p> <p>11. 视频回放*</p> <p>所有对象均由RTTI创建，枚举均有NamePool+Hash，并由于PropertySet的反射系统</p> <p>&nbsp;</p></blockquote> <blockquote> <p>LemonComposer编辑器特性</p> <p>界面基于我去年开发的<a href="http://www.cppblog.com/sunicdavy/archive/2009/07/24/91059.html">MotionUI</a>，lua</p> <p>8+1控制点点对象调节属性</p> <p>类Adobe Flash的帧编辑。</p> <p>类3DS Max的分轨道关键帧编辑，有助于优化art assert</p> <p>自由调节对象层级及父子关系</p> <p>全功能无限制自由Redo,Undo</p> <p>&nbsp;</p></blockquote> <p>*将在未来版本支持</p> <p><a href="http://www.cppblog.com/images/cppblog_com/sunicdavy/WindowsLiveWriter/LemonComposer2D_D2B9/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/sunicdavy/WindowsLiveWriter/LemonComposer2D_D2B9/image_thumb.png" width="483" height="300"></a> </p> <p>&nbsp;</p> <p>&nbsp;</p> <blockquote> <p>2D游戏是独立游戏的主流，也是创意，投入比最小的一个维度。但是基于2D的大多是一些类似于HGE，IndieLib等开源免费2D引擎。但是面对游戏中大量的动画而言，开发者大多是使用图片帧来制作，虽然效果很好，但是设备资源好用和制作难度也是很难控制的。</p></blockquote> <blockquote> <p>流行于去年的植物对僵尸和2004年发行的<a href="http://www.verycd.com/topics/51268/">RO Offline</a>经过资源分析，就是使用类似于Lemon系统，或者说Flash的系统制作而成，因此效果和扩展性非常好。</p> <p>这就是Lemon存在的理由。</p> <p>Flash面向的是GDI+Web，那么Lemon就是针对游戏专有的，基于硬件加速的游戏框架</p> <p>Flash Action Script 对应的就是Lemon的<a href="http://squirrel-lang.org/">Squirrel</a>脚本</p> <p>FlashIDE 对应的就是Lemon Composer</p> <p>Lemon的目标就是让2D游戏开发更简单，让游戏中充满更多的动画, 让游戏开发难度降低</p> <p><a href="http://www.cppblog.com/images/cppblog_com/sunicdavy/WindowsLiveWriter/LemonComposer2D_D2B9/farming-gold-in-pvz%5B1%5D_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="farming-gold-in-pvz[1]" border="0" alt="farming-gold-in-pvz[1]" src="http://www.cppblog.com/images/cppblog_com/sunicdavy/WindowsLiveWriter/LemonComposer2D_D2B9/farming-gold-in-pvz%5B1%5D_thumb.jpg" width="244" height="196"></a></p></blockquote><img src ="http://www.cppblog.com/sunicdavy/aggbug/107257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2010-02-05 14:58 <a href="http://www.cppblog.com/sunicdavy/archive/2010/02/05/107257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断点在凸四边形中</title><link>http://www.cppblog.com/sunicdavy/archive/2010/01/08/105136.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Fri, 08 Jan 2010 02:29:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2010/01/08/105136.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/105136.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2010/01/08/105136.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/105136.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/105136.html</trackback:ping><description><![CDATA[<p>前几天需要做一个鼠标点击判定，具体是判断一个点是否在某个凸四边形中。</p> <p>最简单的方法莫过于判断鼠标点是否在2个三角形中。但是很多判定方法都是有问题的，比如说</p> <p>&nbsp;</p> <p>copy自IndieLib</p><pre class="csharpcode"><span class="kwrd">bool</span> Triangle2D::Inside2( <span class="kwrd">const</span> Vector2&amp; p )
{
    Vector2 v0 = mP3 - mP1;
    Vector2 v1 = mP2 - mP1;
    Vector2 v2 = p - mP1; 

    <span class="rem">// Compute dot products</span>
    <span class="kwrd">float</span> dot00 =  Vector2::DotProduct( v0, v0 );
    <span class="kwrd">float</span> dot01 =  Vector2::DotProduct( v0, v1 );
    <span class="kwrd">float</span> dot02 =  Vector2::DotProduct( v0, v2 );
    <span class="kwrd">float</span> dot11 =  Vector2::DotProduct( v1, v1 );
    <span class="kwrd">float</span> dot12 =  Vector2::DotProduct( v1, v2 ); 

    <span class="rem">// Compute barycentric coordinates</span>
    <span class="kwrd">float</span> invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
    <span class="kwrd">float</span> u = (dot11 * dot02 - dot01 * dot12) * invDenom;
    <span class="kwrd">float</span> v = (dot00 * dot12 - dot01 * dot02) * invDenom; 

    <span class="rem">// Check if point is in triangle</span>
    <span class="kwrd">return</span> (u &gt; 0) &amp;&amp; (v &gt; 0) &amp;&amp; (u + v &lt; 1);
} 

  
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p>Google出的某人代码 <pre class="csharpcode"><span class="kwrd">float</span> Triangle2D::CrossProduct3(<span class="kwrd">const</span> Vector2&amp; p1,<span class="kwrd">const</span> Vector2&amp; p2, <span class="kwrd">const</span> Vector2&amp; p0 )
{
    <span class="kwrd">return</span> (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
} 

<span class="kwrd">bool</span> Triangle2D::Inside( <span class="kwrd">const</span> Vector2&amp; p )
{
    <span class="kwrd">return</span> (CrossProduct3(mP1,p,mP2)*CrossProduct3(mP3,p,mP2)&lt;0) &amp;&amp;
           (CrossProduct3(mP2,p,mP1)*CrossProduct3(mP3,p,mP1)&lt;0) &amp;&amp;
           (CrossProduct3(mP1,p,mP3)*CrossProduct3(mP2,p,mP3)&lt;0);
} 
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p>&nbsp; <p>这2个方法都有缺陷，当点在三角形边上时，就无法得出。当用在一个正方形判断时，正方形中心点就判定为没有在其内部，显然是一个错误。 
<p>&nbsp; <p>之后，又Google出某几个大侠的算法和思想，考虑了下，判定点与四边形重心点的线段是否与四边形4条边相交，相交时，其在四边形外部，反之亦然。 <pre class="csharpcode"><span class="kwrd">bool</span> Quadrangle::Inside2( <span class="kwrd">const</span> Vector2&amp; p )
{
    Vector2 c = Segement2D::GetCrossPoint( mP1, mP3, mP2, mP4 ); 

    <span class="kwrd">return</span> !(Segement2D::Intersect( mP1, mP2, c, p) || 
           Segement2D::Intersect( mP2, mP3, c, p) ||
           Segement2D::Intersect( mP3, mP4, c, p) ||
           Segement2D::Intersect( mP4, mP1, c, p) );
} 

<span class="kwrd">bool</span> Segement2D::Intersect( <span class="kwrd">const</span> Vector2&amp; p1, <span class="kwrd">const</span> Vector2&amp; p2,<span class="kwrd">const</span> Vector2&amp; p3, <span class="kwrd">const</span> Vector2&amp; p4 )
{
    <span class="kwrd">float</span> gradab, gradcd, ycptab, ycptcd, interceptX, intercepty; 

    <span class="rem">// In order to avoid divisions by zero</span>
    <span class="rem">//if (mP1.y == mP2.y)</span>
    <span class="rem">//    mP2.y += 0.0001f; </span>

    <span class="rem">//if (mP1.x == mP2.x)</span>
    <span class="rem">//    mP2.x += 0.0001f; </span>

    <span class="rem">//if (seg.mP1.y == seg.mP2.y)</span>
    <span class="rem">//    seg.mP2.y += 0.0001f; </span>

    <span class="rem">//if (seg.mP1.x == seg.mP2.x)</span>
    <span class="rem">//    seg.mP2.x += 0.0001f; </span>

    <span class="rem">// Calculates the intersection between the two lines</span>
    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); 

    <span class="rem">// Checking in the intersection is inside the segment</span>
    <span class="kwrd">if</span> (!((interceptX &gt;= p1.x &amp;&amp; interceptX &lt;= p2.x) || (interceptX &gt;= p2.x &amp;&amp; interceptX &lt;= p1.x)))
        <span class="kwrd">return</span> 0; 

    <span class="kwrd">if</span> (!((intercepty &gt;= p1.y &amp;&amp; intercepty &lt;= p2.y) || (intercepty &gt;= p2.y &amp;&amp; intercepty &lt;= p1.y)))
        <span class="kwrd">return</span> 0; 

    <span class="kwrd">if</span> (!((interceptX &gt;= p3.x &amp;&amp; interceptX &lt;= p4.x) || (interceptX &gt;= p4.x &amp;&amp; interceptX &lt;= p3.x)))
        <span class="kwrd">return</span> 0; 

    <span class="kwrd">if</span> (!((intercepty &gt;= p3.y &amp;&amp; intercepty &lt;= p4.y) || (intercepty &gt;= p4.y &amp;&amp; intercepty &lt;= p3.y)))
        <span class="kwrd">return</span> 0; 

    <span class="kwrd">return</span> 1;
} 

Vector2 Segement2D::GetCrossPoint(<span class="kwrd">const</span> Vector2&amp; p1, <span class="kwrd">const</span> Vector2&amp; p2, <span class="kwrd">const</span> Vector2&amp; q1, <span class="kwrd">const</span> Vector2&amp; q2)
{
    <span class="rem">//必须相交求出的才是线段的交点，但是下面的程序段是通用的 </span>

    <span class="rem">/*根据两点式化为标准式，进而求线性方程组*/</span>
    Vector2 crossPoint;
    <span class="rem">//求x坐标</span>
    <span class="kwrd">float</span> tempLeft = (q2.x - q1.x) * (p1.y - p2.y) - (p2.x - p1.x) * (q1.y - q2.y);
    <span class="kwrd">float</span> 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;
    <span class="rem">//求y坐标</span>
    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; 

    <span class="kwrd">return</span> crossPoint;
}
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p>这个算法效率并不是很高，但对于设计器来说无所谓了，如果有好的准确算法，可以讨论</p><img src ="http://www.cppblog.com/sunicdavy/aggbug/105136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2010-01-08 10:29 <a href="http://www.cppblog.com/sunicdavy/archive/2010/01/08/105136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断点在凸四边形中</title><link>http://www.cppblog.com/sunicdavy/archive/2010/01/08/105135.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Fri, 08 Jan 2010 02:27:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2010/01/08/105135.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/105135.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2010/01/08/105135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/105135.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/105135.html</trackback:ping><description><![CDATA[<p>前几天需要做一个鼠标点击判定，具体是判断一个点是否在某个凸四边形中。</p> <p>最简单的方法莫过于判断鼠标点是否在2个三角形中。但是很多判定方法都是有问题的，比如说</p> <p>&nbsp;</p> <p>copy自IndieLib</p><pre class="csharpcode"><span class="kwrd">bool</span> Triangle2D::Inside2( <span class="kwrd">const</span> Vector2&amp; p )
{
    Vector2 v0 = mP3 - mP1;
    Vector2 v1 = mP2 - mP1;
    Vector2 v2 = p - mP1; 

    <span class="rem">// Compute dot products</span>
    <span class="kwrd">float</span> dot00 =  Vector2::DotProduct( v0, v0 );
    <span class="kwrd">float</span> dot01 =  Vector2::DotProduct( v0, v1 );
    <span class="kwrd">float</span> dot02 =  Vector2::DotProduct( v0, v2 );
    <span class="kwrd">float</span> dot11 =  Vector2::DotProduct( v1, v1 );
    <span class="kwrd">float</span> dot12 =  Vector2::DotProduct( v1, v2 ); 

    <span class="rem">// Compute barycentric coordinates</span>
    <span class="kwrd">float</span> invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
    <span class="kwrd">float</span> u = (dot11 * dot02 - dot01 * dot12) * invDenom;
    <span class="kwrd">float</span> v = (dot00 * dot12 - dot01 * dot02) * invDenom; 

    <span class="rem">// Check if point is in triangle</span>
    <span class="kwrd">return</span> (u &gt; 0) &amp;&amp; (v &gt; 0) &amp;&amp; (u + v &lt; 1);
} 

  
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p>Google出的某人代码 <pre class="csharpcode"><span class="kwrd">float</span> Triangle2D::CrossProduct3(<span class="kwrd">const</span> Vector2&amp; p1,<span class="kwrd">const</span> Vector2&amp; p2, <span class="kwrd">const</span> Vector2&amp; p0 )
{
    <span class="kwrd">return</span> (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
} 

<span class="kwrd">bool</span> Triangle2D::Inside( <span class="kwrd">const</span> Vector2&amp; p )
{
    <span class="kwrd">return</span> (CrossProduct3(mP1,p,mP2)*CrossProduct3(mP3,p,mP2)&lt;0) &amp;&amp;
           (CrossProduct3(mP2,p,mP1)*CrossProduct3(mP3,p,mP1)&lt;0) &amp;&amp;
           (CrossProduct3(mP1,p,mP3)*CrossProduct3(mP2,p,mP3)&lt;0);
} 
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p>&nbsp; <p>这2个方法都有缺陷，当点在三角形边上时，就无法得出。当用在一个正方形判断时，正方形中心点就判定为没有在其内部，显然是一个错误。 
<p>&nbsp; <p>之后，又Google出某几个大侠的算法和思想，考虑了下，判定点与四边形重心点的线段是否与四边形4条边相交，相交时，其在四边形外部，反之亦然。 <pre class="csharpcode"><span class="kwrd">bool</span> Quadrangle::Inside2( <span class="kwrd">const</span> Vector2&amp; p )
{
    Vector2 c = Segement2D::GetCrossPoint( mP1, mP3, mP2, mP4 ); 

    <span class="kwrd">return</span> !(Segement2D::Intersect( mP1, mP2, c, p) || 
           Segement2D::Intersect( mP2, mP3, c, p) ||
           Segement2D::Intersect( mP3, mP4, c, p) ||
           Segement2D::Intersect( mP4, mP1, c, p) );
} 

<span class="kwrd">bool</span> Segement2D::Intersect( <span class="kwrd">const</span> Vector2&amp; p1, <span class="kwrd">const</span> Vector2&amp; p2,<span class="kwrd">const</span> Vector2&amp; p3, <span class="kwrd">const</span> Vector2&amp; p4 )
{
    <span class="kwrd">float</span> gradab, gradcd, ycptab, ycptcd, interceptX, intercepty; 

    <span class="rem">// In order to avoid divisions by zero</span>
    <span class="rem">//if (mP1.y == mP2.y)</span>
    <span class="rem">//    mP2.y += 0.0001f; </span>

    <span class="rem">//if (mP1.x == mP2.x)</span>
    <span class="rem">//    mP2.x += 0.0001f; </span>

    <span class="rem">//if (seg.mP1.y == seg.mP2.y)</span>
    <span class="rem">//    seg.mP2.y += 0.0001f; </span>

    <span class="rem">//if (seg.mP1.x == seg.mP2.x)</span>
    <span class="rem">//    seg.mP2.x += 0.0001f; </span>

    <span class="rem">// Calculates the intersection between the two lines</span>
    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); 

    <span class="rem">// Checking in the intersection is inside the segment</span>
    <span class="kwrd">if</span> (!((interceptX &gt;= p1.x &amp;&amp; interceptX &lt;= p2.x) || (interceptX &gt;= p2.x &amp;&amp; interceptX &lt;= p1.x)))
        <span class="kwrd">return</span> 0; 

    <span class="kwrd">if</span> (!((intercepty &gt;= p1.y &amp;&amp; intercepty &lt;= p2.y) || (intercepty &gt;= p2.y &amp;&amp; intercepty &lt;= p1.y)))
        <span class="kwrd">return</span> 0; 

    <span class="kwrd">if</span> (!((interceptX &gt;= p3.x &amp;&amp; interceptX &lt;= p4.x) || (interceptX &gt;= p4.x &amp;&amp; interceptX &lt;= p3.x)))
        <span class="kwrd">return</span> 0; 

    <span class="kwrd">if</span> (!((intercepty &gt;= p3.y &amp;&amp; intercepty &lt;= p4.y) || (intercepty &gt;= p4.y &amp;&amp; intercepty &lt;= p3.y)))
        <span class="kwrd">return</span> 0; 

    <span class="kwrd">return</span> 1;
} 

Vector2 Segement2D::GetCrossPoint(<span class="kwrd">const</span> Vector2&amp; p1, <span class="kwrd">const</span> Vector2&amp; p2, <span class="kwrd">const</span> Vector2&amp; q1, <span class="kwrd">const</span> Vector2&amp; q2)
{
    <span class="rem">//必须相交求出的才是线段的交点，但是下面的程序段是通用的 </span>

    <span class="rem">/*根据两点式化为标准式，进而求线性方程组*/</span>
    Vector2 crossPoint;
    <span class="rem">//求x坐标</span>
    <span class="kwrd">float</span> tempLeft = (q2.x - q1.x) * (p1.y - p2.y) - (p2.x - p1.x) * (q1.y - q2.y);
    <span class="kwrd">float</span> 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;
    <span class="rem">//求y坐标</span>
    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; 

    <span class="kwrd">return</span> crossPoint;
}
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p>这个算法效率并不是很高，但对于设计器来说无所谓了，如果有好的准确算法，可以讨论</p><img src ="http://www.cppblog.com/sunicdavy/aggbug/105135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2010-01-08 10:27 <a href="http://www.cppblog.com/sunicdavy/archive/2010/01/08/105135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SilverLight的教学资源</title><link>http://www.cppblog.com/sunicdavy/archive/2009/12/30/104459.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Wed, 30 Dec 2009 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2009/12/30/104459.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/104459.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2009/12/30/104459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/104459.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/104459.html</trackback:ping><description><![CDATA[<p>中文社区：<a href="http://silverlight.cn/">http://silverlight.cn/</a></p> <p>微软官方中文MSDN：<a href="http://msdn.microsoft.com/zh-cn/library/cc838158(VS.95).aspx">http://msdn.microsoft.com/zh-cn/library/cc838158(VS.95).aspx</a></p> <p>微软官方英文MSDN例子：<a href="http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm#/?sref=HomePage">http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm#/?sref=HomePage</a></p><img src ="http://www.cppblog.com/sunicdavy/aggbug/104459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2009-12-30 16:45 <a href="http://www.cppblog.com/sunicdavy/archive/2009/12/30/104459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对SilverLight的初步了解</title><link>http://www.cppblog.com/sunicdavy/archive/2009/12/30/104457.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Wed, 30 Dec 2009 08:36:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2009/12/30/104457.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/104457.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2009/12/30/104457.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/104457.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/104457.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 最近研究2D动画系统，参考了Flash，也参考了SilverLight，不研究不敢写此博文</p> <p>&nbsp;&nbsp;&nbsp; 网上很多SilverLight和Flash比较的文章，常见的又是“Flash杀手”，“全新领域”之类的字眼。反观魅族M8和iPhone，也是这么写的。很明显都是“五毛党”的枪文，或者一些无聊小编简单的见解。</p> <p>&nbsp;&nbsp;&nbsp; 你见过SilverLight做的动画片么？ 这点不奇怪， SilverLight的核心是WPF，也就是Windows的下一代界面设计理念。早期的理念诸如：MFC， WTL，.Net。根据我研究看来，SilverLight的动画都是基于代码的，所以你不希望一部动画片是用纯手工方式编写代码来制作吧!</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; Flash是源自于<a href="http://zh.wikipedia.org/zh-cn/FutureSplash_Animator">FutureSplash Animator</a>，早期版本只是一个简单设计动画的编辑器，因为对帧需要控制，所以加入了<a href="http://zh.wikipedia.org/zh-cn/ActionScript">ActionScript</a>作为其控制语言。后期逐步发展壮大，记得2002年时，曾经见过有将视频格式导成swf格式进行播放，从此，这种技术渐渐发展成为现在流行的<a href="http://zh.wikipedia.org/zh-cn/Flash_Video">FLV</a>。以至于到现在强大的<a href="http://zh.wikipedia.org/zh-cn/RIA">RIA</a>。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 所以这么看来，SilverLight即便发展到SilverLight 4，也无法在动画方面超过Flash，除非添加一套类似Flash的动画编辑器。做动画，必选Flash，而且其可以跨平台，装几率非常高。不过做<a href="http://zh.wikipedia.org/zh-cn/RIA">RIA</a>，小受众群使用Visual Studio的强大工具搭配SilverLight/C#将会大大降低开发成本。</p><img src ="http://www.cppblog.com/sunicdavy/aggbug/104457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2009-12-30 16:36 <a href="http://www.cppblog.com/sunicdavy/archive/2009/12/30/104457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于XML的游戏UI架构设计（一）</title><link>http://www.cppblog.com/sunicdavy/archive/2009/06/08/87065.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Mon, 08 Jun 2009 06:01:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2009/06/08/87065.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/87065.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2009/06/08/87065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/87065.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/87065.html</trackback:ping><description><![CDATA[
<p>&nbsp;&nbsp;&nbsp;&nbsp;目前项目中使用Flash为主设计的UI，因为兼容性问题，Flash中编辑框虽然可以输入中文，但是光标是看不到闪烁的。经过仿佛研究发现，必须将d3d 的flash容器程序在后台时，才能显示光标，这一个测试结果让我们雷的不行。最终决定将flash拆解开，每个界面一个flash。但依然发现很多影响开发效率的问题。 
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.gbclip.com/"><span style="font-family:Arial; font-size:9pt">GameBryo</span></a>引擎中支持原生的C++ GAME UI，也支持直接播放flash，这部分（ScaleForm）使用的是以<a href="http://osflash.org/gameswf_library">GameSwf</a>为基础的手动解析flash文件，因此在编辑框等方面做的非常好。 
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;Flash的UI开发灵活度很高，底层库bug少，但是与现有工程结合难度大，因此仍然转向研究以XML为基础的UI库设计。 
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;这里推荐几个参考： 
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;WowBench： <a href="http://sourceforge.net/projects/wowbench/">http://sourceforge.net/projects/wowbench/</a>
	</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是魔兽世界的UI的模拟器，开源，可以从中了解魔兽世界的基本UI架构及API构成。同时，魔兽的lua脚本在安全性和开发度上做的非常好，这部分可以参考下。 
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;Mozilla XUL：<a href="https://developer.mozilla.org/En/XUL">https://developer.mozilla.org/En/XUL</a>
	</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是Mozilla战略中的一个重要组成部分，这套UI支持类似于wxWidgets或者HTML方式的排版</p><img src ="http://www.cppblog.com/sunicdavy/aggbug/87065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2009-06-08 14:01 <a href="http://www.cppblog.com/sunicdavy/archive/2009/06/08/87065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>腾讯界面库初探</title><link>http://www.cppblog.com/sunicdavy/archive/2009/06/08/87063.html</link><dc:creator>战魂小筑</dc:creator><author>战魂小筑</author><pubDate>Mon, 08 Jun 2009 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/sunicdavy/archive/2009/06/08/87063.html</guid><wfw:comment>http://www.cppblog.com/sunicdavy/comments/87063.html</wfw:comment><comments>http://www.cppblog.com/sunicdavy/archive/2009/06/08/87063.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/sunicdavy/comments/commentRss/87063.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunicdavy/services/trackbacks/87063.html</trackback:ping><description><![CDATA[
<p>&nbsp;&nbsp;&nbsp;&nbsp;腾讯新产品线：QQ2009, QQ 旋风2，QQ影音等都使用了非常漂亮的界面。一直以为是自己写的，毕竟QQ2009需要一个安全的环境以避免外挂的衍生。经过spy++探测，发现一个TXGuiFoundation，再在网上一搜，搜到了这个东西： 
</p><h2>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#333333; font-family:Segoe UI; font-size:16pt">DSkinLite: <a href="http://uieasy.cn/downloads.html"></a></span><a href="http://uieasy.cn/downloads.html"><span style="color:blue; text-decoration:underline">http://uieasy.cn/downloads.html 
</span></a></h2><a href="http://uieasy.cn/downloads.html"></a><p><a href="http://uieasy.cn/downloads.html"><img src="http://www.cppblog.com/images/cppblog_com/sunicdavy/060809_0535_1.png" alt="" border="0"></a>
	</p><p><span style="font-size:9pt; text-decoration:underline"><span style="color:blue">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#333333"><span style="font-family:Arial">&nbsp;Dskinlite </span>是一款轻量级的<span style="font-family:Arial">C++</span>皮肤库，使用<span style="font-family:Arial">XML</span>文件根据规则来管理<span style="font-family:Arial">GDI</span>资源如颜色，字体，图片，并描述界面构成，最大程度的将界面和程序逻辑分离，同时为软件皮肤更换，换色等提供基础支持。<span style="font-family:Arial">DSkinLite</span>将界面构成元素抽象为线条元素，矩形元素，图片元素，文本元素，并提供相应规则来使用这些元素<span style="font-family:Arial">"</span>组合<span style="font-family:Arial">"</span>界面。<span style="font-family:Arial">DSkinlite</span>开发团队有较深的<span style="font-family:Arial">Windows</span>界面开发的实际经历，对软件界面处理颇有心得，致力于将实用，高效，前沿的界面处理技术介绍给广大开发人员。<span style="font-family:Arial">
				</span></span><span style="color:blue">
			</span></span></p><p><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333"><span style="font-family:Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DSkinLite</span>与其他界面库相比有以下特点：<span style="font-family:Arial">
				</span>没有采用<span style="font-family:Arial">Hook</span>所有进程消息的方式，因此没有替换系统相关对话框。<span style="font-family:Arial">DSkinLite</span>只是采用<span style="font-family:Arial">MFC</span>，<span style="font-family:Arial">ATL</span>等<span style="font-family:Arial">framework</span>类似的方式，简单替换窗口过程，截取界面绘制等消息，对应用程序来说基本上是透明的。从这个方面讲，<span style="font-family:Arial">DSkinLite</span>是一款轻量级的界面库。<span style="font-family:Arial">
				</span>同时，<span style="font-family:Arial">DSkinLite</span>没有特别的<span style="font-family:Arial">Frameword</span>的依赖，可以在<span style="font-family:Arial">Win32</span>，<span style="font-family:Arial">MFC,ATL,WTL</span>等环境中使用。<span style="font-family:Arial"> DSkinLite</span>界面库使用<span style="font-family:Arial">XML</span>管理<span style="font-family:Arial">GDI</span>资源并配置窗口界面，用户可以方便的保持界面的一致性，同时可以很方便的构造出更多的窗口样式<span style="font-family:Arial">
				</span>界面库的高效性。<span style="font-family:Arial">DSkinLite</span>将专注于程序库的高效性，具体表现在内存占用，界面绘制速度，界面防止闪烁，程序加载图片资源、解析<span style="font-family:Arial">XML</span>文件的速度等方面，我们做了很多工作，并不断持续优化。以期望程序各方面表现最为高效的界面程序库。<span style="font-family:Arial">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DSkinLite </span>皮肤库的程序架构考虑到可能出现的界面特效，使得实现诸如透明，渐隐渐显，动画等界面特效变得更加容易，目前支持大多数控件的透明效果，后续会根据用户需求，开发更多的实用的界面特效。<span style="font-family:Arial">
				</span></span><span style="color:blue">
			</span></span></p><h3><span style="text-decoration:underline"><span style="color:#333333; font-size:10pt">使用<span style="font-family:Segoe UI">XML</span>配置控件的界面<span style="font-family:Segoe UI">
				</span></span><span style="color:blue">
			</span></span></h3><ul><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">使用<span style="font-family:Arial">XML</span>定义<span style="font-family:Arial">GDI</span>资源（颜色，字体，图片，<span style="font-family:Arial">cursor</span>）<span style="font-family:Arial">
					</span></span><span style="color:blue">
				</span></span></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">使用<span style="font-family:Arial">XML</span>配置控件的界面风格<span style="font-family:Arial">
					</span></span><span style="color:blue">
				</span></span></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">绘制元素被抽象为线条，文本，矩形，图片<span style="font-family:Arial">
					</span></span><span style="color:blue">
				</span></span></li><li><div>
&nbsp;</div><p><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333"><span style="font-family:Arial">XML</span>语法简单，易于学习和掌握<span style="font-family:Arial">
						</span></span><span style="color:blue">
					</span></span></p><p>&#160;</p><h3><span style="text-decoration:underline"><span style="color:#333333; font-size:10pt">其他关键特性<span style="font-family:Segoe UI">
							</span></span><span style="color:blue">
						</span></span></h3><p>&#160;</p></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">基于<span style="font-family:Arial">Win32 API</span>，没有<span style="font-family:Arial">framework</span>依赖。<span style="font-family:Arial">
					</span></span><span style="color:blue">
				</span></span></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">支持大多数标准控件<span style="font-family:Arial">
					</span></span><span style="color:blue">
				</span></span></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">支持改变皮肤色调<span style="font-family:Arial">
					</span></span><span style="color:blue">
				</span></span></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">支持大多数控件透明，包括子窗口透明<span style="font-family:Arial">
					</span></span><span style="color:blue">
				</span></span></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">支持动画效果<span style="font-family:Arial">
					</span></span><span style="color:blue">
				</span></span></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">支持<span style="font-family:Arial">png, bitmap, gif, ico</span>图片格式。支持带透明通道的<span style="font-family:Arial">png</span>图片<span style="font-family:Arial">
					</span></span><span style="color:blue">
				</span></span></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">支持将皮肤文件打包到一个文件<span style="font-family:Arial">
					</span></span><span style="color:blue">
				</span></span></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">支持<span style="font-family:Arial">Unicode </span></span><span style="color:blue">
				</span></span></li><li><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">支持<span style="font-family:Arial">Popup Menu</span>等，包括不规则的<span style="font-family:Arial">menu window </span></span><span style="color:blue">
				</span></span></li><li><div>
&nbsp;</div><p><span style="font-size:9pt; text-decoration:underline"><span style="color:#333333">支持滚动条控件，同时支持所有内置滚动条控制<span style="font-family:Arial">
						</span></span><span style="color:blue">
					</span></span></p><p>&nbsp;
&nbsp;</p><p>该网站还提到一个DirectUI的东西，这个东西是一种windowless的架构，具体概念类似于游戏中的UI，不依赖平台句柄，因此外挂只能截取诸如QQ基于ATL的外窗口，但是无法获取窗口内部的数据 
</p></li></ul><p>&nbsp;</p><img src ="http://www.cppblog.com/sunicdavy/aggbug/87063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunicdavy/" target="_blank">战魂小筑</a> 2009-06-08 13:36 <a href="http://www.cppblog.com/sunicdavy/archive/2009/06/08/87063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>