战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

#

QtPropertyBrowser2.5中的字符串属性对应的修改方式是一个输入框,OnValueChange是在每次键入字符时发送一次.这个对于编辑器需要的逻辑来说是一种灾难. Ogitor修改了其源码,解决了这个问题:

qteditorfactory.h 中

QtLineEditFactory类添加如下代码,红色标识

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中
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 &regExp);
    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;
}
 
这样既可在输入回车键,或者输入框失去焦点后产生一个OnValueChange事件
posted @ 2011-05-06 21:11 战魂小筑 阅读(2854) | 评论 (1)编辑 收藏

Git在网上炒的轰轰烈烈,很多人说它快,好,linux代码库都是用这个库,强大而有保证.

本人使用TortoiseHg 1.0 接近1年时间,感觉非常好.由于本人开发的引擎属于私人代码不开源,只希望在U盘及公司/家的电脑共享,因此一年前选择了TortoiseHg,一直使用至今. 今天有幸看到TortoiseGit终于有hack方法支持中文,而且GUI也做的跟SVN一样,适用了一下,但发现不能满足我的需求.

下面对比下TortoiseHg及TortoiseGit的优缺点

1. TortoiseHg安装简单方便,1个exe搞定(这里只考虑Windows平台)

    TortoiseGit相对麻烦点点,还需要外挂git. 这个对于SVN来说都没这样

2. TortoiseHg Commit速度超快,虽然很多人说Hg是python写的,但没感觉慢

    TortoiseGit Commit同样多的文件,GUI居然卡了没响应,单个文件Commit也卡很久

3. TortoiseHg在Commit时选择Ignore,会弹出很强大的IgnorePattern,这比SVN要方便很多

    TortoiseGit则是和SVN一样,可惜对于想忽略文件夹,还得自己手动打开ignorefile编辑

4. TortoiseHg远程共享可以直接使用TortoiseHg的webserver,只需一步操作即可,新版本(2.0) 支持SSH

    TortoiseGit的WindowsServer架设跟SVN一样麻烦

5. TortoiseHg 1.0里的多分枝合并问题很多,操作不当还会导致版本错位, 希望2.0能好一点

    TortoiseGit 支持Rebase,这点很不错

6. Hg支持直接Push到一个带.hg库的文件夹而无需任何的server,这是Git望尘莫及的

    虽然Git支持一些安全的令牌及密码,这点类似于SVN,但对于自己的代码,这些过程就显得过于强大而不方便了

转载请注明: 战魂小筑

总结: 本人的需求很简单,并且只是简单的使用TortoiseHg,不需要过多的功能. 这里没有贬低TortoiseGit的意思. TortoiseGit的强大更适用于专业大型团队及分散式开发,以替代SVN

posted @ 2011-04-10 23:47 战魂小筑 阅读(7048) | 评论 (4)编辑 收藏

  • Game Team
    • 国外AI和Audio程序员所占的角色还是很重要的, 而国内AI都是服务器在做, Audio基本上没有人下多少工夫
    • 美术的话TA越来越重要, 3D游戏开发不缺少
    • 另外, 项目管理也很重要, 程序员没有那么多精力去关注这些事情
  • Game Engine
    • 引擎的三个特性: 数据驱动, 可复用, 可扩展
    • 流派
      • 第一人称
        • 写实效果, 对于技术要求最高. 真实渲染, 高帧率, 物理模拟, 动画和高智能AI, 多人游戏支持
      • 第三人称
        • 卡通效果, 丰富的动作, 可交互场景
      • 格斗游戏
        • 大量的动作, 打击判定, 角色渲染, 皮肤/布料/毛发渲染
      • 竞速游戏
      • 即时战略
        • 地形支持. 复杂AI
      • 多人在线
        • 服务器, 图形效果要求低
      • 其他
    • 中间件
      • 游戏开发越来越多的使用到中间件, 没有哪一个引擎能把所有的部分做到极致
      • 现在的引擎更像是一个容器, 各种第三方插件整合到一起
      • 就国内现状来说, 用商业引擎的一般会再买几个中间件, 不然功能不全; 用自研引擎的要么找开源的, 要么自己做
      • 典型的几个中间件:
        • Lighting: Beast/Enlighten
        • Physics: Havok/PhysX/Bullet
        • Animation: Granny/Havok/Edge
        • AI: Kynapse/Xaiment
        • UI: Scaleform/Iggy
        • Video: Bink
        • Audio: fmod/XACT/Miles
        • Network: RakNet
    • Gameplay
      • 很多引擎是缺少这一层的, 可能OGRE的流行让大部分人觉得渲染引擎就是游戏引擎吧?
      • 除了渲染, 像对象系统, 事件系统, 脚本系统, AI等也是一个游戏引擎不可缺少的部分
    • Pipeline
      • 这才是一个引擎具有竞争力的地方, 因为它直接关系到一个游戏的开发效率
      • 对于一个引擎来说, 画面效果虽然重要, 但是pipeline比画面和效率更为重要
      • 游戏开发是个不断迭代的过程, 所以提高迭代的速度也意味着降低成本
      • 一个引擎, 不管什么都是围绕着"资源"来进行的
    • Tools
      • 版本管理
        • 最开始接触的是SVN. 当然, 不可否认这是开源免费的最佳代表, 用来管理代码还是不错的. 但是用它管理美术资源无疑是个效率很低的选择
        • Git/Hg, 相比SVN我觉得更好用一些, TortoiseGit是我现在的首选. TortoiseHg用了一段时间, 跟TortoiseSVN的操作习惯差别太大, 而且界面还是python的, 不太习惯
        • Perforce, 商业解决方案. 效率的确高(特别是美术二进制资源), 插件(VS/Max/Maya/PS)也不错. 从SVN转过来后老是对它某些细节有点不爽, 因为它不会主动对比文件差异, 这也是它为什么速度快的原因-_-
      • Profiling
        • VTune/CodyAnalyst是两上程序用的工具. 最近发现VS2010自代的也相当好用, 不做汇编级的分析的话完全够用了
        • PerfHUD/PIX/GPA: NV现在感觉对PerfHUD支持的少了. PIX如果程序写法不标准会分析不了. GPA现在是越来越好用了, 要是把PIX的一些功能也吸收过去就更好了

转载自: 逍遥自在的CSDN博客 http://blog.csdn.net/xoyojank/archive/2011/04/10/6313422.aspx

posted @ 2011-04-10 21:41 战魂小筑 阅读(1869) | 评论 (0)编辑 收藏

   Gizmo可以理解为坐标轴,就是3D软件里3个轴并可以调整对象的各种变换属性的东西.

    绘制Gizmo其实很简单,这里只说箭头的绘制中的一些技巧.一开始我的做法是MAX里建模,如图

image

然后创建3个模型对象,以Z为父级(我的坐标系是Z朝上), X,Y分别挂接Z节点

按照Ogitor中的介绍,需要将Z关闭绘制,结果,绘制顺序有错误

image

正确的效果应该是蓝色(Z轴,朝上)盖住绿色的Y轴.

这就涉及到X,Y,Z轴模型在Z关闭后的绘制顺序,需要通过检查对象的位置,按照从远到近的顺序进行绘制.

但是一开始每个轴的单位坐标都是在箭头的下部,因此,怎么旋转摄像机,都只能出1个绘制顺序.这就是问题所在. 因此,决定重新修改箭头的本地坐标系,调整为下图所示

image

MAX中,将箭头作为本地坐标原点, 并修改排序算法,对Z关闭后的对象按照画家算法排序,如图:

image

绘制效果正确.

解决这个问题时,我查阅了Ogitor代码,并在Ogitor编辑器资源里找到了箭头资源,但是代码中并没有用到这个资源,而是改用

AxisGizmo::createMesh(Ogre::SceneManager *manager, Ogre::String name)

函数用代码方式创建Gizmo,估计也是和我碰到一样的问题吧

posted @ 2011-03-11 19:06 战魂小筑 阅读(1922) | 评论 (0)编辑 收藏

从XP开始,多出了一套叫ApplicationData的目录,由于是NT内核及多用户的引用,因此在没有管理员权限的帐号打开安装过的程序时,应用程序是无法写入自己的目录的,因此早期的一些程序会因此遇到一些故障.

解决这个问题的方法是获取ApplicationData的目录位置,根据自己应用程序的名称创建配置文件.

这些网上都能搜到,主要是使用SHGetFolderPath的API,这里要说下 int csidl这个参数的几个区别:

CSIDL_COMMON_APPDATA   所有用户都可以使用的应用程序配置,映射All Users\Application Data

CSIDL_APPDATA                指定用户使用的应用程序配置,并且可以通过域同步漫游的,映射<user name>\Application Data

CSIDL_LOCAL_APPDATA      本机使用,不能漫游的应用程序配置,映射<user name>\Local Settings\Applicaiton Data

另外,由于这些路径使用起来并不方便,因此一般我们还是习惯在应用程序下存储配置文件,这就涉及一个检测是否应用程序文件夹有写权限的问题.

我尝试过:

int _waccess( 
   const wchar_t *path, 
   int mode 
);
  MSDN里说这个函数可以用于判定一个文件夹是否有写权限,但是实际测试中,这个函数对于有权限控制的文件夹毫无作用,始终返回可写.
  因此,最笨的方法,依然是直接在应用程序目录下创建一个临时文件,创建成功说明可写,然后再删除这个文件(好恶心的方法).不过话又说回来,这是C时代的函数,应该不会做太多平台相关的判断.
 
posted @ 2011-03-09 16:38 战魂小筑 阅读(2568) | 评论 (0)编辑 收藏

程序员的3种美德: 懒惰、急躁和傲慢(Laziness, Impatience and Hubris)

Laziness

The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful, and document what you wrote so you don't have to answer so many questions about it. Hence, the first great virtue of a programmer, Also hence, this book.

懒惰:

是这样一种品质,它使得你花大力气去避免消耗过多的精力。它敦促你写出节省体力的程序,同时别人也能利用它们。为此你会写出完善的文档,以免别人问你太多问题。

Impatience

The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to. Hence, the second great virtue of a programmer.

急躁:

是这样一种愤怒——当你发现计算机懒洋洋地不给出结果。于是你写出更优秀的代码,能尽快真正的解决问题。至少看上去是这样。

Hubris

Excessive pride, the sort of thing Zeus zaps you for. Also the quality that makes you write (and maintain) programs that other people won't want to say bad things about. Hence, the third great virtue of a programmer.

傲慢:

极度的自信,使你有信心写出(或维护)别人挑不出毛病的程序。

 

转自http://blog.csdn.net/arbuckle/archive/2007/01/05/1475009.aspx

 

上面3点越是厉害,说明你的程序员功力,火候不浅.对, 好程序员就是很认真很仔细的

posted @ 2011-02-14 22:33 战魂小筑 阅读(2462) | 评论 (5)编辑 收藏

http://pinnawhite.com/weblog/?p=2145

世界游戏革命

介绍日本游戏开发与美国的区别,片中你能见识全世界游戏开发方式及工作环境和理念,做游戏开发的童鞋不能错过这个视频

posted @ 2011-01-15 21:30 战魂小筑 阅读(963) | 评论 (1)编辑 收藏

Qt下的属性控件QtPropertyBrowser在Google中资料很少,而且在很多介绍的文章里的下载地址都指向了QtMobility,这个东西跟非手机平台没有太大关系。找了很久,发现在http://qt.nokia.com/downloads页面的右下角有一个FTP链接:

ftp://ftp.qt.nokia.com/

提示也写着在这里可以下载到以前的一些Qt包

在里面终于可以找到qtpropertybrowser-2.5_1-opensource.zip

下载后,用VisualStudio的Qt插件打开pro,有例子有设置好的工程,还愁文档么,呵呵

posted @ 2010-12-31 22:36 战魂小筑 阅读(4853) | 评论 (1)编辑 收藏

这里使用的是VC2008编译exe,其中要链接VC2005编译的静态库,编译,链接都无问题。运行后出现无法找到Manifest问题。按照传统,查看用户机是否使用FAT32格式分区,勾选解决FAT32选项依然无效。屏蔽新链接库,运行又正常,所以问题出现在静态库本身。但是静态库编译时无法关闭和控制Manifest。

Google之,找到这样一篇文章

http://connect.microsoft.com/VisualStudio/feedback/details/362837/migrating-from-microsoft-vc80-crt-manifest-to-microsoft-vc90-crt-manifest

突然想到,静态库编译器与exe编译器不统一,马上重新使用2008编译静态库,问题解决

 

总结:

VC6时期没有Manifest,那个时候编译出的lib都可以给现在的编译器用,2003也勉强,但是2005还没做完善,2008就是2005的大补丁,所以以后库用2008编译都应该没有问题

posted @ 2010-11-22 12:05 战魂小筑 阅读(2502) | 评论 (7)编辑 收藏

调试中总会遇到这样的情况,比如,需要调试一个被另外一个进程启动的程序。最简单的方法莫过于直接在IDE中Attach到进程,但是这样的方法做一次还行。要是一直需要调试,编译后需要再调试,就会让你抓狂。

平时安装有VC IDE的机器一定会碰到这样的情况:如果程序有crash,会弹出一个JIT的调试对话框,询问使用何种调试器进行调试。这种情况同样会出现在使用dump文件时。这个对话框也是我们今天需要用到的。

如果需要调试一个被另外进程启动的进程,那么需要让这个被启动的线程能启动调试器,方法如下:

假定我们需要调试的应用程序名称为myapp.exe

 

1. 打开注册表

2. 在HKEY_LOCAL_MACHINE\Software\Microsoftware\Windows NT\CurrentVersion\Image File Execution Options中寻找myapp.exe文件夹

3. 如果这个文件夹不存在,那么就新建一个,例如:myapp.exe

4. 在文件夹里新建一个字符串键,名称为debugger,值为vsjitdebugger.exe

5. 如果使用的不是VC调试器,那么需要在环境变量中添加这个exe的启动路径

 

运行你需要被调试的程序试试吧,爽了吧!

 

转载请注明此文来自 战魂小筑博客 http://www.cppblog.com/sunicdavy

posted @ 2010-11-16 21:22 战魂小筑 阅读(2673) | 评论 (4)编辑 收藏

仅列出标题
共26页: First 9 10 11 12 13 14 15 16 17 Last