战魂小筑

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

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

#

前段时间试用Windows 7,安装了vs2008的90天试用版,结果到期提示了。使用网上很多的方法来尝试输入正版序列号,但就是在卸载模式中无法找到序列号输入框。

    今天回到XP时,发现了同样的问题,把Google都查倒了,最后终于找到一位大侠贡献的方法

http://blog.sina.com.cn/s/blog_57b5da120100gk7l.html

其实那个输入框一直都在那,只不过被隐藏了(可能是某个Windows补丁)

用文中提供的代码就可以找回输入框

非常感谢这位大侠!

posted @ 2009-12-17 22:47 战魂小筑 阅读(765) | 评论 (0)编辑 收藏

     最近和几个朋友讨论怎样降低游戏开发难度,提高游戏开发速度以及可视化结构化的游戏开发方法

     虚幻是在高级游戏开发工作流中做的比较好的一个,一整套可视化开发工具及强大的虚幻脚本让3D游戏的开发难度大大降低。其脚本可以方便的调用引擎中的native函数,当然也为游戏的特殊结构提供了诸如state的功能,处理状态,阻塞逻辑等只有游戏才有的复杂逻辑

     可以说,虚幻为游戏而设计,又有成熟的商业游戏用例,因此虚幻是游戏开发的方向。

     回看2D游戏开发,其实最方便,最系统化的还是使用Flash,或者Silverlight。这些工具都是提供了一套方便的IDE,可以可视化的做动画,并且与代码整合。

     但是以上这些开发,都或多或少使用的是传统的过程式串行编码方式来描述一个并发执行事件的游戏,因此开发难度还是很大的。

     回想起我专业里学过的PLC(可编程逻辑控制器),一堆可以控制的继电器的逻辑组合就可以做出各种复杂霓虹灯逻辑或者电梯逻辑等。

     本人原来所在项目中负责一个任务系统。但是boss不允许用任何第三方库,无奈只能自己实现,一开始我就使用了触发器架构,每个对象都可以出发不同的触发器,然后是自己实现的简单脚本,用C++解析脚本来读入触发器。对于策划,可以很快速的构建一个任务,唯一的缺点,就是有点绕

     使用触发器的地方还很多,暴雪的即时战略,基本都是用了触发器结构,星际争霸,魔兽争霸3。魔兽争霸3中的触发器可以说是遍地都是,无需编程,只需要按照系统给你提供的一些字段,比如说 当 矿 小于 XX 点时, 执行 撤离。这些游戏系统中的人物,都清一色的使用触发器。

     虽然魔兽世界的代码没有泄漏,但是魔兽的服务器的模拟代码中描述的任务,就是用一堆数字的触发器在运行

    因此,触发器对于提高游戏开发效率有很大的帮助,使用XML结合自己的系统,就可以写出一套结构化的基于触发器游戏系统。

posted @ 2009-12-17 17:46 战魂小筑 阅读(2085) | 评论 (1)编辑 收藏

最近写代码时,碰到一个有趣的C++类拷贝问题:

 

class Base
{
public:
    std::string memberA;
};

class Child : public Base
{
public:
    Child( const std::string& v ){ memberB = v; }
    std::string memberB;
};

 

Base* a = new Child( "a" );

Base* b = new Child( "b" );

 

需要将 b类的基类及子类的所有成员函数拷贝给a类

注意:

1. Base和Child都有动态数据,不能用memcpy哦

2. 拷贝代码请写在Base或Child中,不要写在类外

3. 成员变量的数目不一定时,怎样才能做到最省力?( 不必把每个类的成员变量都=下)

 

C++的反射特性不是很好,这个问题在动态语言里是迎刃而解

各位有什么好的方法?

posted @ 2009-12-16 16:54 战魂小筑 阅读(472) | 评论 (1)编辑 收藏

    最近将代码调整为release版时,碰到这样一个奇怪的错误:直接运行程序,还没有进入main入口时就宕掉。这个exe工程链接过一个公用的静态库和一个底层功能的静态库。在debug版完全没有问题。

    随即开始隔离代码分析,当隔离到一个继承公用静态库时,隔离后不会宕机。这表示静态库与exe之间的链接出了一些问题。再次观察挂掉的地方显示streambuf一类的东西,这是包含在iostream里的东西,继续点击堆栈向上跟踪。结果在wcout.cpp里发现了

__PURE_APPDOMAIN_GLOBAL static wfilebuf wfout(_cpp_stdout);

所有问题迎刃而解,应该是恶心的iostream的静态变量,在多重静态库链接时的错误,导致exe启动,CRT为其分配内存时的宕机。马上屏蔽所有使用过wcout及iostream的所有代码。release版正常运行,不再宕机

posted @ 2009-11-11 16:49 战魂小筑 阅读(742) | 评论 (4)编辑 收藏

    Windows 7 已经发布了,不过我在几个月前已经开始使用。实在是不喜欢Vista,因此直接跳过使用了win7.总体感觉还是不错,现在来说下Windows 7的使用感觉。

    如果用过Vista,那么Windows 7只能说是方便了,而不能说是漂亮了。但是如果直接从XP过来,那么就会感觉Windows 7非常漂亮。Windows 7的驱动兼容性很好。我家里2005年的BenQ本子所有驱动,包括读卡器都可以通过自动更新找到。另外,程序兼容性也没有那么夸张,基本上大部分的程序都可以兼容,特别是兼容Vista的,基本都可以跑在Windows 7下。即便不能兼容的程序,就像当年98/2000到xp一样,调节下兼容性就可以了。

    如果你使用Windows 7来工作,那么恭喜你,Windows 7的使用效率是很高的。还在XP的3大页开始菜单中找Visual Studio么?还在调节控制面板到98时代的经典菜单,一个一个的找防火墙么? 只需要在开始菜单里输入你要找的东西,很快就可以找到这些功能。

    虽然Windows 7的jumplist是抄袭MacOS,但转过来想想,Windows本身何不是从Mac抄袭过来的呢?除了jumplist,还有一个功能也许一般很难被发现:用鼠标中键点击任务栏,可以启动这个程序的新实例。这个对于Chrome这种多进程浏览器来说实在是很方便的事情。

    工作中,公司还在使用VS2005,但是第一次使用,不小心习惯性的调整到了兼容XP模式,结果不管是IDE还是编译器,一直报错。后来查过网站后,才发现,VS2005绝对不要在Windows 7下打开兼容性。

    另外,很多VPN由于Vista以上系统的安全性问题,都不能在Windows 7下使用了。另外让公司配机器又很麻烦,这时最好的方法就是装一台虚拟机:VMWare+ xp,20分钟装完就可以使用了。比Windows 7自带的那个要求低多了,而且还可以在里面跑DX一类图形程序,比远程桌面方便多了

posted @ 2009-10-27 10:32 战魂小筑 阅读(563) | 评论 (0)编辑 收藏

今天qq某大侠问我,为啥他的代码会crash

char* pdata = new char(14245);
::memset( pdata, 0, 14245 );

我马上运行代码,结果果真是Access Violent。

之后试过malloc都没有问题

随机我把这段代码删除,过了几分钟后,我按照记忆,重新写下代码

char* pdata = new char[14245];
::memset( pdata, 0, 14245 );

结果不crash了。细细一看
 
 
 
 
 
 
为啥要调用char的构造函数传入14245的参数呢?这样只能new出来1个字节,但是memset又写了14245个字节,不挂才有鬼了
之后问过很多人,基本都没看出来,可见这个写法极其骗人
posted @ 2009-09-03 16:10 战魂小筑 阅读(1266) | 评论 (3)编辑 收藏

Game Maker的开发风格与Action Game Maker截然不同。

Action Game Maker(以下简称AGM)

走的是日本游戏的细节与专业的路线。AGM着眼于ACT,ARPG,STG等类型游戏的开发,并有这些游戏提供专业的游戏开发模板。

 

 

1

 

这个工具提供了一个2D动作游戏所需要的所有工作流(Work Flow)

1. 导入原始素材图片

2. 转换原始图片为动画帧

3. 将动画帧与角色状态绑定

4. 制作背景,并关联背景之间的联系

5. 放置角色,设定角色状态之间的转换

6. 布置敌人

 

 

 

2 

 

更为强大的是,AGM可以将游戏导出为XNA格式以及Adobe Flash文件

整个制作过程无需编写任何一行代码,但是游戏制作的种类和创意以及操作受限

这个设计工具更适合同人爱好者以及非程序员

 

Game Maker

image

 

    这个工具的设计思想可以说是很程序员化的。设计的流程莫过于

1. 导入素材为Sprites

2. 创建不同的Object,并为之连接各种Sprites

3. 创建Rooms,这就是游戏场景,所有的Object都可以放置在这些Rooms里

4. 每个Objects没有状态,只有各种事件,响应这些事件并作出必要的操作即可

    使用中,可以说Game Maker 对于程序员来说更容易理解,要做出一个简单demo也很容易。但是GameMaker由于没有具体的游戏设计模板,因此要设计一款RPG,ARPG等等特殊种类的游戏就变得异常艰难,设计者得首先在这个工具上搭建一套自己游戏类型的平台,然后再在上面进行开发。

    GameMaker可以选用自己的脚本进行编程,也可以完全使用图形化的工具。因此可扩展性还是很强的

    GameMaker甚至支持3D,可以制作简单的3D游戏

 

Adobe Flash

     这是不得不提的游戏设计强大工具。虽然这款软件在制作之初是为动画设计的,但是随着后期变化需求的需要,加入了Action Script。之后,软件的基本设计模式没有变化,每个对象都可以拥有n帧,你可以在每一帧上书写代码或者添入动画,对于游戏这种充满动画和图片的东西来说,Flash无疑展现了其强大的一面。

     随着Web Game的流行,Adobe Flash的Action Script 3中加入了对Raw socket的支持,这样C++以及其他开发语言就可以通过Socket与Flash进行通信。

     Adobe Flash拥有强大的多边形碰撞,多边形布尔/遮盖运算。基础UI支持,以及可以调试的脚本,完备的网络库,基于反射的XML支持

     同时,Flash也拥有一些开发单机游戏的问题:不能从自定义包里加载,资源控制等等问题

     因此,我想出一套非常好的Flash开发游戏架构,声明,在此之前并未参考/接触过任何web game或者flash game的架构。

     1. Flash选用完全对外通讯模式,不使用读取本地配置

     2. 自己写一套基础数据服务器,将本地二进制包读取的图片及配置文件以网络方式发送给flash

     3. 当然,对于部分的图片,可以选用FMS做架构,其他功能自己的服务器做补充即可

     4. 稍加修改,这个架构就可以变成通用的网络游戏架构

 

对于商业休闲网络游戏来说Flash无疑是最好的选择,越来越多的开发者选用Flash作为开发工具

posted @ 2009-09-01 15:38 战魂小筑 阅读(5758) | 评论 (0)编辑 收藏

        游戏开发到现今,已经进入到一种固定模式与创意挣扎的阶段。Activision Blizzard 刚刚超过EA成为全球最大的游戏制造商,再看下我们周围的这些所谓的大作,无非就是版本号更高一些,画面更好一些,然后将其他游戏热门的创意进行大抄袭意外,几乎依然保留着最初版本的痕迹和基本玩法。然后,有一些开发者,依然坚持创建自己的游戏,按照自己的意图去设计全新的游戏,独立游戏概念就此出炉。

        说到独立游戏,其实可以被称作是“小游戏”,这些游戏为了快速实现游戏原型,一般都使用高级的游戏开发工具,比如说RPGMaker, GameMaker, ActionGameMaker等等。这些工具其实最早的鼻祖,在我认为,莫过于星际争霸的编辑器,一个完全不需要编程就可以实现游戏创意的工具。最近,星际争霸2介绍游戏编辑器的视频放了出来,世界瞬间震撼了。一个RTS游戏的编辑器,居然连射击游戏都可以制作,虽然在魔兽争霸3的编辑器中已经可以实现类似于跑跑卡丁车这类游戏。

       依然游戏很多开发者认为,那些开发工具都是为不会编程的玩家实现的。包括我在内,也是这样认为的,因为我们追求的目标并不一样,一个是追求游戏设计的乐趣,一个是追求代码编写的快乐以及高可定制性等。

       使用现成的游戏开发工具固然简单,但是学习的过程以及这些工具的限制,更恐怖的莫过于这些工具的BUG(类似于GameMaker中浮点数的精度问题)都让我重新考虑传统游戏开发。但同样我会面对更多的问题:

1. 一个好的基于Windows的引擎,最好是DX9硬件加速

2. 基于位图的字体,带编辑器的粒子,GUI以及控制系统组件

3. 轨迹控制,动画帧控制,可定制的多边形碰撞系统

4. 能使用脚本,更有类似于Unreal系列的对象脚本技术,支持脚本暂停,并可调试

5. 一个非常棒的开发环境以及能让所有组件都可以扩展的系统

也许是我要求很高,至今为止,没有哪个引擎能支持的那么好,又免费。顺便说下评价下几个C++图形引擎

HGE:

1. 使用DX8,很多DX9特性不能完全支持,例如很多DX9的API,HLSL等,虽然这些看似在2D里用处不大

2.低效的zip读取机制。zip的文件读取以及查找居然采用字符串比较,也就是attach的zip越多,查找速度越慢

3. 粒子系统带有编辑器,这点很不错,而且效果也还可以

4. 字体要提出批评,这点做的太差了

5. 原始版不支持unicode,使用hge社区里某大侠提供的unicode版本后,做国际化方便多了

6. 纯粹简单游戏引擎,做下猫猫狗狗的差不多,做复杂的格斗的话,很费力

 

SexFramework(Popcap游戏引擎)

1. 使用DDraw,古老而又稳定的技术,在植物对僵尸的游戏里,明显看到,当物体过多时,渲染速度急剧下降。当然这里我觉得应该是这个游戏大量使用flash造成的吧(猜测)

2. 支持后台加载,这点需要大量加分。看到很多Popcap游戏边播放动画边加载吧?

3. 支持专门的包读取,api有点像c风格io库

4. 因为商用,所以可以信赖,别忘记,还支持flash哦

 

IndieLib(可以在我的博客前面的文章找到)

1. 统一的C API,简洁,漂亮,便于与.net结合做编辑器

2. 硬件DX9加速,比HGE好多了,而且数学库清一色使用D3DX,更是快的一塌糊涂

3. 支持多边形碰撞检测,以及XML定制的动画帧

4.支持2d缩放,这个技术让游戏可以变的很酷

5. 没有支持压缩包读取,但是从代码上看,加的话应该不困难

6. 没有粒子支持,即便有,也没有编辑器支持,就这点就很严重了

 

各位如果有的2d引擎库,也请推荐下

 

Game Virtual Machine

      之所以要提出这个概念,主要是建立在游戏的本质其实也是与网页很接近的。

       纵览网页的开发模型,不难看出这部分已经是很成熟的了。例如:ASP可以自动将你的标记过的代码编译成客户端或者服务器的版本。自动排版引擎的概念彻底推翻了微软以左上角像素的对象显示方式。一个网页,支持各种脚本扩展以及Flash这种RIA应用

      游戏,如果仅仅按照类型来做限定时,GameMaker,RPGMaker这类工具已经能将游戏开发的概念抽象成一些步骤以及参数。但问题是,要使用这些工具来制作一些并不常见的游戏类型时,可能见变得非常难,当然这点上,GameMaker要做的好一些,这个工具使用了很多类似于脚本图形化技术,说白了,底层仍然是它的脚本,只不过经过一层图形化工具的封装后给你使用而已。

     我所设想的GameVirtualMachine是这样的:

 

建立于游戏指令系统之上

       传统的游戏都是建立在虚拟机基础上,这样做的好处就是很灵活。但同时这也造成了程序员为了实现一些游戏中的逻辑关系,硬生生的使用OO这种概念来模拟另外一个概念。这样做导致了游戏代码难于理解。

        很现实的一个例子就是C++的反射问题。C#中将反射做到了编译器以及Runtime层,这让开发者们一门心思的进行程序设计,虽然有一些性能损失,但是对于很多C++项目不停不停的造反射这个轮子来说明显是值得的。

       这套指令系统有一些基本指令,这些基本指令类似于一个脚本系统基本的运算以及流程控制等等。

简化游戏逻辑编写

       建立在指令系统上的优点是很明显的。指令系统底层运行着游戏虚拟机,其可以对指令的运行进行控制以便实现,让精灵走到哪个位置,停一会再走到哪个位置的等一系列流程的操作。这些操作对于传统裸写游戏来说,不知道要写多少次计数器,计时器。

直观而简单的调试

        因为不使用脚本语言,调试变的异常简单,甚至于,玩家想知道游戏怎么运行的,只要打开一个GVM的调试器就可以看到诸如

              move_sprite_to   xxx, xxxx

              attack_enemy xxxx,xxx

可扩展性

      为了制作通用游戏,这套指令是可以被扩展的。例如精灵控制子集,地图控制子集等等

      指令集着眼的是对象,流程以及逻辑控制。而指令集的实现就是与底层API的交互过程。

      如果你说现在编辑器不能实现一个飞龙随机飞舞并由玩家控制吐火的逻辑时,你便可为这个游戏编写一些随机飞舞,吐火的指令,底层实现完全依赖于一些API。

      创建指令的目的,就是让游戏的操作变成一种组件开发的接口创建工程。让更多的玩家可以为游戏逻辑互相编写,共享代码

     创建指令的同时,你写的指令代码其实就是新的VM代码。GVM系统会将你的VM代码与其他VM代码一起在游戏中运行

编辑器可实现性

       游戏不难做,难做的编辑器。编辑器里最直接的功能就是需要UNDO/REDO,这可以让设计者在设计重新设计之间反复选择。因为所有操作都是基于指令的。

     其实所谓的编辑器,也就是一个脚本生成器。诸多的按钮,ComboBox等等其实都是低效的,但是对于不会编程,或者需要快速开发的玩家来说,GUI是唯一的选择。当然,如果在某些部分需要特殊逻辑时,就可以与指令混合编写

跨平台性

       VM的特性已经被广为使用。从浏览器到Android手机操作系统,乃至OS。因此,GVM也是可以跨平台的。只需要在每个平台下实现一些平台相关的模块就可以

posted @ 2009-08-26 20:42 战魂小筑 阅读(874) | 评论 (5)编辑 收藏

    C++中使用delete进行单个对象的析构及内存删除,使用delete[]进行对象数组的析构及内存删除

    记得某次友人层说过,delete[]在Windows平台上都是用HeapFree来实现的,因此delete[]和delete来删除对象数组时都是一样的。之后我也参考过很多的内存管理器及new/delete重载实现,基本都是这个道理。

    最近突然发现,如果是对象数组的话,使用delete确实能删除内存,但是对象数组中的每个对象的析构就不能被调用了。幸好平时一直都还是保持良好的C++习惯,一直使用delete[],并且使用new[]大部分是char类型,不需要析构

posted @ 2009-08-20 18:22 战魂小筑 阅读(869) | 评论 (3)编辑 收藏

      安装Windows 7 RTM 7600.16385。从XP,Vista到7,Windows系统一直保持着清一色的无聊,纯本地应用。最多只是美化界面而已,虽然有部分细节修改,但是打开文件通用对话框被各种shell做的臃肿不堪,因此,xp仍然是王道

      很多人喜欢将东西放在桌面,这倒也符合工作习惯,但是经过长时间后,桌面会变得凌乱不堪,虽然Windows过段时间会有自动桌面清理,但也仅仅是将文件放置在桌面的一个文件夹中。为什么不学下qq mail里的中转站,7天后都使用后自动清理?而且win2000里的动态桌面到了后面的版本就取消了?为什么不能这些功能放到web上?这样做对于家用确实会很方便

     还有就是最严重的Windows Media Player,将一文件夹拖入居然不能播放这个文件夹。建立好一个播放列表后,仍然不能拖入文件夹,真不知道MS的开发者平时用不用这个软件。。

posted @ 2009-08-17 10:46 战魂小筑 阅读(487) | 评论 (0)编辑 收藏

仅列出标题
共26页: First 18 19 20 21 22 23 24 25 26