"game" via 柠檬杀手 in Google Reader |
Posted: 21 Aug 2008 10:51 AM CDT 自上次有传闻Xbox360将于9月7日继续降价后,近日又有新的证据来证实该传言。据泄露出来的美国电器卖场RadioShack的传单显示,120G版的Xbox360精英版主机将降价至399.99美元,无硬盘版的价格为199美元,与此前的传闻也相符。 不过微软和RadioShack尚未证实次传单的真实性,不过现在离9月7日也不远了,是否降价届时便可知。 标签:Xbox360, 谣言工厂, 降价相关日志
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 10:07 AM CDT
这篇文章转自偶然的blog:http://show.xoyo.com/ouran/article/459579.shtml
所有代码都测试过,非常好用。有问题可以留言,尽力帮你解答。
在网上搜了半天也没有找到一篇合格的讲解用ODBC连接mysql数据库的文章 为啥不合格,因为我想要做一个很简单的基于对话框的应用程序,而网上大多讲的是基于SDI也就是单文档的 其次因为连接的是mysql,而网上大多是讲跟access连接的例子 好了,废话不说了,下面我就来说说我是咋做的,有不对的地方还请指出,大家互相学习。下图是程序的最终效果,包含了数据的显示,添加,修改,删除这几项数据库操作的常用功能。 我的调试环境是xp,mysql版本是mysql4.0.23 1.安装Mysql的ODBC驱动 从http://www.mysql.com上下载驱动程序 地址:http://dev.mysql.com/downloads/connector/odbc/3.51.html#win32 我是下载的Windows ZIP/Setup.EXE 下载到本机之后从zip包中解压出setup.exe文件,双击安装,没什么可说的,完全的傻瓜式安装 2.设置ODBC数据源 配置MySQL的ODBC数据源有两种方法 第一种:手工设置 比较麻烦,但是确是比较安全的办法。 步骤如下: 开始 -> 控制面板 -> 管理工具 -> 数据源 (ODBC),双击数据源(ODBC)之后会出来如下的界面 我解释一下填写的信息: Data Source Name:缩写就是DSN,中文翻译过来就是数据源名称,就是给数据源取个名,为了安全还是取英文名吧,省得出现意外。 Description:描述,可填可不填,我比较懒,就没填,想填也行,就是描述一下这个数据源是哪家的,干啥用的等等,随便吧 Server:服务器,不能省,我填的是localhost,如果你有远程主机,不妨试试填上远程主机的IP地址,我没试过,不清楚 User:用户名,我本地数据库用的是root,你们如果有别的就根据自己的情况填吧 Password:密码,我没设置密码,有则填之,没有就留空 Database:数据库,这是一个listbox,可以自己填,也可以从下拉列表中选,如果你前面的Server,User,Password都正确的话,下拉列表中会出来可选的数据库,这个就是我们要连接的数据库资源。 解释完毕,点了OK之后,我们就算设置完成了。 第二种:动态设置 这种办法是指在程序执行时才添加数据源,SQLConfigDataSource是所用的方法,查msdn可以查到它的用法 第一个参数一般设置成NULL就可以了, 第二个参数我用的是ODBC_ADD_DSN,表示是新增数据源 第三个参数是驱动的名称,在数据源(ODBC)中抄过来就OK了 第四个参数是连接字符串,多个参数用\0分隔开,DSN就是数据源名称,UID是用户名,PWD是密码,SERVER是主机名,DATABASE是数据库名称,最后用两个\0结束。 只要在程序中加上这一行,当程序执行到它时,就会在数据源中加上你所设置的数据源,并且可以在控制面板 -> 管理工具 -> 数据源(ODBC)中查到。如图二所示,里面的odbctest和odbctestqqqq,前者就是动态创建的,后者是最初手工创建的。
3.编写连接程序 我用的是VC6.0,VC这东西好是好,就是封装得太多了,像我等这样初来乍到之人一时半会是狗咬乌龟--找不到下口的地方 下面我就按我的方式来说说,肯定有高手有更高明的办法,不妨评论一二,也好让我等开开眼界。 (1).创建一个基于对话框的工程 在VC中点击菜单中 File -> New,在Projects的下拉菜单中选择MFC AppWizard (exe); 在右上角的输入框中填写一个工程的名字,我取名叫ODBCTest; 选择一个存放目录,我的是存在E:\c\ODBCTest; 点击OK进入下一步,选择基于对话框,然后点finish完成设置。 (2).包含头文件 切换到file view,在header files中找到stdafx.h,这是MFC第一个要包含的头文件,我们在里面加上如下两行,将odbc及数据库操作所需的头文件引入到工程中。没这两个头文件编译时会出错。
(3).画主体对话框 主体对话框是用来列表显示数据,并放置其他操作入口的界面,在这个程序中,我们的主体对话框上会放置一个列表控件和五个按钮控件。 在资源视图上选择对话框资源,然后绘制如下图如示的对话框 1).列表,用的是list control,注意在styles中的view要设置成report(报表),如下图 在这里做下说明,一般看网上的教程或是书,上面讲的程序的编写过程都是按步就班,没有多余的过程,因为作者都已经重新做了排版和设计工作,力求简洁。但实际编程中确是不一样的,常常要经过多次修改,重排,优化,所以这里我打算按实际程序的编写过程来说明,而不是按步就班的说明,力求还原程序编写的全过程。作为一个初学VC的新手,相信有很多跟我一样的新手也会遇到同样的困难,没关系,万事开头难。 一般的教程讲到这里就可能会去将后面所要用到的资源准备好,然后进行“系统的”编程。我这里不这样走,而是回到主窗口的编程上来,一个功能一个功能的实现。 1).实现数据的列表显示 晕了,很多人肯定会晕了。这不扯淡吗,我们的数据库(库名叫:odbc)里啥东西都还没有,显示啥呀。 没关系,好在俺也搞过Mysql几年,别的不会,管理Mysql的工具倒是知道不少,比如:EMS,phpMyAdmin,DBtools... 我为了简单就用了phpMyadmin这个工具,这个工具需要在本地安装了php和mysql才能使用,如果本地没有装php就用不了了,不过没关系,去下载一个EMS也不错,非常强大的工具,华丽的界面,丰富的功能。用过SQL server的可能更习惯于使用DBTools Manager,这也是个强大的工具,值得一试。 二毛说,学VC,在还没有入门之前机器上就会有一堆的工具。初始还不信,现在我信了,这不,刚学没几天,机器上就跑上了VC,msdn,另外还有一堆的入门电子书,阅读器,视频播放软件...既然已经有这么多了,再多几个也无所谓了。 跑题了哈,我先刹车倒回来,接着讲数据的显示, 第一步:在odbc库中建一张表list,都怪我,这库名取得有点误导观众,这里再次申明一下,这里的odbc是我建的一个MySQL数据库,不是那个该死的缩写。下面是建好之后的表 name:是一个40位变长的字符串,用来存放用户名 age:是一个3位的小整型字段,因为没有启用非负设置,最大可以到127,此字段存放用户年龄 这就是list表的结构,然后我们在表中插入几条初始数据,用来显示。 phpMyAdmin的使用我就不多说了,这属于工具的使用,不在本文的说明范围之内。 添加好数据之后,我们可以在phpmyadmin中浏览到它们,如下图: 回到VC中来,在类视图中,找到CODBCTestDlg并展开,找到里面的OnInitDialog()方法,此方法是对话框的初始化方法,我的最初想法就是在这里面完成数据库的连接,查询,并输出数据到列表中。于是我写了如下的代码
但后来发现有问题,因为在后面每添加一条记录之后都需要更新列表,重新输出,这就需要再次写一段跟上面一模一样的代码,我靠,这不浪费时间吗。于是,我将上面的这段代码放到了类的一个方法中。步骤如下: 1).在类视图中选中CODBCTestDlg,点右建,选择新增function,然后创建一个void GetRecord()的方法,如下图
这样,以后在需要重新取列表数据时就可以调用此方法了,这就叫重用。 ODBC连接数据库,有两个类是需要关心的,第一个是CDatabase,另一个是CRecordset 前者用于数据库连接的建立,后者用于数据集的取得 建立连接,用如下的代码来实现
取数据集合
要执行sql,我并没有用ODBC提供的方法,而是用更直接的办法
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 10:05 AM CDT 一、基本使用 2.初始化,即设置列。 用m_list1。 CRect rect4; 这部分初始化操作,最好放在对话框类的OnInitDialog()函数里,自动初始化。 3.插入数据 4.删除所有数据
1.如何设置ListView控件的完全行(Full Row)选项。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 10:04 AM CDT 概要本文说明什么是动态链接库 (DLL) 以及在使用 DLL 时可能发生的各种问题。
然后,本文说明在开发您自己的 DLL 时应该考虑的一些高级问题。在说明什么是 DLL 的过程中,本文将说明动态链接方法、DLL 依赖性、DLL 入口点、导出 DLL 函数以及 DLL 故障排除工具。 本文最后将从较高的层次对 DLL 与 Microsoft .NET Framework 程序集作一比较。 简介对于“适用于”一节中列出的 Microsoft Windows 操作系统,操作系统的大量功能是由动态链接库 (DLL) 提供的。另外,当您在这些 Windows 操作系统之一上运行某一程序时,该程序的很多功能可能是由 DLL 提供的。例如,某些程序可能包含很多不同的模块,而该程序的每个模块都包含在 DLL 中并从中分发。
使用 DLL 有助于促进代码的模块化、代码重用、内存的有效使用和减少所占用的磁盘空间。因此,操作系统和程序能够更快地加载和运行,并且在计算机中占用较少的磁盘空间。 当程序使用 DLL 时,一个称为依赖性的问题可能导致该程序无法运行。当程序使用 DLL 时,就会创建一个依赖项。如果其他程序改写和损坏了该依赖项,原来的那个程序就可能无法成功运行。 在引入 Microsoft .NET Framework 之后,大多数依赖性问题都已经通过使用程序集消除了。 更多信息什么是 DLL?DLL 是一个包含可由多个程序同时使用的代码和数据的库。例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。 此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您可能具有一个工资计算程序,而税率每年都会更改。当这些更改被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。 下表说明了 Windows 操作系统中的一些作为 DLL 实现的文件:
DLL 的优点下表说明了当程序使用 DLL 时提供的一些优点:
DLL 依赖项当某个程序或 DLL 使用其他 DLL 中的 DLL 函数时,就会创建依赖项。因此,该程序就不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题。例如,如果发生下列操作之一,则该程序可能无法运行:
下表说明了为了帮助最大限度地减少依赖性问题而在 Microsoft Windows 2000 和较高版本的 Windows 操作系统中引入的更改:
DLL 故障排除工具可以使用多个工具来帮助您解决 DLL 问题。以下是其中的部分工具。Dependency WalkerDependency Walker 工具可以递归扫描以寻找程序所使用的所有依赖 DLL。当您在 Dependency Walker 中打开程序时,Dependency Walker 会执行下列检查:
drive\Program Files\Microsoft Visual Studio\Common\Tools
DLL Universal Problem SolverDLL Universal Problem Solver (DUPS) 工具用于审核、比较、记录和显示 DLL 信息。下表说明了组成 DUPS 工具的实用工具:
247957 (http://support.microsoft.com/kb/247957/) 示例:使用 DUPS.exe 解决 DLL 兼容性问题
DLL 帮助数据库DLL 帮助数据库帮助您查找由 Microsoft 软件产品安装的特定版本的 DLL。有关 DLL 帮助数据库的更多信息,请访问下面的 Microsoft 网站:DLL 开发本节介绍您在开发自己的 DLL 时应该考虑的问题和要求。DLL 的类型当您在应用程序中加载 DLL 时,可以使用两种链接方法来调用导出的 DLL 函数。这两种链接方法是加载时动态链接和运行时动态链接。加载时动态链接在加载时动态链接中,应用程序像调用本地函数一样对导出的 DLL 函数进行显式调用。要使用加载时动态链接,请在编译和链接应用程序时提供头文件 (.h) 和导入库文件 (.lib)。当您这样做时,链接器将向系统提供加载 DLL 所需的信息,并在加载时解析导出的 DLL 函数的位置。运行时动态链接在运行时动态链接中,应用程序调用 LoadLibrary 函数或 LoadLibraryEx 函数以在运行时加载 DLL。成功加载 DLL 后,可以使用 GetProcAddress 函数获得要调用的导出的 DLL 函数的地址。在使用运行时动态链接时,无需使用导入库文件。下面的列表说明了有关何时使用加载时动态链接以及何时使用运行时动态链接的应用程序条件:
DLL 入口点在创建 DLL 时,可以有选择地指定入口点函数。当进程或线程将它们自身附加到 DLL 或者将它们自身从 DLL 分离时,将调用入口点函数。您可以使用入口点函数根据 DLL 的需要来初始化数据结构或者销毁数据结构。此外,如果应用程序是多线程的,则可以在入口点函数中使用线程本地存储 (TLS) 来分配各个线程专用的内存。下面的代码是一个 DLL 入口点函数的示例。 当入口点函数返回 FALSE 值时,如果您使用的是加载时动态链接,则应用程序不启动。如果您使用的是运行时动态链接,则只有个别 DLL 不会加载。入口点函数只应执行简单的初始化任务,不应调用任何其他 DLL 加载函数或终止函数。例如,在入口点函数中,不应直接或间接调用 LoadLibrary 函数或 LoadLibraryEx 函数。此外,不应在进程终止时调用 FreeLibrary 函数。 注意:在多线程应用程序中,请确保将对 DLL 全局数据的访问进行同步(线程安全),以避免可能的数据损坏。为此,请使用 TLS 为各个线程提供唯一的数据。 导出 DLL 函数要导出 DLL 函数,您可以向导出的 DLL 函数中添加函数关键字,也可以创建模块定义文件 (.def) 以列出导出的 DLL 函数。要使用函数关键字,您必须使用以下关键字来声明要导出的各个函数: __declspec(dllexport) 要在应用程序中使用导出的 DLL 函数,您必须使用以下关键字来声明要导入的各个函数:
__declspec(dllimport) 通常情况下,您最好使用一个包含 define 语句和 ifdef 语句的头文件,以便分隔导出语句和导入语句。您还可以使用模块定义文件来声明导出的 DLL 函数。当您使用模块定义文件时,您不必向导出的 DLL 函数中添加函数关键字。在模块定义文件中,您可以声明 DLL 的 LIBRARY 语句和 EXPORTS 语句。下面的代码是一个定义文件的示例。
示例 DLL 和应用程序在 Microsoft Visual C++ 6.0 中,可以通过选择“Win32 动态链接库”项目类型或“MFC 应用程序向导 (dll)”来创建 DLL。下面的代码是一个在 Visual C++ 中通过使用“Win32 动态链接库”项目类型创建的 DLL 的示例。
下面的代码是一个“Win32 应用程序”项目的示例,该示例调用 SampleDLL DLL 中的导出 DLL 函数。 注意:在加载时动态链接中,您必须链接在生成 SampleDLL 项目时创建的 SampleDLL.lib 导入库。在运行时动态链接中,您应使用与以下代码类似的代码来调用 SampleDLL.dll 导出 DLL 函数。 当您编译和链接 SampleDLL 应用程序时,Windows 操作系统将按照以下顺序在下列位置中搜索 SampleDLL DLL:
.NET Framework 程序集在引入 Microsoft .NET 和 .NET Framework 以后,大多数与 DLL 相关联的问题已经通过使用程序集消除了。程序集是在 .NET 公共语言运行库 (CLR) 控制之下运行的逻辑功能单元。程序集实际上是作为 .dll 文件或 .exe 文件存在的。但是,在内部,程序集与 Microsoft Win32 DLL 大不相同。程序集文件包含程序集清单、类型元数据、Microsoft 中间语言 (MSIL) 代码和其他资源。程序集清单包含程序集元数据,以提供使程序集成为自描述程序集所需的全部信息。程序集清单中包含以下信息:
下表说明了程序集的一些功能,并将其与 Win32 DLL 的功能进行了比较:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 10:02 AM CDT DDX(动态数据交换)和DDV(动态数据验证)看起来好象是在对话框中某控件和 某成员变量之间建立连接,自动实现控件和变量之间的数据转移.但这只是一个幻 觉.它的实际工作方式是这样的:当你用ClassWizard把某变量和控件连接起来时 (通过Member Variables选项卡),它在数据映射中创建一个入口.实际上也就是 在对话框的DoDataExchange函数中添加一个入口函数(DoDataExchange函数是 Class Wizard产生和维护的函数).当你调用UpdateData(FALSE)时,MFC调用 DoDataExchange 函数,Class Wizard放于DoDataExchange中的实现代码将把 来自变量的数据拷贝到对应的控件.如果调用UpdateData(TRUE),MFC反过来把 数据拷贝回变量(并且可能同时进行数据验证) 应该注意到,CDialog经常在OnInitDialog函数中调用UpdateData(FALSE), 这样当对话框显示时你的成员变量就会神秘的出现在对话框中.同样OnOK函数也 调用UpdateData,但参数是TRUE.这样模态对话框看起来自己处理自己了.你可以 编写类似下面的代码: CNameDlg dlg; dlg.m_name="New Name"; if ( dlg.DoModal() == IDOK ) MessageBox(dlg.m_name,"Greetings"); 来实现模态对话框的自动处理. 下面考虑一下使用非模态对话框的情况吧.对话框仍处理OnInitDialog消息, 因此数据初始传输正常.但是非模态对话框一般不等到按OK按钮来处理它们的数 据,这就意味这我们必须自己处理数据传输,具体请看『快速DDX』. 好了,现在来看看DDV动态数据验证.你在使用DDX动态数据交换的同时,也可 以使用数据验证.典型的,验证可以保证一个字符串的字符数小于给定的数目,或 者数字在一定范围之内. 不过数据验证通常并不能满足我们的期望,这是因为验证只在控件到变量的 数据传输时才发生.这通常意味着用户在输入了所有数据,单击OK,然后就收到 一个错误消息. 不过我们可以改进一下,使用『现场数据验证』. 改进DDX/DDV 快速DDX 有几种情况我们需要使用快速DDX,比如你编写一个电子邮件程序,用户在对 话框中输入名称和地址,你需要一个按钮使应用程序可以在用户输入完之后得到 邮件的名称和地址.或者考虑一下模态对话框的"应用"按钮的实现吧. 当然要实现上面的任务,我们可以直接调用GetDlgItemText获取编辑框数据, 但为什么不使用DDX呢?这样至少可以使对话框看起来有点自动化.可以调用 UpdateData(TRUE)把数据传送到变量,反过来填充地址时可以调用UpdateData(FALSE). 要想得到每个控件的状态以确定何时需要进行数据交换,可以重载CDialog类 的OnCommand函数,因为一般的传统控件都用WM_COMMAND消息来提示状态的改变, 当然对于使用WM_NOTIFY消息的新型控件可以一样的处理OnNotify函数.下面是 使用该技术的一个简单例子,当你在对话框中输入数据的同时主窗口中数据也进 行相应的改变. 程序清单:快速DDX // LiveDialog.cpp : implementation file // #include "stdafx.h" #include "Custom.h" #include "LiveDialog.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CLiveDialog dialog CLiveDialog::CLiveDialog(CWnd* pParent /*=NULL*/) : CDialog(CLiveDialog::IDD, pParent) { //{{AFX_DATA_INIT(CLiveDialog) m_email = _T(""); m_name = _T(""); //}}AFX_DATA_INIT m_pView=NULL; // 应用程序窗口视的指针 } void CLiveDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CLiveDialog) DDX_Text(pDX, IDC_EMAIL, m_email); DDX_Text(pDX, IDC_NAME, m_name); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CLiveDialog, CDialog) //{{AFX_MSG_MAP(CLiveDialog) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CLiveDialog message handlers BOOL CLiveDialog::OnCommand(WPARAM wParam, LPARAM lParam) { BOOL fOk= CDialog::OnCommand(wParam, lParam); // Don't do if this command destroyed us or we are initializing if ( ::IsWindow(m_hWnd) && !in_init ) { UpdateData(); // Update on any change ASSERT(m_pView !=NULL ); m_pView->GetDocument()->UpdateAllViews(NULL); } return fOk; } BOOL CLiveDialog::OnInitDialog() { in_init=TRUE; // 正在初始化 CDialog::OnInitDialog(); in_init=FALSE; // 初始化结束 return TRUE; } 在窗口视类中用下面的方法调用对话框: void CLiveView::OnGo() { m_dlg.m_pView=this; // 设置m_dlg.m_pView指向当前视 m_dlg.DoModal(); } 有关该程序还有几个细节要注意: 1.WM_COMMAND消息有破坏对话框,并使之无效的机会,那就是为什么在 ::IsWindow(m_hWnd)返回FALSE时不调用UpdateData的原因. 2.如果你在该段代码的某部分调用UpDateData(FALSE)时,控件可能在那时激活 命令消息,这样在你递归调用UpDateDate(FALSE)时将产生一个断言.也就是说, 在你调用UpDateDate之前必须确定你不是正在更新数据,这就是为什么在 OnInitDialog函数中设置in_ini标志的原因(OnInitDialog中调用了 UpDateDate(FALSE)),同样在其它任何调用UpDateDate的地方都要这样处理. 3.主视必须知道何时需要更新,在这个例子中先保存指向主视的指针,然后在某种 事情发生时调用主视的文档的UpdateAllView实现视的更新.你可能说我们可以找 到对话框的父窗口而不需要事先保存主视指针,但这是无法实现的,因为对话框的 父窗口永远不可能是视(对话框的父窗口必须是顶级窗口). 现场数据验证 实现DDV数据验证的函数其实就是DoDataExchange中以DDV_开头的函数, 如DDV_MinMaxInt()用来验证整数的范围、DDV_MaxChars用来验证字符串的字 符个数,调用UpdateData()函数就可以引起这些函数的执行了。 要想改进数据验证,比如你想在数据输入框中数据的改变时验证大小是否 合适而不是等到按OK之后得到一个错误对话框(就象DDV_MaxChars一样在数据 改变的同时进行字符串个数的验证),我们可以重载对话框的OnCommand函数以 截获所有的命令消息,从中筛选(提取wParam的高位字)符合要求的消息(比如 EN_CHANGE就意味着编辑框中的内容发生了改变),这里也就是我们验证域中值 的好时机。 还有一个问题是我们并不想验证所有的东西,这有几种方法可以解决, 比如手工更改数据映射: 第一步,添加一个成员变量UINT m_vid,在构造函数中把它置为0(当为0时执行 常规的延迟数据验证),在OnCommand中保存当前要验证的控件ID(提取wParam的 底位字). BOOL CAboutDlg::OnCommand(WPARAM wParam,LPARAM lParam) { if ( HIWORD(wParam) == EN_CHANGE && !m_fIsUpdating ) // 检验标志,是否正在进行数据验证或更新 { UpdateData(); m_vid=0; } return CDialog::OnCommand(wParam,lParam); } 第二步,修改数据映射。把DoDataExchange中的所有数据映射移出Class Wizard 的特别注释,并按下面的方法修改代码: void CLiveDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP m_fIsUpdating=TRUE; // 是否正在进行数据传递或验证的标志,设置它 if ( !m_vid ||m_vid==IDC_LOG ) { DDX_Text(pDX, IDC_LOG, m_log); DDV_MaxChars(pDX, m_log, 10); } if ( !m_vid || m_vid ==IDC_NUM ) { DDX_Text(pDX, IDC_NUM, m_num); DDV_MinMaxInt(pDX, m_num, -10, 10); } m_fIsUpdating=FALSE; // 清除标志 } 这里我们还会碰到前一个例子中的第2个问题,也就是你在验证一个特殊的 域时,必须确信你没有正在验证,不然你会得到一个断言。当然可以采用和上面 的例子相似的办法,即在进行数据验证之前先设置m_fIsUpdating=TRUE;(正在进 行数据传递或验证),验证完之后再设为FALSE,在调用UpdateData之前判断该标志. 不过这里会有一个小小的问题,如果数据验证失败,MFC会发出一个异常,以放 弃DoDataExchange,这样你设置的标志就不灵了.最简单的解决办法是在 UpdateData调用之后重新把m_fIsUpdating标志设为FALSE(必须是所有的 UpdateData的调用之后,当然包括MFC内部代码中的调用,如 CDialog::OnInitdialog中),另一种方法是捕获该异常,然后清除标志,具体请 看下面的代码: void CLiveDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP m_fIsUpdating=TRUE; // 是否正在进行数据传递或验证的标志,设置它 try { if ( !m_vid ||m_vid==IDC_LOG ) { DDX_Text(pDX, IDC_LOG, m_log); DDV_MaxChars(pDX, m_log, 10); } if ( !m_vid || m_vid ==IDC_NUM ) { DDX_Text(pDX, IDC_NUM, m_num); DDV_MinMaxInt(pDX, m_num, -10, 10); } m_fIsUpdating=FALSE; // 清除标志 } catch (...) // 捕获异常 { m_fIsUpdating=FALSE; // 清除标志 throw; // 抛出异常 } } 还有一种方法是参考MFC原码写的,在OnCommand中做如下修改: BOOL CAboutDlg::OnCommand(WPARAM wParam,LPARAM lParam) { if ( HIWORD(wParam) == EN_CHANGE && !m_fIsUpdating ) // prevent control notifications from being dispatched during UpdateData { m_vid=LOWORD(wParam); _AFX_THREAD_STATE* pThreadState = AfxGetThreadState(); HWND hWndOldLockout = pThreadState->m_hLockoutNotifyWindow; if (hWndOldLockout != m_hWnd) // must not recurse UpdateData(); m_vid=0; } return CDialog::OnCommand(wParam,lParam); } 关于数据映射 应该认识到,所谓的数据映射只是一个函数,它展现了许多可能性(也就是可扩 展性),另外你还可以定制自己的数据验证,比如你想定制一个邮政编码的数据验 证.具体实现方法请看下面的定制DDX/DDV部分. 还有一点要注意到的,一定要在对应的DDX调用之后立即添加验证代码,否则,当 验证失败时,你的程序或许不会正确识别哪个域有问题. 定制DDX/DDV 现在你可以尝试编写自己的数据交换和数据验证过程了.你要知道交换和 验证函数只是一些知道如何处理CDataExchange对象的全局函数而已,没有什 么特殊的. 下面来看看具体做法: 对于数据交换,需要编写一个带有参数CDataExchange指针、一个控件ID和对 某变量引用的全局函数,尽管可以不在函数前面添加DDX_前缀,但是为了可以和 Class Wizard集成,最好忍住你的这种念头(后面你会看到为什么了). 在交换函数中,可以检查CDataExchange指针,以了解你所须的细节.下面就 来看看CDataExchange类的成员 成员 描述 m_bSaveAndValidate 对应于你提供给UpdateData的参数,当为TRUE时数据从控件传递到变量 m_pDlgWnd 控制窗口或对话框的句柄 PrepareCtrl(int nIDC) 调用该函数,以标识当前控件(如不是编辑框) PrepareEditCtrl(int nIDC) 调用该函数,以标识当前控件(如是编辑框) Fail() 产生一个对控件的验证失败(你可以在DDX或者DDV中调用该函数),抛出一个异 常,破坏DoDataExchange函数的执行 一般的,编写交换函数,,你首先要检查m_bSaveAndValidate的值以确定数据 的传递方向,如果传递失败,你有必要调用PrepareEditCtrl(适于编辑控件)或者 PrepareCtrl(适于所有控件),在做此调用之后,任何对Fail的调用将导致把焦 点交回给该控件,即使其它过程(比如一起的验证过程)发布同样的失败,也是这样 编写一个验证函数,跟编写一个交换函数差不多,差别只是参数的不同.函数 以DDV_为前缀,参数可以接受一个CDataExchange指针、合适类型的一个只值、 一个或两个参数. 它的工作很简单,如果m_bSaveAndValidate为TRUE时,一定要保证值是合法 的(通常认为从程序传递到控件的值是正确的).如果数据正常,则从该函数返回, 如果数据不正常,则调用Fail函数.前一个数据交换函数已经标识了当前操作的 是哪个控件(这也就是为什么必须要在对应的DDX调用之后立即添加DDV的验证代 码的原因了). 下面的例子演示了如何定制自己的数据验证: 程序清单:使用定制的DDX/DDV // validView.cpp : implementation of the CValidView class // #include "stdafx.h" #include "valid.h" typedef float Currency; // used for DDV #include "validDoc.h" #include "validView.h" #include "customdd.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CValidView IMPLEMENT_DYNCREATE(CValidView, CFormView) // Class Wizard won't put this here because it thinks // Dialog boxes handle OnOK. They do, but this is a // form view, not a dialog box BEGIN_MESSAGE_MAP(CValidView, CFormView) //{{AFX_MSG_MAP(CValidView) ON_COMMAND(IDOK,OnOK) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CValidView construction/destruction CValidView::CValidView() : CFormView(CValidView::IDD) { validating=FALSE; vid=0; //{{AFX_DATA_INIT(CValidView) m_age = 18; m_name = _T(""); m_wager = 1.0; m_btnenable = TRUE; //}}AFX_DATA_INIT // TODO: add construction code here } CValidView::~CValidView() { } void CValidView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CValidView) DDX_Text(pDX, IDC_AGE, m_age); DDV_MinMaxInt(pDX, m_age, 18, 150); DDX_Text(pDX, IDC_NAME, m_name); DDV_MaxChars(pDX, m_name, 64); DDX_Text(pDX, IDC_WAGER, m_wager); DDV_MinMaxCurrency(pDX, m_wager, 1.f, 100.f); DDX_EnableWindow(pDX, IDOK, m_btnenable); //}}AFX_DATA_MAP } BOOL CValidView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CFormView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CValidView diagnostics #ifdef _DEBUG void CValidView::AssertValid() const { CFormView::AssertValid(); } void CValidView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } CValidDoc* CValidView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CValidDoc))); return (CValidDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CValidView message handlers void CValidView::OnOK() { if (UpdateData(TRUE)) { MessageBox("Wager placed"); m_btnenable=FALSE; UpdateData(FALSE); } } 程序清单:定制的DDX/DDV过程 #include <stdafx.h> #include "customdd.h" // Custom Exchange void DDX_EnableWindow(CDataExchange *pDX, int id, BOOL &flag) { CWnd *ctl=pDX->m_pDlgWnd->GetDlgItem(id); if (pDX->m_bSaveAndValidate) flag=ctl->IsWindowEnabled(); else ctl->EnableWindow(flag); } // Custom validator void DDV_MinMaxCurrency(CDataExchange *pDX, float val, float min, float max) { CWnd *editctl=CWnd::FromHandle(pDX->m_hWndLastControl); CString s; int n; if (pDX->m_bSaveAndValidate) { // Using math to decide if anything is left over is bad because of rounding // errors, so use a string method instead editctl->GetWindowText(s); n=s.Find('.'); if (n!=-1 && n+3<s.GetLength()) { AfxMessageBox("Please enter the data to the nearest penny!"); pDX->Fail(); } DDV_MinMaxFloat(pDX,val,min,max); // let the existing one do the job } } 与Class Wizard集成 如果你只想把某定制过程应用于一个项目的话,可以把它添加到该项目的 CLW文件.你也可以在包含mfcclwz.dll文件的BIN目录(我的是 ...\Microsoft Visual Studio\Common\MSDev98\Bin)下创建一个DDX.CLW文件, 然后你的DDX过程就可以应用到所有项目了. 下面来看一看怎样写CLW文件: 首先添加一个名为[ExtraDDX]的区段,看起来象INI文件的区段,但是这里的名 称是区分大小写的. [ExtraDDX] ExtraDDXCount=2 ExtraDDX1=E;;Value;Currency;0.0;Text;Floating Point Currency;MinMaxCurrency;Mi&nimum;f;Ma&ximum;f ExtraDDX2=bBECcRLIMNn;;Enable State;BOOL;TRUE;EnableWindow;Window Enabled Status 这些代码是什么意思呢? 第二行 ExtraDDXCount=x 的x表示项目的数目(这里是2),然后接下来的一行以ExtraDDX1=开头,再下来是 ExtraDDX2=、ExtraDDX3=等等。等号右边的代码被分成7个、10个或者12个域, 具体倚赖于你所想实现的目标,每个域以分号分隔,下面的表格列出了这些域的意思: 域 描述 1 DDX应用的空间类型(比如E=编辑框) 2 未使用 3 属性类型(经常是值,对应着Class Wizard的第一个组合框) 4 变量的数据类型 5 初始值 6 没有DDV_前缀的DDV过程名 7 注释 8 没有DDV_前缀的DDV过程名 9 第一个DDV参数的名称(可选) 10 第一个DDV参数的类型(比如,f=float;可选) 11 第二个DDV参数的名称(可选) 12 第二个DDV参数的类型(比如,f=float;可选) 你不必指定任何DDV过程,你可以把一个新的验证过程与标准的交换函数混合 在一起(也就象上面ExtraDDX1那一行所做的一样).注意,这些DDX和DDV函数名并 没有以DDX_和DDV_开头,但是Class Wizard确实往它产生的代码中添加了这些前 缀.这也就是用这些前缀命名函数的原因了。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 09:38 AM CDT 有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到ORACLE的需求,应用程序也要相应做一些修改。总结出以下几点注意事项。 1. 自动增长的数据类型处理 MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。 CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE; 其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999 INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL 2. 单引号的处理 MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。 3. 翻页的SQL语句的处理 MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;PHP里还可以用SEEK定位到结果集的位置。ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。 以下是经过分析后较好的两种ORACLE翻页SQL语句( ID是唯一关键字的字段名 ): 语句一: SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3; 语句二: SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3; 4. 长字符串的处理 长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。 5. 日期字段的处理 MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE, 精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日 24小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’) 日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7; 6. 空字符的处理 MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。 7. 字符串的模糊比较 MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快,用字符串比较函数 instr(字段名,'字符串')>0 会得到更精确的查找结果。 8. 程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 09:35 AM CDT Ben Watson,知名开发者。任职于GeoEye,是其所属开发团队的领导者。本文发表于他自己的博客,阐述了十种学习新技术的方法。1、要看书 在成千上万的编程图书中,可能很大一部分根本毫无用处。但是仍然有很多图书对你的(编程)能力有很大的提升。我一直坚持,相比在网络上查找很多有用信息,在同类图书中查找要来得更容易更快捷。阅读技术图书可心更好地抓住核心内容。对于理论,架构和设计等方面来说,图书也一样很有帮助。只不过要找到高质量的、权威的信息,就不如网络上可供查找的范围广。 2、读代码 这也是我很喜欢的一种方式。如果我并没有几年的专业编程工作经验,在学习之初我并不会去读很多复杂的代码。如果我要是早些开始学习,我将是一个比现在更好的程序员。但是,开始时我会从一些开源项目里,去学习那些源代码(当然,这些代码不能与我的工作有关,也不是我自己写的)。要从自己会使用到的,或者自己感兴趣的程序开始这项工作。我是从 Paint.net 这个网站里开始学习的,而且已经积累了很多关于 .NET 的编程技术。 读别人的代码可以为你提供更多不同的工作思路,这比你完全凭自己思考得到的工作方式要多。 3、写代码 谨记,要写大量的代码。从根本上来讲,最好的学习方法就是实践。如果不写代码,你根本不能把(某种语言中)内在的东西学习透彻。学习之初,可以从一些技术指南和图书中照搬一些尽量简单的程序。当然,这种照搬是要自己完全手工输入,而不是复制和粘贴,这两种之间的效果差别是很大的。这种方法的主旨就在于,使知识内在化,并思考其用法,而不是盲目照抄。学习过程中,要时常查找新的 API 调用方法,这其实是简单的事情。 最重要的是,要写一个你自己的程序,不管它是一个简单的游戏,或者是一个参与开源项目的程序,还是一个公为你自己使用的简单插件。用不同的方式来写程序,尽量尝试使用新的技术,新的技巧,新的设计方式。一定要让现在的项目比以往的项目更好。想要成一个优秀的开发者,这一点是核心。 4、与其他开发者交流 像Apple,微软,Google 等大公司一样的新闻描述的一样,(与其他开发者交流)可以让你解决一些复杂的问题。虽然这并不能让你感觉到自己已经成一个团队或是社区的成员,但是这种方法可以让你接触到更多不同的想法。 不同类型的项目要求不同的设计方法,代码技术,开发流程和设计思想。如果你工作在一个小团队里,你不必与太多的人接触,只要在用户群会议中找到一些人(来讨论)即可。如果这样还不行的话,参与到在线论坛中与其他人讨论(这时你需要更努力地寻找高质量的讨论内容)。 5、教会别人 相对于仅仅读代码之类的工作,教其他人学习可以让你更深入地学习某个技术,这种方法有着非凡的效果。教会别人某个技术,同样也会让你更专注于这种技术,并且可以比别人更深层次地理解它。同样你也会面对一些问题。 “如果你不能向一个六岁的儿童解析清楚一个概念,那么其实是你并没有完全理解它。”Albert Einstein说。 教学场景可以是无穷无尽的:与工作搭档一对一交流,休息碰面,非正式周会,学习茶会,教室,讨论发表会,等等。每周在相同理念开发者之间举办一次30分钟的非正式会议怎么样?每周,让几个人来就他们想要更深入了解话题,向大家传授这些技术知识,并且展开讨论。如果你知道你将要向团队成员们传授正学学习的知识,你是不是更想要了解这项技术的每个细节呢? 6、收听网络电台 如果你有空闲的时间,可以订阅网络电台节目。我现在最喜欢的编程节目就是.Net Rocks。这个节目还会做一些视频节目,叫做dnrTV 。这样会让你即时捕捉到最新最好的技术。一个人是不能学习到所有知识的,而网络电台刚是一个学习了解广泛知识的途径。 7、阅读博客 博客远远比阅读者要多,但是其中有一些却是极其优秀的。我这里不并不是要推荐博客,因为网络上已经有了足够多的博客。这是与真正在开发你所喜欢和使用的软件的开者联系的好方法。 8、学习新的语言 即使你已经在C(++,#) / JAVA等语言上有很好的造诣,仍然有很多其他可以解决问题的编程语言。学习新的语言,是对你已有思维方式的挑战。这不仅仅是另一种语言,更是对思维的重新架构。的确,所有的语言最后都会被编译成汇编程序,但是这并不意味着高级语言毫无价值。 9、学习不正确的方式 除了要学习应该怎么做,还要学习不应该怎么做。经常阅读 Dailywtf.com,学习你并不知道的经验与教训。学习适当的面向对象设计方式,代码写作方式和必须要写的代码等,是很好的方式,但是如果不细心的话也容易养成不良习惯。学习认识不正确的思路是负责项目开发至关重要的一环。 维基百科对很多觉的不正确方式有十分透彻的分类。 10、要谦虚。 学习,意味着: ◆用更好的知识代替不完美的知识; ◆增长你所不知道的知识。 只有承认自己有所不足,才能有学习的动力。归根到底,就是谦虚,不对吗?如果你开始认为你已经掌握了所有需要的知识,那么你就危险了。真正的学习是如饥似渴地追逐知识并使其内在化,这需要很大的努力。我们都知道这一点,但是要必须时常不断地提醒自己。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 09:32 AM CDT 很难想象,ORACLE公司的这一段传奇居然要从IBM开始。 1970年的6月,IBM公司的研究员埃德加·考特 (Edgar Frank Codd) 在Communications of ACM 上发表了那篇著名的《大型共享数据库数据的关系模型》(A Relational Model of Data for Large Shared Data Banks)的论文。这是数据库发展史上的一个转折。要知道,当时还是层次模型和网状模型的数据库产品在市场上占主要位置。从这篇论文开始,拉开了关系型数据库软件革命的序幕。 虽然早在1970年就诞生了关系模型理论,但是市场上迟迟不见关系型数据库管理软件的推出。主要原因是很多反对者认为关系型数据库速度太慢,比不上当时的层次式数据库。值得好笑的是,IBM虽然1973年就启动了System R的项目来研究关系型数据库的实际可行性,也没有及时推出这样的产品,因为当时IBM的的IMS(著名的层次型数据库)市场不错,如果推出关系型数据库,牵涉到IBM很多人的自身利益。再者,IBM庞大复杂的官僚机构处在决策上远不那么灵活。 1977年6月,Larry Ellison与Bob Miner和Ed Oates在硅谷共同创办了一家名为软件开发实验室(Software Development Laboratories,SDL)的计算机公司(ORACLE公司的前身)。那个时候,32岁的Larry Ellison,这个读了三家大学都没能毕业的辍学生,还只是一个普通的软件工程师。公司创立之初,Miner是总裁,Oates为副总裁,而Ellison,因为一个合同的事情,还在另一家公司上班。没多久,第一位员工Bruce Scott(用过ORACLE数据库软件的人都知道有个Scott用户的吧?没错,就是这个Scott,至于Scott用户的密码Tiger,那是Scott养的猫的名字)加盟进来,在Miner和Oates有些厌倦了那种合同式的开发工作后,他们决定开发通用软件,不过们还不知道自己能开发出来什么样的产品。Oates最先看到了埃德加·考特的那篇著名的论文连同其他几篇相关的文章并推荐Ellison和Miner也阅读一下。Ellison和Miner预见到数据库软件的巨大潜力(跟着IBM走,没错),于是,SDL开始策划构建可商用的关系型数据库管理系统(RDBMS)。 很快他们就弄出来一个不太像样的产品,或者具体的说,更像一个Demo。根据Ellison和Miner他们在前一家公司从事的一个由中央情报局投资的项目代码,他们把这个产品命名为ORACLE。因为他们相信,ORACLE(字典里的解释有“神谕, 预言”之意)是一切智慧的源泉。1979年,SDL更名为关系软件有限公司(Relational Software,Inc.,RSI),毕竟“软件开发实验室”不太像一个大公司的名字。1983年,为了突出公司的核心产品,RSI再次更名为ORACLE。
发展与壮大 RSI在1979年的夏季发布了可用于DEC公司的PDP-11计算机上的商用ORACLE产品,这个数据库产品整合了比较完整的SQL实现,其中包括子查询、连接及其他特性。但不得不说,软件不是很稳定,并缺少事务处理这样的重要功能。出于市场策略,公司宣称这是该产品的第二版,但却是实际上的第一版。之所以被命名为第2版而不是第1版,是因为Ellison认为潜在的客户更愿意购买第2个版本,而不是初始版本。(虽然这样做有些不太诚实,还是要承认这是个十分高明的技巧。到现在还有一些公司把自己卖给客户的版本叫做1.0 ,学学1979年的ORACLE吧!)多年以后的今天,ORACLE公司声称是他们第一个提供了第一个SQL关系型数据库管理系统。 虽然软件不是很好,但是客户还是有的。美国中央情报局迫不及待的想买一套这样的软件来满足他们的需求。但在咨询了IBM公司之后发现IBM没有可以商用的产品,他们联系了RSI。于是RSI有了第一个客户。在当时,政府和军方的机构往往同时有几种计算机,而那时还没有什么“软件可移植”这样的说法,当然,也几乎没有具有这样的能力的应用软件。也就是说,给PDP-11开发的ORACLE数据库不能用在IBM主机和DEC的VAX上。很快用户就表现出来这样的需求:ORACLE能否同时在不同的操作系统上运行?这给RSI带来了新的挑战(主要是Miner和Scott)。70年代末期和80年代早期的软件一般都设计成在单一操作系统上运行,具有可移植能力的软件很少。 1983年3月,RSI发布了ORACLE第三版。Miner和Scott历尽艰辛用C语言重新写就这一版本。要知道,C语言当时推出不久,用它来写ORACLE软件也是具有一定的风险的,但除此之外,别无他法。很快就证明了这样做是多么的正确,C编译器便宜而又有效。从现在起,ORACLE产品有了一个关键的特性:可移植性。ORACLE第3版还推出了SQL语句和事务处理的“原子性”――SQL语句要么全部成功,要么全部失败,事务处理要么全部提交,要么全部回滚。ORACLE第3版还引入了非阻塞查询,使用存储在"before image file"中的数据来查询和回滚事务,从而避免了读锁定(read lock)的使用(虽然通过使用表级锁定限制了它的吞吐量)。同样是1983年,IBM发布了姗姗来迟的Database 2(DB2),但只可在MVS上使用。不管怎么说,ORACLE已经占取了先机。 在开发第三版还没有结束的时候,Scott离开了ORACLE。当时用C改写ORACLE的压力很大,无休止的软件调试终于让Scott不堪重负,选择了一走了之。把剩下的重担交给了Miner一个人。在出售了自己的%4的股票之后,Scott 后来创建了Gupta公司(现更名为Centura Software)和PointBase公司(提供百分之百纯Java嵌入式数据库),都是开发和数据库相关的产品。多年后有人问到他的%4的ORACLE股票的时候,Scott,这个曾经给ORACLE写出第一行代码的技术高手,也只能报以一笑了。如果能坚持下来,那是一笔几亿美金的财富。不过当时的Scott没有那么多的想法,他只是太累了。
ORACLE最先将其软件移植到DEC VAX计算机上的VMS操作系统上。早在1979年公司就已经雇了一位DEC公司的技术高手Robot Brandt进行VAX上ORACLE的开发。开始的时候资金有限,只能到加州大学伯克利分校去蹭机器进行开发,后来好一些,但机器也是借来的。尽管困难重重,Brandt还是比较成功的完成了移植工作。随着VAX小型机的大量销售乃至供不应求,ORACLE软件也成为VAX上最受欢迎的程序。这一点要归功于Larry对市场的先知先觉。如果说,是IBM引领着ORACLE公司走上数据库的大船,那么DEC公司的VAX就是带着他们扬帆出海了。短短的几年之后,ORACLE数据库被移植到各种主要平台之上。ORACLE产品也一直因为有可移植性这个关键特性而被那些潜在的客户关注。 Oates这个时候因为婚姻趋于破裂而情绪沮丧,已经不能把精力全部放到公司上,不得不离开公司。几年后,他又重返公司,重新为ORACLE带来巨大的贡献,他许下诺言,在公司员工超过1万人的时候会再度离开。1999年,他完成了心愿。现在他正在纵情于音乐,自得其乐。 很长一段时间里,公司研发由Miner独力承担。Miner视金钱如无物,为人低调,和Ellison的锋芒必露形成鲜明的对比。在公司里,大家一致认为他是老好人,他也深受员工爱戴。Ellison是公司的大脑,Miner则当之无愧的成为公司的心脏。他是个沉默的英雄,正如Steve Jobs背后的Steve Wozniak一样。 1984年10月,ORACLE发布了第4版产品。产品的稳定性总算得到了得到了一定的增强,用Miner的话说,达到了“工业强度”。但是还不够令人满意,用户对产品的抱怨似乎永无休止。这一版增加了读一致性(read consistency),这是数据库的一个关键特性,可以确保用户在查询期间看到一致的数据。也就是说,当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。可以看到,在ORACLE第四版之前,产品始终是不稳定的,但是ORACLE的这群销售人员,主要是Ellison,他在宣传ORACLE的时候总是要夸大其词,但他就是有能力把软件卖出去,而且,还卖得很好,不得不承认,这的确有些神奇。让我们看看1984年软件市场的情形,在数据库市场上的霸主是Asnton-Tale公司,他们的拳头产品是刚推出不久的dBase III(确切的说dBase是PC上的数据库软件霸主),刚刚成为全球第三大的独立软件公司(第一和第二分别是微软、Lotus,ORACLE在当时还排不上号),这一年,也是苹果公司Macintosh诞生的年度,Steven Jobs用这个拳头产品挑战老大哥IBM。同样在这一年中,ORACLE公司的开发人员刚刚把产品移植到PC上。这是最好的年代,也是最坏的年代。数以千计的小公司在软件领域里争斗不休,新公司如雨后春笋般成立,ORACLE如何才能于不败之地? 在1985年,ORACLE发布了5.0版。有用户说,这个版本算得上是ORACLE数据库的稳定版本。这也是首批可以在Client/Server模式下运行的的RDBMS产品,在技术趋势上,ORACLE数据库始终没有落后。这意味着运行在桌面PC机(客户机)上的商务应用程序能够通过网络访问数据库服务器。1986年发布的5.1版还支持分布式查询,允许通过一次性查询访问存储在多个位置的数据。 那是在1985年,当时曾经的最大的独立软件公司Cullinet(主要销售网状数据库)已经如流星般陨落。ORACLE的主要竞争对手是Ingres数据库。Ingres在加州大学伯克利分校诞生,主要的设计者是当时鼎鼎大名的Michael Stonebraker教授。可以说Ingres数据库软件是上个世纪80年代技术上最好的数据库,Ingres市场分额的快速增长已经给ORACLE早成了很大的压力。巧的是,这个时候,IBM公司再一次伸出“上帝之手”。 1986年3月12日,ORACLE公司以每股15美元公开上市,当日以20.75美元收盘,公司市值2.7亿美元。3月13日,微软以每股21美元的发行价上市,以28美元收市,公司市值达到7亿美元。远远超过了ORACLE。成功的光环的微软和盖茨遮盖住了ORACLE和Ellison的光芒,可能这也是Ellison敌视微软的开始。 图三 桀骜不驯的Larry Ellison 经受挫折 ORACLE第6版于1988年发布。由于过去的版本在性能上屡受诟病,Miner带领着工程师对数据库核心进行了重新的改写。引入了行级锁(row-level locking)这个重要的特性,也就是说,执行写入的事务处理只锁定受影响的行,而不是整个表。这个版本引入了还算不上完善的PL/SQL(Procedural Language extension to SQL)语言。第6版还引入了联机热备份功能,使数据库能够在使用过程中创建联机的备份,这极大地增强了可用性。同时在这一年,ORACLE开始研发ERP软件。 公司发展看上去比较顺利,不过,噩梦才刚刚开始。 由于过去对软件测试重视的程度不够――那个时候公司规模小,基本上都是客户帮助免费测试的。在第六版刚发布之后,很多迫不及待开始使用的用户就怨声载道。这是个根本就没有测试好就进行发布的产品(也怪Ellison,大话总要说在前头,只好自尝苦果)。用户开始对ORACLE大肆抨击,ORACLE的一些对手,也开始落井下石,针对ORACLE产品的一些弱点进行攻击。开发人员一面应付愤怒的用户,一面加班加点地对程序进行接连不断的修正,最后,总算得到了一个比较稳定的版本,暂时平息了用户的愤怒。 但是,实际的问题并不在这里,几年来高速增长的同时也给公司带来了巨大的隐患,1990财年第三季度报表的公布引爆了一切。财务人员发现了1500万美元的坏帐,并且公司利润距离预期相差甚远。接下来的时间里,大公司病的诸般症状接踵而来,面对股东的指控,股票一落千丈,公司前景暗淡,甚至面临破产。一度靠贷款来维持自己的奢华生活也不变卖股票的Ellison也快撑不住了。公司下大力气整顿财务(财务主管杰夫·沃克从某种程度上解救了公司)。公司宣布削减开支,裁退大量销售人员,同时聘用了专门的管理人才。 噩梦延续到ORACLE第七版的推出而结束。这个公司已经空谈了好几年的新版本(一度被讥讽为不过是Ellison的故计重施而已),直到1992年6月才终于闪亮登场,这一次公司吸取了第六版匆忙上市的教训,听取了用户的多方面的建议,并集中力量对新版本进行了大量而细致的测试。该版本增加了许多新的性能特性:分布式事务处理功能、增强的管理功能、用于应用程序开发的新工具以及安全性方法。ORACLE7还包含了一些新功能,如存储过程、触发过程和说明性引用完整性等,并使得数据库真正的具有可编程能力。还有一点必需要说明的是,这个版本在原有的基于规则的优化器(RBO)之外引入一种新的优化器:基于开销的优化器(Cost-Based Optimizer , CBO)。CBO根据数据库自身对对象的统计来计算语句的执行开销,从而得出具体的语句执行计划。在以后的几个重大版本中,ORACLE的工程师们逐步对这个优化器进行改进,CBO逐渐取代了RBO。 跨上巅峰 “搅浑水”是Ellison的一项绝技。在1995年巴黎举行的欧洲信息技术论坛会议上,Ellison在即兴演讲中介绍了网络计算机(Network Computer,NC)的概念,所谓NC指的是配置简单却能充分利用网络资源的低价电脑,最为重要的是,它不需要操作系统,或者更准确的说,不需要微软的操作系统。Ellison希望借此来抵制微软的强势。很快,ORACLE联合IBM、Sun、Apple和Netscape在1996年制定了网络计算机的标准,但事实上人们从头到尾没有看到一台真正的NC生产出来。这次的演讲在业界引起了轩然大波,通过这个事件,ORACLE公司吸引了足够多的注意力,同时也让人们看到ORACLE公司对于网络的巨大信心。 1997年6月,ORACLE第八版发布。ORACLE8支持面向对象的开发及新的多媒体应用,这个版本也为支持Internet、网络计算等奠定了基础。同时这一版本开始具有同时处理大量用户和海量数据的特性。这个版本也算可圈可点了。 1998年9月,ORACLE公司正式发布ORACLE 8i。“i”代表Internet,这一版本中添加了大量为支持Internet而设计的特性。这一版本为数据库用户提供了全方位的Java支持。ORACLE 8i成为第一个完全整合了本地Java运行时环境的数据库,用Java就可以编写ORACLE的存储过程。对,Java,只要是能够打击微软的武器,ORACLE都要派上用场。ORACLE8i 添加了SQLJ(一种开放式标准,用于将SQL数据库语句嵌入客户机或服务器Java代码)和ORACLE interMedia(用于管理多媒体内容)以及XML等特性。同时,ORACLE 8i 极大程度上提高了伸缩性、扩展性和可用性以满足网络应用需要。接下来的几年中,ORACLE陆续发布了8i的几个版本,并逐渐添加了一些面向网络应用的新特性。面对开源运动的蓬勃发展,ORACLE自然不甘落后,1998年十月ORACLE发布了可用于Linux平台的ORACLE 8 以及ORACLE Application Server 4.0,随后不久,ORACLE又发布了ORACLE 8i for Linux。在 .com大潮中,ORACLE是站在风口浪尖的弄潮儿。 在2001年6月的ORACLE OpenWorld大会中,ORACLE发布了ORACLE 9i。在ORACLE 9i的诸多新特性中,最重要的就是Real Application Clusters(RAC)了。说起ORACLE集群服务器,早在第五版的时候,ORACLE就开始开发ORACLE并行服务器(ORACLE Parallel Server ,OPS),并在以后的版本中逐渐的完善了其功能,不过,严格来说,尽管OPS算得上是个集群环境,但是并没有体现出集群技术应有的优点。在完全吸收了Rdb(ORACLE在1994年收购了Compaq的Rdb数据库,此前Rdb属于DEC公司,DEC公司在VAX上实现了第一个可以商用的Rdb集群数据库)的一些技术优势之后,ORACLE终于推出了真正的应用集群软件。RAC使得多个集群计算机能够共享对某个单一数据库的访问,以获得更高的可伸缩性、可用性和经济性。ORACLE 9i的RAC在TPC-C的基准测试中打破了数项记录,一时间业内瞩目。这个新的数据库还包含集成的商务智能(BI)功能。ORACLE 9i第2版还做出了很多重要的改进,使ORACLE数据库成为一个本地的XML数据库;此外还包括自动管理、Data Guard等高可用方面的特性。 历史还在继续 2003年9月8日,旧金山举办的ORACLE World大会上,Ellison宣布下一代数据库产品为“ORACLE 10g”。ORACLE应用服务器10g(ORACLE Application Server 10g)也将作为甲骨文公司下一代应用基础架构软件集成套件。“g”代表“grid ,网格”。这一版的最大的特性就是加入了网格计算的功能。何谓网格计算?网格计算可以把分布在世界各地的计算机连接在一起,并且将各地的计算机资源通过高速的互联网组成充分共享的资源集成。通过合理调度,不同的计算环境被综合利用并共享。ORACLE宣称10g可以作为网格计算的基础,矛头直指最大的敌人IBM的“随需应变”!看来,ORACLE公司已经把这一次的“赌注”押在了网格计算的大市场上。但前景如何?让我们拭目以待。 如果说,IBM是IT产业中的一头巨鲸,那么ORACLE一定就是一条大鲨鱼:咄咄逼人,善于进攻。就在2003年6月初,ORACLE突然宣布51亿美金收购仁科(PeopleSoft),业内再次震动。次举又一次露出ORACLE 一贯善于进攻的本性。要知道,ORACLE在发展过程中很少对企业进行收购的,那么收购仁科目的何在?首先,ORACLE觊觎企业应用软件市场已久,但苦于不能进一步扩大市场分额,尤为重要的是,一旦成功,可以直接对最大的敌人IBM进行打击,还可以阻击SAP等巨头的强势,这一点尤为重要。时至今日,ORACLE依然以不达目的不罢休的态势和仁科缠斗,结果如何,让我们拭目以待。 "人生最大的快乐是击败敌人”,Ellison一定很喜欢这句活。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 09:29 AM CDT 用实体关系图进行数据库建模
一、概述 很可能你现在正在规划一个数据库驱动的网站;而且几乎可以肯定的是,你一定已经浏览过数据库驱动的网站。过去,一些网站依赖CGI脚本和文本文件存储实现数据持久化,但现在我们能够访问大量不同的关系型、对象-关系型、面向对象型数据库。 对于Web应用来说,关系数据库是一种强大的支持工具,这得感谢它们的高可用性、性能,而且相对来说,关系数据库比较容易使用。要找出一个功能完善、源代码开放、能够在多种平台上运行的数据库系统并不困难。你可以用Perl、Java、PHP以及其他服务器端脚本语言把关系数据库和Web网站连结到一起。 随着网站规模的发展,它对数据库——通常是关系数据库——的依赖程度也日益增加。大量页面和服务需要向数据库表写入信息,或者从数据库提取信息。对于大多数网站,数据库表很快成为网站体系结构中的关键部分,成为网站运作的生命中枢。为了方便和轻松地管理大容量数据,用户帐户、新闻动态、内容、统计数据都可以保存到关系数据库管理系统(Relational Database Management System,RDBMS)。 用图(Diagram)管理数据模型具有高效、方便的优点。对于RDBMS,描述数据模型的图通常称为实体关系图(Entity Relationship Diagram,ERD)。用ERD描述数据模型能够帮助你预先精确定义数据需求,使你能够对以后的改动作出有效的规划,能够随着网站的发展方便地改进规划。 本文将介绍ERD建模工具和概念。文章提供了一些图的实例,但它们的目的不是提供精确的或者是全面的数据设计范例。它们的目的是以两个建模工具为例,介绍数据建模符号。在不同的工具之间,图的符号有着重大的差别,但它们的基本概念一样。本文的图例从PowerDesigner和Visio 2000 Professional的试用版得到,你可以从本文末尾找到这些工具和其他类似产品的链接。 二、是否使用建模工具? 许多规模较小的网站用ASCII形式的SQL(Structured Query Language)脚本文件进行数据建模。当开发小组人员较少,或者最理想的情况下仅由一个人构成时,这种方法最有效。然而,数据模型将很快发展成为一个复杂的结构——在这种情况下,CASE(Computer Aided Software Engineering,计算机辅助软件设计)工具、有关所有数据信息的图、集中式知识库能够极大地帮助你管理Web网站的数据层。 2.1 何时使用SQL? 即使当你准备用SQL直接管理数据模式(物理数据库)时,图也能有效地帮助你理解和改进系统。然而,如果你的预算或者时间非常有限,采用复杂的新式建模工具可能得不偿失。相反,在这种情况下,你应该使用一个简单的图形工具把数据模式的基本情况记录下来,然后逐步转换到复杂的数据建模工具。 如果你正在设计的数据库类型不常见(或者是非标准的),避免使用某些复杂CASE工具可能是明智的,因为这些工具的“反向工程”能力和某些自动功能可能无法在你的环境下发挥作用。这里所谓的自动功能,是指建模工具根据输入模型的图形和属性信息,自动为目标数据库生成合适SQL命令的能力。反向工程是这样一种能力,建模工具根据已经部署的物理数据模式,从现有的表提取出实体和关系信息。 2.2 转入建模工具 从简单绘图工具转换到数据建模工具并不是一个很复杂的过程。大多数数据建模工具的工作方式就象是一个标准的绘图工具,参见图1a和图1b,这是两个数据建模工具的界面实例。你可以在这里创建和排列表,定义关系,以及指定其它信息(列的类型、长度,键等)。
图1a:PowerDesigner的界面
图1b:Visio的界面 转向数据建模工具的主要挑战在于:
一些入门级数据建模工具(参见本文后面的参考资源)只有少量的高级特性。这有好处,但也有弊端——它们很容易学习使用,但当你积累了更多的经验时,它们可能不再满足你日益增长的需要。然而,升级工具或更换工具一般不存在大的问题,特别是当新的工具能够对现有数据模式进行精确、完整的反向工程时,升级或更换工具的过程尤其简单。 三、ERD建模符号 本文使用Martin的Information Engineering符号。PowerDesigner采用的就是这种符号,Oracle的Designer产品所使用的符号也和它很相似。你可以在AIS Modeling Summary查看各种ERD符号的说明。基本的ERD绘图规范很直观易懂。你可以定义实体(表),描述各个实体之间的关系。在填写表和关系的细节信息时,每一种工具的做法都有所不同;但就我所遇到的工具来看,基本概念在大多数软件包之间是相通的。接下来的内容将介绍你必须了解的主要图形元素和设置方法。 3.1 表 所有构造合理的数据建模工具都允许为表指定丰富的关联信息。这些信息包括(但不局限于):
要指定这些信息,一般你需要进入表的属性窗口,如图2a和图2b所示。
2a:PowerDesigner中表的属性窗口
图2b:Visio中表的属性窗口
一旦输入了新表的属性信息,图将被更新,显示出你所提供的新的或更改后的表信息。下面的图形显示了一个表的实例,这个表的属性信息见图2a和图2b。在图2a和图2b中,许多列被定义成了(m)andatory(强制的)、(p)rimary(主键)和(d)isplayed(被显示的)列。下面的图显示了为该表输入的部分属性信息。
图3a:PowerDesigner的表
图3b:Visio的表
在图3a中可以看到一些非标准的数据类型,如PHONENUMBER和PK。许多数据建模工具允许定义域或定制数据类型,它们可供一个以上的列使用。域不仅代表着数据类型——通常,它们还包含检查约束、默认值、值列表等信息。如果你想要更新一个域(例如定义一种新的电话号码格式),所有该模型中引用该域的列都将自动更新。 3.2 关系 如果我们只定义数据模式中的表,数据建模工具就不那么重要了。各个表之间的关系、依赖情况往往很复杂,有一个管理和显示这些关系的工具将带来很大的帮助。对于一个给定的关系,必须收集的重要信息包括:
大多数建模工具通过在两个或者更多表之间画出连线的方式定义关系。默认情况下,关系往往被定义成为一对多关系,而且它对于关系中的任何一方都是可选的。要修改关系,你必须打开关系的属性窗口,更新实体关系的特征信息。图4a和图4b显示了两个不同的工具允许为关系定义的部分属性:
图4a:PowerDesigner的关系属性设置界面
图4b:Visio的关系属性设置界面
该图显示了一个一对多关系——一个典型的父-子关联关系。部门(Branch)和雇员(Emplyee)的关系是强制的。它意味着一个部门必须至少有一个雇员(1-N强制关系);另一方面,它意味着一个雇员必须属于且只能属于一个部门(1-1强制关系)。图5a和图5b反映了修改后的关系。
图5a:PowerDesigner中两个表之间的关系
图5b:Visio中两个表之间的关系
这个图显示了如何把信息转换成符号。强制的关系由一条实心垂直线(而不是椭圆)表示。某些工具用虚线表示可选的关系。关系中属于“多”的这一边用一个类似鸟爪的图形表示,关系的基数在靠近它所描述的那一端显示。 你可能已经注意到,Employee表没有定义外键列。这个图仍旧处于“概念设计”阶段——此后,从概念图到物理数据模型之间的转换是必不可少的。大多数工具区分概念和物理数据模型——概念数据模型描述信息的需求,但不关注细节问题,例如索引和强制性的引用完整性。 有些时候,你可能要定义自我引用的表。自我引用的表一般用来描述层次型关系。如下面的图形所示,大多数数据建模工具能够处理这类关系。注意在这个例子中,雇员可以有零个或者一个上级——它使你能够处理一些特殊的情况,比如总统没有直接的上级。
图6a:PowerDesigner中自我引用的表
图6b:Visio中自我引用的表 四、图的规划 定义表和关系只是挑战的一部分,图的清楚明白同样很重要。虽然一些工具提供自动布局能力,我还没有看到过一个完善的实现。相反,你的目标应该是遵从“孔雀东南飞”这一规则(这里的“孔雀”是关系中代表“多”这一方的符号,它是连接到表的三条分叉线,象个鸟爪)。换句话说,子表应该位于父表的右方和下方。这种安排使得从逻辑上组织和理解数据模型更加方便。最重要、最高级别的表应该出现在左上角,让级别较低的表出现在页面的右下角。为了清楚起见,减少图中交叉线的数量也是很重要的。正如Eberhardt Rechtin在The Art of Systems Architecting中强调的,“一个好的设计往往看起来很舒服”。如果无论怎样安排,你的数据模型看起来都很混乱,那么,它可能正在告诉你数据模型本身有一些值得注意的问题。
图7a:完整的ER图(PowerDesigner)
图7b:完整的ER图(Visio) 五、从图到数据库 依赖于你所选择的用来建立数据模型的软件包,建模工具可能会根据模型生成SQL命令或直接修改数据库模式。这种功能带来了极大的便利;和使用ASCII格式的SQL脚本相比,这种方式有着许多优点。一些建模工具的功能适合于大量的数据库类型,例如PostgreSQL、MySQL、Oracle、DB2,等等。对于简单的数据库修改,改动操作可以从建模工具通过ODBC直接完成。数据库改动还允许以增量方式进行(例如,ALTER命令或创建命令,以及对特定表的更新命令)。当你第一次使用建模工具时,你可以查看建模工具生成的SQL,看看自己是否可以信任和认可建模工具对数据模型的解释。一段时间之后,你就会熟悉建模工具对各种关系和表细节的解释。 【结束语】数据建模是一种很好的软件工程实践。它能够帮助你在正式编写程序代码之前规划数据需求。在维护和改进系统的数据布局的过程中,数据建模同样很有用。一些工具能够让这个过程变得非常简单,能够在你管理和设计数据库系统的时候带来极大的帮助。然而,根据你所需功能的不同,建模工具的价格也有着极大的差异。在不出现预算赤字的情况下,轻松掌握和运用数据建模技术的最好方法是,从小型的工具开始,然后逐渐深入和提高。
六、参考和资源 ■ 工具
■ 参考 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 09:28 AM CDT 谈到数据库,就不能不谈数据库结构,access也不例外。 一、规划数据库 二、创建数据库 在这个对话框弹出以后,我们不再象上次那样选“数据库”选项卡,而是选择“常用”选项卡,并在“常用”选项卡上用鼠标左键双击“数据库”图标。 屏幕上弹出“文件新建数据库”对话框,在“文件名”中给新建的数据库文件取名“空数据库”,选择保存位置,点“创建”按钮即可。 三、access数据库中的主要对象及其关系 在数据库中,“表”用来存储数据;“查询”用来查找数据;人通过“窗体”、“报表”、“页面”获取数据;而“宏”和“模块”则用来实现数据的自动操作。其实对于数据库来说,最重要的功能就是获取数据库中的数据,所以数据在数据库各个对象间的流动就成为我们最关心的事情。为了以后建立数据库的时候能清楚的安排各种结构,应该先了解一下Access数据库中对象间的作用和联系。 作为一个数据库,最基本的就是要有表,并且表中存储了数据。比如“通讯录”数据库,首先要建立一个表,然后将某人的联系地址、电话等信息输入到这个数据表中,这样就有了数据库中的数据源。有了这些数据以后,就可以将它们显示在窗体上。这个过程就是将表中的数据和窗体上的控件建立连接,在Access中把这个过程叫做“绑定”。这样就可以通过屏幕上的各种各样的窗体界面来获得真正存储在表中的数据了。而且合理地在窗体上摆放控件和图案可以使我们更容易操作和理解数据库中数据代表的含意。这样就完成数据从表到窗体的流动,实现了数据库中的数据在计算机和人之间进行了一次沟通。比如在“通讯录”数据库中,使用自动窗体将数据库中的一个记录显示在窗体上,控制窗体上的记录操作按钮在表中前后移动,可以看到对应其它记录的信息。现在,数据库中的表和窗体对象之间的关系应该很清晰了,我们可以画出一个表。至于数据库中的其他对象,现在先把它们空出来。在以后学习了其他的几种对象以后,将把这个表示数据库中数据流向的图表补充完整。我们以后可以每学一课,就按照这种方式将各种对象间的数据流向画出来,这对于建立一个完整的数据库很有好处。 总结:通过建立一个空数据库,讲解了建立一个新数据库需要注意的问题和数据库中每个对象的用途和相互关系,实践是检验真理的唯一标准,赶快加紧试试吧:) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 09:25 AM CDT 在进入Raw Socket多种强大的应用之前,我们先讲解怎样建立一个Raw Socket及怎样用建立的Raw Socket发送和接收IP包。 建立Raw Socket 在Windows平台上,为了使用Raw Socket,需先初始化WINSOCK:
MAKEWORD(2, 1)组成一个版本字段,2.1版,同样的,MAKEWORD(2, 2)意味着2.2版。MAKEWORD本身定义为:
因此MAKEWORD(2, 1)实际等同于0x0201。同样地,0x0101可等同于MAKEWORD(1, 1)。 与WSAStartup()的函数为WSACleanup(),在所有的socket都使用完后调用,如:
接下来,定义一个Socket句柄:
创建Socket并将句柄赋值给定义的sd,可以使用WSASocket()函数来完成,其原型为:
其中的参数定义为: af:地址家族,一般为AF_INET,指代IPv4(The Internet Protocol version 4)地址家族。 type:套接字类型,如果创建原始套接字,应该使用SOCK_RAW; Protocol:协议类型,如IPPROTO_TCP、IPPROTO_UDP等; lpProtocolInfo :WSAPROTOCOL_INFO结构体指针; dwFlags:套接字属性标志。 例如,下面的代码定义ICMP协议类型的原始套接字:
创建Socket也可以使用socket()函数:
参数的定义与WSASocket()函数相同。 为了使用socket()函数创建的Socket,还需要将这个Socket与sockaddr绑定:
其中使用的struct sockaddr_in(即SOCKADDR_IN)为:
而bind()函数第二个参数的struct sockaddr类型定义为:
实际上,bind()函数采用struct sockaddr是为了考虑兼容性,最终struct sockaddr和struct sockaddr_in的内存占用是等同的。struct sockaddr_in中的struct in_addr成员占用4个字节,为32位的IP地址,定义为:
把32位的IP地址定义为上述联合体将使用户可以以字节、半字或字方式读写同一个IP地址。同志们,注意了,这个技巧在许多软件开发中定义数据结构时被广泛采用。 为了控制包的发送方式,我们可能会用到如下的这个十分重要的函数来设置套接字选项:
例如,当level为SOL_SOCKET时,我们可以设置布尔型选项SO_BROADCAST从而控制套接字是否传送和接收广播消息。 下面的代码通过设置IPPROTO_IP level的IP_HDRINCL选项为TRUE从而使能程序员亲自处理IP包报头:
下面的函数用于控制套接字:
如下面的代码让socket接收所有报文(sniffer模式):
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 09:24 AM CDT -- win API socket 本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。 一、WSAStartup函数 int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); 使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。 例:假如一个程序要使用2.1版本的Socket,那么程序代码如下 wVersionRequested = MAKEWORD( 2, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); 二、WSACleanup函数 int WSACleanup (void); 应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。 三、socket函数 SOCKET socket( int af, int type, int protocol ); 应用程序调用socket函数来创建一个能够进行网络通信的套接字。第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置PF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第三个参数指定应用程序所使用的通信协议。该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。下面是一个创建流套接字的例子: struct protoent *ppe; ppe=getprotobyname("tcp"); SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto); 四、closesocket函数 int closesocket( SOCKET s ); closesocket函数用来关闭一个描述符为s套接字。由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。套接字数据结构中专门有一个字段存放该结构的被引用次数,即有多少个套接字描述符指向该结构。当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个套接字描述符指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1。 closesocket函数如果执行成功就返回0,否则返回SOCKET_ERROR。 五、send函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回SOCKET_ERROR) 注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。 六、recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符;第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0。这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。 注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。 七、bind函数 int bind( SOCKET s, const struct sockaddr FAR *name, int namelen ); 当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的: struct sockaddr { u_short sa_family; char sa_data[14]; }; sa_family指定地址族,对于TCP/IP协议族的套接字,给其置AF_INET。当对TCP/IP协议族的套接字进行绑定时,我们通常使用另一个地址结构: struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; 其中sin_family置AF_INET;sin_port指明端口号;sin_addr结构体中只有一个唯一的字段s_addr,表示IP地址,该字段是一个整数,一般用函数inet_addr()把字符串形式的IP地址转换成unsigned long型的整数值后再置给s_addr。有的服务器是多宿主机,至少有两个网卡,那么运行在这样的服务器上的服务程序在为其Socket绑定IP地址时可以把htonl(INADDR_ANY)置给s_addr,这样做的好处是不论哪个网段上的客户程序都能与该服务程序通信;如果只给运行在多宿主机上的服务程序的Socket绑定一个固定的IP地址,那么就只有与该IP地址处于同一个网段上的客户程序才能与该服务程序通信。我们用0来填充sin_zero数组,目的是让sockaddr_in结构的大小与sockaddr结构的大小一致。下面是一个bind函数调用的例子: struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(8888); saddr.sin_addr.s_addr = htonl(INADDR_ANY); bind(ListenSocket,(struct sockaddr *)&saddr,sizeof(saddr)); 八、listen函数 int listen( SOCKET s, int backlog ); 服务程序可以调用listen函数使其流套接字s处于监听状态。处于监听状态的流套接字s将维护一个客户连接请求队列,该队列最多容纳backlog个客户连接请求。假如该函数执行成功,则返回0;如果执行失败,则返回SOCKET_ERROR。 九、accept函数 SOCKET accept( SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen ); 服务程序调用accept函数从处于监听状态的流套接字s的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符,以后与客户套接字交换数据的是新创建的套接字;如果失败就返回INVALID_SOCKET。该函数的第一个参数指定处于监听状态的流套接字;操作系统利用第二个参数来返回新创建的套接字的地址结构;操作系统利用第三个参数来返回新创建的套接字的地址结构的长度。下面是一个调用accept的例子: struct sockaddr_in ServerSocketAddr; int addrlen; addrlen=sizeof(ServerSocketAddr); ServerSocket=accept(ListenSocket,(struct sockaddr *)&ServerSocketAddr,&addrlen); 十、connect函数 int connect( SOCKET s, const struct sockaddr FAR *name, int namelen ); 客户程序调用connect函数来使客户Socket s与监听于name所指定的计算机的特定端口上的服务Socket进行连接。如果连接成功,connect返回0;如果失败则返回SOCKET_ERROR。下面是一个例子: struct sockaddr_in daddr; memset((void *)&daddr,0,sizeof(daddr)); daddr.sin_family=AF_INET; daddr.sin_port=htons(8888); daddr.sin_addr.s_addr=inet_addr("133.197.22.4"); connect(ClientSocket,(struct sockaddr *)&daddr,sizeof(daddr)); |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 08:38 AM CDT 非常适合于初学者的sniffer源码,里面的内容已经将的很清楚,也很容易懂。而且也适合于分析IP,TCP,UDP,ICMP……的数据包情况,截取的数据全部放在源程序的logefile.txt里面! 因为很经典,因为很容易懂,因为自己也正在学习成长中,所以把自己的体会,把自己的东西贡献出来大家共享一下,因为只有相互学习才能进步!因为自己曾经对这些东西也很迷茫,曾经找了很久,曾经一无所获,痛苦了很久,不过之后,自己也研究了很久。 自己经历过,如果能让大家可以少走点弯路,我觉得我很荣幸,我也觉得这篇源码值得大家珍藏!万一这篇源码对于有些人还有点用处,请记得我的主题:Fly to Your Dreams! #include "stdio.h" #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) //this removes the need of mstcpip.h void StartSniffing (SOCKET Sock); //This will sniff here and there //IP Header Structure //UDP Header Structure // TCP Header Structure //ICMP Header Structure
//Its free! int main() void StartSniffing(SOCKET sniffer) void ProcessPacket(unsigned char* Buffer, int Size)
void PrintTcpPacket(unsigned char* Buffer, int Size) void PrintUdpPacket(unsigned char *Buffer,int Size) void PrintIcmpPacket(unsigned char* Buffer , int Size) void PrintData (unsigned char* data , int Size) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 08:36 AM CDT 既然要学习Socket,就应该用最简单直白的方式把Socket的几个使用要点讲出来。我认为程序员最关心的有以下几点,按照优先级排列如下: 1. Socket的机制是什么? 2. 用C/C++写Socket需要什么头文件、库文件、DLL,它们可以由谁提供,安装后一般处于系统的哪个文件夹内? 3. 编写Socket程序需要的编程基础是什么? 4. Socket库内最重要的几个函数和数据类型是什么? 5. 两个最简单的例子程序; 6. 一个贴近应用的稍微复杂的Socket应用程序。 我将一一讲述这些要点,并给出从简到繁,从朴素到花哨的所有源代码以及编译链接的命令。 1 Socket的机制是什么? 我们可以简单的把Socket理解为一个可以连通网络上不同计算机程序之间的管道,把一堆数据从管道的A端扔进去,则会从管道的B端(也许同时还可以从C、D、E、F……端)冒出来。管道的端口由两个因素来唯一确认,即机器的IP地址和程序所使用的端口号。IP地址的含义所有人都知道,所谓端口号就是程序员指定的一个数字,许多著名的木马程序成天在网络上扫描不同的端口号就是为了获取一个可以连通的端口从而进行破坏。比较著名的端口号有http的80端口和ftp的21端口。当然,建议大家自己写程序不要使用太小的端口号,它们一般被系统占用了,也不要使用一些著名的端口,一般来说使用1000~5000之内的端口比较好。 Socket可以支持数据的发送和接收,它会定义一种称为套接字的变量,发送数据时首先创建套接字,然后使用该套接字的sendto等方法对准某个IP/端口进行数据发送;接收端也首先创建套接字,然后将该套接字绑定到一个IP/端口上,所有发向此端口的数据会被该套接字的recv等函数读出。如同读出文件中的数据一样。 2 所需的头文件、库文件和DLL 对于目前使用最广泛的Windows Socket2.0版本,所需的一些文件如下(以安装了VC6为例说明其物理位置): ? 头文件winsock2.h,通常处于C:"Program Files"Microsoft Visual Studio"VC98"INCLUDE;查看该头文件可知其中又包含了windows.h和pshpack4.h头文件,因此在windows中的一些常用API都可以使用; ? 库文件Ws2_32.lib,通常处于C:"Program Files"Microsoft Visual Studio"VC98"Lib; ? DLL文件Ws2_32.dll,通常处于C:"WINDOWS"system32,这个是可以猜到的。 3 UDP 用最通俗的话讲,所谓UDP,就是发送出去就不管的一种网络协议。因此UDP编程的发送端只管发送就可以了,不用检查网络连接状态。下面用例子来说明怎样编写UDP,并会详细解释每个API和数据类型。 3.1 UDP广播发送程序 下面是一个用UDP发送广播报文的例子。 #include <winsock2.h> #include <iostream.h> void main() { SOCKET sock; //socket套接字 char szMsg[] = "this is a UDP test package";//被发送的字段 //1.启动SOCKET库,版本为2.0 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 0 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( 0 != err ) //检查Socket初始化是否成功 { cout<<"Socket2.0初始化失败,Exit!"; return; } //检查Socket库的版本是否为2.0 if (LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) { WSACleanup( ); return; } //2.创建socket, sock = socket( AF_INET, //internetwork: UDP, TCP, etc SOCK_DGRAM, //SOCK_DGRAM说明是UDP类型 0 //protocol ); if (INVALID_SOCKET == sock ) { cout<<"Socket 创建失败,Exit!"; return; } //3.设置该套接字为广播类型, bool opt = true; setsockopt(sock, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<char FAR *>(&opt), sizeof(opt)); //4.设置发往的地址 sockaddr_in addrto; //发往的地址 memset(&addrto,0,sizeof(addrto)); addrto.sin_family = AF_INET; //地址类型为internetwork addrto.sin_addr.s_addr = INADDR_BROADCAST; //设置ip为广播地址 addrto.sin_port = htons(7861); //端口号为7861 int nlen=sizeof(addrto); unsigned int uIndex = 1; while(true) { Sleep(1000); //程序休眠一秒 //向广播地址发送消息 if( sendto(sock, szMsg, strlen(szMsg), 0, (sockaddr*)&addrto,nlen) == SOCKET_ERROR ) cout<<WSAGetLastError()<<endl; else cout<<uIndex++<<":an UDP package is sended."<<endl; } if (!closesocket(sock)) //关闭套接字 { WSAGetLastError(); return; } if (!WSACleanup()) //关闭Socket库 { WSAGetLastError(); return; } } 编译命令: CL /c UDP_Send_Broadcast.cpp 链接命令(注意如果找不到该库,则要在后面的/LIBPATH参数后加上库的路径): link UDP_Send_Broadcast.obj ws2_32.lib 执行命令: D:"Code"成品代码"Socket"socket_src>UDP_Send_Broadcast.exe 1:an UDP package is sended. 2:an UDP package is sended. 3:an UDP package is sended. 4:an UDP package is sended. ^C 下面一一解释代码中出现的数据类型与API函数。有耐心的可以仔细看看,没耐心的依葫芦画瓢也可以写程序了。 3.2 SOCKET类型 SOCKET是socket套接字类型,在WINSOCK2.H中有如下定义: typedef unsigned int u_int; typedef u_int SOCKET; 可知套接字实际上就是一个无符号整型,它将被Socket环境管理和使用。套接字将被创建、设置、用来发送和接收数据,最后会被关闭。 3.3 WORD类型、MAKEWORD、LOBYTE和HIBYTE宏 WORD类型是一个16位的无符号整型,在WTYPES.H中被定义为: typedef unsigned short WORD; 其目的是提供两个字节的存储,在Socket中这两个字节可以表示主版本号和副版本号。使用MAKEWORD宏可以给一个WORD类型赋值。例如要表示主版本号2,副版本号0,可以使用以下代码: WORD wVersionRequested; wVersionRequested = MAKEWORD( 2, 0 ); 注意低位内存存储主版本号2,高位内存存储副版本号0,其值为0x0002。使用宏LOBYTE可以读取WORD的低位字节,HIBYTE可以读取高位字节。 3.4 WSADATA类型和LPWSADATA类型 WSADATA类型是一个结构,描述了Socket库的一些相关信息,其结构定义如下: typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; } WSADATA; typedef WSADATA FAR *LPWSADATA; 值得注意的就是wVersion字段,存储了Socket的版本类型。LPWSADATA是WSADATA的指针类型。它们不用程序员手动填写,而是通过Socket的初始化函数WSAStartup读取出来。 3.5 WSAStartup函数 WSAStartup函数被用来初始化Socket环境,它的定义如下: int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); 其返回值为整型,调用方式为PASCAL(即标准类型,PASCAL等于__stdcall),参数有两个,第一个参数为WORD类型,指明了Socket的版本号,第二个参数为WSADATA类型的指针。 若返回值为0,则初始化成功,若不为0则失败。 3.6 WSACleanup函数 这是Socket环境的退出函数。返回值为0表示成功,SOCKET_ERROR表示失败。 3.7 socket函数 socket的创建函数,其定义为: SOCKET PASCAL FAR socket (int af, int type, int protocol); 第一个参数为int af,代表网络地址族,目前只有一种取值是有效的,即AF_INET,代表internet地址族; 第二个参数为int type,代表网络协议类型,SOCK_DGRAM代表UDP协议,SOCK_STREAM代表TCP协议; 第三个参数为int protocol,指定网络地址族的特殊协议,目前无用,赋值0即可。 返回值为SOCKET,若返回INVALID_SOCKET则失败。 3.8 setsockopt函数 这个函数用来设置Socket的属性,若不能正确设置socket属性,则数据的发送和接收会失败。定义如下: int PASCAL FAR setsockopt (SOCKET s, int level, int optname, const char FAR * optval, int optlen); 其返回值为int类型,0代表成功,SOCKET_ERROR代表有错误发生。 第一个参数SOCKET s,代表要设置的套接字; 第二个参数int level,代表要设置的属性所处的层次,层次包含以下取值:SOL_SOCKET代表套接字层次;IPPROTO_TCP代表TCP协议层次,IPPROTO_IP代表IP协议层次(后面两个我都没有用过); 第三个参数int optname,代表设置参数的名称,SO_BROADCAST代表允许发送广播数据的属性,其它属性可参考MSDN; 第四个参数const char FAR * optval,代表指向存储参数数值的指针,注意这里可能要使用reinterpret_cast类型转换; 第五个参数int optlen,代表存储参数数值变量的长度。 Getsockopt函数 简述: 获取一个套接口选项。 #include <winsock.h> int PASCAL FAR getsockopt( SOCKET s, int level, int optname, char FAR* optval, int FAR* optlen); s:一个标识套接口的描述字。 level:选项定义的层次。支持的层次仅有SOL_SOCKET和IPPROTO_TCP。 optname:需获取的套接口选项。 optval:指针,指向存放所获得选项值的缓冲区。 optlen:指针,指向optval缓冲区的长度值。 注释: getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。在不同协议层上存在选项,但往往是在最高的“套接口”层次上,设置选项影响套接口的操作,诸如操作的阻塞与否、包的选径方式、带外数据的传送等。 被选中选项的值放在optval缓冲区中。optlen所指向的整形数在初始时包含缓冲区的长度,在调用返回时被置为实际值的长度。对SO_LINGER选项而言,相当于linger结构的大小,对其他选项来说,是一个整形数的大小。 如果未进行setsockopt()调用,则getsockopt()返回系统缺省值。 3.9 sockaddr_in、in_addr类型,inet_addr、inet_ntoa函数 sockaddr_in定义了socket发送和接收数据包的地址,定义: struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; 其中in_addr的定义如下: struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; 首先阐述in_addr的含义,很显然它是一个存储ip地址的联合体,有三种表达方式: 第一种用四个字节来表示IP地址的四个数字; 第二种用两个双字节来表示IP地址; 第三种用一个长整型来表示IP地址。 给in_addr赋值的一种最简单方法是使用inet_addr函数,它可以把一个代表IP地址的字符串赋值转换为in_addr类型,如 addrto.sin_addr.s_addr=inet_addr("192.168.0.2"); 本例子中由于是广播地址,所以没有使用这个函数。其反函数是inet_ntoa,可以把一个in_addr类型转换为一个字符串。 sockaddr_in的含义比in_addr的含义要广泛,其各个字段的含义和取值如下: 第一个字段short sin_family,代表网络地址族,如前所述,只能取值AF_INET; 第二个字段u_short sin_port,代表IP地址端口,由程序员指定; 第三个字段struct in_addr sin_addr,代表IP地址; 第四个字段char sin_zero[8],很搞笑,是为了保证sockaddr_in与SOCKADDR类型的长度相等而填充进来的字段。 以下代表指明了广播地址,端口号为7861的一个地址: sockaddr_in addrto; //发往的地址 memset(&addrto,0,sizeof(addrto)); addrto.sin_family = AF_INET; //地址类型为internetwork addrto.sin_addr.s_addr = INADDR_BROADCAST; //设置ip为广播地址 addrto.sin_port = htons(7861); //端口号为7861 3.10 sockaddr类型 sockaddr类型是用来表示Socket地址的类型,同上面的sockaddr_in类型相比,sockaddr的适用范围更广,因为sockaddr_in只适用于TCP/IP地址。Sockaddr的定义如下: struct sockaddr { u_short sa_family; char sa_data[14]; }; 可知sockaddr有16个字节,而sockaddr_in也有16个字节,所以sockaddr_in是可以强制类型转换为sockaddr的。事实上也往往使用这种方法。 3.11 Sleep函数 线程挂起函数,表示线程挂起一段时间。Sleep(1000)表示挂起一秒。定义于WINBASE.H头文件中。WINBASE.H又被包含于WINDOWS.H中,然后WINDOWS.H被WINSOCK2.H包含。所以在本例中使用Sleep函数不需要包含其它头文件。 3.12 sendto函数 在Socket中有两套发送和接收函数,一是sendto和recvfrom;二是send和recv。前一套在函数参数中要指明地址;而后一套需要先将套接字和一个地址绑定,然后直接发送和接收,不需绑定地址。sendto的定义如下: int PASCAL FAR sendto (SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR *to, int tolen); 第一个参数就是套接字; 第二个参数是要传送的数据指针; 第三个参数是要传送的数据长度(字节数); 第四个参数是传送方式的标识,如果不需要特殊要求则可以设置为0,其它值请参考MSDN; 第五个参数是目标地址,注意这里使用的是sockaddr的指针; 第六个参数是地址的长度; 返回值为整型,如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR。 接收一个数据报并保存源地址。 #include <winsock.h> int PASCAL FAR recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen); s:标识一个已连接套接口的描述字。 buf:接收数据缓冲区。 len:缓冲区长度。 flags:调用操作方式。 from:(可选)指针,指向装有源地址的缓冲区。 fromlen:(可选)指针,指向from缓冲区长度值。 3.13 WSAGetLastError函数 该函数用来在Socket相关API失败后读取错误码,根据这些错误码可以对照查出错误原因。 3.14 closesocket 关闭套接字,其参数为SOCKET类型。成功返回0,失败返回SOCKET_ERROR。 3.15 小结 总结以上内容,写一个UDP发送程序的步骤如下: 1. 用WSAStartup函数初始化Socket环境; 2. 用socket函数创建一个套接字; 3. 用setsockopt函数设置套接字的属性,例如设置为广播类型;很多时候该步骤可以省略; 4. 创建一个sockaddr_in,并指定其IP地址和端口号; 5. 用sendto函数向指定地址发送数据,这里的目标地址就是广播地址;注意这里不需要绑定,即使绑定了,其地址也会被sendto中的参数覆盖;若使用send函数则会出错,因为send是面向连接的,而UDP是非连接的,只能使用sendto发送数据; 6. 用closesocket函数关闭套接字; 7. 用WSACleanup函数关闭Socket环境。 那么,与之类似,一个UDP接收程序的步骤如下,注意接收方一定要bind套接字: 1. 用WSAStartup函数初始化Socket环境; 2. 用socket函数创建一个套接字; 3. 用setsockopt函数设置套接字的属性,例如设置为广播类型; 4. 创建一个sockaddr_in,并指定其IP地址和端口号; 5. 用bind函数将套接字与接收的地址绑定起来,然后调用recvfrom函数或者recv接收数据; 注意这里一定要绑定,因为接收报文的套接字必须在网络上有一个绑定的名称才能保证正确接收数据; 6. 用closesocket函数关闭套接字; 7. 用WSACleanup函数关闭Socket环境。 广播接收程序见源程序代码UDP_Recv_Broadcast.cpp。编译、链接、执行与UDP_Send_Broadcast类似。 3.16 UDP点对点发送接收程序 广播发送和接收使用并不广泛,一般来说指定发送和接收的IP比较常用。点对点方式的UDP发送和接收与上面的例子非常类似,不同的就是需要指定一个具体的IP地址。并且不需要调用setsockopt设置socket的广播属性。 其具体源代码见UDP_Send_P2P.cpp和UDP_Recv_P2P.cpp。 注意在使用这两个程序时要设为自己所需的IP。 4 TCP TCP与UDP最大的不同之处在于TCP是一个面向连接的协议,在进行数据收发之前TCP必须进行连接,并且在收发的时候必须保持该连接。 发送方的步骤如下(省略了Socket环境的初始化、关闭等内容): 1. 用socket函数创建一个套接字sock; 2. 用bind将sock绑定到本地地址; 3. 用listen侦听sock套接字; 4. 用accept函数接收客户方的连接,返回客户方套接字clientSocket; 5. 在客户方套接字clientSocket上使用send发送数据; 6. 用closesocket函数关闭套接字sock和clientSocket; 而接收方的步骤如下: 1. 用socket函数创建一个套接字sock; 2. 创建一个指向服务方的远程地址; 3. 用connect将sock连接到服务方,使用远程地址; 4. 在套接字上使用recv接收数据; 5. 用closesocket函数关闭套接字sock; 值得注意的是,在服务方有两个地址,一个是本地地址myaddr,另一个是目标地址addrto。本地地址myaddr用来和本地套接字sock绑定,目标地址被sock用来accept客户方套接字clientSocket。这样sock和clientSocket连接成功,这两个地址也连接上了。在服务方使用clientSocket发送数据,则会从本地地址传送到目标地址。 在客户方只有一个地址,即来源地址addrfrom。这个地址被用来connect远程的服务方套接字,connect成功则本地套接字与远程的来源地址连接了,因此可以使用该套接字接收远程数据。其实这时客户方套接字已经被隐性的绑定了本地地址,所以不需要显式调用bind函数,即使调用也不会影像结果。 具体源代码见TCP_Send.cpp和TCP_Recv.cpp。注意将源代码中的IP地址修改为符合自己需要的IP。为了减少代码复杂性,没有使用读取本机IP的代码,后续例子程序中含有此功能代码。 4.1 bind函数 bind函数用来将一个套接字绑定到一个IP地址。一般只在服务方(即数据发送方)调用,很多函数会隐式的调用bind函数。 4.2 listen函数 从服务方监听客户方的连接。同一个套接字可以多次监听。 4.3 connect和accept函数 connect是客户方连接服务方的函数,而accept是服务方同意客户方连接的函数。这两个配套函数分别在各自的程序中被成功调用后就可以收发数据了。 4.4 send和recv函数 send和recv是用来发送和接收数据的两个重要函数。send只能在已经连接的状态下使用,而recv可以面向连接和非连接的状态下使用。 send的定义如下: int WSAAPI send( SOCKET s, const char FAR * buf, int len, int flags ); 其参数的含义和sendto中的前四个参数一样。而recv的定义如下: int WSAAPI recv( SOCKET s, char FAR * buf, int len, int flags ); 其参数含义与send中的参数含义一样 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 10:25 AM CDT 标签:Alpha Protocol, GC 2008, ps3, Xbox360, 游戏图象, 阿尔法协议 相关日志
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 07:57 AM CDT 《星战:原力释放》的demo已经出了,本来想赶快下载好试玩一下,然后为大家一篇试玩感受到,可惜在XBOX-SKY上Newtype比我快一步,已经写好了《星战:原力释放》的试玩感受,而且我现在在公司值班,下不了demo,那就借花献佛吧,我newtype的文章装载过来。 demo开始的剧情似乎交代了一些本作中的男主角的身世: 某绝地武士被 维达(Vader)所杀,其儿被 Vader 收养,并对他进行黑暗绝地武士训练。 Vader 派出的间谍搜寻到了幸存的绝地武士 Rahm Kota 的下落, Kota正带领反叛军攻击一座帝国船厂,男主角的第一个任务便是去杀死Kota,并带回其光剑给Vader,以完成最后的训练。 由于Vader 训练徒弟的事情不能让帝国皇帝知晓,所以Vader下令: 无论是叛军还是帝国士兵,见到你的一律格杀勿论! 游戏画面很流畅,但是人物建模,特别是男主角脸部的刻画,感觉没有之前宣传片中的美,也没有 刀魂4中的脸部建模帅气,不知道是否因为是demo 的缘故。 但其他环境刻画都没有问题,看不出明显锯齿。 本作的特色之一就是环境的破坏 与 物品的互动: 游戏开始后,一艘小型飞船(Rogue Shadow)把你放到帝国船厂某处,场景中的绝大部分堆放物品,包括墙壁上的各种饰物、管道都可以用原力进行抓取(对准物品,按住RT键),而走廊一侧可以看到宇宙的舷窗可以通过用原力抓抛物品进行破坏(按住RT键抓取物品,左蘑菇控制抛掷方向,然后松开RT 即 将物品向选定方向掷出),舷窗破碎后,可以看到舱内物件被吸出,然后自动防护系统启动,破碎的舷窗被降下的金属防护墙挡住封闭。 刚才说的是一般的物品可被抓举、抛出,游戏进程中的敌人也可以被被你的原力折磨,譬如抓起一个反叛军士兵,扔向一堆帝国士兵,感觉有些像打保龄球; 而超出自己体积的 钛战机 也可以被你抓下来扔出去。 星战中,特别是宇宙空间站中的场景,都能见到不少各种大门,以往游戏规则是要寻找门的开关进行开启,本作有些流氓,不用找开关,绝大多数门可以用原力进行冲撞给撞开,偶尔一些太厚的双层门,也可以用原力控制门锁移动进行解开。 走到船厂内部的一个回廊时,可以看到远处和高处出现的一批批待发的钛战机,很壮观,而回廊旁边的金属吊桥骨架可以用原力将其弯曲抬高,导致有些钛式战机飞过的时候会撞到上面爆炸。 游戏快结束的时候,遭遇到帝国的一架AT-ST,双足行走装甲,消灭其身边的小兵,然后用周围的各种箱子砸它,大概剩1/3血的时候再次逼近AT-ST,屏幕下方提示特别按键提示,按照提示操作,可见男主角华丽的把AT-ST 从中劈成两半。 demo流程到此结束。 p.s. 屏幕左上角,有两个槽,绿色的生命槽 和 蓝色的原力槽。 游戏(demo)中没有医疗包、血包的设定,补充声明需要依靠杀敌后产生的绿色光点进行恢复,有些像NG中的蓝魂,会自己飞向主角; 蓝槽是原力,补充方式为不使用的情况下自动回复,有些像HALO中的能量护盾恢复方式。 demo 流程太短,应了某人的那句:有些意犹未尽的感觉。 很期待正式版的到来,届时又可以将自己置身于星战的世界中了。 标签 demo, PS3, xbox360, 星球大战, 最新游戏相关日志
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Results from the Game Design Challenge: Hero Posted: 21 Aug 2008 04:00 AM CDT |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 09:18 AM CDT 注:这是一个有关阿朱文章“如何成为开发正规军”的系列读后感,不定期发布,同步发表于CSDN。 在阿朱的开篇文章里,结尾处,总结了成为开发正规军所必备的四驾马车: 业务架构,技术架构,测试与技术支持,文案兼培训。 也就说,把上面的四个方面作好作扎实,就会更容易也更顺利的成为正规军。言简意赅,一针见血。 我是从事网游研发的,与阿朱所从事的传统软件研发可能会有一些不同,但我基本能明白阿朱这里所总结出来的这四条所代表的含义。我是这样理解的: 业务架构,在我的项目里,具体是指设计需求,也就是游戏内容设计; 技术架构,具体指引擎技术,客户端与服务器端各自包含的技术框架,包括逻辑层语言技术,引擎层语言技术,常用数据结构,引擎层的基本管理单元,脚本层的基本管理单元,数据库逻辑框架等等; 测试及技术支持,这个我理解为我们的游戏测试环节,包括了测试所用的工具,GM指令,以及测试人员本身; 文案兼培训,这个,在网游项目中比较特殊,文案会有专职的文案策划,但他们具体多是负责对呈现给玩家的语言信息进行润色以把技术性语言转化为玩家语言。而培训,这一点,我把引申为两层:一个是对内的,另一个是对外的。对内的培训,包括程序对程序的培训,程序对QC的技术培训,以及QC对策划的培训。对外的培训,我把它理解为“对玩家的培训”,与其说是培训,不如说是在易用性方面的自动引导系统。因为我们的玩家千千万,不可能都进行一对一的培训,所以,把游戏本身的易用性作好,就是对玩家最好的培训。 以上,是我自己针对于阿朱的四驾马车作的对比。对比,不是我的目的,我的目的,是想通过这样的对比,找到目前我们的开发方式中,有哪些作得还不够,还需要进一步加强,进一步作得更加规范。 与传统软件不同,网游的研发需求,处于经常性的变化之中,今天是这样的需求,明天就可能变成另外的需求,虽然你可能因此大动肝火,但不管是来自于市场的,还是来自于公司上层的要求,针对于变化的需求,多数情况下,开发人员只有服从。有的人,就是因为要频繁改动,于是自己选择了放弃,选择了在技术上不求上进,得过且过,作一次算一次,不对代码架构进行全局角度的设计,因为他们担心将来很可能又要改掉。 而其实,我要说,需求变动与技术架构设计,这是一对相辅相成的矛盾体。有经验的开发者,会针对变化了的需求给出自己的改进性解决方案,有时,并不见得非要完全按照变动需求就一成不变的照搬执行,有时,对于需求方不太在意的需求改进,对于我们技术而言,就是架构调整与不调整的大问题。所以,积极地面对需求变化,才是一种比较理性的处理方式,得过且过,只能让你的技术能力一步步退化,要善于在变化中求不变。 我们目前人员配置的构成,从结构上来说,看起来还是比较正式的,我们有策划,有程序,有美术,有QC几乎完整的一大套网游研发团队的完整建制。但是,问题,不是出在这个建制完整与不完整上,问题是出在这个建制里的人与人之间的流程,人与人之间的交流和沟通还没有完全理顺。 举例来说,我们只说研发这块:程序员之间的交流,其形式还是过份单一,没有形成有效的经验传承机制,在所有的交流方式中,我认为效率最低的就是文字和文档交流,效率最高的就是面对面或电话对电话的交流,而影响最深远,记忆最深刻的交流,是共同面对BUG,共同面对技术难题,一起解决之。这一块的完整机制,我们尚没有完全建立起来,目前,我们仅仅作到了能在技术群里通过IM发一些提醒信息,提示大家一些编码规范,以及编码陷阱,但是,很遗憾的是,这些信息,通常很快就被大家忘掉。 所以,说到底,我觉得,人是需要经历的,只有自己经历了,才可能深刻。按照这个思路,我的初步想法是,在项目开始正式运营后,我要建立起一整套完整的技术运营流程,规范其中的每一步,并且让所有的技术人员轮流参与这样的运营过程,这个过程,包括了代码发布,BUG追踪,BUG修正,性能跟进等等诸多环节。 另外,我们技术团队还存在的一个大问题是,我们的测试人员,其在测试方面的测试层次太低,我们一直想作,但一直没有作成的是,想把测试人员发展成为半个技术人员,至少,让他们可以设计白盒测试用例,可以作到函数级的测试,可以自己设计一些自动化的测试工具。但很可惜,这一块,我们对测试人员的相关培训,作得还远远不够,我们一直被项目进度逼着,心有余而力不足。 另外一个,我们没有完全理顺的关系是:具体开发人员与策划人员之间的交流与配合。策划案要细到一个什么样的程度,开发人员在哪些地方可以自由发挥,这些东西,都还没有形成共识。有时,案子作得太过死板,让程序完全失去了写代码的乐趣;而有时,案子又作得太过灵活,让程序抓不住方向。我想,这也反映了程序人员与策划人员本身经验水平以及沟通的问题,这一块,也是需要进一步理顺的。 阿朱在开篇的文章里,列出了一个烂产品可能存在的三个方面问题:操作说明,培训机制,稳定性。 我想,对于一款网游产品,它应该还包括了:耐玩性,研发速度。 操作说明,在网游产品中,我把它理解为“易用性”,也说是玩家易上手的程度。在网游产品中,们不可能发布一个操作手册来试图集中告诉玩家应该如何如何玩,网游产品的操作说明,应该是更生动和方式多样化的,可以把这种操作说明更丰富的表现在游戏本身的环境里。 培训机制,简单的理解为:让玩家学会成长,同时,也让团队学会成长。 稳定性,这个不用多说,不稳定的网游产品,是不可能在第一次面世后生存下来的。 耐玩性,决定了这一款产品对玩家的粘度,以及玩家的忠诚度。 研发速度,决定了这一款产品相比于其它产品的竞争力,以及对满足玩家需求的响应速度。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 11:06 PM CDT 《剑网2》的很多装备都是带有描述的,记得有一个武器的描述说是某种颜色(比如乌黑、金黄,也可能是其它颜色),但是这件武器的实际颜色且并不是和描述的颜色相同。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 21 Aug 2008 02:46 AM CDT 此时,家长只需在一旁暗中保护和观察,给幼儿一个独立游戏思考的空间,在他出色地完成游戏后再加以表扬鼓励。 当然,家长应尽可能为幼儿提供条件,促使其与同伴之间的正常交往。事实证明,现实中“受欢迎的儿童”,多是在交往中主动、独立的幼儿,他们往往 ...
|
You are subscribed to email updates from "game" via 柠檬杀手 in Google Reader
To stop receiving these emails, you may unsubscribe now. | Email Delivery powered by FeedBurner |
If you prefer to unsubscribe via postal mail, write to: "game" via 柠檬杀手 in Google Reader, c/o FeedBurner, 20 W Kinzie, 9th Floor, Chicago IL USA 60610 |
Posted: 22 Aug 2008 11:20 AM CDT 在德国莱比锡举办的GC 2008游戏展上,EA也展示了将于9月运营的网络游戏《战锤Online(Warhammer Online: Age of Reckoning)》的开场动画。 标签:Warhammer, Warhammer Online, 战锤, 游戏影像, 网络游戏 相关日志
|
Posted: 22 Aug 2008 11:13 AM CDT |
Posted: 22 Aug 2008 11:08 AM CDT 标签:Darksiders, ps3, 暗黑血统, 游戏图象 相关日志
|
Posted: 22 Aug 2008 11:03 AM CDT PSP 3000与PSP 2000在外形上的差别很小,最大的差别就是液晶面板,新的液晶面板色域是原来的两倍、反应时间是原来的两倍、对比度也是原来的五倍。此外,PSP 3000内置了麦克风, 细小的差别:
相关日志
|
Posted: 22 Aug 2008 10:48 AM CDT 在德国莱比锡举办的GC 2008游戏大展上,Konami公布了一款动作游戏新作《暗影之王(Lords of Shadow)》。游戏由开发《耶利哥》的西班牙游戏开发公司Mercury Steam负责开发,预计于2010年登陆PS3与Xbox360平台。 标签:GC 2008, Lords of Shadow, ps3, Xbox360, 暗影之王, 游戏影像, 游戏新闻 相关日志
|
Posted: 22 Aug 2008 09:03 AM CDT |
Posted: 22 Aug 2008 08:59 AM CDT 从目前的情况来看,电子游戏已经被承认为人类的又一种艺术。从广义上来将,游戏伴随着人类一直走来,远古的苏美尔和埃及人在数千年前就已经开始享受游戏带来的乐趣;对于电子游戏而言(包括电脑、家用游戏机、街机、掌机等,也许现在还需要加上手机),它的出现自然是在电脑诞生并走向大众化之后。 最早的电脑体积庞大,耗电量惊人,但实际性能可能还比不上各位早已不用的电子计算器。不过早期的程序员还是在这些机器上设计了对应的游戏,tic-tac-toe就是这样的一个。电脑的进一步发展使得越来越多的大学、大型公司等机构也可以配备,很多大学生和公司技术人员也就成为最早的“游戏开发工程师”。 十九世纪五十年代,RalphBauer最早提出了在电视上连接游戏机的构想,并将他的设想提交给了电视公司MAGnavox,1972年推出的MagnavoxOdyssey就是Bauer构想的实现。以现在的眼光来看,Odyssey是一个粗糙的产品,只是在电视屏幕上显示一些亮点并需要一个透明塑料层来进行游戏。不过电子游戏的革命从那时起已经开始了,而且这样的势头无法阻挡。 第一台真正的家用游戏系统是1977年推出的Atari2600。这款产品使用插卡设计,可以运行多个游戏,销售情况相当不错。同时,为电脑编写的游戏也出现了(针对appleII和TRS-80开发)。 我们今天对于电子游戏的回顾不同于大家以往看过的关于游戏历史的介绍,我们会看看不同类型的游戏经过数十年有着怎样的进化,这样的变化不仅在于画面,而且会在游戏操作方式上有很大的改变。 在下面选出的几个类型游戏中,我们每个类型选出6款游戏做为代表,下面就来看看游戏的进化历程: 体育游戏--网球 TennisforTwo(1958) 游戏硬件:模拟电脑(机械继电器,电位计、电阻器、操作放大器和一些晶体管) TennisforTwo是由WillyHiginbotham开发的一个游戏的DEMO,通过示波器和两个带有电位计的板(带有一个按钮)来进行游戏。这个游戏只能用于二人对战,Higinbotham根本就没有进行游戏AI设计。 游戏不带有记分系统,游戏者必须手动记录自己的成绩,同时得分后还需要手动按下“Reset”键重新开始游戏。这款游戏从来没有公开发行过,数年以后游戏设备被完全拆开。 osti的网站上有关于这款游戏的运行视频,有兴趣的朋友可以去看看。 Pong(1972) 游戏硬件:定制数字电路,家用机为Pong芯片 Pong是Atari的第二款游戏产品,但却是他们第一款真正成功的。Pong带有一个简单的记分系统,球会在击中“球拍”后以同样的反射角度弹回,不过球拍在运动中就会使得球的轨迹带来一些附加的垂直运动,从而带来一些策略成分。这款游戏可以双人对战,也可以单人挑战电脑。 Pong的成功带来了很多模仿者,也促使Atari发布了他们的游戏机Atari2600(VCS)。 AtariTennis(1981) 游戏硬件:Atari2600 Activision是由从Atari中因为不满而推出的程序员组成的,也成为Atari2600主机上最成功的游戏公司。 这款网球游戏是在游戏机推出很晚后才发行的,背景简单而静态,球网也同样如此。游戏中的人物只有很少量的动作,并集中在腿部,挥拍动作只有一种。游戏中的网球带有阴影,玩家通过这个阴影观察球的运动,不过击球力量、高度始终一样,对球路的控制也没有实现。 游戏可以双人对战,也可以人机对战,不过电脑的AI设计不很好,它很少出现失误,玩家可能需要花10分钟才能得到一分。 任天堂网球(1983)
游戏硬件:FC红白机 任天堂的FC(NES)也就是我们熟悉的红白机,它的性能比起Atari2600要高出不少。这个网球游戏中带有裁判,背景制作更加精细,人物动作也有所增加,但人物的大小并不会改变。网球不仅会在地面投下阴影,还会根据角度和距离改变大小,使得游戏性大为提高。 游戏的AI设计合理,并且提供了难度选择,最简单难度的电脑跑动慢,击球力量小,很容易击败。游戏采用标准的网球规则,不仅提供对战模式,还可以让两位玩家组成双打模式挑战电脑,乐趣增加了不少。T TennisArena(1997) 游戏硬件:PlayStATIon 索尼PlayStation的推出将家用机的3D性能带到了新的高度,为主流游戏加入了3D概念。这款网球游戏采用3D物体渲染,镜头可以360度自由旋转并进行缩放。 游戏中的人物同样采用3D模型,完全遵守透视原则。不过由于PS缺少纹理平滑功能,所以游戏中的纹理表现并不理想,出现不少色块和象素混杂。人物的动作采用3D捕捉方式,看上去相当平滑而真实,但观众却只是平面的“纸板”(PS的多边形性能不足)。 游戏充分使用了PS手柄的按键,玩家可以让游戏人物做出各种想要的击球动作和跑动,同时系统还会根据球路做出一些击球动作的自动选择。 游戏提供单人和双人模式,但是电脑加入玩家一方后表现总不够理想,至少比不上球网对面的那个。 VirtuaTennis(2003)
游戏硬件:Playstation2 索尼的PS2游戏主机尽管在机能上不能算是同类产品中最出色的,但确实是销量最大的。相对于PS而言,PS2的图像质量有了明显的提高,纹理过滤功能使得贴图平滑起来,人物、天气效果以及球场效果都更加真实,观众也开始3D化了。 游戏的操控有了进一步的提高,游戏模式也增加了锦标赛、表演赛和世界巡回赛等,并允许4位玩家进行对战。游戏AI也有了一定的提升,会根据玩家的操作发现其缺陷,并加以利用。 网络游戏 Multi-UserDungeons(1975)
游戏硬件:大学中的大型机+ANSI字符终端 Multi-UserDungeons也就是我们熟悉的MUD,是从文字冒险游戏中发展而来,不过带有自己鲜明的特点:多人连线,这也使得众多玩家沉迷其中。 文字化的MUD在中国也有过自己的脚印,不过由于当时网络条件的限制以及操作的不变,并没有今天这样的关注度和流行度。 HABITat(1986) 游戏硬件:Commodore64 Habitat是Lucasfilm的早期图形化MUD游戏,采用了QuantumLink在线服务(也就是AOL的前身),Commodore64电脑的用户可以通过他们300波特的Modem拨号连接到服务器上,也连接到那个虚拟的世界,化身为卡通人物。 在这个游戏中,人物选择的卡通角色已经可以自行定制外形,游戏世界中提供了2万个场景。用户通过手柄进行控制,类似于现在的鼠标。游戏最多允许2万个玩家同时在线,不过实际运作中这个数字要低很多。 游戏中提供了多种类型的武器和装备,并随即引发了玩家能否相互“PK”的争论。游戏运行这样的PK,并带有自己的原始经济系统。Habitat随着Commodore64的没落而消失,不过它为今后的网络游戏发展提供了不少经验和教训。 Meridian59(1996) 游戏硬件:486级别配置(CPU:66MHz)
游戏硬件:PC系统 UltimaOnline(UO)并不是一款3D化的网络游戏,但2D化的世界中却带有巨大的变革。 UO首先是首个进入主流的网络游戏,售出了上百万拷贝,并引起了相当多的媒体关注。游戏的Beta版设定有些缺少平衡性,但是正式版完善的相当不错,手艺的引入使得玩家可以创造出自己的衣物、盔甲和武器,“富有”的玩家可以在游戏中购买虚拟房屋,存放自己的物品。玩家的技能相当丰富,从舞剑到钓鱼都有自己的乐趣。 UO的虚拟社会是它对网络游戏最大的共享,玩家可以举行虚拟音乐会、虚拟俱乐部、虚拟婚礼等。UO在后来逐渐退出了流行,但是还拥有着自己的核心玩家群。 Everquest(1999)
游戏硬件:PC系统,奔腾2400MHz处理器以上 EverQuest是索尼开发的游戏,获得了不小的成功。Verant在游戏中创造了一个全新的世界Norrath,并加入了众多奇幻生物,游戏世界采用3D方式渲染并支持硬件加速,是当时画面最好看的网络游戏。 Everquest没有采用UO的技能系统,而是选择了简单很多的升级方式,类似于早期的D&D。系统使得不少玩家在初期晋级容易,后期升级越来越慢,玩家可以在每次升级时对自己的角色能力进行强化。 游戏中有一个创新的地方,敌人会以不同颜色出现,不同的颜色代表不同的危险级别。玩家之间可以相互厮杀,但必须进入独立的服务器中。 WoW(2004)
游戏硬件: WoW是暴雪推出并获得很大成功的游戏,对于这个正在风行的游戏我们并不需要进行太多的介绍。这款游戏中引入了UO的技能概念,也有EverQuest的升级思路,不同玩家都可以在其中找到自己想要的东西。 FPS游戏 Hovertank3D(1991)
游戏硬件:PC平台,286以上级别(CPU:16MHz) 在Hovertank之前,业界已经有了3维世界的设计游戏,但Hovertank是第一个实时完成3D化的游戏。玩家在3D化的走廊中前进,不断消灭采用Sprites缩放技术渲染的敌人。游戏中所有的墙壁都是同样的高度,所有的角度都是90度,房间没有天花板,“装修”也只是简单的颜色填充。 这款游戏和今后的FPS不同,它限定了时间要求玩家完成特定的任务。 Wolfenstein3D(1991)
游戏硬件:PC平台,286以上级别(CPU:16MHz) id在Hovertank之后加快了脚步,他们从AppleII中的2D游戏《EscapefromCastleWolfenstein》(逃离狼穴)中获得了灵感,推出了著名的Wolfenstein3D。这款游戏中秉承了等高墙壁和90度特性,但墙壁上已经有了初步的纹理贴图,天花板和地面仍然只是简单处理,但吊灯的出现无疑是一个进步。 游戏中的敌人和物件都采用平面缩放技术,也就是从不同角度看上去都是一个模样;但是玩家手中的武器已经可以看见并有了区别。 这个游戏中没有了时间限制,玩家需要找到特定颜色的钥匙开启特定的门,这也在今后的FPS游戏中不断出现。玩家控制的角色面部出现在了屏幕下面,并且会根据受到的伤害程度而改变,这也为玩家增加了投入感。 Doom(1993)
游戏硬件:PC平台,386以上级别(CPU:16MHz) DOOM系列是idSoftware赢得目前江湖地位的重要作品,售出了上百万拷贝,并造成了相当的社会影响,形成了自己的文化。也许id还需要为PC的游戏化承担责任,越来越多的人认识到电脑也可以做为娱乐设备。 游戏中的角度不再完全是90度。同时游戏引擎尽管不能渲染区域外的内容(人物无法走出桥、隧道等),但已经可以无缝连接其他区域,使得楼梯、电梯成为可能。游戏的引擎不允许玩家拥有完全360度的垂直视角,所有的建筑都有了纹理贴图,但是敌人和物品仍然是简单的平面化。 游戏的进程类似于Wolfenstein3D,但是游戏中的怪物出现了彼此误伤的可能,有时甚至会出现互相厮打的场面。这为玩家增加了策略因素。 游戏中加入的多人对战模式更是开始了一个全新的领域,Deathmatch从此成为人们选择FPS的又一个理由,剧情变得不再那么重要。 Quake(1996) 游戏硬件:PC平台,奔腾以上级别(CPU:60MHz) 对于FPS游戏而言,Quake为其带来两个明显的改变:全面正式的3D世界以及因特网上的多人游戏。Quake的3D引擎负责渲染游戏中出现的所有内容,包括以往平面化的怪兽和物品,全部都是纹理贴图的3D物品。游戏中的地图也因为全面3D化而有了层次感,人物也可以进行180度的上下观察。 id的这款游戏再次取得了成功,成就超过了DOOM。游戏引擎支持多种分辨率,使得游戏可以在不同级别的系统上运行,同时也使得游戏在相当长的时间里在画面上都很突出。游戏发行以后,出现了一个名为GLQuake的升级包,使得游戏可以支持当时最强大的3DFXVoodoo系列显卡。GLQuake使得游戏中的纹理看上去更加出色,游戏运行更加平滑,FPS也有了明显提高。 Quake3(1999)
游戏硬件:PC平台,奔腾II以上级别(CPU:200MHz) Quake3是id一项大胆的尝试,这款游戏中取消了单人游戏模式,而将全部精力放在多人死亡竞赛上。这样的设计尽管让一些玩家在游戏发售初期有些不满,但图像引擎上的提高很好的弥补了他们。 Quake3的引擎中引入了色彩光照和曲线建筑的特性,这个引擎被多家游戏公司采用,Alice、JediKnightII等游戏都是基于这个引擎开发出来的。 Half-Life2(2004)
游戏硬件:PC平台,奔腾四以上级别(CPU:1.2GHz) 最初的Half-Life一代游戏是采用QuakeII的引擎开发的,当然也包括后来大红大紫的CS;但是在二代游戏中,Valve开发出了他们自己的游戏引擎Source,在其中实现了众多新技术、新特性,Havoc物理引擎的加入更是使得游戏世界更加真实。 游戏提供了单人过关模式和多人模式,采用Source引擎的游戏还将不断推出。 RPG游戏 Rogue(1980)
游戏硬件:大学使用的大型机加ANSI字符终端,后期改为PC平台,MSDOS系统(4.77MHz处理器) Rogue是由大学生在体验过文字冒险游戏Adventure之后获得的灵感,他们想要在新的系统中使用全新的方式和图像库完成类似的产品,并最终获得成功。当IBMPC在1981年正式发布以后,这个游戏也很快移植到这个全新的平台。 Rogur是一个简单却容易上瘾的游戏,玩家控制人物在随机生成的地下城中探索,需要在其间攻击怪兽(用简单的大写字母表示),攻击方式也就是直接撞上去。玩家还可以输入简单的键盘指令让人物喝药水、查看物品、装备武器/防具、发动魔法等,基本上可以首先纸上游戏D&D的全部功能。 尽管地下城是随机生成的,但是这个游戏却有自己的结局,也就是击败一个终极老怪。游戏当时在大学校园中相当流行。 UltimaIII(1983)
游戏硬件:AppleII RichardGarrioTT在推出Ultima系列之前先在1981年推出了游戏Akalabeth(AppleII平台),这款游戏带有Ultima系列的基本特征:方块拼凑起来的陆地世界,玩家需要穿过大陆访问别的城市和地下城。 UltimaIII实际上为Ultima系列确立了一些事实上的标准:Sosaria大陆(后来更名为Britannia)、首都Britain、国王LordBritish(这是Richard在夏令营中的昵称)。在这款游戏中,玩家也首次接触到NPC,NPC会加入玩家的队伍(最多4名)一起开始冒险旅程。冒险中玩家会随时遭遇怪兽,随后系统进入近镜头,玩家和怪物轮流发动攻击,受伤严重的怪物会尝试逃离战场。 玩家在游戏中可以与NPC通过简单文字进行交流(Name、Job等),来引发剧情,很多NPC都知道很重要的信息,并且对完成游戏很重要。 UltimaVI(1990)
游戏硬件:PC平台,CPU8088(8MHz) UltimaVI是在PC平台上首个支持256色VGA图形的游戏,同时也是首个支持鼠标的游戏,不过鼠标还不是必须品。游戏世界由于色彩的增加而变得更加多样化,所有的物品都采用45度视角,从而形成一种伪3D效果。 Darklands(1992) 游戏硬件:PC平台,80286以上(CPU:16MHz) Darklands是一个吸引人的独特RPG游戏,它基于真实的历史设定(15世纪的德国),其中加入了众多中世纪时的幻想。玩家组成最多4人的队伍在世界上探索。世界中包括90个以上的城市,玩家进入城市后界面就会变成菜单式。玩家在城市中的行动会决定下一步的去向,也会影响到世界。游戏中的战斗是实时进行的,系统还提供了“自动战斗”选项方便玩家。 这个游戏的最终目的并不是干掉终极BOSS,而只是要提高玩家的知名度,所以这个游戏可以说没有尽头。 博得之门(1998)
游戏硬件:PC系统,奔腾处理器以上(CPU:166MHz) 这是一款采用龙与地下城规则游戏中最为著名的一个系列,由于获得了完全的许可,游戏得以使用D&D的世界、地点、角色和怪兽类型等元素。玩家组成一个最多6人的团队探索世界,多个玩家可以通过因特网共同冒险。 对于这款经典RPG游戏,我们就不做过多的介绍了,建议有条件的玩家都体验一下这款游戏。 无冬之夜(2002) 游戏硬件:PC系统,奔腾II处理器以上(CPU:450MHz) NeverwinterNights同样是一个获得完全授权的D&D游戏,硬件技术上的进步使得游戏与博得之门有了明显的不同。游戏世界和人物角色都才完全的3D渲染,并借助显卡硬件完成纹理和光照效果。游戏中镜头可以自动跟随当前人物,玩家同时也用鼠标来自行控制镜头。 游戏中的战斗同样是即时发生的,支持幕后的游戏引擎还在做着掷骰子和计算规则这样的事情。游戏世界采用完全的3D渲染,每一块区域都是独立的,玩家进入其他区域都需要经过一个场景载入过程。不过尽管游戏中的物件都是独立生成的,但是游戏中的地面(地形、建筑等)都是使用3D镶嵌方式完成,这和上面介绍的博得之门相比有了一些退步。有心的玩家可以在游戏过程中发现地下城中的许多场景和城镇看上去都是那么的相似。设计公司采用这样的方式主要为了减少Memory的使用,“Memory”在这里特指显卡的显存。 NeverwinterNights最吸引人的地方并不是画面、情节这样的地方,而是开发公司提供的近乎无限扩展能力。游戏零售版本中带有脚本编辑器,可以让普通电脑用户创建自己的模块、自己的故事甚至是自己的游戏画面。目前玩家已经自己做出了上百个这样的扩展包,并且不断有新的玩家加入到其中,最让人吃惊的是有玩家编写出了无冬之夜的在线版,其中带有主流网络游戏的基本特性,只是不需要为此买什么点卡、月卡。 小结 从上个世纪走到今天,电子游戏已经走过了一段漫长的路程,它几乎是伴随着电脑的出现而出现的。电子游戏的显示设备从最早的示波器进化到了今天的液晶显示器、HD电视并正在朝着真正3D化的显示前进。 随着游戏的不断进化,不仅游戏的画面、音响效果有了明显的提高,游戏的娱乐性也在不断提高。当然,游戏的进化并不体现在每个方面,比如Ultima7(1993年)中的NPC就有自己的生活,他们会按照需要回家睡觉、早晨出发工作、中午去酒吧小憩;而如今发行的一些游戏中,NPC完全没有自己的需要,他们一直站在一个地方说着同样的几句话。 目前的游戏平台我们可以分成PC(Windows操作系统)、索尼PS系列、微软Xbox系列和任天堂系列,越来越多的游戏开发商的作品开始跨平台发布,希望获得利益的最大化。 对于未来而言,PC和游戏主机都将继续存在下去,并将都会变得越来越强大,画面质量不断提高,同时游戏的操控方式也可能出现改变,比如任天堂的新一代主机Revolution的全新概念手柄。 上一个三十年,可能有人没能亲身体验,但下一个三十年,你我将一起见证。 |
Posted: 22 Aug 2008 08:49 AM CDT 在阅读各种游戏介绍的时候我们常常会碰见“引擎”(Engine)这个单词,引擎在游戏中究竟起着什么样的作用?它的进化对于游戏的发展产生了哪些影响?希望下面这篇文章能为大家释疑。 一、什么是引擎 我们可以把游戏的引擎比作赛车的引擎,大家知道,引擎是赛车的心脏,决定着赛车的性能和稳定性,赛车的速度、操纵感这些直接与车手相关的指标都是建立在引擎的基础上的。游戏也是如此,玩家所体验到的剧情、关卡、美工、音乐、操作等内容都是由游戏的引擎直接控制的,它扮演着中场发动机的角色,把游戏中的所有元素捆绑在一起,在后台指挥它们同时、有序地工作。简单地说,引擎就是“用于控制所有游戏功能的主程序,从计算碰撞、物理系统和物体的相对位置,到接受玩家的输入,以及按照正确的音量输出声音等等。” 可见,引擎并不是什么玄乎的东西,无论是2D游戏还是3D游戏,无论是角色扮演游戏、即时策略游戏、冒险解谜游戏或是动作射击游戏,哪怕是一个只有1兆的小游戏,都有这样一段起控制作用的代码。经过不断的进化,如今的游戏引擎已经发展为一套由多个子系统共同构成的复杂系统,从建模、动画到光影、粒子特效,从物理系统、碰撞检测到文件管理、网络特性,还有专业的编辑工具和插件,几乎涵盖了开发过程中的所有重要环节,以下就对引擎的一些关键部件作一个简单的介绍。 首先是光影效果,即场景中的光源对处于其中的人和物的影响方式。游戏的光影效果完全是由引擎控制的,折射、反射等基本的光学原理以及动态光源、彩色光源等高级效果都是通过引擎的不同编程技术实现的。 其次是动画,目前游戏所采用的动画系统可以分为两种:一是骨骼动画系统,一是模型动画系统,前者用内置的骨骼带动物体产生运动,比较常见,后者则是在模型的基础上直接进行变形。引擎把这两种动画系统预先植入游戏,方便动画师为角色设计丰富的动作造型。 引擎的另一重要功能是提供物理系统,这可以使物体的运动遵循固定的规律,例如,当角色跳起的时候,系统内定的重力值将决定他能跳多高,以及他下落的速度有多快,子弹的飞行轨迹、车辆的颠簸方式也都是由物理系统决定的。 碰撞探测是物理系统的核心部分,它可以探测游戏中各物体的物理边缘。当两个3D物体撞在一起的时候,这种技术可以防止它们相互穿过,这就确保了当你撞在墙上的时候,不会穿墙而过,也不会把墙撞倒,因为碰撞探测会根据你和墙之间的特性确定两者的位置和相互的作用关系。 渲染是引擎最重要的功能之一,当3D模型制作完毕之后,美工会按照不同的面把材质贴图赋予模型,这相当于为骨骼蒙上皮肤,最后再通过渲染引擎把模型、动画、光影、特效等所有效果实时计算出来并展示在屏幕上。渲染引擎在引擎的所有部件当中是最复杂的,它的强大与否直接决定着最终的输出质量。 引擎还有一个重要的职责就是负责玩家与电脑之间的沟通,处理来自键盘、鼠标、摇杆和其它外设的信号。如果游戏支持联网特性的话,网络代码也会被集成在引擎中,用于管理客户端与服务器之间的通信。 通过上面这些枯燥的介绍我们至少可以了解到一点:引擎相当于游戏的框架,框架打好后,关卡设计师、建模师、动画师只要往里填充内容就可以了。因此,在3D游戏的开发过程中,引擎的制作往往会占用非常多的时间,《马科斯·佩恩》的MAX-FX引擎从最初的雏形FinalReality到最终的成品共花了四年多时间,LithTech引擎的开发共花了整整五年时间,耗资700万美元,Monolith公司(LithTech引擎的开发者)的老板詹森·霍尔甚至不无懊悔地说:“如果当初意识到制作自己的引擎要付出这么大的代价的话,我们根本就不可能去做这种傻事。没有人会预料得到五年后的市场究竟是怎样的。” 正是出于节约成本、缩短周期和降低风险这三方面的考虑,越来越多的开发者倾向于使用第三方的现成引擎制作自己的游戏,一个庞大的引擎授权市场已经形成。 二、引擎的进化 曾经有一段时期,游戏开发者关心的只是如何尽量多地开发出新的游戏并把它们推销给玩家。尽管那时的游戏大多简单粗糙,但每款游戏的平均开发周期也要达到8到10个月以上,这一方面是由于技术的原因,另一方面则是因为几乎每款游戏都要从头编写代码,造成了大量的重复劳动。渐渐地,一些有经验的开发者摸索出了一条偷懒的方法,他们借用上一款类似题材的游戏中的部分代码作为新游戏的基本框架,以节省开发时间和开发费用。根据马老先生的生产力学说,单位产品的成本因生产力水平的提高而降低,自动化程度较高的手工业者最终将把那些生产力低下的手工业者淘汰出局,引擎的概念就是在这种机器化作业的背景下诞生的。 每一款游戏都有自己的引擎,但真正能获得他人认可并成为标准的引擎并不多。纵观九年多的发展历程,我们可以看出引擎最大的驱动力来自于3D游戏,尤其是3D射击游戏。尽管像Infinity这样的2D引擎也有着相当久远的历史,从《博德之门》(Baldur’sGate)系列到《异域镇魂曲》(Planescape:Torment)、《冰风谷》(IcewindDale)直至今年夏天将要发布的《冰风谷2》,但它的应用范围毕竟局限于“龙与地下城”风格的角色扮演游戏,包括颇受期待的《夜在绝冬城》(NeverwinterNights)所使用的Aurora引擎,它们都有着十分特殊的使用目的,很难对整个引擎技术的发展起到推动作用,这也是为什么体育模拟游戏、飞行模拟游戏和即时策略游戏的引擎很少进入授权市场的原因,开发者即便使用第三方引擎也很难获得理想的效果,采用《帝国时代2》(AgeofEmpires)引擎制作的《星球大战:银河战撤(StarWars:GalacticBattleground)就是一个最好的例子。 因此,下面对引擎的历史回顾将主要围绕动作射击游戏的变迁展开,动作射击游戏同3D引擎之间的关系相当于一对孪生兄弟,它们一同诞生,一同成长,互相为对方提供着发展的动力。 引擎的诞生(1992年~1993年) 1992年,3DRealms公司/Apogee公司发布了一款只有2兆多的小游戏——《德军司令部》(Wolfenstein3D),稍有资历的玩家可能都还记得初接触它时的兴奋心情,用“革命”这一极富煽动色彩的词语也无法形容出它在整个电脑游戏发展史上占据的重要地位。这部游戏开创了第一人称射击游戏的先河,更重要的是,它在X轴和Y轴的基础上增加了一根Z轴,在由宽度和高度构成的平面上增加了一个向前向后的纵深空间,这根Z轴对那些看惯了2D游戏的玩家造成的巨大冲击可想而知。 Wolfenstein3D引擎的作者是大名鼎鼎的约翰·卡马克,这位idSoftware公司的首席程序师正是凭借这款Wolfenstein3D引擎在游戏圈里站稳了脚跟。事实上,《德军司令部》并非第一款采用第一人称视角的游戏,在它发售前的几个月,Origin公司就已经推出了一款第一人称视角的角色扮演游戏——《创世纪:地下世界》(UltimaUnderworld),这款角游戏采用了类似的技术,但它与Wolfenstein3D引擎之间有着相当大的差别,举例来说,《地下世界》的引擎支持斜坡,地板和天花板可以有不同的高度,分出不同的层次,玩家可以在游戏中跳跃,可以抬头低头,这些特性Wolfenstein3D引擎都无法做到,而且从画面上看,《德军司令部》更接近漫画风格而不是传统的像素画面。 尽管从技术细节上看,Wolfenstein3D引擎比不上《创世纪:地下世界》的引擎,但它却更好地利用了第一人称视角的特点,快速火爆的游戏节奏使人们一下子记住了“第一人称射击游戏”这个单词,而不是“第一人称角色扮演游戏”。《德军司令部》后来还发布过一款名义上的续集——《三元的崛起》(RiseoftheTriad),这款游戏在Wolfenstein3D引擎的基础上增加了许多重要特性,包括跳跃和抬头低头等动作。 引擎诞生初期的另一部重要游戏同样是出自idSoftware公司的一款非常成功的第一人称射击游戏——《毁灭战士》(Doom)。Doom引擎在技术上大大超越了Wolfenstein3D引擎,《德军司令部》中的所有物体大小都是固定的,所有路径之间的角度都是直角,也就是说你只能笔直地前进或后退,这些局限在《毁灭战士》中都得到了突破。尽管游戏的关卡还是维持在2D平面上进行制作,没有“楼上楼”的概念,但墙壁的厚度可以为任意,并且路径之间的角度也可以为任意,这使得楼梯、升降平台、塔楼和户外等各种场景成为可能。 由于Doom引擎本质上依然是二维的,因此可以做到同时在屏幕上显示大量角色而不影响游戏的运行速度,这一特点为游戏创造出了一种疯狂刺激的动作风格,在这方面迄今为止大约只有《英雄萨姆》(SeriousSam)系列能与之相比,除此之外还没有哪款3D引擎能在大批敌人向你涌来的时候依然保持游戏的流畅,这也是为什么如今市面上的大部分第一人称射击游戏都在积极地培养玩家的战术运用能力、提高玩家的射击准确率而拒绝滥砍滥杀的主要原因之一。值得一提的是,尽管Doom引擎缺乏足够的细节度,但开发者仍然在《毁灭战士》中表现出了惊人的环境效果,其纯熟的设计技巧实在令人赞叹。 不过更值得纪念的是,Doom引擎是第一个被用于授权的引擎。1993年底,Raven公司采用改进后的Doom引擎开发了一款名为《投影者》(ShadowCaster)的游戏,这是游戏史上第一例成功的嫁接手术。1994年Raven公司采用Doom引擎开发《异教徒》(Heretic),为引擎增加了飞行的特性,成为跳跃动作的前身。1995年Raven公司采用Doom引擎开发《毁灭巫师》(Hexen),加入了新的音效技术、脚本技术以及一种类似集线器的关卡设计,使你可以在不同关卡之间自由移动。Raven公司与idSoftware公司之间的一系列合作充分说明了引擎的授权无论对于使用者还是开发者来说都是大有裨益的,只有把自己的引擎交给更多的人去使用才能使引擎不断地成熟起来。 《毁灭战士》系列本身就相当成功,大约卖了350万套,而授权费又为idSoftware公司带来了一笔可观的收入。在此之前引擎只是作为一种自产自销的开发工具,从来没有哪家游戏商考虑过依靠引擎赚钱,Doom引擎的成功无疑为人们打开了一片新的市常 引擎的转变(1994年~1997年) 在引擎的进化过程中,肯·西尔弗曼于1994年为3DRealms公司开发的Build引擎是一个重要的里程碑,Build引擎的“肉身”就是那款家喻户晓的《毁灭公爵》(DukeNukem3D)。《毁灭公爵》已经具备了今天第一人称射击游戏的所有标准内容,如跳跃、360度环视以及下蹲和游泳等特性,此外还把《异教徒》里的飞行换成了喷气背包,甚至加入了角色缩小等令人耳目一新的内容。在Build引擎的基础上先后诞生过14款游戏,例如《农夫也疯狂》(RedneckRampage)、《阴影武士》(ShadowWarrior)和《血兆》(Blood)等,还有台湾艾生资讯开发的《七侠五义》,这是当时(至今依然是)国内不多的几款3D射击游戏之一。Build引擎的授权业务大约为3DRealms公司带来了一百多万美元的额外收入,3DRealms公司也由此而成为了引擎授权市场上的第一个“暴发户”。不过从总体来看,Build引擎并没有为3D引擎的发展带来任何质的变化,突破的任务最终由idSoftware公司的《雷神之锤》(Quake)完成了。 《雷神之锤》紧跟在《毁灭公爵》之后发售,两者孰优孰劣一时之间成为玩家的热门话题。从内容的精彩程度来看《毁灭公爵》超过《雷神之锤》不少,但从技术的先进与否来看,《雷神之锤》是毫无疑问的赢家。Quake引擎是当时第一款完全支持多边形模型、动画和粒子特效的真正意义上的3D引擎,而不是Doom、Build那样的2.5D引擎。此外Quake引擎还是连线游戏的始作俑者,尽管几年前的《毁灭战士》也能通过调制解调器连线对战,但最终把网络游戏带入大众的视野之中的是《雷神之锤》,是它促成了电子竞技产业的发展。 一年之后,idSoftware公司推出《雷神之锤2》,一举确定了自己在3D引擎市场上的霸主地位。《雷神之锤2》采用了一套全新的引擎,可以更充分地利用3D加速和OpenGL技术,在图像和网络方面与前作相比有了质的飞跃,Raven公司的《异教徒2》(HereticII)和《军事冒险家》(SoldierofFortune)、Ritual公司的《原罪》(Sin)、Xatrix娱乐公司的《首脑:犯罪生涯》(Kingpin:LifeofCrime)以及离子风暴工作室去年夏天刚刚发布的《安纳克朗诺克斯》(Anachronox)都采用了QuakeII引擎。 QuakeII引擎的授权模式大致如下:基本许可费从40万美元到100万美元不等,版税金视基本许可费的多少而定,40万美元的许可费大约需提取10%以上的版税金,100万美元的许可费则提取很少一部分版税金。这样算下来,《雷神之锤2》通过引擎授权所获得的收入至少有一千万美元,尽管游戏本身的销售业绩比起《毁灭战士》来要差很多,大约卖了110多万套,收入在4500万美元左右,但在授权金这一块它所获得的盈利显然要远远高于《毁灭战士》,此时的引擎已经从一种单纯的工具变成了一块令人垂涎欲滴的肥肉。 俗话说“一个巴掌拍不响”,没有实力相当的竞争者,任何市场都无法发展起来的。正当QuakeII独霸整个引擎市场的时候,EpicMegagames公司(即现在的Epic游戏公司)的《虚幻》(Unreal)问世了。毫不夸张,第一次运行这款游戏的时候,我的确被眼前的画面惊呆了,尽管当时只是在300x200的分辨率下运行的这款游戏(四大悲事之一:玩游戏机器不够劲)。除了精致的建筑物外,游戏中的许多特效即便在今天看来依然很出色,荡漾的水波,美丽的天空,庞大的关卡,逼真的火焰、烟雾和力场等效果。从单纯的画面效果来看,《虚幻》是当之无愧的佼佼者,其震撼力完全可以与人们第一次见到《德军司令部》时的感受相比。 Unreal引擎可能是使用最广的一款引擎,在推出后的两年之内就有18款游戏与Epic公司签订了许可协议,这还不包括Epic公司自己开发的《虚幻》资料片《重返纳帕利》,其中比较近的几部作品如第三人称动作游戏《北欧神符》(Rune)、角色扮演游戏《杀出重围》(DeusEx)以及永不上市的第一人称射击游戏《永远的毁灭公爵》(DukeNukemForever),这些游戏都曾经或将要获得不少好评。 Unreal引擎的应用范围不限于游戏制作,还涵盖了教育、建筑等其它领域。DigitalDesign公司曾与联合国教科文组织的世界文化遗产分部合作采用Unreal引擎制作过巴黎圣母院的内部虚拟演示,ZenTao公司采用Unreal引擎为空手道选手制作过武术训练软件,另一家软件开发商VitoMiliano公司也采用Unreal引擎开发了一套名为“Unrealty”的建筑设计软件,用于房地产的演示。 这款与《雷神之锤2》同时代的引擎经过不断的更新,至今依然活跃在游戏市场上,丝毫没有显出老迈的迹象,实属难得。 引擎的革命(1998年~2000年) 游戏的图像发展到《虚幻》这里已经达到了一个天花板的高度,接下去的发展方向很明显不可能再朝着视觉方面进行下去。前面说过,引擎技术对于游戏的作用并不仅局限于画面,它还影响到游戏的整体风格,例如,所有采用Doom引擎制作的游戏,无论是《异教徒》还是《毁灭巫师》,都有着相似的内容,甚至连情节设定都如出一辙。玩家开始对端着枪跑来跑去的单调模式感到厌倦,开发者们不得不从其它方面寻求突破,由此掀起了第一人称射击游戏的一个新的高潮。 两部划时代的作品同时出现在1998年——Valve公司的《半条命》(Half-Life)和LookingGlass工作室的《神偷:暗黑计划》(Thief:TheDarkProject),尽管此前的《系统震撼》(SystemShock)等游戏也为引擎技术带来过许多新的特性,但没有哪款游戏能像《半条命》和《神偷》那样对后来的作品以及引擎技术的进化造成如此深远的影响。 曾获得无数大奖的《半条命》采用的是Quake和QuakeII引擎的混合体,Valve公司在这两部引擎的基础上加入了两个很重要的特性:一是脚本序列技术,这一技术可以令游戏以合乎情理的节奏通过触动事件的方式让玩家真实地体验到情节的发展,这对于诞生以来就很少注重情节的第一人称射击游戏来说无疑是一次伟大的革命;第二个特性是对人工智能引擎的改进,敌人的行动与以往相比明显有了更多的狡诈,不再是单纯地扑向枪口。这两个特点赋予了《半条命》引擎鲜明的个性,在此基础上诞生的《要塞小分队》、《反恐精英》和《毁灭之日》等优秀作品又通过网络代码的加入令《半条命》引擎焕发出了更为夺目的光芒。 在人工智能方面真正取得突破的游戏是LookingGlass工作室的《神偷:暗黑计划》,游戏的故事发生在中古年代,玩家扮演一名盗贼,任务是进入不同的场所,在尽量不引起别人注意的情况下窃取物品。《神偷》采用的是LookingGlass工作室自行开发的Dark引擎,Dark引擎在图像方面比不上《雷神之锤2》或《虚幻》,但在人工智能方面它的水准却远远高于后两者,游戏中的敌人懂得根据声音辨认你的方位,能够分辨出不同地面上的脚步声,在不同的光照环境下有不同的目力,发现同伴的尸体后会进入警戒状态,还会针对你的行动做出各种合理的反应,你必须躲在暗处不被敌人发现才有可能完成任务,这在以往那些纯粹的杀戮游戏中是根本见不到的。如今的绝大部分第一人称射击游戏都或多或少地采用了这种隐秘的风格,包括新近发布的《荣誉勋章:盟军进攻》(MedalofHonor:AlliedAssault)。遗憾的是,由于LookingGlass工作室的过早倒闭,Dark引擎未能发扬光大,除了《神偷:暗黑计划》外,采用这一引擎的只有《神偷2:金属时代》(Thief2:TheMetalAge)和《系统震撼2》等少数几款游戏。 受《半条命》和《神偷:暗黑计划》两款游戏的启发,越来越多的开发者开始把注意力从单纯的视觉效果转向更具变化的游戏内容,其中比较值得一提的是离子风暴工作室出品的《杀出重围》,《杀出重围》采用的是Unreal引擎,尽管画面效果十分出众,但在个体的人工智能方面它无法达到《神偷》系列的水准,游戏中的敌人更多的是依靠预先设定的场景脚本做出反应,例如砸碎弹药盒可能会引起附近敌人的警惕,但这并不代表他听到了什么,打死敌人后周围的同伙可能会朝你站立的位置奔过来也可能会无动于衷,这些不真实的行为即便在《荣誉勋章:盟军进攻》里也依然存在。图像的品质抵消了人工智能方面的缺陷,而真正帮助《杀出重围》在众多射击游戏中脱颖而出的则是它的独特风格,游戏含有浓重的角色扮演成分,人物可以积累经验、提高技能,还有丰富的对话和曲折的情节。同《半条命》一样,《杀出重围》的成功说明了叙事对第一人称射击游戏的重要性,能否更好地支持游戏的叙事能力成为了衡量引擎的一个新标准。 从2000年开始3D引擎朝着两个不同的方向分化,一是如《半条命》、《神偷》和《杀出重围》那样通过融入更多的叙事成分和角色扮演成分以及加强游戏的人工智能来提高游戏的可玩性,二是朝着纯粹的网络模式发展,在这一方面,idSoftware公司再次走到了整个行业的最前沿,他们意识到与人斗才是其乐无穷,于是在QuakeII出色的图像引擎的基础上加入更多的网络成分,破天荒推出了一款完全没有单人过关模式的纯粹的网络游戏——《雷神之锤3竞技撤(QuakeIIIArena),它与Epic公司稍后推出的《虚幻竞技撤(UnrealTournament)一同成为引擎发展史上的一个转折点。 随着QuakeIII引擎的大获成功,idSoftware公司在引擎授权市场上也大赚了一笔。Raven公司再次同idSoftware公司合作,采用QuakeIII引擎制作了第一人称射击游戏《星际迷航:精英部队》(StarTrekVoyager:EliteForce),此外这部引擎还被用于制作第三人称动作游戏《重金属F.A.K.K.2》(HeavyMetalF.A.K.K2)和《艾丽丝漫游魔境》(AmericanMcGee’sAlice)、最近的两款二战题材的射击游戏《重返德军总部》(ReturntoCastleWolfenstein)和《荣誉勋章:盟军进攻》,以及开发中的《绝地放逐者:绝地武士2》(JediOutcast:JediKnightII)。从地牢到外太空,从童话世界到二战年代,从第一人称视角到第三人称视角,充分显示了QuakeIII引擎的强大潜力。 Epic公司的《虚幻竞技撤虽然比《雷神之锤3竞技撤落后了一步,但如果仔细比较一下的话,你就会发现它的表现要略高出后者一筹。从画面方面看两者差不多打成平手,但在联网模式上,它不仅提供有死亡竞赛模式,还提供有团队合作等多种激烈火爆的对战模式,而且UnrealTournament引擎不仅可以应用在动作射击游戏中,还可以为大型多人游戏、即时策略游戏和角色扮演游戏提供强有力的3D支持。UnrealTournament引擎在许可业务方面的表现也超过了QuakeIII,迄今为止采用UnrealTournament引擎制作的游戏大约已经有20多款,其中包括《星际迷航深度空间九:坠落》(StarTrekDeepSpaceNine:TheFallen)、《新传说》(NewLegend)和《塞拉菲姆》(Seraphim)等。 在1998年到2000年期间迅速崛起的另一款引擎是Monolith公司的LithTech引擎,这款引擎最初是用在机甲射击游戏《升刚》(Shogo)上的。前面说过,LithTech引擎的开发共花了整整五年时间,耗资700万美元,功夫不负有心人,1998年LithTech引擎的第一个版本推出之后立即引起了业界的主意,为当时处于白热化状态下的《雷神之锤2》vs.《虚幻》之争泼了一盆冷水。 正是由于过于高昂的开发代价,2002年Monolith公司决定单独成立一个LithTech公司,以LithTech引擎的授权许可作为主要业务,希望借此捞回一些成本。采用LithTech第一代引擎制作的游戏包括《血兆2》和《清醒》(Sanity)等。2000年LithTech公司推出了引擎的2.0版本和2.5版本,加入了骨骼动画和高级地形系统,给人留下深刻印象的《无人永生》(NoOneLivesForever)以及即将上市的《全球行动》(GlobalOperations)采用的就是LithTech2.5引擎,此时的LithTech已经从一名有益的补充者变成了一款同QuakeIII和UnrealTournament平起平坐的引擎。如今LithTech引擎的3.0版本也已经发布,并且衍生出了“木星”(Jupiter)、“鹰爪”(Talon)、“深蓝”(Cobalt)和“探索”(Discovery)四大系统,其中“鹰爪”被用于开发《异形大战掠夺者2》(AlienVs.Predator2),“木星”将用于《无人永生2》的开发,“深蓝”用于开发PS2版《无人永生》,“探索”则将被用来制作一款尚未公布的大型网络游戏。 LithTech引擎除了本身的强大性能外,最大的卖点在于详尽的服务,除了LithTech引擎的源代码和编辑器外,购买者还可以获得免费的升级、迅捷的电子邮件和电话技术支持,LithTech公司甚至还会把购买者请到公司进行手把手的培训。而且LithTech引擎的平均价格也不算很高,大约在25万美元左右,同QuakeIII引擎的70万美元相比已经是相当低廉了。 引擎的明天(2001年~) 2001年~2003年有许多优秀的3D射击游戏陆续发布,其中一部分采用的是QuakeIII和UnrealTournament等现成引擎,如《三角洲部队3》DF3,《黑鹰坠落》DF4,《星际迷航深度空间九:坠落》、《重返德军总部》、《使命的召唤》和《荣誉勋章:盟军进攻》、《荣誉勋章:先头部队》。而更多的则采用的是自己开发的引擎,比较有代表性的包括网络射击游戏《部落2》(Tribes2)、第一人称射击游戏《马科斯·佩恩》、《红色派系》(RedFaction)和《英雄萨姆》等。 《部落2》采用的是V12引擎,这款引擎虽然无法同QuakeIII和UnrealTournament相提并论,但开发者为它制定的许可模式却相当新颖,你只需花上100美元就可以获得引擎的使用权,不过天下没有免费的午餐,随之而来的一系列规定相当苛刻,例如,开发者不能把该引擎用于为其它游戏发行商、其它商业游戏站点等竞争对手制作游戏,开发出来的游戏必须在发行前交给GarageGames公司(V12引擎的所有者),不能交给任何第三方,GarageGames公司将拥有这些游戏五年的独家发行权等等。尽管如此,对于那些规模较小的独立开发者来说,这个超低价引擎仍然具有非常大的吸引力。 《马科斯·佩恩》采用的是MAX-FX引擎,这是第一款支持辐射光影渲染技术(RadiosityLighting)的引擎,这种技术以往只在一些高级的建筑设计软件中出现过,它能够结合物体表面的所有光源效果,根据材质的物理属性及其几何特性,准确地计算出每个点的折射率和反射率,让光线以更自然的方式传播过去,为物体营造出十分逼真的光影效果。MAX-FX引擎的另一个特点是所谓的“子弹时间”(BulletTime),这是一种《黑客帝国》风格的慢动镜头,在这种状态下甚至连子弹的飞行轨迹都可以看得一清二楚。MAX-FX引擎的问世把游戏的视觉效果推向了一个新的高峰。 《红色派系》采用的是Geo-Mod引擎,这是第一款可任意改变几何体形状的3D引擎,也就是说,你可以使用武器在墙壁、建筑物或任何坚固的物体上炸开一个缺口,穿墙而过,或者在平地上炸出一个弹坑躲进去。Geo-Mod引擎的另一个特点是高超的人工智能,敌人不仅仅是在看见同伴的尸体或听见爆炸声后才会做出反应,当他们发现你留在周围物体上的痕迹如弹孔时也会警觉起来,他们懂得远离那些可能对自己造成伤害而自己又无法做出还击的场合,受伤的时候他们会没命地逃跑,而不会冒着生命危险继续作战。 《英雄萨姆》采用的是Serious引擎,这款引擎最大的特点在于异常强大的渲染能力,面对大批涌来的敌人和一望无际的开阔场景,你丝毫不会感觉到画面的停滞,而且游戏的画面效果也相当出色。此外值得一提的还有《海底惊魂》(AquaNox)所用的Krass引擎,这款引擎被作为GeForce3的官方指定引擎,专门用于宣传、演示GeForce3的效果,视觉方面的表现无可挑剔。 不过,由于受到技术方面的限制,把第一人称射击游戏放入大型网络环境中的构想至少在目前还很难实现。众所周知,一般的大型网络游戏多为节奏较慢的角色扮演游戏,这些游戏所使用的引擎,无论是《卡米洛特的黑暗年代》(DarkAgeofCamelot)使用的NetImmerse引擎,还是《地平线:伊斯塔里亚大陆》(Horizons:EmpiresofIstaria)使用的Horizons引擎,或是“据说可以保证50万人在同一虚拟世界中尽情游戏而不会有任何滞后感”的BigWorld引擎,都无法支持一个供数百名玩家同时战斗的大型团队动态环境。正是基于这样的考虑,idSoftware公司重新把目光放在了单人模式上,去年年底公布的《雷神之锤4》和《毁灭战士3》将重新建构一个以单人游戏为主的引擎。与此同时,老对手Epic游戏公司也在紧锣密鼓地开发新一代Unreal引擎和《虚幻竞技场2》的引擎。尽管目前关于这几款引擎的具体资料并不多,但从已展示的几段采用新引擎实时渲染的动画片段来看,它们的确完全超越了市面上的其它引擎,预示着一个新的引擎时代的到来。 最后需要指出的是,许多优秀的游戏开发者正在退出游戏开发市场,转而进入引擎授权市场,仅靠开发引擎吃饭,这是个危险的信号。尽管引擎的不断进化使游戏的技术含量越来越高,但最终决定一款游戏是否优秀的因素在于使用技术的人而不是技术本身。如前所述,引擎相当于游戏的框架,框架打好后,你只需往里填充内容即可,在这里,框架只是提供了一种可能性,游戏的精彩与否取决于内容如何而非框架如何。正如《无人永生》开发小组所说:“所有问题最终都会归结为一点——你的游戏是否好玩。” |
Posted: 22 Aug 2008 10:22 AM CDT 标签:PC, ps3, Red Faction, Xbox360, 游戏图象, 红色派系 相关日志
|
Posted: 22 Aug 2008 10:09 AM CDT 标签:GC 2008, PSP, Resistance, 抵抗, 游戏图象 相关日志
|
Posted: 22 Aug 2008 09:46 AM CDT Koei今天公布了将于今年10月2日在PS2上发售的《真·三国无双5 Special》的全新武将模组:蜀国武将黄月英将携新武器刃弩登场,这样加上之前公布的马超、曹丕、凌统、张郃、太史慈,共有6名武将将以全新的姿态出现在游戏之中。 标签:ps2, Shin Sangoku Musoum, 游戏图象, 真三国无双 相关日志 |
Posted: 22 Aug 2008 09:42 AM CDT 标签:GC 2008, PC, ps3, Wheelman, Xbox360, 汽车驾驶员, 游戏图象 相关日志
|
Posted: 22 Aug 2008 09:38 AM CDT 标签:PC, ps3, Tom Clancy, Tom Clancy’s HAWX, Xbox360, 汤姆克兰西, 游戏图象, 鹰击长空 相关日志
|
Posted: 22 Aug 2008 09:35 AM CDT |
Posted: 22 Aug 2008 09:31 AM CDT 标签:Damnation, GC 2008, PC, ps3, Xbox360, 游戏图象, 诅咒 相关日志
|
Posted: 22 Aug 2008 09:29 AM CDT 标签:Borderlands, GC 2008, PC, ps3, Xbox360, 游戏图象, 边境之地 相关日志
|
Posted: 22 Aug 2008 09:26 AM CDT 标签:Bayonetta, GC 2008, ps3, Xbox360, 游戏图象, 猎天使魔女 相关日志
|
Posted: 22 Aug 2008 11:17 PM CDT |
Posted: 22 Aug 2008 08:41 AM CDT 无意中看到这个,想找到那个牛逼的作者,基本大海捞月。怎么都那么爱转载,转载时连个原帖地址都没有。。。我也不客气了。 在C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比较著名的大型库。 标准库 标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。 1、 Dinkumware C++ Library 参考站点:http://www.dinkumware.com/ P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其 C/C++的产品中采用Dinkumware的库。 2、 RogueWave Standard C++ Library 参考站点: 这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。笔者不推荐使用。 3、SGI STL 参考站点: SGI公司的C++标准模版库。 4、STLport SGI STL库的跨平台可移植版本。
准标准库——Boost Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。 Boost中比较有名气的有这么几个库: Regex 正则表达式库 Spirit LL parser framework,用C++代码直接表达EBNF Graph 图组件和算法 Lambda 在调用的地方定义短小匿名的函数对象,很实用的functional功能 concept check 检查泛型编程中的concept Mpl 用模板实现的元编程框架 Thread 可移植的C++多线程库 Python 把C++类和函数映射到Python之中 Pool 内存池管理 smart_ptr 5个智能指针,学习智能指针必读,一份不错的参考是来自CUJ的文章: Smart Pointers in Boost,哦,这篇文章可以查到,CUJ是提供在线浏览的。中文版见笔者在《Dr. Dobb's Journal软件研发杂志》第7辑上的译文。 Boost总体来说是实用价值很高,质量很高的库。并且由于其对跨平台的强调,对标准C++的强调,是编写平台无关,现代C++的开发者必备的工具。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。并且很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手法,不要贸然的花费时间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品代码中多多利用。 参考站点:http://www.boost.org(国内镜像:http://www.c-view.org/tech/lib/boost/index.htm) GUI 在众多C++的库中,GUI部分的库算是比较繁荣,也比较引人注目的。在实际开发中,GUI库的选择也是非常重要的一件事情,下面我们综述一下可选择的GUI库,各自的特点以及相关工具的支持。 1、 MFC 大名鼎鼎的微软基础类库(Microsoft Foundation Class)。大凡学过VC++的人都应该知道这个库。虽然从技术角度讲,MFC是不大漂亮的,但是它构建于Windows API 之上,能够使程序员的工作更容易,编程效率高,减少了大量在建立 Windows 程序时必须编写的代码,同时它还提供了所有一般 C++ 编程的优点,例如继承和封装。MFC 编写的程序在各个版本的Windows操作系统上是可移植的,例如,在 Windows 3.1下编写的代码可以很容易地移植到 Windows NT 或 Windows 95 上。但是在最近发展以及官方支持上日渐势微。
2、 QT Qt 是Trolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,同时它还支持Windows、Macintosh、Unix/X11等多种平台。 3、WxWindows 跨平台的GUI库。因为其类层次极像MFC,所以有文章介绍从MFC到WxWindows的代码移植以实现跨平台的功能。通过多年的开发也是一个日趋完善的GUI库,支持同样不弱于前面两个库。并且是完全开放源代码的。新近的C++ Builder X的GUI设计器就是基于这个库的。 4、Fox 开放源代码的GUI库。作者从自己亲身的开发经验中得出了一个理想的GUI库应该是什么样子的感受出发,从而开始了对这个库的开发。有兴趣的可以尝试一下。 参考网站:http://www.fox-toolkit.org/ 5、 WTL 基于ATL的一个库。因为使用了大量ATL的轻量级手法,模板等技术,在代码尺寸,以及速度优化方面做得非常到位。主要面向的使用群体是开发COM轻量级供网络下载的可视化控件的开发者。 6、 GTK 参考网站:http://gtkmm.sourceforge.net/ GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnome这样的杀手应用。而GTK就是这个库的C++封装版本。 网络通信 ACE 参考网站: http://www.cs.wustl.edu/~schmidt/ACE.html C++库的代表,超重量级的网络通信开发框架。ACE自适配通信环境(Adaptive Communication Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ 包装外观(Wrapper Facade)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。 StreamModule 参考网站:http://www.omnifarious.org/StrMod 设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易,而不是用同步的外壳包起异步的本质。 SimpleSocket 参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm 这个类库让编写基于socket的客户/服务器程序更加容易。 A Stream Socket API for C++ 参考网站: http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html 又一个对Socket的封装库。 XML Xerces 参考网站:http://xml.apache.org/xerces-c/ Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAX和DOM API。XML验证在文档类型定义(Document Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XML Schema 的基本完整的开放标准。 XMLBooster 参考网站:http://www.xmlbooster.com/ 这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序来修改这个parser。在DOM和SAX两大主流XML解析办法之外提供了另外一个可行的解决方案。 Pull Parser 参考网站: http://www.extreme.indiana.edu/xgws/xsoap/xpp 这个库采用pull方法的parser。在每个SAX的parser底层都有一个pull的parser,这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。 Xalan 参考网站:http://xml.apache.org/xalan-c/ Xalan是一个用于把XML文档转换为HTML,纯文本或者其他XML类型文档的XSLT处理器。 CMarkup 参考网站:http://www.firstobject.com/xml.htm 这是一种使用EDOM的XML解析器。在很多思路上面非常灵活实用。值得大家在DOM和SAX之外寻求一点灵感。 libxml++ http://libxmlplusplus.sourceforge.net/ libxml++是对著名的libxml XML解析器的C++封装版本
科学计算 Blitz++ 参考网站:http://www.oonumerics.org/blitz Blitz++ 是一个高效率的数值计算函数库,它的设计目的是希望建立一套既具像C++ 一样方便,同时又比Fortran速度更快的数值计算环境。通常,用C++所写出的数值程序,比 Fortran慢20%左右,因此Blitz++正是要改掉这个缺点。方法是利用C++的template技术,程序执行甚至可以比Fortran更快。 Blitz++目前仍在发展中,对于常见的SVD,FFTs,QMRES等常见的线性代数方法并不提供,不过使用者可以很容易地利用Blitz++所提供的函数来构建。 POOMA 参考网站: http://www.codesourcery.com/pooma/pooma POOMA是一个免费的高性能的C++库,用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程序开发,对并行机器进行了优化以达到最高的效率,方便在工业和研究环境中使用。 MTL 参考网站:http://www.osl.iu.edu/research/mtl/ Matrix Template Library(MTL)是一个高性能的泛型组件库,提供了各种格式矩阵的大量线性代数方面的功能。在某些应用使用高性能编译器的情况下,比如Intel的编译器,从产生的汇编代码可以看出其与手写几乎没有两样的效能。 CGAL 参考网站:www.cgal.org Computational Geometry Algorithms Library的目的是把在计算几何方面的大部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。
游戏开发 Audio/Video 3D C++ Programming Library 参考网站: http://www.galacticasoftware.com/products/av/ AV3D是一个跨平台,高性能的C++库。主要的特性是提供3D图形,声效支持(SB,以及S3M),控制接口(键盘,鼠标和遥感),XMS。 KlayGE 参考网站:http://home.g365.net/enginedev/ 国内游戏开发高手自己用C++开发的游戏引擎。KlayGE是一个开放源代码、跨平台的游戏引擎,并使用Python作脚本语言。KlayGE在LGPL协议下发行。感谢龚敏敏先生为中国游戏开发事业所做出的贡献。 OGRE OGRE(面向对象的图形渲染引擎)是用C++开发的,使用灵活的面向对象3D引擎。它的目的是让开发者能更方便和直接地开发基于3D硬件设备的应用程序或游戏。引擎中的类库对更底层的系统库(如:Direct3D和OpenGL)的全部使用细节进行了抽象,并提供了基于现实世界对象的接口和其它类。
线程 C++ Threads 参考网站:http://threads.sourceforge.net/ 这个库的目标是给程序员提供易于使用的类,这些类被继承以提供在Linux环境中很难看到的大量的线程方面的功能。 ZThreads 参考网站:http://zthread.sourceforge.net/ 一个先进的面向对象,跨平台的C++线程和同步库。
序列化 s11n 参考网站:http://s11n.net/ 一个基于STL的C++库,用于序列化POD,STL容器以及用户定义的类型。 Simple XML Persistence Library 参考网站:http://sxp.sourceforge.net/ 这是一个把对象序列化为XML的轻量级的C++库。
字符串 C++ Str Library 参考网站:http://www.utilitycode.com/str/ 操作字符串和字符的库,支持Windows和支持gcc的多种平台。提供高度优化的代码,并且支持多线程环境和Unicode,同时还有正则表达式的支持。 Common Text Transformation Library 参考网站:http://cttl.sourceforge.net/ 这是一个解析和修改STL字符串的库。CTTL substring类可以用来比较,插入,替换以及用EBNF的语法进行解析。 GRETA 参考网站:http://research.microsoft.com/projects/greta/ 这是由微软研究院的研究人员开发的处理正则表达式的库。在小型匹配的情况下有非常优秀的表现。 综合 P::Classes 参考网站:http://pclasses.com/ 一个高度可移植的C++应用程序框架。当前关注类型和线程安全的signal/slot机制,i/o系统包括基于插件的网络协议透明的i/o架构,基于插件的应用程序消息日志框架,访问sql数据库的类等等。 ACDK - Artefaktur Component Development Kit 参考网站:http://acdk.sourceforge.net/ 这是一个平台无关的C++组件框架,类似于Java或者.NET中的框架(反射机制,线程,Unicode,废料收集,I/O,网络,实用工具,XML,等等),以及对Java, Perl, Python, TCL, Lisp, COM 和 CORBA的集成。 dlib C++ library 参考网站:http://www.cis.ohio-state.edu/~kingd/dlib/ 各种各样的类的一个综合。大整数,Socket,线程,GUI,容器类,以及浏览目录的API等等。 Chilkat C++ Libraries 参考网站: http://www.chilkatsoft.com/cpp_libraries.asp 这是提供zip,e-mail,编码,S/MIME,XML等方面的库。 C++ Portable Types Library (PTypes) 参考网站:http://www.melikyan.com/ptypes/ 这是STL的比较简单的替代品,以及可移植的多线程和网络库。 LFC 参考网站:http://lfc.sourceforge.net/ 哦,这又是一个尝试提供一切的C++库
其他库 Loki 参考网站: http://www.moderncppdesign.com/ 哦,你可能抱怨我早该和Boost一起介绍它,一个实验性质的库。作者在loki中把C++模板的功能发挥到了极致。并且尝试把类似设计模式这样思想层面的东西通过库来提供。同时还提供了智能指针这样比较实用的功能。 ATL ATL(Active Template Library)是一组小巧、高效、灵活的类,这些类为创建可互操作的COM组件提供了基本的设施。 FC++: The Functional C++ Library 这个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代表作。如果想要在OOP之外寻找另一分的乐趣,可以去看看函数式程序设计的世界。大师Peter Norvig在 “Teach Yourself Programming in Ten Years”一文中就将函数式语言列为至少应当学习的6类编程语言之一。 FACT! 参考网站:http://www.kfa-juelich.de/zam/FACT/start/index.html 另外一个实现函数式语言特性的库 Crypto++ 提供处理密码,消息验证,单向hash,公匙加密系统等功能的免费库。还有很多非常激动人心或者是极其实用的C++库,限于我们的水平以及文章的篇幅不能包括进来。在对于这些已经包含近来的库的介绍中,由于并不是每一个我们都使用过,所以难免有偏颇之处,请读者见谅。
资源网站 正如我们可以通过计算机历史上的重要人物了解计算机史的发展,C++相关人物的网站也可以使我们得到最有价值的参考与借鉴,下面的人物我们认为没有介绍的必要,只因下面的人物在C++领域的地位众所周知,我们只将相关的资源进行罗列以供读者学习,他们有的工作于贝尔实验室,有的工作于知名编译器厂商,有的在不断推进语言的标准化,有的为读者撰写了多部千古奇作…… Bjarne Stroustrup http://www.research.att.com Stanley B. Lippman http://blogs.msdn.com/slippman/(中文版 http://www.zengyihome.net/slippman/index.htm Scott Meyers http://www.aristeia.com/ David Musser http://www.cs.rpi.edu/~musser/ Bruce Eckel http://www.bruceeckel.com Nicolai M. Josuttis http://www.josuttis.com Herb Sutter http://www.gotw.ca/ Andrei Alexandrescu http://www.moderncppdesign.com/ |
Posted: 22 Aug 2008 08:16 AM CDT 1、简介(Introduction) 假如说你正在写一个能够支持一大堆酷酷特性的3D游戏引擎。你长长的清单上列满了诸如曲面、动态光照、体积雾、镜面、入口(一种应用于空间渲染的技术)、天空盒、顶点着色(在DirectX 8里开始引入的新技术,大大增加了对顶点处理的灵活性)、粒子系统、静态网格模型和动画网格模型等等。如果此时你已经很清楚地知道怎样去实现这些东西了以后,或许就该开始着手把这些东西一起塞进一个引擎了吧。 呵呵,答案是暂停。在你开始动手写码以前,你必须先思考清楚你打算用这个引擎来做什么。最常见的情况是,你热切地希望用它来做一个游戏。如果你仅仅是从一头扎进引擎的代码堆里开始的话,你将在以后为游戏增加若干具体效果和控制时反复重写引擎中的大部分代码,从而倍受煎熬。在这个时候,具备一点点对引擎设计方面的远见将为你省下不少时间和头疼药。我们所不想遇到的是一个巨型的工程。若面临此境,你将无法得以善终,只能另谋出路。作为一个每个人都必须掌握的教训,不要去做无法完成的事。实际地完成一个项目才是正确的目标,唯有此道可以让人愉悦并值得炫耀。 在让我们开始观察一个具备完整特性的3D引擎应该包括哪些基本组成部分之前,必须先声明一点,本文是为那些已经有足够3D方面的经验但还需要一点方向指引的人而写的。这些并不是什么你必须使用的艰深和快速的原则。这些只是我自己用的很好的一些体会,这些东西从宏观上也说明了游戏引擎有几个组成部分,每个组成部分包括多少工作量。我把这些部分分为系统、控制台、支撑、渲染器/引擎内核、游戏界面、游戏本身以及工具/数据。 2、工具及数据(Tools/Data) 在开发过程中,你会需要一些数据,不幸的是,这个并不象写若干文本文件来定义一个立方体那么简单。起码你会需要用道3D模型编辑器、关卡编辑器和图形程序。这些东西可以花钱买或者去可以去网上下载一个免费的程序做这个工作。更不幸的是,除了这些,你可能还会需要更多的工具,而这些软件根本就不存在。因此,你必须写出它们。如果你不能弄到一个能满足你需要的关卡编辑器,你可能得动手自己写一个。你还可能会需要写一个打包程序来把很多零零碎碎的文件打成一个文件包,否则的话,在产品里发布成百上千的文件可实在是让人恶心。除了这些,还需要有个转换器或者插件来把3D模型编辑器的格式转换到你自己的格式。还有一些处理游戏数据的工具,比如可见性计算或者光照纹理映射等等。 一个基础要点是:在编写工具上所花费的代码量很可能会达到或超过编写游戏本身的代码量。你可以找到一些能被利用的格式和工具,但迟早你会认识到,你会需要一些专门针对于你自己引擎的特性,于是不得不放弃这些现成的东西而由自己重新另起炉灶。 完成这些工具,使其满足应用需求将会是一个漫长的冲刺过程,在此过程中,还须注意仔细整理代码。总有一天,某人可能会试图使用、扩展或者修改你的工具,尤其是当你的引擎是以允许被修改或以开放源码的方式来发布的时候。 与此同时,正如编写这个游戏、工具以及引擎这些工作一样,你还应做好在编辑制作图形、关卡、音效、音乐和模型等工作上花费大量时间的准备。 3、系统(System) 系统是引擎中负责与机器本身通讯的部分。在作平台移植时,如果引擎编写得十分精良,则只有系统部分是需要作主要修改的地方。系统内部又分了几个子系统。包括图形、输入、声音、时间、配置。系统负责初始化、更新、关闭所有这些子系统。 图形子系统的概念非常直观易懂。我们通过它来把图象在屏幕上显示出来。通常,我们会用OpenGL、Direct3D、Glide或者软件渲染来实现这个部分。如果想更酷的话,可以把这些API界面都给实现了,然后在它们上面设计一个图形抽象层,这样就给了用户更多的选择和机会来提高兼容性和性能。当然,由于不是所有的API都具有相同的特性集,实现这个并不是一件很容易的事情。 输入子系统负责处理所有的输入(键盘、鼠标、游戏手柄和游戏摇杆),并把它们统一起来以允许控制的抽象化。举例来说,当在游戏逻辑进行到某处的时候,我们需要检测玩家是否希望他或她的位置朝前移动。与其直接依次去检测每种输入设备,不如让我们来调用一次输入子系统,它会透明地去完成检测所有的输入设备的工作。这样还有一个好处就是使得玩家可以轻松地进行输入配置,并且可以很容易地实现由多种输入控制同一动作的功能。 声音子系统负责加载和播放各种声音。相当简洁直观不是,但当前绝大部分游戏都支持3D音效,这使得整个工作变得稍微复杂了一些。 3D游戏引擎(这里我指的是实时3D游戏……)中的绝大部分功能都需要基于时间来进行。因此在时间子系统里你必须实现一些时间管理功能的代码。这个其实非常简单,但因为所有东西的移动都是按照时间来进行的,一套优良的设计将使你不必在以后反复重写多次雷同的代码。 配置子系统实际位于前述子系统之上。它负责读取配置文件、命令行参数、或者其它被用到的设置方式。其它子系统在初始化和运行的时候会向它查询相应配置。这样就可以很容易地改变分辨率、颜色位深、键设置、声音支持选项等等,甚至是在游戏已经加载了以后。使你的引擎尽量可配置化会简化测试的工作并使得玩家更易于把游戏设置成他们自己所喜爱的方式。 4、控制台(Console) 好了,我知道大家都喜欢跟风去做一个雷神之锤那样的控制台。但谁让它确实是个好主意呢。通过控制台变量和函数,你可以在不重新启动的情况下,改变游戏和引擎的设置。能在开发时输出调试信息也是一件很棒的事情。很多时候,你需要检查一些变量,把它们的值输出到控制台上比起使用一个调试器来,会方便快捷许多。一旦引擎开始运行,如果有错误发生,不必退出这个应用程序,你可以很优雅从容地处理掉它并输出一条错误信息。如果你不想让最终用户看到或使用控制台,你可以很容易地将它屏蔽掉,没人能看得出它的存在。 5、支撑(Support) 这个部分会被引擎的其他部分所大量使用。它包括你全部的数学代码(向量、平面、矩阵等等)、内存管理、文件加载、容器(如果偷懒,可以用STL:Standard Template Library 标准模板库)。这个部分非常基础,很可能你会在其他项目中都用得到它。 6、渲染器及引擎内核(Renderer/Engine Core) 是的,人人都爱渲染3D图形。渲染3D世界的方法是如此之多,以至于几乎不可能给出一个在所有情形下都能工作的图形管道的描述。 不管你是怎么实现渲染器的,最重要的是让它够基本并且够干净。确保你有清楚的模块以对应不同的状况。我把渲染器再次细分为可见性、碰撞检测和响应、摄象机、静态几何图形、动态几何图形、粒子系统、公告板、网格、天空盒、光照、雾化、顶点着色、输出。 其中每个部分应该各自有一个界面,我们通过这个界面来改变设置、位置、方向、及其它任何与系统相关的部分。 可以预期,将会遇到的一个主要缺陷是特性膨胀。所以,尽量在设计阶段先确定好哪些是你打算实现的,否则的话,中途增加新特性是非常困难的,即使最后能得以实现,但也肯定会是非常勉强的。 让所有的三角形(或者称为面也行)最终通过相同的一点进入的渲染管道是一个漂亮而方便的设计。(不是每次一个三角形,我说的是三角形列表、扇形、条带等等)。把所有的东西统一成为一个格式需要多做一些工作,而这个格式将被经过相同的光照、雾化、及阴影代码处理。最后,你会欣慰地发现,只要改变一下多边形的材质/纹理索引,在一个多边形上可以实现的任何效果,都可以在游戏中其它任何多边形上实现。 这样做不会损及绘制包含多样性的事物,但必须仔细以免产生冗余代码。 最终你会发现,全部这些你打算去实现的很酷的效果在整个代码工作量中只占15%不到。这是很自然的,图形只占了游戏引擎的一小部分。 7、游戏界面(Game Interface) 3D游戏引擎中最重要的部分是游戏引擎。但它还不是游戏,实际的游戏绝不应该包含任何被放入游戏引擎的部分。在引擎和游戏之间放入一个瘦层可以使得代码更整洁并且易于使用。虽然要增加一点额外的代码工作量,但好处是可以让游戏引擎易于重用并且更易于使用脚本语言来实现游戏逻辑,或者是把游戏代码放入一个库中。如果你打算把游戏逻辑的任何一部分嵌入引擎,那么在以后计划对它进行重用时,你得准备着去面对无数的问题和修改。 那么,你肯定想知道,这个引擎和游戏之间的层应该提供些什么呢?答案是控制。对引擎中每个具有动态属性的部分,这个引擎和游戏之间的层都提供了一个界面去修改它。其内容包括摄象机、模型属性、光照、粒子系统物理、播放声音、播放音乐、处理输入、改变关卡、碰撞检测和响应,及2D图形的放置以实现一些覆盖内容的显示、标题屏幕等等。 8、游戏本身(The Game) 呵呵,关于这个,我无法告诉你怎样去写你自己的游戏。这个是该轮到你自己了。你已经化了若干功夫去编写这个让人惊讶的引擎,它优良的界面将极大地减轻你在游戏编写过程中的压力。 3D游戏引擎是一个巨大的软件工程。一个人可以搞定一个引擎,但肯定不是熬上一晚就能搞定的。你可能将会需要编写若干兆的源代码。如果你缺乏去完成它的动力,那是绝对不可能得手的。 还有,千万别第一次就试着编写一个完整的引擎。不妨先选一个对引擎需求较少的小型项目。脚踏实地,你终将到达目标。 |
Posted: 23 Aug 2008 09:37 AM CDT 本文是参考《星际争霸II》的官方技术文档。原文档(PDF,英文) 下载地址
1. SC2引擎的适应性。与其他BLZ的游戏一样,SC2也具有广泛的硬件适应性,可以从Radeon 9800系列和GeForce FX系列一直到最新的Radeon 4800系列和GeForce GT200系列。 2. 与CPU相比,更强调GPU(Stress GPU over CPU)。如果在高特效设定下,SC2将会使用大量像素渲染操作,在大量单位战斗的情况下,不只是考验CPU,还更加考验GPU。 3. 一个引擎,两个“世界”(Dual Nature of the Engine)。其实就是说SC2具有两个视角模式,一个是普通的RTS视角、一个是单人模式的RPG视角。当然在这两个模式下呈现的画面效果是有所不同的。 4. 视觉特效(Based Effects)。包括FP16 HDR、光线散射/反射效果(Diffuse and specular for lighting)、景深效果(depth of field)、体积雾(fog volumes)、动态环境遮蔽(dynamic ambient occlusion)、智能贴图置换(smart displacement)等等。 5. 延迟渲染(Deferred Lighting)。SC2引擎采用了“延迟渲染”技术。延迟渲染技术的种种优点,使它成为了未来游戏的发展趋势。 6. 屏幕空间环境光遮蔽(Space Ambient Occlusion,简称SSAO)。说名词大家可能都陌生,但如果说到《Crysis》那逼真的光照效果,大家都会记忆犹深,那正是SSAO技术的体验。而现在,SC2也要采用这种技术! 景深效果演示,同时也有光线反射、散射效果 半透明阴影演示,烟雾也能投射出阴影 一个引擎,两个“世界” SSAO技术演示图 来源: sc2.cc |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Falcon 4.0: Allied Force 制作人访谈 Posted: 23 Aug 2008 09:26 AM CDT Facon 4.0系列是飞行模拟游戏中的传奇,她的制作公司MicroProse关闭后,在来自世界各地的骨灰级飞行迷们及其改投新主的前肢作者们的勤奋工作下,陆续放出了多个增强版本。有的提高真实性(航电、武器等),有的强化图形表现(模型、云层等),但都是非官方的增强包,而2005年由Lead Pursuit公司发行的Falcon 4.0:Allied Force则是Falcon 4.0原版发行后的第一个商业发行版,其最突出的优点就是大大的提高了多人网络联机游戏时的稳定性。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 09:19 AM CDT 今年的SIGGRAPH(计算机图形图像专业组织)大会已经结束,这次大会上,我们发现了一些很有意思的东西。当然,暴雪和AMD的合作首先给我们带来了惊喜,而在随后的讲座上,我们发现了一些很有用的信息。
AMD公布了一篇关于星际2图像引擎的文件,文件中说:“出于技术用途,我们会重新审视一些设计目标,以便让我们的美工通过对战和单人模式来描述暴雪的艺术风格是如何影响引擎设计的。” 暴雪和AMD的合作绝不仅仅是为了做表面功夫或是在暴雪嘉年华上获得免费的显卡,在暴雪提供的文件中,包含了大量有关星际2系统配制的信息。目前只能确定显卡的配制信息。下面是一段在暴雪蓝贴里面的话: “我们希望星际2能用最低的配制来实现最大的兼容性,让尽可能多的玩家都能玩上星际2。同时我们也希望能充分发挥硬件的潜力,让游戏具有竞争力。这就意味着能支持的硬件范围很广,ATI Radeon 9800/NVIDIA GeForce FX系列到ATI Radeon HD 4800s andNVIDIA GeForce G200s都可以。”
以下文章是参考《星际争霸II》的官方技术文档。 1. SC2引擎的适应性。与其他BLZ的游戏一样,SC2也具有广泛的硬件适应性,可以从Radeon 9800系列和GeForce FX系列一直到最新的Radeon 4800系列和GeForce GT200系列。 2. 与CPU相比,更强调GPU(Stress GPU over CPU)。如果在高特效设定下,SC2将会使用大量像素渲染操作,在大量单位战斗的情况下,不只是考验CPU,还更加考验GPU。 3. 一个引擎,两个“世界”(Dual Nature of the Engine)。其实就是说SC2具有两个视角模式,一个是普通的RTS视角、一个是单人模式的RPG视角。当然在这两个模式下呈现的画面效果是有所不同的。 4. 视觉特效(Based Effects)。包括FP16 HDR、光线散射/反射效果(Diffuse and specular for lighting)、景深效果(depth of field)、体积雾(fog volumes)、动态环境遮蔽(dynamic ambient occlusion)、智能贴图置换(smart displacement)等等。 5. 延迟渲染(Deferred Lighting)。SC2引擎采用了“延迟渲染”技术。延迟渲染技术的种种优点,使它成为了未来游戏的发展趋势。 6. 屏幕空间环境光遮蔽(Space Ambient Occlusion,简称SSAO)。说名词大家可能都陌生,但如果说到《Crysis》那逼真的光照效果,大家都会记忆犹深,那正是SSAO技术的体验。而现在,SC2也要采用这种技术! 7. 半透明阴影(Translucent Shadows)。这种技术能令烟雾、爆炸也能投射出阴影效果。 个人总结:SC2将会是一个比较吃GPU的游戏,因此,如果你想在高特效下体验SC2,还请准备好你的显卡。SC2众多先进的3D技术将再次考验你的显卡!当然,低配置的朋友你也可以相信BLZ游戏一贯广泛的硬件适应性,如果你不追求顶级效果,相信SC2也不会太过为难你的机器。 官方公布的3D效果图欣赏
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 09:18 AM CDT |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 09:17 AM CDT 很多游戏在玩家的心中都留下过各种各样的痕迹,其中有过不少经典,有延续下来的,有没落的,今天突然有了一些感慨所以想把以前玩过的经典游戏尽量写一写,也许有些游戏早已不为人所知,但是至少在我心里这些游戏都给我带来过最美好的回忆。
1、仙剑奇侠传 仙剑一,现在已经成了武侠游戏不可逾越的经典,当年那感人至深的情节,荡气回肠的音乐,曾经感动过至少一代人,让他们陪着李逍遥感动、心酸、落泪。曾经在游戏排行榜上无法撼动的位置,完美诠释了一款经典游戏应该具备的素质。 仙剑二、三、四,也许是时代不同了,大家玩游戏的品味提高了,或者这些游戏真的水平有限,所以他们都无法撼动仙剑一的地位,让仙剑一的经典成了一个永远的绝唱。
2、轩辕剑系列 我玩过的是一代、二代、三代和四代,二代我认为是十分成功的,新颖的炼妖系统,和机关人系统,再加上完整而又紧凑的剧情,与情节丝丝入扣的音乐,都是这款游戏成功的关键。 轩辕剑三——云和山的彼端以及外传天之痕,我认为是我国2D单机RPG游戏的巅峰之作,玩过的人都知道论画面,论音乐,论故事情节,再到操作,难易度,以及地图的制作和设置等等,几乎是完美无缺的,最主要的是那个时代的游戏几乎没有什么BUG,至少可以让我们顺利的完成游戏。 轩辕剑四,当时号称是水墨风格的3DRPG游戏,总的来说感觉还可以,不过也许是我抱着旧的东西不放,我觉得轩辕剑四的制作水平远远不及轩辕剑三的制作水平,无论从画面,还是游戏性,都不如三代。之后我还曾经购买了正版的轩辕剑四的外传,我唯一的印象就是,游戏开始后的第一场战斗就是一个严重的BUG,一进战斗就退出,那时我本来就对这个系列的3D化不抱什么好感,所以连补丁都没下,就直接把这个游戏扔进了垃圾箱。
3、侠客英雄传三 不知道现在还有没有人记得这款游戏,当时这款游戏独创了动画战斗系统,战斗画面在当时来说只能用华丽来形容,比较开放的地图,独特的铸剑、镶嵌和挖掘系统,给这款游戏增色不少,但是战斗过于简单,和封闭式的剧情,却成为这款游戏小小的瑕疵,玩过的朋友都知道,主角刚被师傅赶出去的时候山门旁边的山洞里能拿到一把攻击力加300的剑,装备上以后让战斗变成了砍人游戏,虽然我个人认为这个设计很不错,很适合我,但是总的来说,这样还是多少降低了它的游戏性。 一代和二代我都没玩过,所以就不评论了。不过这个系列的游戏好像后来就再也没有出过续篇,多少还是有些遗憾。
4、倚天屠龙记 我记得好像是智冠出的这么个游戏(太早了记不清了,如有错误请海涵),我说的是DOS下的那款,不是后来出的那些。其实整体来说这款游戏很烂,烂的不能再烂了,唯一值得人记住的是这款游戏的主题音乐,简直是太传神了,除此之外实在是没有什么可取之处……。 对了,还有张无忌的头像,就是一片黑加上两个金色的洞,这一点让我印象深刻。
5、C&C系列+红色警戒系列 可以说是即时战略游戏的开山之作,当年火爆的程度绝不亚于现在的《魔兽争霸》系列。只要是个网吧的电脑里肯定安装了这款游戏,如果没有安装这款游戏那一定是准备关张的网吧了。我想很多人都玩过我就不多介绍了。
6、最终幻想全系列 到现在为止,最终幻想一直是经典RPG的代名词,精良的制作水平,完美的剧情演绎,美工、作曲等等的一切都已经是其他的大部分同类型游戏所无法超越的。 当然了说到其他的游戏,比如《塞尔达传说》系列,《伊苏》系列等等,都是经典中的经典,但是鉴于在下从来没有玩过,就不妄加评论了。
7、英雄传说系列 这个系列的游戏,绝对是日式RPG的代表作之一。简单明快的战斗方式,扣人心弦的剧情发展,配合美妙的音乐再加上可爱的日式卡通人设,绝对会吸引你,让你一口气打穿它,然后坐在家里自己YY下一部作品。 8、星际争霸+魔兽争霸系列 这两个系列的游戏我想不用我多说了吧,公认的。什么?你说没听说过,那我救不了你了。
9、生化危机系列 当年玩生化危机一的时候,我们是几个大小伙子一起坐在电脑前玩的,当时那个感觉现在还记在心里。 恐怖游戏就是恐怖游戏,气氛渲染的真好,情景、音乐、再搭配上当时来说十分逼真的音效,在安静的大屋里,你唯一能听到就是自己的脚步声和僵尸啃噬尸体的声音。 这也是一个玩过的人很多的游戏了,如果你随便问一个玩过的人,他一定会坐在这里跟你讲一个下午的游戏心得。
10、DIABLO(暗黑破坏神)系列 这是世人公认的经典游戏,不知道是哪个无敌的家伙把这个游戏的名字杜撰成了“暗黑破坏神”,我记得最早翻译过来的名字叫“恐惧”(毕竟DIABLO这个词来自圣经,大概意思是“恐惧之王”,所以我认为一开始的译名还算比较贴切),后来等出正版的时候就换成“暗黑”了。 到现在我还是愿意叫“大菠萝”这个玩家之间的爱称。而且DIABLO2是我现在还在玩的游戏之一。
11、博德之门系列+冰风谷系列+无冬之夜系列等以“被遗忘的国度”的世界为基础的AD&D规则下的游戏。 这几款游戏,我想真正玩全的人就不是很多了,反正我是没有玩全,尤其是后面出的无冬之夜系列,除了一代和二代的本体其他的什么都没玩过,而且现在再想找恐怕也不那么容易了,这个成了我永远的残念。 其实这个系列还是很有名的,著名的黑暗精灵游侠崔斯特·杜垩登就出现在以被遗忘的国度的世界为基础的故事中,玩过博德之门一代和二代的朋友一定知道,在游戏中一代我们有机会见到这位传奇英雄,而二代我们有机会跟这位传奇英雄和他的朋友们并肩作战。 至于为什么好玩,我想只有愿意打穿这些游戏并且绝对不用攻略的玩家能够体会。
12、CS(反恐精英) ……没什么可说的了,到现在依然如日中天的游戏之一。
13、《文明》系列 明快的画面,简洁的操作,丰富的游戏内涵加上颇具深度的战略战斗方式,以及独特的科技树系统,使得这个系列的游戏成为最有影响力的即时战略游戏之一。
14、三国志系列+大航海时代系列+太阁立志传系列 三国志系列:历史类战略游戏中的顶尖之作,很多喜欢三国故事和人物的朋友都玩过这个系列的游戏,每一代都会给玩家带来惊喜,总之是当之无愧的经典。(但是三国志OL我就不评价了,我觉得没意思。) 大航海时代系列:其实这个系列应该属于航海类战略游戏,但是游戏中涉及到大量的历史和地理知识,是其他类型游戏所比不了的。(我也觉得大航海时代OL相对来说比三国志OL好玩多了,好歹我还曾经愿意花钱来玩这款游戏。) 太阁立志传系列:我唯一玩过的是二代和五代,玩二代是很久以前的事了,现在已经记不大清楚,但是五代是我现在还在玩的游戏,总的来说这是一款开放度非常高的游戏,你可以在游戏中扮演很多角色,冲锋陷阵的武将,武艺高超的剑豪,富甲天下的商人,悬壶济世的名医等等很多职业供你选择,整个游戏拥有极高的自由度,最有意思的是制作新角色,给你大量的容貌组件让你自己设计出独一无二的角色,游戏中还内置了很多的益智小游戏,充分的照顾了有各种游戏需求的人,总的来说这是款现在看来都不落伍的游戏,如果有机会最好大家都试试这款游戏。(当然了如果你的反日倾向比我还重,那我看你还是不要玩了。) 15、《辐射》系列 我认为是最经典的RPG游戏,自由度极高的世界设定,写实的武器系统,完全自由的游戏方式,整个游戏灰暗的画面把核战后的世界描写的入木三分,虽然一代和二代都是回合制的战斗系统,但是这并不影响游戏的可玩性,反而加强了游戏本身的战略性,成了一款半角色扮演半战略的经典神作。 辐射战略版,继承了一代和二代的大部分优点,战斗方式也变成了可以在即时战斗和回合制战斗之间切换的系统,但是它却失去了前作的高自由度,成了一款闯关战略游戏,这多少令人有些失望。但是整体来说这个系列的游戏还是非常值得期待的,让我们期待《辐射3》的到来。
16、《模拟人生》系列 怎么说呢,我认为是最好的生活类模拟游戏,也是我正在玩的游戏之一。对于这种绝对的经典游戏我就不用在过多的叙述了,大家还是去自己感受吧。
17、《极品飞车》系列 同样不必多说的一个系列,玩过的人绝对不在少数,尤其自7代开始出现的车辆改装系统,把这个游戏推向了一个前所未有的高峰,让这款游戏成了赛车类模拟游戏的代名词。其他的诸多特点就不在这里一一赘述了,因为玩过的人都知道。
18、《古墓丽影》系列 一套难度相当高的动作冒险游戏,绝对是操作流玩家的首选,如果一个玩家能准确而又完美的控制女主角劳拉上下翻飞闪躲腾挪,那他一定会得来其他人的一片掌声和叫好。(而我就不是操作流玩家,所以这个系列的游戏玩的不全。)
写到这里,我看我也该住手了,因为经典游戏实在是太多了,一个一个写恐怕一时半会是写不完了,况且还有很多经典游戏我根本就没玩过。以上只是我从玩过的游戏中拣出一些比较喜欢的来评论一下,如果看过的朋友有什么其他的经典想告诉我,请在评论处写出,如果是现在还能找得到的游戏,我也去找来玩玩,好好感受一下经典的魅力。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 09:17 AM CDT 今天在查perlin noise资料的时候,发现了一很好的网站:http://freespace.virgin.net/hugo.elias/。里边有介绍各种游戏图形技术的实现原理、示例代码。如Perlin Noise:http://freespace.virgin.net/hugo.elias/models/m_perlin.htm。 [新闻]微软将于下个月推出自己的社会化书签服务 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 07:30 AM CDT Solidot | 你忍不住想付费的独立游戏. 不玩游戏很多年。不过还是很感兴趣于这些游戏. tags: solidot. IPhone 3G: Worker Accidentally Takes Pictures of iPhone Factory (On iPhone). 上面有中文,貌似是在中国生产的. tags: iphone, 3g, apple ...
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 18 Aug 2008 09:39 AM CDT 为了构建这么多的关卡,设计团队通过了一系列的蓝图设计。Desilets解释说:“这些设计是从‘空中30000英尺’的地方鸟瞰进行的,我们会自上而下看,然后在某一处说:‘好,在那里应该有打斗,然后在那边应该有一些围绕柱子做的杂技动作。 ...
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 06:03 AM CDT madgamer: 在思考什么类型的游戏玩的人最多。游戏这个范围很广,凡是能通过玩家参与而得到快乐的可以称之为游戏了。体育算是一种游戏,体育项目里什么活动最火,玩的人最多?貌似是足球和篮球。他们有哪些特征呢,多人互动,竞技性。而玩足球的人又比玩篮球的人多,分部年龄段广,这是为什么呢?我觉得是因为足球的踢法更简单,对身体素质的要求更低一些,只要你有脚就能踢。篮球运球,传球等要求不低,在一个较小的空间内,个人要求较高。这就体现了足球简单的特性。 PC平台上目前什么游戏玩的人最多,在中国是WOW,征途,梦幻西游么?都不是。玩的人最多的还是魔兽争霸,这其中包括了魔兽争霸中的对战模式,RPG模式,3C模式(三国无双)。这恰恰又体现了多人互动,竞技性。而玩魔兽争霸的人多,其实恰恰反映了一个问题,玩家对小众互动(现实朋友间)的忠诚度其实高于大众互动(虚拟社会上的),人们都有比较心理,你喜欢和谁比较,是和你不认识的呢,还是和你身边的朋友?答案大部分会是和身边的朋友比较,真实的朋友对你高评价更能满足你的虚荣心。就连西楚霸王都说,得到了功名利禄不衣锦还乡的话那又有什么意义呢,当然他这是一种狭隘的心理,但是这种狭隘的心理恰恰很多人都有,是大众心理。这其实也是马斯洛5层需要里的第四层需要,尊重需要。前几天在gameres上看到一个新人(注:偶现在也是新人。呵呵)写了一个婚姻系统,我没有看,主要是现在麻烦。不过下面有一个老策划评价了说婚姻系统属于小众互动,游戏公司不愿意把他们设计的太复杂,他们更关注像帮会系统这样的大众互动,我承认大众互动对游戏的社区化的建设是有很大贡献的。但是社区化是建立在玩家特征相似的基础上。像帮会系统应该提供给玩家的是一种马斯洛的第三级需要,归属需要。但是现如今很多游戏的帮会系统其实并不好给玩家充分的归属需要,只有高级别的玩家,处于帮会高层的玩家才能得到归属和尊重的。低级别的玩家往往是没有太多地位的,何谈归属?帮会在玩家前期不能给玩家太多的精神支持,在玩家游戏前期能够给玩家精神援助的恰恰是一些小众互动,经常一起打怪的朋友。在现在魔兽争霸游戏趋势里,3C,RPG的游玩比对战多,这其实体现了操作简单在起作用。原来盛行的CS也体现小范围的多人互动,和竞技性。 总结一下吧,足球,篮球,war3,CS这些最受世界玩家欢迎的游戏都体现了一个核心,最受人们喜爱的游戏是能够使小众(真实朋友)很好互动的竞技性游戏。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UNF Game Development Camp and Pandora news Posted: 23 Aug 2008 07:45 AM CDT Approximately 50 high school students from Denmark have participated in the UNF Game Development Camp, and two of the results have been published under some of the Creative Commons Licenses. The seven teams' common tool was Blender and it's game engine. While the results seem very amateurish, I rather like the idea of involving children in the design of toys. Especially when preformed by non-profit organizations. The ultra-mega-super-duper portable Pandora, the ultimate open source handheld device, seems to become a reality. Playing Quake 2 on a device slightly wider than a CD? Sounds uncomfortable. But in connection with a real keyboard and mouse, this device might be quite fun. In my opinion portable stuff just can't get small enough. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 06:04 AM CDT 已經不是第一次了……挖坑這種事……一個在最后的時間里為了分手女友瘋狂畫圖的男人……怎樣都想讓他掛……(你想官方CP???)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Weekend Design Challenge: The negative side of business Posted: 23 Aug 2008 07:01 AM CDT I saw a really fascinating article online where Bill Roper of Flagship Studios' fame talked about the demise of his company. It was a really fascinating and honest look on the inside of a business. It's also a perfect example of why I wanted to write and edit my book about business and legal issues. Here's a competent developer who obviously was able to create a successful game as he did previously at Blizzard, but where not doing the proper business planning lead to a business failure. (Personal to Bill Roper: contact me if you want to write a chapter for the next edition of the book. ;) No particular challenge this weekend, but do read that article. A few of my own thoughts after the jump. From the interview, it looks like the major problem was a serious lack of business planning. They wanted add more content to the online part of the game, but they didn't have a solid plan for accomplishing this. I've commented before that the business model didn't make sense and really turned people off when it was announced rather late in the project. It also shows the importance of having someone who does understand the business aspects. You can have a talented leader with a great team, but if your business aspects aren't taken care of then you can lose control very easily. It's easy to underestimate the situation and hope you can pull out a last-minute miracle. The problem is, of course, that a lot of "biz guys" have bad reputations, sometimes with good reason. They have a reputation for being superficial, and focusing on the short term. They don't listen to the concerns of other people in the business, believing they know best. Some also think that they don't need to learn about the details of the game industry, because they've managed people before. And, even though they always want to stick their fingers into the "fun design" part of the job, they don't always appreciate it if you give your point of view on business issues. It's tough to find someone who will act as a good partner with everyone's best interests in mind, but it can make your business go a lot smoother. It's also interesting to see a former Blizzard employee bitten by the one thing most developers point out as Blizzard's largest advantage: having nearly unlimited resources. It's a lot easier to make Blizzard-quality games when you have practically endless schedule and budget. But, as the article points out, if you try that trick in the "real world" the publisher will chuckle and ask you, "How are you going to pay for that? Not with my checkbook, you aren't." Even the best developers are hampered by the standard industry situations that cause all sorts of problems for everyone else. In the end, I really feel sorry for the Flagship employees who lost control of their babies. It's hard to pour your creative efforts into something only to lose it. It sounds like Mr. Roper is going to take some time off, but hopefully he'll get back into things eventually and takes the lessons learned to make things work better the next time around. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 06:51 AM CDT ·人生活在希望之中,旧的希望实现了,或者泯灭了,新的希望的烈焰随之燃烧起来。 ·书籍是全世界的营养品。生活里没有书籍,就好像没有阳光;智慧中没有书籍,就好像鸟儿没有翅膀。 ·这个世界,真正潇洒的人不多,故作潇洒的人多。有人认为,那种一掷千金的派头就很潇洒,这是对潇洒的误解和潮弄,这种派头,除了证明这钱八成不是他自己挣来的外,并不能再说明什么 ·高尚的追求,使生命变得壮丽,使精神变得富有;庸俗的追求,使人生变得昏暗,使青春变得衰朽。 ·在物质开拓中去开拓崇高的精神;在精神开拓中去开拓人生的价值。 ·也许你航行了一生也没有到达彼岸,也许你攀登了一世也没能登上顶峰。但是能触礁的不是勇士,敢失败的未必不是英雄,奋斗了就问心无愧,奋斗了就是成功的人生。 ·灵魂在耕耘中净化,信念在耕耘中升腾。转首回望,耕耘后是一片清新的天地,一个绚丽的人生。 ·只有启程,才会到达理想的目的地;只有拼搏,才会获得辉煌的成功;只有播种,才能有收获;只有奋斗,才能品味幸福的人生。 ·倘若把感情贯注到事业上去,手艺匠也可以成为极伟大的艺术家。 ·我们在上路的时候,一定要带上三件法宝,而不是赤手空拳。这三件法宝是一健壮的身体、丰富的知识和足够的勇气。 ·所有的输和赢都是人生经历的偶然和必然。只要勇敢地选择远方,你也就注定选择了胜利和失败的可能。人生的关键在于:只要你做了,输和赢都很精采。 ·大自然是个忠实的供给者,但它只把报酬给予努力工作的人。 ·生活中,谅解可以产生奇迹。谅解可以挽回感情上的损失;谅解犹如一个火把,能照亮由焦躁、怨恨和复仇心理铺就的道路。,不仅仅是由于他的容貌,首先决定他的精神面貌。一个品质高尚的人,永远是年轻和美丽的。 ·言行适度,凡事想到别人,是君子的两大特色。 ·最难抑制的感情是骄傲,尽管你设法掩饰,竭力与之斗争,它仍然存在。即使你敢相信已奖它完全克服,你很可能又因自己的谦逊而感到骄傲。 ·事业恰似雪球,必须勇敢往前推,愈推愈滚愈大,但是,若在途中停下,便会立刻融化消失。 ·昨天是一张作废的支票,明天是一张期票,而今天则是你唯一拥有的现金。 ·人生是海洋,希望是舵手的罗盘,使人们在暴风雨中不致迷失方向。 ·在这个世界上取得成功的人,是那些努力寻找他们想要的机会的人,如果找不到机会,他们就会自己创造机会。 ·时间是伟大的作者,她能写出未来的结局。 ·人生是短暂的,这句话应当提醒每一个人去从事他要做的一切事情。 ·世界上最长而又最短,最快而又最慢,最平凡而又最珍贵,最易被忽视而又最令人后悔的就是时间。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 06:40 AM CDT 山里的影子,一直在心里不断地想象,无穷地扩大,成为覆盖整个记忆的天幕。有轻雾,有雨点,有彩虹,有溪流,时常在血管的深处涌动,甚至泛滥。站在某个交汇点上,清点着记忆里某些感动的事物,深刻的风景,流泪的情感。那些日日夜夜成长的点滴,构成了现在眼神里布满的影像。 那些花儿开满山间的童年时光,那些北风吹过滩涂的少年情怀,那些风雨击得颤抖的青春岁月,总在眼前隐约闪现。是轻盈跳跃的脚步,一路把我带到今天。场景,在不停地变换,在这个舞台上,不知不觉地进入了预定的角色,做着拙劣的表演。幕布拉开以后,只能不由自主地一直诠释着这个人生,不停不歇。 不知不觉步入这个年龄,青春正在渐行渐远,迟暮正在缓步而来,但这又应该是一个多么绽放的季节啊。可是,青春却在这里拐弯,急剧地把寒冷带进岁月的河流,封锁起激荡的浪花,成为缓慢流淌的状态。而激流,却在这平缓的河床下面,进行无可逆转的回旋。 在青春年华,一个人行走的光阴,没有故事情节,只有悠然思绪。曾经的荒凉与青涩,站在天地间不断思索成长的意义,探求生命的足迹,进行未来的想象。但无论怎样,心里总是升腾着希望,以及对美好事物的追求,有希望和期待的青春总是美好的。 征程,总是在脚下。风雨,总是在路上。日夜奔波,星月作伴,就把自己投入了生活的细枝末节,与这些具体而琐碎的目标劳累身心,疲惫不堪。于是,我们无心再欣赏沿途风景,无心再细数路途痕迹。岁月,就这样推动着人生的车轮,滚滚向前,一片烟尘。 当某个泛起烟雨的清晨,当某个夕阳斜抹的黄昏,当某个星月灿烂的夜里,不经意的抬头看见这一切的时候,猛然发现自己的内心,其实还有感动存在。因为感动,也就能够寻找到久违的激情,和那些尘封许多的影像,泪光在不断闪动。 归去,已经成为不可能。只能存在,存在于现在这样的境遇里。无论是喜是悲,都是内心真切的拥有。更多的时候,就是一种怀念,就是一种记忆,就是一种想象。时间,总停留在青春之前。童年、少年时代,是看不到时间流逝的样子的,总是那么丰裕,光景随意挥霍,愁怀离绪也只是不经意的装点。 青春,在这个季节拐弯。一个最重要的症结可能就在,过去的事情总也忘不了,现在的事情总也记不住。当怀旧成为一种常态,青春就已经要远离,已经要消逝。留下的,只有青春的记忆,以及记忆里一些风花雪月的情节。四季,已经没有什么不同,已经难以再打动心灵深处的那片不再嫩绿的田园。 站在青春的坟墓前,只有清风徐徐,只有枯草蔓蔓,只有四野茫茫。点起香烟,看轻烟袅然升起;端起杯盏,闻酒香悄然弥漫。静立着,静立着,只有一个孑然的影,定格在苍茫的烟云之间。可是,我拿什么来祭奠你,我的青春,我的即将放弃的青春,我的永远逝去的青春。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 06:37 AM CDT 飞蛾在熊熊火焰中把自己燃烧,却心甘情愿,因为它曾经拥抱光明;夕阳壮丽的坠落,却毫不犹豫,因为它曾经染红天边;受伤的雄鹰依旧挣扎着渴望再次展翅,因为它曾经自由翱翔。 不为坎坷行程而厌倦人生,就算凋零在最美的时刻,依旧骄傲的微笑,因为我曾经欢乐;不为失意而放弃追逐命运,哪怕成功从未光顾,仍然不懈地追求,因为我曾经坚持;不为红尘纷扰而远离梦想,即使阴云把天空笼罩,仍旧梦想着灿烂的明天,因为我曾经寻找。 也许寒冷的伤害刺痛过你的心,也许世俗的阻挠碾碎过你的梦,也许蹉跎岁月磨灭过你的希望……但至少早广袤的世界中,我们曾经有过晶莹的心、五彩的梦和燃烧的希望。就像鸟儿曾经飞在天空,鱼儿曾经游在水里,花儿曾经开在风中。茫茫人海中,有我穿梭的身影;人生道路上,有我追寻的印迹;尘世流浪的风雨中,有我最喜欢的人不变的注视。这就证明我的生命有过最美丽的执著。曾经拥有,就是对你生命最坚韧的注释。 不要告诉我永恒是什么,我在最灿烂的瞬间毁灭。不要告诉我成熟是什么,我在刚成熟的瞬间结束……因为曾经来过,爱得以继续,梦得以继续,守侯得以继续。 飞蛾在熊熊火焰中把自己燃烧,却心甘情愿,因为它曾经拥抱光明;夕阳壮丽的坠落,却毫不犹豫,因为它曾经染红天边;受伤的雄鹰依旧挣扎着渴望再次展翅,因为它曾经自由翱翔。 不为坎坷行程而厌倦人生,就算凋零在最美的时刻,依旧骄傲的微笑,因为我曾经欢乐;不为失意而放弃追逐命运,哪怕成功从未光顾,仍然不懈地追求,因为我曾经坚持;不为红尘纷扰而远离梦想,即使阴云把天空笼罩,仍旧梦想着灿烂的明天,因为我曾经寻找。 也许寒冷的伤害刺痛过你的心,也许世俗的阻挠碾碎过你的梦,也许蹉跎岁月磨灭过你的希望……但至少早广袤的世界中,我们曾经有过晶莹的心、五彩的梦和燃烧的希望。就像鸟儿曾经飞在天空,鱼儿曾经游在水里,花儿曾经开在风中。茫茫人海中,有我穿梭的身影;人生道路上,有我追寻的印迹;尘世流浪的风雨中,有我最喜欢的人不变的注视。这就证明我的生命有过最美丽的执著。曾经拥有,就是对你生命最坚韧的注释。 不要告诉我永恒是什么,我在最灿烂的瞬间毁灭。不要告诉我成熟是什么,我在刚成熟的瞬间结束……因为曾经来过,爱得以继续,梦得以继续,守侯得以继续。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 06:36 AM CDT 感恩这世人的缺憾, 使我们警醒不至于堕落.
感恩这都市的污染, 使我们有追求明净的智慧. 感恩那些看似无知的花树,使我们深刻的认清自我. 最大的感恩是,我们生而为有情的人,不是无情的东西,使我们能凭借情的温暖,走出或冷漠或混乱或脏或匆忙或无知的津渡,找到源源不绝的生命之泉. 人生不如意十常八九,一个人的命运是早就注定的,吃多少,穿多少,用多少,甚至活多久都是分配好的。生活给以的一切是要付出代价的,命运赠送的东西暗中都标着价格。没有一成不变的东西,但是做了就要负起责任来,就是勇敢地走下去.这个世界不是到处都有鲜花,永远是春天,每天都是温暖的,有时有阴天和冷天,会遇到艰难和曲折。就像我们选择了生命就要对自己负责。真的不能自暴自弃,因为这样就会伤害所有关心你的人。 在同一天空下,每天都有那么多人死亡,但在同一时间又有那么多的生命诞生。那么多的人得了癌症还是一样充实地活着,他们并不抱怨上天的不公平,也许曾经抱怨过吧,但是他们还是活得多姿多彩,天空依然蔚蓝,生活依然多彩。 经过一天的所见所闻,我突然有一种解脱的感觉,知道只要我可以看开一点,我的人生依然绚丽多彩,剔除这样的不如意,我还是可以无忧无虑,开心地过我的日子。人生可能有许多事情还难以选择和把握,但有一点,人是可以选择和把握的。那就是自己对人生的态度。只有积极的,向上的,友善的,努力的,乐观的,充满信心的去对待生活,人生才会有亮色。 人在生活中,总是有得有失的,而懂得感恩的人之所以快乐并不是因为他们总是利大于弊或得多于失,而因为他们根本不去算计自己失去的部分,而永远对自己得到的心怀感激。一个人的一生不是只属于她自己的,她的人生有亲人的参与,有那些真正的朋友的介入,从出生的那一刻起,我的人生就已经渲染了他们的色彩,注定有他们的加入,望着他们充满关心与怜惜的眼神,忍心伤害他们吗?已经得到了那么多,还不懂得去珍惜与感激。那我真是糟蹋了我的一生,对自己太不负责任了。 天,苍苍茫茫的,彩霞像一大摊错点的命运谱,各种色彩纠缠交集,却仍旧逃不开最终的暗黑。但人生是不能不向前走的,即使眼前就是离别的、死亡的篇章,也要逐一上演。既然如此,何不让自己灿烂一回呢? |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 03:31 AM CDT
Persistence
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 05:03 AM CDT 去年,看马云和史玉柱的东西看了很多,这段时间关注了一下CSDN上阿朱的一些文章,反过来又结合我们自己的成长过程想了一下,总结出一个道理: 但凡成功的企业和团队,都具备类似的特质,并没有什么特别新鲜的招法,也不会有什么捷径,都是一步步脚踏实地在困境中求生存,一步步熬过来的。 当然,“熬”与“煎熬”之间还是有很大区别的,我不说你也知道,我指的"熬"是更积极的面对,而不是做一天和尚撞一天钟的那种消极怠工。 也许是太过于追求完美,我总认为我们的开发流程有很多问题,总是不满意,而在看了阿朱的一些文章之后,我觉得,我们的开发流程已经是非常规范,也已经非常高效了,根本没有什么大的问题,只要我们保持目前的团队氛围,保持精益求精的心态,我们的开发就一直会不断向上,因为我们现在已经进入了一个良性循环。 呆过小公司,也自己创过业,进了网易作网游后,我总想更多的了解别人的产品是怎么作的,我想,阿朱的产品和团队,应该是中国传统软件行业的一个缩影,其中折射了太多的中国软件业的现实问题,与传统软件行业相比,我们这些作网游的,不知道要幸福到哪里去了。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 03:15 AM CDT 看到一个好友博客中的一段话,深以为感, 曾经的天真,曾经的浪漫,曾经的梦想,曾经的美好,就这样在现实中一点点地,被磨平了。 这是很多人不愿意接受的现实,真理不是在掌握多数人的手里,很多人现在从事的工作,都不是他当初所想的或是最喜欢的,你最后结婚的人往往不是你最理想的,你所讲的话并不代表你的真实想法,你不想去做的事情对你多数有利,往往害你的是你最想不到的好朋友,骂你骂得最凶的人到最后救了你...... 我们被逼的事与愿为。 以此回顾人生之路,似乎逃不出这段话的预言
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 03:04 AM CDT 伪代码(Pseudocode) 如下: bool pointIn2DTri(vec2 p, vec2 a, vec2 b, vec2 c) { vec2 v1, v2; float area[3]; bool zero_area[3]; v1 = b - a; v2 = p - a; //2D向量叉乘的几何意义在于,等于V1,V2向量组成三角形面积的两倍 area[0] = crossproduct(v1,v2); //判断浮点数是否等于0 zero_area[0] = realequal(area[0], 0.0); v1 = c - b; v2 = p - b; area[1] = crossproduct(v1, v2); zero_area[1] = realequal(area[1], 0.0); if(!zero_area[0] && !zero_area[1] && sign(area[0])!=sign(area[1])) //一个是正面积一个是负面积 { return false; } v1 = a - c; v2 = p - c; area[2] = crossproduct(v1, v2); zero_area[2] = realequal(area[2], 0.0); //和相临的边再判断 if((!zero_area[0] && !zero_area[2] && sign(area[0])!=sign(area[2])) || (!zero_area[1] && !zero_area[2] && sign(area[1])!=sign(area[2]))) { return false; } return true; } ![]() |
Posted: 24 Aug 2008 02:38 AM CDT vvvvvvvvv画完了〜終于!!!真是磨嘰啊……立繪而已……
|
Posted: 24 Aug 2008 07:49 AM CDT 不错,周末最后一场桌游以压倒式胜利,oye!
|
Posted: 24 Aug 2008 06:58 AM CDT 玩儿卫星接收已经快一年了,一直想做个寻星一体机,也就是寻星仪,用来调星。买各种配件、工具前前后后就花了不少时间,幸好有淘宝,否则到处去找还不得跑断腿。和上高中时候自己DIY功放等等小东西相比,现在想买点儿东西、想找点儿资料实在太容易了,不过也没那么多时间了,这就是代价,有钱没时间,有时间没钱。 寻星仪无非是小体积的卫星接收机+锂电池组+液晶屏,本打算再集成一个寻星频谱仪进去的,这样更方便找信号,没时间就暂时搁置了。首先要做个外壳,先是买了个铝铸压防水外壳,电钻做了开口之后才发现这实在是个错误决定,铸铝外壳太难加工了,而且又太厚重,后来只好放弃,又买了个铝合金的外壳,事实证明这个决定很正确。 钳工活儿开始——和做软件一样, 先做好规划设计,量好尺寸,划线,然后用电钻做初步的开口,然后再用电磨装上钨钢旋转锉修到大致平滑,然后再用钢锉、砂纸……总之这个钳工的活儿就做了两天。 上图: 用下来感觉很不错,顺利地用它重调了天线。 Related posts,相关文章
Related postsCopyright © 2008 Wang Zhiyong, Some Rights Reserved ;) all content of this site is under Creative Commons License 此网站所有内容采用 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。(digitalfingerprint: e71076c267f520b120f4bb81270fe189) |
Posted: 24 Aug 2008 09:28 AM CDT 唉,呵呵,无奈呀无奈,CSDN,终究还是一个是非之地,也罢也罢,想不到一个内部的讨论竟然还被这么煞有介事的弄出来,而且,还只说支持自己的内容,一点也不提及我的原意及我所说的诸多情况。 作了几件事: 1. 退出了周老师的书籍策划讨论组; 2. 删除了有关此文的两篇读后感; 3. 关闭CSDN博客的讨论功能。 原因是: 1. 我现在还不是个闲人,也不是CXO,我还有很多辛苦的事要作,没功夫整天盯着博客回复; 2. 我需要安静,需要安安静静的作项目,不想卷入与项目本身无关的任何是非; 3. 我想看到一个最真实的阿朱,不管他是确有经验的,还是非常局限和非常自负的,我不想因为自己的“搅局”而改变真实本身; 4. 一些我不方便说,但真实存在的原因。 你也不过如此,呵呵,别过。 |
Posted: 24 Aug 2008 05:23 AM CDT 这里要再缩小一下战棋SLG的定义,实际上这里说的是类似大战略这种简化战略层次,有较多的单位在地图上走格子的回合制SLG。看上去业余要完成一个战棋SLG并不困难,因为它对图像处理没有什么太高的要求,大都是一个个图标在移动;地图制作简单,就是用最简单的Tile图素拼接法就能实现;如果直接在大地图上开打,连战斗画面都能省略很多;因此以VB的老牛破车处理速度和简陋的windows标准控件界面似乎都能做出来————SS的大战略就用了很多的win标准控件。但是,我在断断续续地写了两年设定(文案,不是代码)之后,发现大战略也不是那么好写,有两个大坑值得注意。
对程序来说,问题在于AI。游戏的复杂程度和AI的聪明程度成反比,游戏的中需要考虑的要素的数量越多,电脑方思考越笨。对于大战略这种兵器种类繁多,相生相克复杂,又导入了索敌(侦查)范围的游戏来说,AI需要统筹安排的量太多了。如果是写曹操传或是类似萌え萌え二次大戦(略)这样的游戏,AI仅限于一个基于Tile的计算移动范围的算法,以及选择在移动范围内的攻击目标的规则,再加上特殊时刻的行动(比如向某个地点移动)就差不多了,都不是很难;而对于大战略,已经不是让全单位轮流动一遍,看看能不能打到人就可以对付的了。比如,光是一个让步兵搭载车辆进军某地的过程,就牵涉到局势判断,目标选择,单位的行动配合等等无数。
对于策划设计者来说,困难的是公式和数值的设定。要想做个稍微正统点的战棋SLG设定,部队的参数数量就飞快的地往上增加,移动,燃料,空防,地防,武装,优先,轻易突破数十项。公式也随着复杂化,单是攻击公式一项,用到的性能参数就有十几个,其他还有远程射击,占领,爆击,经验变化等等公式就不用说了。Excel在设计和平衡公式的时候会非常有用。
由于有着这两个难点的存在,要做一个能够让人愿意玩下去的战棋SLG并不如想象中那么容易。相较而言,SRPG的战棋类(比如曹操传)更易于成功,有数个曹操传的MOD(玩家自行修改版本)也挺受人欢迎的样子。 |
Posted: 24 Aug 2008 04:23 AM CDT 今天是父母结婚29周年的纪念日。 每年的今天都会向父母表示一下祝福,今年也是。刚刚打了电话给父母表示了祝福。 这世界上,我最羡慕的一对情侣,不是别人——正是我的父母。 希望有天我也能像父母一样和自己的配偶恩爱厮守长相伴。 |
Posted: 24 Aug 2008 03:26 AM CDT C 语言里有一个 alloca 函数,可以在堆栈上分配一块内存,当前函数退出时,由于系统堆栈指针的调整,这块内存会被自动回收。 alloca 的函数原型是 void * alloca(size_t size); 今天,在各种编程文档中已经不太提倡使用了。因为它有许多不安全因素。这里暂且不讨论。 另外,在 CRT 库里,通常还会提供一个 另外,当你分配为局部变量数组申请空间过大时,gcc 也会调用 这个周末,我手工写了一个 gcc 的这个 返回值当然是通过 eax 送出,同时一并修改了堆栈寄存器 esp 。 经过多次程序崩溃,并用 gdb 对汇编代码逐行分析,还看出了另外一点门道。 调用 如果打开 gcc 的优化开关(我使用的 -O2 ,gcc 版本 3.4.5),编译器有时候会预测 最后给出云风的 .globl __alloca; __alloca: subl $1,%eax andl $0xfffffffc,%eax /* align to dword */ subl %eax,%esp pushl (%esp,%eax) /* return addr */ movl %esp,%eax addl $4,%eax ret ps. 这个帖子放在这里,日后肯定会有同学偷懒搜代码搜过来的,嘿嘿。程序随便用,但出了问题别找我。我不帮人做作业。 |
Posted: 24 Aug 2008 12:55 AM CDT reinterpret_cast是C++里的强制类型转换符。 操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。 例如:int *n= new int ; double *d=reinterpret_cast<double*> (n); 在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析。 因此, 需要谨慎使用 reinterpret_cast. 并且:reinterpret_cast 只能在指针之间转换。 == =========================================== == static_cast .vs. reinterpret_cast == ================================================ reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。(这句话是C++编程思想中的原话) static_cast 和 reinterpret_cast 操作符修改了操作数类型。它们不是互逆的; static_cast 在编译时使用类型信息执行转换,在转换执行必要的检测(诸如指针越界计算, 类型检查). 其操作数相对是安全的。另一方面;reinterpret_cast 仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换, 例子如下: int n=9; double d=static_cast < double > (n); 上面的例子中, 我们将一个变量从 int 转换到 double。 这些类型的二进制表达式是不同的。 要将整数 9 转换到 双精度整数 9,static_cast 需要正确地为双精度整数 d 补足比特位。其结果为 9.0。而reinterpret_cast 的行为却不同: int n=9; double d=reinterpret_cast<double & > (n); 这次, 结果有所不同. 在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析. 因此, 你需要谨慎使用 reinterpret_cast. |
Critical Hits Podcast #11: True Dungeon Actual Play Posted: 24 Aug 2008 12:03 AM CDT During GenCon 2008, post-Ennies, I ran off to a far away hotel to play in my very first session of True Dungeon. No photography is allowed inside the game itself, but I smuggled in my trusty voice recorder inside my shirt pocket to record the whole thing as a bit of guerrilla reporting. It’s hard to describe just how cool True Dungeon is, and how much work the organizers put into creating a unique experience. Hopefully, by listening to the recording, you’ll get a taste of what it’s like. (Also, listen to me be a crappy bard!) Critical Hits Podcast #11 (35 MB, over an hour long) Some notes on the rooms after the jump:
Big special thanks to Mike Beck (and the remnants of the Miami University Strategy Game Club) for inviting me into the game, and also for being so entertaining during the dungeon. This posting includes an audio/video/photo media file: Download Now |
Posted: 23 Aug 2008 11:48 PM CDT 皇家赌场上映之后,著名的花花公子间谍詹姆斯·邦德终于彻底丧失了时间空间连续性,开始重温自己刚刚出道时候的陈年往事。Treyarch也借用邦德新近增添的“时间逆转挪移大法”,开发了最新的007游戏“量子危机”。这个游戏包含了量子危机和皇家赌场两部电影的内容,并填补了一些电影之间发生的故事。GS小编有机会尝试了这款FPS的两关内容。 游戏并非根据时间线索,而是在两部电影之间跳跃。小编尝试的第一关发生在意大利的锡耶那,是新电影量子危机的一部分。这一关基本上没有太多的故事内容,詹姆斯跟着一个神秘的西服男从地下隧道一路杀到地上。詹姆斯必须使用房间中的各种掩体,才能单枪匹马干掉为数众多的敌人。一般游戏是第一人称视角,在转入掩体之后则变为第三人称(有点像彩虹6?)。从第一人称换到第三人称的过程有些太快,可能需要适应时间。在掩体背后,詹姆斯可以探头瞄准敌人,或者拿枪盲射,或者从一个掩体换到另外一个掩体。这一次的掩体也并非100%安全,木头桌椅在强大活力之下都会被打穿,增加游戏的紧迫程度,让玩家必须不断的更换掩体。量子危机为玩家精心安排了各种可以互动的环境物体,除了能被打穿的掩体,和传统的“爆炸煤气罐”之外,玩家打穿墙上的灭火器并不会爆炸,但是却会喷出白色烟雾阻挡敌人视线,玩家可以趁机远距离干掉敌人,或者冲过去来个波恩式的徒手终结技。游戏使用COD系列的引擎,所以玩家一上手就会觉得很熟悉。 第一关的最后一段则是詹姆斯像刺客信条的Ataire一样在房顶上跳来跳去,超级间谍虽然不如阴郁刺客灵巧,但是詹姆斯可以穿过窗户,从房间里走过。这种快节奏的追逐,从房顶跳到窗户,穿过不同人家的设定相较于之前直来直去的FPS,让玩家换换口味和节奏。 接下来的一关则又回到了皇家赌场的情节,詹姆斯在赌局休息的时候跑去调查他的对手拉席夫。第一关主要是拿枪杀敌,这一关则更多的是潜伏。玩家可以潜入敌人身后,按右蘑菇悄悄干掉敌人,虽然不如波恩干得那么潇洒漂亮,不过敌人总归是一声不吭的倒在地上了。游戏也给玩家提供不同的路线,除了比较直接的走廊,玩家也可以穿过旅馆房间从窗户/阳台走。詹姆斯可以小心的贴着墙走,如果遇到阳台上抽烟休息的守卫,荧屏会分成2部分,一部分现实詹姆斯的视角,另外一部分现实守卫的视角。虽然一开始可能感觉有些奇怪,但是熟悉之后,玩家就可以轻松的趁守卫别开脸的时候来个萨姆大叔的经典动作,把敌人揪下阳台摔死。。。游戏除了射击,潜伏,还有一些环境有关的小迷题,基本上要求玩家仔细搜索周边环境,寻找必要的信息,找到新的通路之类之类。 量子危机不仅仅是一个简单的FPS,从现在来看,游戏融入了射击,潜伏,解迷等等因素。詹姆斯·邦德也终于变得稍微像个“间谍”了。游戏的节奏掌握得很好,COD4的引擎也让游戏看上去相当漂亮。游戏将于今年11月4日发售,我们将会拭目以待。 http://www.xbox-sky.com/showthread.php?t=204266 标签 007, PS3, xbox360, 最新游戏相关日志 |
|
|
Posted: 23 Aug 2008 11:30 PM CDT 网络游戏行业咨询服务的基础
引用中国传统经典做结尾,网络游戏是一片蓝海,有船还需要有桨有帆。
|
Posted: 24 Aug 2008 01:59 PM CDT |
Posted: 23 Aug 2008 09:59 PM CDT ![]() Was noodling around with a dragon to add to a Metaplace world I was fiddling with, and sketched this. Then I ran it thru a few Photoshop filters. Been a long time since I put a doodle up on the blog, so here it is. This was done first with Adobe Sketchbook Pro on my tablet, using “pencils” “airbrush” and “paintbrush.” Then I brought it into Photoshop and filtered one layer with charcoal, another with craquelure, and blended the two together with around a 60% opacity. For comparison, the dragon’s head used to look like this. His wings don’t line up. Oh well. |
Wizardry 8: Arnika Bank - No Safer Than Under the Matress Posted: 23 Aug 2008 02:24 PM CDT I am continuing my play-through of 2001's Wizardry 8, one of the last of the mainstream "old-school" style RPGs.
Since my last report, I have acquired a couple of tools to help me out. The first is... a manual! The used copy of the game I bought from E-Bay came with nothing but the discs (those with the full packaging are often selling for as high as three digits). I have found that I was able to figure out most of the game without the documentation just fine. I wouldn't call Wizardry 8 intuitive in its gameplay, necessarily, but for fans of the series and the genre, things aren't too hard to figure out. It would have been handier when creating race / class combinations, but familiarity with Wizardry 7 helped in that. You can find a PDF version of the Wizardry 8 manual at replacementdocs.com. The second nifty tool is a utility called WizFast which was recommended by several people. I was able to download it from wolfie.wiz8.de. It speeds up monster movement beyond the 5x maximum for the in-game option. I'm actually pretty happy with it at around 5x, but for those really big wilderness encounters that turn into chase scenes, this could really be a time-saver. Scorpia also contacted me, and offered me some semi-cryptic hints and tips. She always tried hard to do this without giving too much away when she was writing for Computer Gaming World (man, I miss those days). But she did warn me point-blank about the tower, saying, "The Arnika bomb is for real. The DS is not someone who bluffs." Ah. Good point. Important safety tip. Anyway, I'm still in Arnika and the nearby areas. There have been plenty of things to do in the city, although most of those things involve that noble goal of adventurers everywhere: To loot anything not nailed to the floor, and to break into any place that is sealed against you. And the locals often don't seem to mind. Hey, these are desperate times, right? I recovered a diamond for the Arnika bank - stolen, somehow, under their tight security measures. I wasn't pleased enough with the reward. So I made some withdrawals of my own. I was able to... uh, "find" several security cards that gave me access to the vaults in the basement. And the emotionless bank teller apparently didn't seem to notice that I didn't look much like Antone the Rapax. And she complains that these things (like the diamond theft) always seem to occur on her watch! I found the nearby jail to be abandoned by its guards, who I guess were busy patrolling the streets to aid me in frequent battles against the minions of the Dark Savant. I found their security less than adequate. I ended up releasing some bandits, who I imagine must have been half-starved, as they attacked me immediately rather than expressing their gratitude. I unfortunately had to put them out of their misery. At the bottom of one cell, however, I found a secret entrance to a tunnel that went under the street and into one of the bank vaults. With more loot. I had one other offer to interact with the bank. Some Ratkin named Rattus Rattus asked me to cash a check for him. And he gave me a zip gun in payment. I agreed, and even made it all the way back to the bank. Before handing Rattus's note to the teller, I decided to read it first. Good thing I did. It bas a hold-up note. That prankster! I quietly folded the note and put it away and left the bank. I later found a gullible merchant who was willing to buy the note for 1 gold piece. I have no idea why. I hope the Arnika Community Bank is insured. Because I don't think they are going to be in business very long. In true Gygaxian style, the same exploration that can reward you so handsomely can also bring you a great deal of trouble. While locked doors may be there to protect valuables inside from people like me, that can also be used to keep bad things locked IN. I discovered this exploring one too many locked doors inside the temple of Phoonzang. Who knew there were all those deadly ghosts inside? However, I prevailed, and I'll consider it a service rendered to the temple. With the ghosts gone, maybe they can renovate the chambers and turn them into dining areas or guest rooms or something. One of the treasures in the bank - the sword Bloodlust - turned out to have a curse attached to it. I wasn't paying attention when I gave it to my samurai-turned-gadgeteer. I figured it'd make a good close-quarters weapon when we got flanked. Then I discovered he was incapable of switching back to his gun - or any other weapon. Fortunately, selling the sword back to its original owner, Antone the Rapax (who assumed it had been made by his brother - I'm not making this up!), almost made up for the cost of the "remove curse" scroll we had to use to free our gadgeteer-swordsman from its powerful compulsion. Greed has its drawbacks. I am now on the trail of the big artifact that the Dark Savant is after - the Destinae Dominus. The introductory movie made it sound like someone had just absconded with the thing moments before the Dark Savant arrived. But, according to certain townspeople, the theft took place a hundred years ago. I guess when you are dealing with ancient prophecies, a mere century is still a current event. Anyway, the thief was a former cop (well, HLL guardsman) named Marten. While he's being painted as a villain by some, I wonder if he didn't have a heads-up that the Big Bad would be coming one day and decided to keep it safe. Or maybe he was an adventurer like me, and had that problem with looting everything that wasn't nailed down. He apparently fled to the nearby town of Trynton, and the "Trynnies" hid him and the Destinae Dominus for some time. When the HLL came after him, he managed to give them the slip. Since I think I've exhausted most of the currently-available quest opportunities in Arnika (I think), it looks like my trail now leads to Trynton. I wonder if there is anybody alive there who knows about Marten, or where he might have taken the Destinae Dominus... And besides, it might be best to get out of town before people start discovering that their private vaults are empty and start putting two and two together. Maybe after I've saved the entire universe, they'll cut me some slack. Did you enjoy this article? Be sure and check out past articles and the comments HERE. Rampant Games: Games With Personality! Latest games at Rampant Games: Depths of Peril and Eschalon: Book 1 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
“为什么连我们的女儿出生时,你还在为你那个该死的游戏工作?” Posted: 21 Aug 2008 02:20 AM CDT 1997年制作《Starcraft(星际争霸)》时,关卡设计师杰夫·斯纯(Jeff Strain)的设计也到了必须重新定义任务处理模块的关键时刻,恰值妻子临产。他一接到妻子的电话,他立即去公司计算机部借了一台笔记本电脑,然后就飞车赶往家中。女儿在母亲的腹中躁动, ...
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The PSB, SOCOM.com & Killzone.com Weekly Recap Posted: 23 Aug 2008 01:57 PM CDT
Courtesy of David “Point Man” Brothers
Courtesy of Victor Zuylen – Editor, Killzone Community
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 01:01 PM CDT Beej网络socket编程指南 -------------------------------------------------------------------------------- 介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等等… 好在我已经将这些事完成了,我将和所有人共享我的知识了。如果你了解 C 语言并想穿过网络编程的沼泽,那么你来对地方了。 -------------------------------------------------------------------------------- 读者对象 这个文档是一个指南,而不是参考书。如果你刚开始 socket 编程并想找一本入门书,那么你是我的读者。但这不是一本完全的 socket 编程书。 -------------------------------------------------------------------------------- 平台和编译器 这篇文档中的大多数代码都在 Linux 平台PC 上用 GNU 的 gcc 成功编译过。而且它们在 HPUX平台 上用 gcc 也成功编译过。但是注意,并不是每个代码片段都独立测试过。 -------------------------------------------------------------------------------- 目录: 1) 什么是套接字? 2) Internet 套接字的两种类型 3) 网络理论 4) 结构体 5) 本机转换 6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 9) connect()函数 10) listen()函数 11) accept()函数 12) send()和recv()函数 13) sendto()和recvfrom()函数 14) close()和shutdown()函数 15) getpeername()函数 16) gethostname()函数 17) 域名服务(DNS) 18) 客户-服务器背景知识 19) 简单的服务器 20) 简单的客户端 21) 数据报套接字Socket 22) 阻塞 23) select()--多路同步I/O 24) 参考资料 -------------------------------------------------------------------------------- 什么是 socket? 你经常听到人们谈论着 “socket”,或许你还不知道它的确切含义。现在让我告诉你:它是使用 标准Unix 文件描述符 (file descriptor) 和其它程序通讯的方式。什么?你也许听到一些Unix高手(hacker)这样说过:“呀,Unix中的一切就是文件!”那个家伙也许正在说到一个事实:Unix 程序在执行任何形式的 I/O 的时候,程序是在读或者写一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数。但是(注意后面的话),这个文件可能是一个网络连接,FIFO,管道,终端,磁盘上的文件或者什么其它的东西。Unix 中所有的东西就是文件!所以,你想和Internet上别的程序通讯的时候,你将要使用到文件描述符。你必须理解刚才的话。现在你脑海中或许冒出这样的念头:“那么我从哪里得到网络通讯的文件描述符呢?”,这个问题无论如何我都要回答:你利用系统调用 socket(),它返回套接字描述符 (socket descriptor),然后你再通过它来进行send() 和 recv()调用。“但是...”,你可能有很大的疑惑,“如果它是个文件描述符,那么为什 么不用一般调用read()和write()来进行套接字通讯?”简单的答案是:“你可以使用!”。详细的答案是:“你可以,但是使用send()和recv()让你更好的控制数据传输。”存在这样一个情况:在我们的世界上,有很多种套接字。有DARPA Internet 地址 (Internet 套接字),本地节点的路径名 (Unix套接字),CCITT X.25地址 (你可以将X.25 套接字完全忽略)。也许在你的Unix 机器上还有其它的。我们在这里只讲第一种:Internet 套接字。 -------------------------------------------------------------------------------- Internet 套接字的两种类型 什么意思?有两种类型的Internet 套接字?是的。不,我在撒谎。其实还有很多,但是我可不想吓着你。我们这里只讲两种。除了这些, 我打算另外介绍的 "Raw Sockets" 也是非常强大的,很值得查阅。 那么这两种类型是什么呢?一种是"Stream Sockets"(流格式),另外一种是"Datagram Sockets"(数据包格式)。我们以后谈到它们的时候也会用到 "SOCK_STREAM" 和 "SOCK_DGRAM"。数据报套接字有时也叫“无连接套接字”(如果你确实要连接的时候可以用connect()。) 流式套接字是可靠的双向通讯的数据流。如果你向套接字按顺序输出“1,2”,那么它们将按顺序“1,2”到达另一边。它们是无错误的传递的,有自己的错误控制,在此不讨论。 有什么在使用流式套接字?你可能听说过 telnet,不是吗?它就使用流式套接字。你需要你所输入的字符按顺序到达,不是吗?同样,WWW浏览器使用的 HTTP 协议也使用它们来下载页面。实际上,当你通过端口80 telnet 到一个 WWW 站点,然后输入 “GET pagename” 的时候,你也可以得到 HTML 的内容。为什么流式套接字可以达到高质量的数据传输?这是因为它使用了“传输控制协议 (The Transmission Control Protocol)”,也叫 “TCP” (请参考 RFC-793 获得详细资料。)TCP 控制你的数据按顺序到达并且没有错 误。你也许听到 “TCP” 是因为听到过 “TCP/IP”。这里的 IP 是指“Internet 协议”(请参考 RFC-791。) IP 只是处理 Internet 路由而已。 那么数据报套接字呢?为什么它叫无连接呢?为什么它是不可靠的呢?有这样的一些事实:如果你发送一个数据报,它可能会到达,它可能次序颠倒了。如果它到达,那么在这个包的内部是无错误的。数据报也使用 IP 作路由,但是它不使用 TCP。它使用“用户数据报协议 (User Datagram Protocol)”,也叫 “UDP” (请参考 RFC-768。) 为什么它们是无连接的呢?主要是因为它并不象流式套接字那样维持一个连接。你只要建立一个包,构造一个有目标信息的IP 头,然后发出去。无需连接。它们通常使用于传输包-包信息。简单的应用程序有:tftp, bootp等等。 你也许会想:“假如数据丢失了这些程序如何正常工作?”我的朋友,每个程序在 UDP 上有自己的协议。例如,tftp 协议每发出的一个被接受到包,收到者必须发回一个包来说“我收到了!” (一个“命令正确应答”也叫“ACK” 包)。如果在一定时间内(例如5秒),发送方没有收到应答,它将重新发送,直到得到 ACK。这一ACK过程在实现 SOCK_DGRAM 应用程序的时候非常重要。 -------------------------------------------------------------------------------- 网络理论 既然我刚才提到了协议层,那么现在是讨论网络究竟如何工作和一些 关于 SOCK_DGRAM 包是如何建立的例子。当然,你也可以跳过这一段, 如果你认为已经熟悉的话。 现在是学习数据封装 (Data Encapsulation) 的时候了!它非常非常重 要。它重要性重要到你在网络课程学(图1:数据封装)习中无论如何也得也得掌握它。主要 的内容是:一个包,先是被第一个协议(在这里是TFTP )在它的报头(也许 是报尾)包装(“封装”),然后,整个数据(包括 TFTP 头)被另外一个协议 (在这里是 UDP )封装,然后下一个( IP ),一直重复下去,直到硬件(物理) 层( 这里是以太网 )。 当另外一台机器接收到包,硬件先剥去以太网头,内核剥去IP和UDP 头,TFTP程序再剥去TFTP头,最后得到数据。现在我们终于讲到声名狼藉的网络分层模型 (Layered Network Model)。这种网络模型在描述网络系统上相对其它模型有很多优点。例如, 你可以写一个套接字程序而不用关心数据的物理传输(串行口,以太网,连 接单元接口 (AUI) 还是其它介质),因为底层的程序会为你处理它们。实际 的网络硬件和拓扑对于程序员来说是透明的。 不说其它废话了,我现在列出整个层次模型。如果你要参加网络考试, 可一定要记住: 应用层 (Application) 表示层 (Presentation) 会话层 (Session) 传输层(Transport) 网络层(Network) 数据链路层(Data Link) 物理层(Physical) 物理层是硬件(串口,以太网等等)。应用层是和硬件层相隔最远的--它 是用户和网络交互的地方。 这个模型如此通用,如果你想,你可以把它作为修车指南。把它对应 到 Unix,结果是: 应用层(Application Layer) (telnet, ftp,等等) 传输层(Host-to-Host Transport Layer) (TCP, UDP) Internet层(Internet Layer) (IP和路由) 网络访问层 (Network Access Layer) (网络层,数据链路层和物理层) 现在,你可能看到这些层次如何协调来封装原始的数据了。 看看建立一个简单的数据包有多少工作?哎呀,你将不得不使用 "cat" 来建立数据包头!这仅仅是个玩笑。对于流式套接字你要作的是 send() 发 送数据。对于数据报式套接字,你按照你选择的方式封装数据然后使用 sendto()。内核将为你建立传输层和 Internet 层,硬件完成网络访问层。 这就是现代科技。 现在结束我们的网络理论速成班。哦,忘记告诉你关于路由的事情了。 但是我不准备谈它,如果你真的关心,那么参考 IP RFC。 -------------------------------------------------------------------------------- 结构体 终于谈到编程了。在这章,我将谈到被套接字用到的各种数据类型。 因为它们中的一些内容很重要了。 首先是简单的一个:socket描述符。它是下面的类型: int 仅仅是一个常见的 int。 从现在起,事情变得不可思议了,而你所需做的就是继续看下去。注 意这样的事实:有两种字节排列顺序:重要的字节 (有时叫 "octet",即八 位位组) 在前面,或者不重要的字节在前面。前一种叫“网络字节顺序 (Network Byte Order)”。有些机器在内部是按照这个顺序储存数据,而另外 一些则不然。当我说某数据必须按照 NBO 顺序,那么你要调用函数(例如 htons() )来将它从本机字节顺序 (Host Byte Order) 转换过来。如果我没有 提到 NBO, 那么就让它保持本机字节顺序。 我的第一个结构(在这个技术手册TM中)--struct sockaddr.。这个结构 为许多类型的套接字储存套接字地址信息: struct sockaddr { unsigned short sa_family; /* 地址家族, AF_xxx */ char sa_data[14]; /*14字节协议地址*/ }; sa_family 能够是各种各样的类型,但是在这篇文章中都是 "AF_INET"。 sa_data包含套接字中的目标地址和端口信息。这好像有点 不明智。 为了处理struct sockaddr,程序员创造了一个并列的结构: struct sockaddr_in ("in" 代表 "Internet"。) struct sockaddr_in { short int sin_family; /* 通信类型 */ unsigned short int sin_port; /* 端口 */ struct in_addr sin_addr; /* Internet 地址 */ unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/ }; 用这个数据结构可以轻松处理套接字地址的基本元素。注意 sin_zero (它被加入到这个结构,并且长度和 struct sockaddr 一样) 应该使用函数 bzero() 或 memset() 来全部置零。 同时,这一重要的字节,一个指向 sockaddr_in结构体的指针也可以被指向结构体sockaddr并且代替它。这 样的话即使 socket() 想要的是 struct sockaddr *,你仍然可以使用 struct sockaddr_in,并且在最后转换。同时,注意 sin_family 和 struct sockaddr 中的 sa_family 一致并能够设置为 "AF_INET"。最后,sin_port和 sin_addr 必须是网络字节顺序 (Network Byte Order)! 你也许会反对道:"但是,怎么让整个数据结构 struct in_addr sin_addr 按照网络字节顺序呢?" 要知道这个问题的答案,我们就要仔细的看一看这 个数据结构: struct in_addr, 有这样一个联合 (unions): /* Internet 地址 (一个与历史有关的结构) */ struct in_addr { unsigned long s_addr; }; 它曾经是个最坏的联合,但是现在那些日子过去了。如果你声明 "ina" 是数据结构 struct sockaddr_in 的实例,那么 "ina.sin_addr.s_addr" 就储 存4字节的 IP 地址(使用网络字节顺序)。如果你不幸的系统使用的还是恐 怖的联合 struct in_addr ,你还是可以放心4字节的 IP 地址并且和上面 我说的一样(这是因为使用了“#define”。) -------------------------------------------------------------------------------- 本机转换 我们现在到了新的章节。我们曾经讲了很多网络到本机字节顺序的转 换,现在可以实践了! 你能够转换两种类型: short (两个字节)和 long (四个字节)。这个函 数对于变量类型 unsigned 也适用。假设你想将 short 从本机字节顺序转 换为网络字节顺序。用 "h" 表示 "本机 (host)",接着是 "to",然后用 "n" 表 示 "网络 (network)",最后用 "s" 表示 "short": h-to-n-s, 或者 htons() ("Host to Network Short")。 太简单了... 如果不是太傻的话,你一定想到了由"n","h","s",和 "l"形成的正确 组合,例如这里肯定没有stolh() ("Short to Long Host") 函数,不仅在这里 没有,所有场合都没有。但是这里有: htons()--"Host to Network Short" htonl()--"Host to Network Long" ntohs()--"Network to Host Short" ntohl()--"Network to Host Long" 现在,你可能想你已经知道它们了。你也可能想:“如果我想改变 char 的顺序要怎么办呢?” 但是你也许马上就想到,“用不着考虑的”。你也许 会想到:我的 68000 机器已经使用了网络字节顺序,我没有必要去调用 htonl() 转换 IP 地址。你可能是对的,但是当你移植你的程序到别的机器 上的时候,你的程序将失败。可移植性!这里是 Unix 世界!记住:在你 将数据放到网络上的时候,确信它们是网络字节顺序的。 最后一点:为什么在数据结构 struct sockaddr_in 中, sin_addr 和 sin_port 需要转换为网络字节顺序,而sin_family 需不需要呢? 答案是: sin_addr 和 sin_port 分别封装在包的 IP 和 UDP 层。因此,它们必须要 是网络字节顺序。但是 sin_family 域只是被内核 (kernel) 使用来决定在数 据结构中包含什么类型的地址,所以它必须是本机字节顺序。同时, sin_family 没有发送到网络上,它们可以是本机字节顺序。 -------------------------------------------------------------------------------- IP 地址和如何处理它们 现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有 必要用手工计算它们,也没有必要用"<<"操作来储存成长整字型。 首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地 址"132.241.5.10"要储存在其中,你就要用到函数inet_addr(),将IP地址从 点数格式转换成无符号长整型。使用方法如下: ina.sin_addr.s_addr = inet_addr("132.241.5.10"); 注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用 函数htonl()。 我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。 显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符 号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特 错!记住要先进行错误检查。 好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢? 它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数 inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样: printf("%s",inet_ntoa(ina.sin_addr)); 它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一 个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的 指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用 inet_ntoa(),它就将覆盖上次调用时所得的IP地址。例如: char *a1, *a2; . . a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */ a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */ printf("address 1: %s\n",a1); printf("address 2: %s\n",a2); 输出如下: address 1: 132.241.5.10 address 2: 132.241.5.10 假如你需要保存这个IP地址,使用strcopy()函数来指向你自己的字符 指针。 上面就是关于这个主题的介绍。稍后,你将学习将一个类 似"wintehouse.gov"的字符串转换成它所对应的IP地址(查阅域名服务,稍 后)。 -------------------------------------------------------------------------------- socket()函数 我想我不能再不提这个了-下面我将讨论一下socket()系统调用。 下面是详细介绍: #include <sys/types.h>; #include <sys/socket.h>; int socket(int domain, int type, int protocol); 但是它们的参数是什么? 首先,domain 应该设置成 "AF_INET",就 象上面的数据结构struct sockaddr_in 中一样。然后,参数 type 告诉内核 是 SOCK_STREAM 类型还是 SOCK_DGRAM 类型。最后,把 protocol 设置为 "0"。(注意:有很多种 domain、type,我不可能一一列出了,请看 socket() 的 man帮助。当然,还有一个"更好"的方式去得到 protocol。同 时请查阅 getprotobyname() 的 man 帮助。) socket() 只是返回你以后在系统调用种可能用到的 socket 描述符,或 者在错误的时候返回-1。全局变量 errno 中将储存返回的错误值。(请参考 perror() 的 man 帮助。) -------------------------------------------------------------------------------- bind()函数 一旦你有一个套接字,你可能要将套接字和机器上的一定的端口关联 起来。(如果你想用listen()来侦听一定端口的数据,这是必要一步--MUD 告 诉你说用命令 "telnet x.y.z 6969"。)如果你只想用 connect(),那么这个步 骤没有必要。但是无论如何,请继续读下去。 这里是系统调用 bind() 的大概: #include <sys/types.h>; #include <sys/socket.h>; int bind(int sockfd, struct sockaddr *my_addr, int addrlen); sockfd 是调用 socket 返回的文件描述符。my_addr 是指向数据结构 struct sockaddr 的指针,它保存你的地址(即端口和 IP 地址) 信息。 addrlen 设置为 sizeof(struct sockaddr)。 简单得很不是吗? 再看看例子: #include <string.h>; #include <sys/types.h>; #include <sys/socket.h>; #define MYPORT 3490 main() { int sockfd; struct sockaddr_in my_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); /*需要错误检查 */ my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = inet_addr("132.241.5.10"); bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */ /* don't forget your error checking for bind(): */ bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); . . . 这里也有要注意的几件事情。my_addr.sin_port 是网络字节顺序, my_addr.sin_addr.s_addr 也是的。另外要注意到的事情是因系统的不同, 包含的头文件也不尽相同,请查阅本地的 man 帮助文件。 在 bind() 主题中最后要说的话是,在处理自己的 IP 地址和/或端口的 时候,有些工作是可以自动处理的。 my_addr.sin_port = 0; /* 随机选择一个没有使用的端口 */ my_addr.sin_addr.s_addr = INADDR_ANY; /* 使用自己的IP地址 */ 通过将0赋给 my_addr.sin_port,你告诉 bind() 自己选择合适的端 口。同样,将 my_addr.sin_addr.s_addr 设置为 INADDR_ANY,你告诉 它自动填上它所运行的机器的 IP 地址。 如果你一向小心谨慎,那么你可能注意到我没有将 INADDR_ANY 转 换为网络字节顺序!这是因为我知道内部的东西:INADDR_ANY 实际上就 是 0!即使你改变字节的顺序,0依然是0。但是完美主义者说应该处处一 致,INADDR_ANY或许是12呢?你的代码就不能工作了,那么就看下面 的代码: my_addr.sin_port = htons(0); /* 随机选择一个没有使用的端口 */ my_addr.sin_addr.s_addr = htonl(INADDR_ANY);/* 使用自己的IP地址 */ 你或许不相信,上面的代码将可以随便移植。我只是想指出,既然你 所遇到的程序不会都运行使用htonl的INADDR_ANY。 bind() 在错误的时候依然是返回-1,并且设置全局错误变量errno。 在你调用 bind() 的时候,你要小心的另一件事情是:不要采用小于 1024的端口号。所有小于1024的端口号都被系统保留!你可以选择从1024 到65535的端口(如果它们没有被别的程序使用的话)。 你要注意的另外一件小事是:有时候你根本不需要调用它。如果你使 用 connect() 来和远程机器进行通讯,你不需要关心你的本地端口号(就象 你在使用 telnet 的时候),你只要简单的调用 connect() 就可以了,它会检 查套接字是否绑定端口,如果没有,它会自己绑定一个没有使用的本地端口。 -------------------------------------------------------------------------------- connect()程序 现在我们假设你是个 telnet 程序。你的用户命令你得到套接字的文件 描述符。你听从命令调用了socket()。下一步,你的用户告诉你通过端口 23(标准 telnet 端口)连接到"132.241.5.10"。你该怎么做呢? 幸运的是,你正在阅读 connect()--如何连接到远程主机这一章。你可 不想让你的用户失望。 connect() 系统调用是这样的: #include <sys/types.h>; #include <sys/socket.h>; int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); sockfd 是系统调用 socket() 返回的套接字文件描述符。serv_addr 是 保存着目的地端口和 IP 地址的数据结构 struct sockaddr。addrlen 设置 为 sizeof(struct sockaddr)。 想知道得更多吗?让我们来看个例子: #include <string.h>; #include <sys/types.h>; #include <sys/socket.h>; #define DEST_IP "132.241.5.10" #define DEST_PORT 23 main() { int sockfd; struct sockaddr_in dest_addr; /* 目的地址*/ sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 错误检查 */ dest_addr.sin_family = AF_INET; /* host byte order */ dest_addr.sin_port = htons(DEST_PORT); /* short, network byte order */ dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); bzero(&(dest_addr.sin_zero),; /* zero the rest of the struct */ /* don't forget to error check the connect()! */ connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)); . . . 再一次,你应该检查 connect() 的返回值--它在错误的时候返回-1,并 设置全局错误变量 errno。 同时,你可能看到,我没有调用 bind()。因为我不在乎本地的端口号。 我只关心我要去那。内核将为我选择一个合适的端口号,而我们所连接的 地方也自动地获得这些信息。一切都不用担心。 -------------------------------------------------------------------------------- listen()函数 是换换内容得时候了。假如你不希望与远程的一个地址相连,或者说, 仅仅是将它踢开,那你就需要等待接入请求并且用各种方法处理它们。处 理过程分两步:首先,你听--listen(),然后,你接受--accept() (请看下面的 内容)。 除了要一点解释外,系统调用 listen 也相当简单。 int listen(int sockfd, int backlog); sockfd 是调用 socket() 返回的套接字文件描述符。backlog 是在进入 队列中允许的连接数目。什么意思呢? 进入的连接是在队列中一直等待直 到你接受 (accept() 请看下面的文章)连接。它们的数目限制于队列的允许。 大多数系统的允许数目是20,你也可以设置为5到10。 和别的函数一样,在发生错误的时候返回-1,并设置全局错误变量 errno。 你可能想象到了,在你调用 listen() 前你或者要调用 bind() 或者让内 核随便选择一个端口。如果你想侦听进入的连接,那么系统调用的顺序可 能是这样的: socket(); bind(); listen(); /* accept() 应该在这 */ 因为它相当的明了,我将在这里不给出例子了。(在 accept() 那一章的 代码将更加完全。)真正麻烦的部分在 accept()。 -------------------------------------------------------------------------------- accept()函数 准备好了,系统调用 accept() 会有点古怪的地方的!你可以想象发生 这样的事情:有人从很远的地方通过一个你在侦听 (listen()) 的端口连接 (connect()) 到你的机器。它的连接将加入到等待接受 (accept()) 的队列 中。你调用 accept() 告诉它你有空闲的连接。它将返回一个新的套接字文 件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口, 新的在准备发送 (send()) 和接收 ( recv()) 数据。这就是这个过程! 函数是这样定义的: #include <sys/socket.h>; int accept(int sockfd, void *addr, int *addrlen); sockfd 相当简单,是和 listen() 中一样的套接字描述符。addr 是个指 向局部的数据结构 sockaddr_in 的指针。这是要求接入的信息所要去的地 方(你可以测定那个地址在那个端口呼叫你)。在它的地址传递给 accept 之 前,addrlen 是个局部的整形变量,设置为 sizeof(struct sockaddr_in)。 accept 将不会将多余的字节给 addr。如果你放入的少些,那么它会通过改 变 addrlen 的值反映出来。 同样,在错误时返回-1,并设置全局错误变量 errno。 现在是你应该熟悉的代码片段。 #include <string.h>; #include <sys/socket.h>; #include <sys/types.h>; #define MYPORT 3490 /*用户接入端口*/ #define BACKLOG 10 /* 多少等待连接控制*/ main() { int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ struct sockaddr_in my_addr; /* 地址信息 */ struct sockaddr_in their_addr; /* connector's address information */ int sin_size; sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 错误检查*/ my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */ /* don't forget your error checking for these calls: */ bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); listen(sockfd, BACKLOG); sin_size = sizeof(struct sockaddr_in); new_fd = accept(sockfd, &their_addr, &sin_size); . . . 注意,在系统调用 send() 和 recv() 中你应该使用新的套接字描述符 new_fd。如果你只想让一个连接进来,那么你可以使用 close() 去关闭原 来的文件描述符 sockfd 来避免同一个端口更多的连接。 -------------------------------------------------------------------------------- send() and recv()函数 这两个函数用于流式套接字或者数据报套接字的通讯。如果你喜欢使 用无连接的数据报套接字,你应该看一看下面关于sendto() 和 recvfrom() 的章节。 send() 是这样的: int send(int sockfd, const void *msg, int len, int flags); sockfd 是你想发送数据的套接字描述符(或者是调用 socket() 或者是 accept() 返回的。)msg 是指向你想发送的数据的指针。len 是数据的长度。 把 flags 设置为 0 就可以了。(详细的资料请看 send() 的 man page)。 这里是一些可能的例子: char *msg = "Beej was here!"; int len, bytes_sent; . . len = strlen(msg); bytes_sent = send(sockfd, msg, len, 0); . . . send() 返回实际发送的数据的字节数--它可能小于你要求发送的数 目! 注意,有时候你告诉它要发送一堆数据可是它不能处理成功。它只是 发送它可能发送的数据,然后希望你能够发送其它的数据。记住,如果 send() 返回的数据和 len 不匹配,你就应该发送其它的数据。但是这里也 有个好消息:如果你要发送的包很小(小于大约 1K),它可能处理让数据一 次发送完。最后要说得就是,它在错误的时候返回-1,并设置 errno。 recv() 函数很相似: int recv(int sockfd, void *buf, int len, unsigned int flags); sockfd 是要读的套接字描述符。buf 是要读的信息的缓冲。len 是缓 冲的最大长度。flags 可以设置为0。(请参考recv() 的 man page。) recv() 返回实际读入缓冲的数据的字节数。或者在错误的时候返回-1, 同时设置 errno。 很简单,不是吗? 你现在可以在流式套接字上发送数据和接收数据了。 你现在是 Unix 网络程序员了! -------------------------------------------------------------------------------- sendto() 和 recvfrom()函数 “这很不错啊”,你说,“但是你还没有讲无连接数据报套接字呢?” 没问题,现在我们开始这个内容。 既然数据报套接字不是连接到远程主机的,那么在我们发送一个包之 前需要什么信息呢? 不错,是目标地址!看看下面的: int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen); 你已经看到了,除了另外的两个信息外,其余的和函数 send() 是一样 的。 to 是个指向数据结构 struct sockaddr 的指针,它包含了目的地的 IP 地址和端口信息。tolen 可以简单地设置为 sizeof(struct sockaddr)。 和函数 send() 类似,sendto() 返回实际发送的字节数(它也可能小于 你想要发送的字节数!),或者在错误的时候返回 -1。 相似的还有函数 recv() 和 recvfrom()。recvfrom() 的定义是这样的: int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); 又一次,除了两个增加的参数外,这个函数和 recv() 也是一样的。from 是一个指向局部数据结构 struct sockaddr 的指针,它的内容是源机器的 IP 地址和端口信息。fromlen 是个 int 型的局部指针,它的初始值为 sizeof(struct sockaddr)。函数调用返回后,fromlen 保存着实际储存在 from 中的地址的长度。 recvfrom() 返回收到的字节长度,或者在发生错误后返回 -1。 记住,如果你用 connect() 连接一个数据报套接字,你可以简单的调 用 send() 和 recv() 来满足你的要求。这个时候依然是数据报套接字,依 然使用 UDP,系统套接字接口会为你自动加上了目标和源的信息。 -------------------------------------------------------------------------------- close()和shutdown()函数 你已经整天都在发送 (send()) 和接收 (recv()) 数据了,现在你准备关 闭你的套接字描述符了。这很简单,你可以使用一般的 Unix 文件描述符 的 close() 函数: close(sockfd); 它将防止套接字上更多的数据的读写。任何在另一端读写套接字的企 图都将返回错误信息。 如果你想在如何关闭套接字上有多一点的控制,你可以使用函数 shutdown()。它允许你将一定方向上的通讯或者双向的通讯(就象close()一 样)关闭,你可以使用: int shutdown(int sockfd, int how); sockfd 是你想要关闭的套接字文件描述复。how 的值是下面的其中之 一: 0 – 不允许接受 1 – 不允许发送 2 – 不允许发送和接受(和 close() 一样) shutdown() 成功时返回 0,失败时返回 -1(同时设置 errno。) 如果在无连接的数据报套接字中使用shutdown(),那么只不过是让 send() 和 recv() 不能使用(记住你在数据报套接字中使用了 connect 后 是可以使用它们的)。 getpeername()函数 这个函数太简单了。 它太简单了,以至我都不想单列一章。但是我还是这样做了。 函数 getpeername() 告诉你在连接的流式套接字上谁在另外一边。函 数是这样的: #include <sys/socket.h>; int getpeername(int sockfd, struct sockaddr *addr, int *addrlen); sockfd 是连接的流式套接字的描述符。addr 是一个指向结构 struct sockaddr (或者是 struct sockaddr_in) 的指针,它保存着连接的另一边的 信息。addrlen 是一个 int 型的指针,它初始化为 sizeof(struct sockaddr)。 函数在错误的时候返回 -1,设置相应的 errno。 一旦你获得它们的地址,你可以使用 inet_ntoa() 或者 gethostbyaddr() 来打印或者获得更多的信息。但是你不能得到它的帐号。(如果它运行着愚 蠢的守护进程,这是可能的,但是它的讨论已经超出了本文的范围,请参 考 RFC-1413 以获得更多的信息。) -------------------------------------------------------------------------------- gethostname()函数 甚至比 getpeername() 还简单的函数是 gethostname()。它返回你程 序所运行的机器的主机名字。然后你可以使用 gethostbyname() 以获得你 的机器的 IP 地址。 下面是定义: #include <unistd.h>; int gethostname(char *hostname, size_t size); 参数很简单:hostname 是一个字符数组指针,它将在函数返回时保存 主机名。size是hostname 数组的字节长度。 函数调用成功时返回 0,失败时返回 -1,并设置 errno。 -------------------------------------------------------------------------------- 域名服务(DNS) 如果你不知道 DNS 的意思,那么我告诉你,它代表域名服务(Domain Name Service)。它主要的功能是:你给它一个容易记忆的某站点的地址, 它给你 IP 地址(然后你就可以使用 bind(), connect(), sendto() 或者其它 函数) 。当一个人输入: $ telnet whitehouse.gov telnet 能知道它将连接 (connect()) 到 "198.137.240.100"。 但是这是如何工作的呢? 你可以调用函数 gethostbyname(): #include <netdb.h>; struct hostent *gethostbyname(const char *name); 很明白的是,它返回一个指向 struct hostent 的指针。这个数据结构 是这样的: struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; }; #define h_addr h_addr_list[0] 这里是这个数据结构的详细资料: struct hostent: h_name – 地址的正式名称。 h_aliases – 空字节-地址的预备名称的指针。 h_addrtype –地址类型; 通常是AF_INET。 h_length – 地址的比特长度。 h_addr_list – 零字节-主机网络地址指针。网络字节顺序。 h_addr - h_addr_list中的第一地址。 gethostbyname() 成功时返回一个指向结构体 hostent 的指针,或者 是个空 (NULL) 指针。(但是和以前不同,不设置errno,h_errno 设置错 误信息。请看下面的 herror()。) 但是如何使用呢? 有时候(我们可以从电脑手册中发现),向读者灌输 信息是不够的。这个函数可不象它看上去那么难用。 这里是个例子: #include <stdio.h>; #include <stdlib.h>; #include <errno.h>; #include <netdb.h>; #include <sys/types.h>; #include <netinet/in.h>; int main(int argc, char *argv[]) { struct hostent *h; if (argc != 2) { /* 检查命令行 */ fprintf(stderr,"usage: getip address\n"); exit(1); } if ((h=gethostbyname(argv[1])) == NULL) { /* 取得地址信息 */ herror("gethostbyname"); exit(1); } printf("Host name : %s\n", h->;h_name); printf("IP Address : %s\n",inet_ntoa(*((struct in_addr *)h->;h_addr))); return 0; } 在使用 gethostbyname() 的时候,你不能用 perror() 打印错误信息 (因为 errno 没有使用),你应该调用 herror()。 相当简单,你只是传递一个保存机器名的字符串(例如 "whitehouse.gov") 给 gethostbyname(),然后从返回的数据结构 struct hostent 中获取信息。 唯一也许让人不解的是输出 IP 地址信息。h->;h_addr 是一个 char *, 但是 inet_ntoa() 需要的是 struct in_addr。因此,我转换 h->;h_addr 成 struct in_addr *,然后得到数据。 -------------------------------------------------------------------------------- 客户-服务器背景知识 这里是个客户--服务器的世界。在网络上的所有东西都是在处理客户进 程和服务器进程的交谈。举个telnet 的例子。当你用 telnet (客户)通过23 号端口登陆到主机,主机上运行的一个程序(一般叫 telnetd,服务器)激活。 它处理这个连接,显示登陆界面,等等。 图2:客户机和服务器的关系 图 2 说明了客户和服务器之间的信息交换。 注意,客户--服务器之间可以使用SOCK_STREAM、SOCK_DGRAM 或者其它(只要它们采用相同的)。一些很好的客户--服务器的例子有 telnet/telnetd、 ftp/ftpd 和 bootp/bootpd。每次你使用 ftp 的时候,在远 端都有一个 ftpd 为你服务。 一般,在服务端只有一个服务器,它采用 fork() 来处理多个客户的连 接。基本的程序是:服务器等待一个连接,接受 (accept()) 连接,然后 fork() 一个子进程处理它。这是下一章我们的例子中会讲到的。 -------------------------------------------------------------------------------- 简单的服务器 这个服务器所做的全部工作是在流式连接上发送字符串 "Hello, World!\n"。你要测试这个程序的话,可以在一台机器上运行该程序,然后 在另外一机器上登陆: $ telnet remotehostname 3490 remotehostname 是该程序运行的机器的名字。 服务器代码: #include <stdio.h>; #include <stdlib.h>; #include <errno.h>; #include <string.h>; #include <sys/types.h>; #include <netinet/in.h>; #include <sys/socket.h>; #include <sys/wait.h>; #define MYPORT 3490 /*定义用户连接端口*/ #define BACKLOG 10 /*多少等待连接控制*/ main() { int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ struct sockaddr_in my_addr; /* my address information */ struct sockaddr_in their_addr; /* connector's address information */ int sin_size; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1) { perror("bind"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } while(1) { /* main accept() loop */ sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \ &sin_size)) == -1) { perror("accept"); continue; } printf("server: got connection from %s\n", \ inet_ntoa(their_addr.sin_addr)); if (!fork()) { /* this is the child process */ if (send(new_fd, "Hello, world!\n", 14, 0) == -1) perror("send"); close(new_fd); exit(0); } close(new_fd); /* parent doesn't need this */ while(waitpid(-1,NULL,WNOHANG) >; 0); /* clean up child processes */ } } 如果你很挑剔的话,一定不满意我所有的代码都在一个很大的main() 函数中。如果你不喜欢,可以划分得更细点。 你也可以用我们下一章中的程序得到服务器端发送的字符串。 -------------------------------------------------------------------------------- 简单的客户程序 这个程序比服务器还简单。这个程序的所有工作是通过 3490 端口连接到命令行中指定的主机,然后得到服务器发送的字符串。 客户代码: #include <stdio.h>; #include <stdlib.h>; #include <errno.h>; #include <string.h>; #include <sys/types.h>; #include <netinet/in.h>; #include <sys/socket.h>; #include <sys/wait.h>; #define PORT 3490 /* 客户机连接远程主机的端口 */ #define MAXDATASIZE 100 /* 每次可以接收的最大字节 */ int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in their_addr; /* connector's address information */ if (argc != 2) { fprintf(stderr,"usage: client hostname\n"); exit(1); } if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */ herror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } their_addr.sin_family = AF_INET; /* host byte order */ their_addr.sin_port = htons(PORT); /* short, network byte order */ their_addr.sin_addr = *((struct in_addr *)he->;h_addr); bzero(&(their_addr.sin_zero),; /* zero the rest of the struct */ if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1) { perror("connect"); exit(1); } if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { perror("recv"); exit(1); } buf[numbytes] = '\0'; printf("Received: %s",buf); close(sockfd); return 0; } 注意,如果你在运行服务器之前运行客户程序,connect() 将返回 "Connection refused" 信息,这非常有用。 -------------------------------------------------------------------------------- 数据包 Sockets 我不想讲更多了,所以我给出代码 talker.c 和 listener.c。 listener 在机器上等待在端口 4590 来的数据包。talker 发送数据包到 一定的机器,它包含用户在命令行输入的内容。 这里就是 listener.c: #include <stdio.h>; #include <stdlib.h>; #include <errno.h>; #include <string.h>; #include <sys/types.h>; #include <netinet/in.h>; #include <sys/socket.h>; #include <sys/wait.h>; #define MYPORT 4950 /* the port users will be sending to */ #define MAXBUFLEN 100 main() { int sockfd; struct sockaddr_in my_addr; /* my address information */ struct sockaddr_in their_addr; /* connector's address information */ int addr_len, numbytes; char buf[MAXBUFLEN]; if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \ == -1) { perror("bind"); exit(1); } addr_len = sizeof(struct sockaddr); if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, \ (struct sockaddr *)&their_addr, &addr_len)) == -1) { perror("recvfrom"); exit(1); } printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr)); printf("packet is %d bytes long\n",numbytes); buf[numbytes] = '\0'; printf("packet contains \"%s\"\n",buf); close(sockfd); } 注意在我们的调用 socket(),我们最后使用了 SOCK_DGRAM。同时, 没有必要去使用 listen() 或者 accept()。我们在使用无连接的数据报套接 字! 下面是 talker.c: #include <stdio.h>; #include <stdlib.h>; #include <errno.h>; #include <string.h>; #include <sys/types.h>; #include <netinet/in.h>; #include <sys/socket.h>; #include <sys/wait.h>; #define MYPORT 4950 /* the port users will be sending to */ int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in their_addr; /* connector's address information */ struct hostent *he; int numbytes; if (argc != 3) { fprintf(stderr,"usage: talker hostname message\n"); exit(1); } if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */ herror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } their_addr.sin_family = AF_INET; /* host byte order */ their_addr.sin_port = htons(MYPORT); /* short, network byte order */ their_addr.sin_addr = *((struct in_addr *)he->;h_addr); bzero(&(their_addr.sin_zero),; /* zero the rest of the struct */ if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0, \ (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) { perror("sendto"); exit(1); } printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr)); close(sockfd); return 0; } 这就是所有的了。在一台机器上运行 listener,然后在另外一台机器上 运行 talker。观察它们的通讯! 除了一些我在上面提到的数据套接字连接的小细节外,对于数据套接 字,我还得说一些,当一个讲话者呼叫connect()函数时并指定接受者的地 址时,从这点可以看出,讲话者只能向connect()函数指定的地址发送和接 受信息。因此,你不需要使用sendto()和recvfrom(),你完全可以用send() 和recv()代替。 -------------------------------------------------------------------------------- 阻塞 阻塞,你也许早就听说了。"阻塞"是 "sleep" 的科技行话。你可能注意 到前面运行的 listener 程序,它在那里不停地运行,等待数据包的到来。 实际在运行的是它调用 recvfrom(),然后没有数据,因此 recvfrom() 说" 阻塞 (block)",直到数据的到来。 很多函数都利用阻塞。accept() 阻塞,所有的 recv*() 函数阻塞。它 们之所以能这样做是因为它们被允许这样做。当你第一次调用 socket() 建 立套接字描述符的时候,内核就将它设置为阻塞。如果你不想套接字阻塞, 你就要调用函数 fcntl(): #include <unistd.h>; #include <fontl.h>; . . sockfd = socket(AF_INET, SOCK_STREAM, 0); fcntl(sockfd, F_SETFL, O_NONBLOCK); . . 通过设置套接字为非阻塞,你能够有效地"询问"套接字以获得信息。如 果你尝试着从一个非阻塞的套接字读信息并且没有任何数据,它不允许阻 塞--它将返回 -1 并将 errno 设置为 EWOULDBLOCK。 但是一般说来,这种询问不是个好主意。如果你让你的程序在忙等状 态查询套接字的数据,你将浪费大量的 CPU 时间。更好的解决之道是用 下一章讲的 select() 去查询是否有数据要读进来。 -------------------------------------------------------------------------------- select()--多路同步 I/O 虽然这个函数有点奇怪,但是它很有用。假设这样的情况:你是个服 务器,你一边在不停地从连接上读数据,一边在侦听连接上的信息。 没问题,你可能会说,不就是一个 accept() 和两个 recv() 吗? 这么 容易吗,朋友? 如果你在调用 accept() 的时候阻塞呢? 你怎么能够同时接 受 recv() 数据? “用非阻塞的套接字啊!” 不行!你不想耗尽所有的 CPU 吧? 那么,该如何是好? select() 让你可以同时监视多个套接字。如果你想知道的话,那么它就 会告诉你哪个套接字准备读,哪个又准备写,哪个套接字又发生了例外 (exception)。 闲话少说,下面是 select(): #include <sys/time.h>; #include <sys/types.h>; #include <unistd.h>; int select(int numfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); 这个函数监视一系列文件描述符,特别是 readfds、writefds 和 exceptfds。如果你想知道你是否能够从标准输入和套接字描述符 sockfd 读入数据,你只要将文件描述符 0 和 sockfd 加入到集合 readfds 中。参 数 numfds 应该等于最高的文件描述符的值加1。在这个例子中,你应该 设置该值为 sockfd+1。因为它一定大于标准输入的文件描述符 (0)。 当函数 select() 返回的时候,readfds 的值修改为反映你选择的哪个 文件描述符可以读。你可以用下面讲到的宏 FD_ISSET() 来测试。 在我们继续下去之前,让我来讲讲如何对这些集合进行操作。每个集 合类型都是 fd_set。下面有一些宏来对这个类型进行操作: FD_ZERO(fd_set *set) – 清除一个文件描述符集合 FD_SET(int fd, fd_set *set) - 添加fd到集合 FD_CLR(int fd, fd_set *set) – 从集合中移去fd FD_ISSET(int fd, fd_set *set) – 测试fd是否在集合中 最后,是有点古怪的数据结构 struct timeval。有时你可不想永远等待 别人发送数据过来。也许什么事情都没有发生的时候你也想每隔96秒在终 端上打印字符串 "Still Going..."。这个数据结构允许你设定一个时间,如果 时间到了,而 select() 还没有找到一个准备好的文件描述符,它将返回让 你继续处理。 数据结构 struct timeval 是这样的: struct timeval { int tv_sec; /* seconds */ int tv_usec; /* microseconds */ }; 只要将 tv_sec 设置为你要等待的秒数,将 tv_usec 设置为你要等待 的微秒数就可以了。是的,是微秒而不是毫秒。1,000微秒等于1毫秒,1,000 毫秒等于1秒。也就是说,1秒等于1,000,000微秒。为什么用符号 "usec" 呢? 字母 "u" 很象希腊字母 Mu,而 Mu 表示 "微" 的意思。当然,函数 返回的时候 timeout 可能是剩余的时间,之所以是可能,是因为它依赖于 你的 Unix 操作系统。 哈!我们现在有一个微秒级的定时器!别计算了,标准的 Unix 系统 的时间片是100毫秒,所以无论你如何设置你的数据结构 struct timeval, 你都要等待那么长的时间。 还有一些有趣的事情:如果你设置数据结构 struct timeval 中的数据为 0,select() 将立即超时,这样就可以有效地轮询集合中的所有的文件描述 符。如果你将参数 timeout 赋值为 NULL,那么将永远不会发生超时,即 一直等到第一个文件描述符就绪。最后,如果你不是很关心等待多长时间, 那么就把它赋为 NULL 吧。 下面的代码演示了在标准输入上等待 2.5 秒: #include <sys/time.h>; #include <sys/types.h>; #include <unistd.h>; #define STDIN 0 /* file descriptor for standard input */ main() { struct timeval tv; fd_set readfds; tv.tv_sec = 2; tv.tv_usec = 500000; FD_ZERO(&readfds); FD_SET(STDIN, &readfds); /* don't care about writefds and exceptfds: */ select(STDIN+1, &readfds, NULL, NULL, &tv); if (FD_ISSET(STDIN, &readfds)) printf("A key was pressed!\n"); else printf("Timed out.\n"); } 如果你是在一个 line buffered 终端上,那么你敲的键应该是回车 (RETURN),否则无论如何它都会超时。 现在,你可能回认为这就是在数据报套接字上等待数据的方式--你是对 的:它可能是。有些 Unix 系统可以按这种方式,而另外一些则不能。你 在尝试以前可能要先看看本系统的 man page 了。 最后一件关于 select() 的事情:如果你有一个正在侦听 (listen()) 的套 接字,你可以通过将该套接字的文件描述符加入到 readfds 集合中来看是 否有新的连接。 这就是我关于函数select() 要讲的所有的东西。 参考书目: Internetworking with TCP/IP, volumes I-III by Douglas E. Comer and David L. Stevens. Published by Prentice Hall. Second edition ISBNs: 0-13-468505-9, 0-13-472242-6, 0-13-474222-2. There is a third edition of this set which covers IPv6 and IP over ATM. Using C on the UNIX System by David A. Curry. Published by O'Reilly & Associates, Inc. ISBN 0-937175-23-4. TCP/IP Network Administration by Craig Hunt. Published by O'Reilly & Associates, Inc. ISBN 0-937175-82-X. TCP/IP Illustrated, volumes 1-3 by W. Richard Stevens and Gary R. Wright. Published by Addison Wesley. ISBNs: 0-201-63346-9, 0-201-63354-X, 0-201-63495-3. Unix Network Programming by W. Richard Stevens. Published by Prentice Hall. ISBN 0-13-949876-1. On the web: BSD Sockets: A Quick And Dirty Primer (http://www.cs.umn.edu/~bentlema/unix/--has other great Unix system programming info, too!) Client-Server Computing (http://pandonia.canberra.edu.au/ClientServer/socket.html) Intro to TCP/IP (gopher) (gopher://gopher-chem.ucdavis.edu/11/Index/Internet_aw/Intro_the_Inter net/intro.to.ip/) Internet Protocol Frequently Asked Questions (France) (http://web.cnam.fr/Network/TCP-IP/) The Unix Socket FAQ (http://www.ibrado.com/sock-faq/) RFCs--the real dirt: RFC-768 -- The User Datagram Protocol (UDP) (ftp://nic.ddn.mil/rfc/rfc768.txt) RFC-791 -- The Internet Protocol (IP) (ftp://nic.ddn.mil/rfc/rfc791.txt) RFC-793 -- The Transmission Control Protocol (TCP) (ftp://nic.ddn.mil/rfc/rfc793.txt) RFC-854 -- The Telnet Protocol (ftp://nic.ddn.mil/rfc/rfc854.txt) RFC-951 -- The Bootstrap Protocol (BOOTP) (ftp://nic.ddn.mil/rfc/rfc951.txt) RFC-1350 -- The Trivial File Transfer Protocol (TFTP) (ftp://nic.ddn.mil/rfc/rfc1350.txt) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 11:23 AM CDT 原型:extern char *strstr(char *haystack, char *needle); 用法:#include <string.h> 功能:从字符串haystack中寻找needle第一次出现的位置(不比较结束符NULL)。 说明:返回指向第一次出现needle位置的指针,如果没找到则返回NULL。 举例: // strstr.c #include <syslib.h> #include <string.h> main() { char *s="Golden Global View"; char *l="lob"; char *p; clrscr(); p=strstr(s,l); if(p) printf("%s",p); else printf("Not Found!"); getchar(); return 0; } 语法:int strstr(str1,str2) str1: 被查找目标 string expression to search. str2:要查找对象 The string expression to find. 该函数返回str2第一次在str1中的位置,如果没有找到,返回NULL The strstr() function returns the ordinal position within str1 of the first occurrence of str2. If str2 is not found in str1, strstr() returns 0. 例子: 功能:从字串” string1 onexxx string2 oneyyy”中寻找”yyy” (假设xxx和yyy都是一个未知的字串) char *s=” string1 onexxx string2 oneyyy”; char *p; p=strstr(s,”string2”); if(!p) printf(“Not Found!”); p=strstr(p,”one”); if(!p) printf(“Not Found!”); p+=strlen(“one”) printf(“%s”,p); 说明:如果直接写语句p=strstr(p,”one”),则找到的是xxx,不符合要求 所以需采用二次查找法找到目标 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 11:06 AM CDT 写过Direct3D程序的朋友们可能还记得,在以往,大家常为如何表现更多真实的材质(如玻璃、金属等)而发愁。最新的Direct3D中,HLSL把程序员从复杂的Shader指令集中解放出来,着力于更重要的算法。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Posted: 23 Aug 2008 11:03 AM CDT 目 录
第二段ARB,用来表示是谁开发的这个扩展,常见以下几个值:
第三段multitexture就是真正的扩展名了,如multitexture就是多重纹理扩展。
Windows怎么实现OpenGL硬件加速呢?OpenGL32.dll是微软的OpenGL 1.1纯软件实现,我们的程序都要动态链接到这个dll。如果安装3D芯片厂商的驱动程序,会将一个不同名字的dll放到Windows系统目录下,比如在Windows 2000下安装nVIDIA GeForce2 MX的驱动程序,会在系统目录下放一个nvoglnt.dll(这就是nVIDIA的OpenGL驱动),并在注册表中登记nvoglnt.dll,让Windows知道硬件加速OpenGL驱动的名字,以后运行OpenGL程序,OpenGL32.dll就会把OpenGL调用直接转到nvoglnt.dll。
判断一种像素格式是否被显卡硬件所支持,可以用函数DescribePixelFormat取得该像素格式的数据,然后看结构体PIXELFORMATDESCRIPTOR中的dwFlags的值,如果:
2、显卡差异
现在可能使用的nVIDIA和ATI的显卡芯片代号和显卡型号的对应关系如下表:
·其中标注“*”的是产品系列,型号还会细分。 ·通常大家习惯用芯片代号的主版本号来统称一代芯片,例如用NV20统称NV20/NV25/NV28,用R200统称RV250/R200/RV280。 ·虽然ATI RADEON 7500的芯片型号是RV200,但实际属于R100档次的产品。 我们来看一个执行路径的例子,id Software即将推出的DOOM 3的执行路径。 DOOM 3一共有6条执行路径: 1)ARB:几乎不使用扩展,没有镜面高光效果,没有顶点编程(Vertex Program),保证程序能在低端显卡上运行。 2)NV10:支持所有功能,每帧需要渲染5个pass(five rendering passes:指一个对象多次送入渲染管道,比如第一次渲染漫射光diffuse,第二次渲染镜面高光specular……,各次渲染结果通过glBlend混合在一起形成最终效果),没有顶点编程。 3)NV20:支持所有功能,2或3个pass。 4)NV30:支持所有功能,1个pass。 5)R200:支持所有功能,大部分情况下只需1个pass。 6)ARB2:支持所有功能,浮点片断编程(fragment program),1个pass。 nVIDIA显卡可能执行ARB/NV10/NV20/NV30/ARB2五条路径,其中NV10/NV20/NV30专门针对不同档次的nVIDIA显卡开发的。 ATI显卡可能执行ARB/R200/ARB2三条路径,其中R200是专门针对ATI开发的。 而其他显卡则根据档次高低执行ARB或ARB2路径。ARB用于低端显卡,ARB2用于高端显卡。 3、顶点/片断编程 1999年底,nVIDIA推出GeForce 256,并开始使用GPU(Graphics Processing Unit)来称呼显卡芯片(也有厂商叫VPU(Visual Processing Unit),是一回事)。GeForce 256最大卖点是硬件T&L(Transform & Lighting,变换和光照),这意味着变换和光照计算可以在GPU中进行,大大减轻了CPU的压力,显卡开始成为独立于CPU的一个处理器。 硬件T&L后,GPU最激动人心的进步就是引入了可编程能力。我们知道,OpenGL和Direct3D都有固定的渲染管线,定义光源,送入顶点位置、法线、纹理坐标等,就可以给你渲染出一幅图像来,程序员对具体的渲染过程无法控制。而OpenGL扩展和DirectX 8给渲染管线引入可编程能力,图形软件开发人员可以编写运行于显卡芯片的汇编程序来控制具体的渲染过程,这给予图形软件开发更大的灵活性,并且由于硬件的支持,获得这些灵活性并不会牺牲性能。GPU的可编程能力对实时图形渲染会产生深远的影响。 OpenGL支持两种可编程模型:
目前顶点编程相关的扩展有:
实际上ATI R300级别的显卡已经在顶点编程中支持分支循环(硬件支持DirectX 9的Vertex Shader 2.0),但并没有开发扩展提供给OpenGL程序员使用,估计是在等支持分支循环的GL_ARB_vertex_program2扩展出台。
以上扩展提供的功能不是编写运行于GPU的汇编码,而是通过函数调用的方式实现,不如编写汇编码直观方便。下面几个扩展则可以通过编写汇编码来实现片断编程。
与顶点编程相比,片断编程要复杂得多:
看到这里我们不难理解为什么DOOM 3会将渲染执行路径分成ARB、NV10、NV20、NV30、R200、ARB2几条了:
附表:
ATI显卡顶点、片断编程支持情况:
4、Cg/RM/及其它 4.1 Cg(C for Graphics) 直接使用扩展编写vertex program和fragment program不太方便,要么是函数调用,要么是汇编码,相当于用x86汇编编写PC程序,而现在已经有了面向vertex program和fragment program的高级语言,称为HLSL(High Level Shading Language:高级着色语言)。 Cg是nVIDIA提出的一种高级着色语言,它的语法和C语言类似,可以大大简化vertex program和fragment program的编写。用它写的程序可以:
我们可以看到Cg只是对nVIDIA的产品支持比较好,而其他厂商的产品只有支持GL_ARB_vertex_program/GL_ARB_fragment_program时才能从Cg获得好处,不支持这两个ARB扩展的显卡则不能运行Cg编写的程序,大大降低了Cg的实用性。虽然Cg提供接口,使其他厂商可以对Cg进行扩展,以支持各个厂商自己的OpenGL扩展,不过Cg毕竟是一个企业的产品,别的厂商不会支持,所以如果要写通用的图形程序,Cg并不合适。 |
Posted: 25 Aug 2008 10:53 AM CDT http://jeffsutherland.com/scrum/2008/05/scrum-makes-you-smarter.html
"Recent research shows that people who work in command and control environments actually lose a significant number of points on their IQ. They get stupider." Would onsite coaching or classes help your team?
Visit www.ClintonKeith.com to find the services
I offer that can help your game development teams
adopt or improve how they use Scrum. |
Posted: 25 Aug 2008 10:22 AM CDT ![]() AGD is also famous for having done the remakes of King's Quest 1 and 2. According to some reports, the remake is superior to the original not only in graphics quality, but in gameplay as well. Several of the original game's rougher edges have been smoothed out, and combat is reportedly much cleaner. Note: They do have a commercial game available, as well, entitled Al Emmo and the Lost Duchman's Mine. Now, creating a full-on remake and giving it away for free is a stupidly hard way to market one's own game (as is most of game development), but it's clear the Quest for Glory remake was more of a labor of love than a marketing strategy. Anyway, the QFG2 remake clocks in at about 85 megs. For interested developers out there, the remake was created using AGS - Adventure Game Studio. It's free, for those who would like to try their hand at developing old-school point & click adventure games. |
Did you enjoy this article? Be sure and check out past articles and the comments HERE. Rampant Games: Games With Personality! Latest games at Rampant Games: Depths of Peril and Eschalon: Book 1 |
Posted: 25 Aug 2008 09:46 AM CDT 分析幼儿游戏的水平,适时地给予帮助,帮助幼儿逐步独立制定和遵守简单的规则,不断丰富游戏内容,培养幼儿独立游戏的能力。(5)鼓励幼儿在游戏中使用普通话和礼貌用语进行交往,互相谦让,轮流担任主角和其他角色,在游戏中感到快乐。 ...
|
Posted: 25 Aug 2008 09:50 AM CDT Timesoldies is a modern/oldtime shooter game. The year is 2110 and scientist have created the first prototype of a timemachine. A squad of six men have said 'yes' to be the first to try it. They are supposed to travel to the year of 2111 (just to test it), but the time travel fails and the squad ends op in an unknows time. The first they see in the time, is a castle, and they soon discover that they are in the middle age as they run into heavy resistance, from a small army that are armed with axes and swords. When you have defeated them another small army shows up. They tells you to follow them to the caslte. The squad agrees, as they have no clue where else to go. When they get to the castle, they meet the highest members in the castle. They offer them food, as an reward for defeating their enemies outside the castle. The members tells the squad that they can eaither join their army an fight against the enemy, or to leave and wander somewhere. The squad decides to join their army, and after that you will get into intense missions, where you will fight against the enemies, that gets more and more advanced weapons. In the end your army is about to get defeated and one of the members of your now 3 men squad is betraying you and your friend, and joins the other side. In the end you will have to fight the hardest battle against the enemy, and you defeat them. In the last scene you get picked up by the scientist from the future, and you go back to 2110. |
Warhawk Operation: Fallen Star Posted: 25 Aug 2008 09:00 AM CDT So I’ve been dropping hints for a few months now on the blog and finally, at Leipzig Games Conference this week, we unveiled our third expansion for the Warhawk Universe — Operation: Fallen Star. The sweet, sweet hotness that is the Icarus Mk.1 Rocket pack and once you’ve played it, you wonder how you ever played Warhawk without it!
Before I answer some of the questions that I’ve seen from the past couple of days, let me give you all a rundown of what’s included in Operation: Fallen Star. There is an entirely new level - Tau Crater! It’s a smoky, forested island that features lots of vertical elements to give players tons of cools places to use the jetpack; huge trees that you can fly up into and land on their branches, an enormous recovery crane with lots of trusses and platforms to fly around, and of course, the name sake, a truly gargantuan capital ship wreckage smashed into the ground forming, you guessed it, Tau Crater. The capital ship is fully traversable meaning you can use the jetpack or other aircraft to fly up to its various surfaces, pipes, and destroyed sections. Hop out, use them to recon the other bases, snipe, call-in a binoc strike, whatever. Around the crater are salvage platforms that have been constructed and serve as some of the bases in the Tau Crater. There’s also a huge fiery hole in the middle of the wreckage that you can climb though as a troop to quickly cross from one side of the level to the other. There are massive chunks of wreckage scattered around the level and the recovery efforts at these locations are bases as well. In total there are 10 new layouts for Tau Crater and since the jetpack is a massive, game-changing addition to Warhawk, we included a crap-ton of bonus layouts for the original game too — there are 30 bonus layouts that add jetpacks into the Warhawk’s original content. And yes, of course the jet pack can be used with both of the new free game modes that we released with the v1.4 Update. Jetpack Collector mode is awesome! Now the jetpack itself is big departure from the way we normally do vehicles and this was very, very intentional. With each of our Booster-Packs, we specifically look for mechanic changing ways to freshen-up the game — and Operation: Fallen Star is no exception. So here’s the run-down on the jetpack… First off, the jetpacks are equipment that the salvage crews are using to work on the wreckage so the style of it is very much like the equipment you might see at a construction site. This is true for the Daedalus Rapid Assembly Device (D-RAD) as well. Think of it as a vending machine for jetpacks. One of our players on the Warhawk forums asked if it was like a “hot-dog-stand”…well, yes it kinda is You run up to the Daedalus and then press SQUARE to grab a jetpack off the rack, like you would to mount a vehicle or turret. The Daedalus then begins its automated construction process and makes a new jetpack for another player to grab. This construction period helps control the balance of the game so that not every single troop always has a jet pack. Now to help protect against brutal base camping, we opted to not have the vending machine, err….the Daedalus be destructible. In some of our early play sessions, it just was too easy to ravage the other team if you could destroy the Daedalus. The Warhawk forums also wondered if a jeep could drive the vending machine around, sorry, the answer is no. We spent a lot of time tuning the placement of each of the vending machines and towing them around the level would have introduced some pretty brutal exploits. You can also mount other vehicles if you have a jetpack. So you and your team can coordinate fast strikes with the 4×4s and then all jump-jet out to make a flag run or scoop-up a team’s cores. If you have jetpack equipped, you are also allowed use it like an ejector seat and bail out of our Warhawk or Nemesis if you get into a dicey situation. Another great tactic is to use the Warhawk and run fly-by at the enemy base then have your buddy in the passenger slot bail out with the jetpack. The controls for the jetpack are really easy too and operate the same as any other vehicle in the game so it should feel really natural to start using one. R2 is the thrust button. Press it to engage the jets and your character will be carried higher and higher into the air. While you’re flying, use the analog sticks to move around. You can let off the thruster button to disengage the thrusters and your character will begin to drop towards the ground. If you are flying around and you need to focus on combat and not thrust control, all you have to do is hold L2 and the jetpack will automatically emit enough thrust to maintain your current altitude. This way you can focus on raining death from above The jetpack also has a boost-dodge feature, similar to the afterburner for the aircraft. Simply double-tap R2 to engage the boost-dodge. The direction of the boost-dodge can be performed in any direction, backwards, forwards, side to side, even straight up depending on which direction you are pressing when you dodge. Now this feature not only is a great way to get around the battlefield, but the “dodge” part of the boost-dodge is key for scrubbing missiles. There is only one missile in the game that can acquire a jetpack lock-on and that’s the troop missile launcher. So if you are up in the air and you see the missile warning pop-up on your screen, you better do a dodge, otherwise that missile is going to nail you! Now if you have a jetpack equipped but you are just running around on the ground, the missile launcher can’t get a lock on you…and this is another good way to help avoid getting hit. Another question that our players wanted to know is if you can fly with the flag using a jetpack and the answer is yes. We took a lot of time to make sure all the traversal speeds were tuned just right and CTF and Collector mode are crazy fun with the Jetpack — hell, even just straight up deathmatch is way more fun! So here are some of the details: Operation: Fallen Star is being released on August 28th worldwide and is $7.99 in the Playstation Store. We also worked with SONY to get a new bundle pack ready too. The new Booster Combo Pack includes all 3 of the expansions for only $15.99. That’s like getting all 3 Booster-Packs for the price of only 2!!! Quick — deploy the wacky waiving inflatable arm-flailing tube men!!! As a reminder, keep you eyes out for our FREE v1.5 Update that goes LIVE on August 27th! So that’s it for now — I’ll do my best today to answer comments cause I didn’t get to at all with my last post cause I was crazy busy traveling for meetings. So let ‘em rip! Oh, and one last thing, Kudos to 3 people (topodisc, mattnz, cubehouse) who were able to breakdown my crazy color-swatch-HEX-string-mythology-reference! Rock on, |
Posted: 25 Aug 2008 11:41 PM CDT |
Game Design Psychology: The Full Hirokazu Yasuhara Interview Posted: 25 Aug 2008 11:00 AM CDT
|
Posted: 25 Aug 2008 01:25 AM CDT 河南省郑州市网吧资料
|
Posted: 25 Aug 2008 05:53 AM CDT I've been pretty quiet about stuff I'm working on recently. But, it's getting to the point where we need to look some talented people to fill out the team. Read on for a bit of background information and what positions I'm looking for. Even if you're not interested, referring an interested party can give you precious good Karma with me. ;) If you read my blog regularly, you can probably figure out what the goals of the company will be. We want to build a series of smaller MMO type game that don't fit the mold. In other words, we're not going to be cloning WoW here. Our first game won't be high fantasy, even, but we may work on one in the future. The company is currently defining our goals, organizing a pitch, and looking for funding. We're working with an experienced Silicon Valley entrepreneur, so we have access to a wide range of possibilities for funding beyond selling our souls to a publisher. Note that currently the company isn't funded and therefore isn't paying salaries; coming on gives you a greater influence on the project and other "company founder" type perks. If you are only interested in a paying position, note that when you send in your information. We're going to be a small team, so the ability to work fast and well with others is needed. The company work on the project remotely, so relocation is not currently required. But, expect to do regular meetings over IM or voice chat to keep up with the rest of the team. Most of the current people have worked remotely before, so this shouldn't be an issue for most of us. But, if you're the type that can't keep yourself motivated, think carefully about this point. Note that previous MMO experience is nice, but not strictly required. If you're highly competent in your field and willing to learn new things, that's good enough. The positions we're looking for: Tech Lead - Someone to take over the technology, with a focus on server-side. Currently I have a working Stackless Python server prototype. Our focus is to re-use the core technology, so someone who shares this personal goal would be great. This will be a very hands-on position, so expect to get your hands dirty with code while keeping people on task. If you are an experienced (Stackless) Python developer, but don't think you're management material quite yet, feel free to send in your information as well. We may consider someone for this job if we can't find a qualified Lead. Sample code, particularly in Python, would be appreciated. Flash/ActionScript 3 - Someone to work on a Flash-based client. We have a working prototype version that needs a lot of work. You would be the resident expert on AS3, so someone very familiar with Flash is needed. Being able to teach others would be a large bonus. If you are an expert at another web-based client technology (Shockwave, AJAX, etc), don't hesitate to contact us as well. If you can work quickly and efficiently to produce a client for our games, we'll consider you seriously. Flash/AS3 is just something we know a bit more about than anything else at this point, but we are willing to listen to a convincing tech demonstration. Links to samples of your previous work are appreciated. Designer - Initial focus will be on writing design documentation, then transitioning into content development. Python scripting is a bonus, as would ActionScript 3 experience. Being able to write effectively is a vital skill. A sample of a document describing a game system would be appreciated. Artist - We're looking for 2D artists willing to work on contract. If you're interested, send an email and sample images from your portfolio. For any of these positions, send along your résumé and any appropriate samples mentioned above to psych...@gmail.com. Share whatever information you think would be helpful with your email. If you have questions, send them along to the same email address. |
Posted: 25 Aug 2008 04:15 AM CDT 2流装备,2流操作,进入了8强。 其原因总结如下 1.我是一个福将,接连遇到对手掉线 2.练的是偏门角色,威力一般,魔抗高,速度快。这类菜刀流打法,在日常游戏生活中比较无力,因为对方会加好BUFF,砍都砍不动,而比武大会中,我喝下移动加速药水,冲到对方面前时,对方往往第一个BUFF还没加好。一阵菜刀乱砍,对方法师全部了账。
一个人要成功,天时地利人和,缺一不可 |
Posted: 25 Aug 2008 01:37 AM CDT 早上朋友发了一个测试性格的图片,感觉还算准确。于是,我也找了一个测试性格的图片,朋友们也来试试。看看自己的性格是哪类的。
评估自己的性格,请看看以下的图片,并选出你最喜爱的一张图片。
这些图片是科学家跟心理学家一起合作的成果,这些图片代表了九种不同的性格。据称这是全球最准确的性格测试。希望你喜欢这个测验!快来看看你的性格如何吧。测试图片如下,最好在5秒钟内选出你喜欢的图片!
你喜欢自由自在,无拘无束的生活。
2. 独立,前卫,不受拘束
你追求自由及不受拘束,自我的生活。
3. 时常自我反省,敏感的思想家
你对于自己及四周的环境能够比一般人控制得更好更彻底。
4. 务实,头脑清醒,和谐
你作风自然,喜欢简单的东西。
5. 专业,实事求事,自信
你掌管自己的生活,你相信自己的能力多于相信命运的安排。
6. 温和,谨慎,无攻击性
你生性随和,但处事谨慎。
7. 具分析力,可靠,自信
你对事物的灵敏度令你可以发现到旁人忽略了的东西。
8. 浪漫,爱幻想,情绪化
你是一个感性的人。你拒绝只从一个严肃,理智的角度去理解事物。
9. 精力充沛,好动,外向
你不介意冒险,特别喜欢有趣的,多元化的工作。 |
Posted: 25 Aug 2008 12:22 AM CDT 跪求媒体厂商的名片信息,请达人
|
Once Again, A Former Mainstream Video Game Developer Posted: 25 Aug 2008 01:00 AM CDT So ... I quit. Remember how I promised last weekend (just before heading out to work over ten hours straight on a Saturday) that the severe crunch-mode thing I've been using as an excuse for months would be over soon? That's what I was talking about. After about two-and-a-half years back in the video game business, the volatility and lifestyle and quality-of-life issues (and did I mention volatility?) got to be a bit much for my family and myself. I'd actually put this off for a couple of months so we could finish up the project (and so I could find a decent place to land). Recent events propelled me to pull the trigger a little earlier than expected, but the time had come for me to make my exit. And the position I'd accepted had already expressed the willingness to be flexible about my start date. Anyway, I have a few days off to decompress - which are sorely needed. After all, I think I clocked in 40 hours for the week sometime Wednesday evening, not including the weekend hours. And it sounds like management is working to make things right by the rest of my team, so I am pleased with that. They are a great bunch, I wish them all the best, and I'll miss working with them. But I'm also really excited about my new position. Besides promising more humane hours and steadier paychecks, I'll get the chance to work on some really cool simulator technology. But in the meantime, I get a chance for some R&R, to play some Wizardry 8, pay attention to my family who needed to be re-introduced to me, and actually devote a little bit of time to Frayed Knights, which has been sadly neglected the last three months. I started this blog as a "former" mainstream video game developer. After jumping back into the fray for a the last few years, and admittedly having some pretty good times there, I can say I'm pretty happy about returning to my "former" status. Probably for good this time (but I've learned to never say never). Viva La Indie! |
Did you enjoy this article? Be sure and check out past articles and the comments HERE. Rampant Games: Games With Personality! Latest games at Rampant Games: Depths of Peril and Eschalon: Book 1 |
Posted: 25 Aug 2008 04:15 PM CDT |
Posted: 25 Aug 2008 12:33 AM CDT 一分钱不花骗取包月广告手段暴光
投放方:北京天成胜境科技有限公司 网站:乐游网 运营游戏:《浪漫庄园》
被耍方:哈尔滨利兴科技有限公司 网站:
51拉的统计后台 你看那的流量多 选一个吧
密码 170itcom
乐游网 15:34:49
您把密码都给我了?
乐游网 15:35:08
我还是进不去呀
170资讯 ...
|
Posted: 25 Aug 2008 12:58 AM CDT 文/天姿 老公工作变动,你会辞职跟他去外地扎根吗?尤其是,此时你的事业正处于上升期。 2008年8月25日 |
电视游戏科普初探游戏引擎--学习篇_电视游戏_新浪游戏_新浪网 Posted: 20 Aug 2008 10:35 PM CDT Starbreeze公司一位正在忙于在线第一人称射击游戏Enclave(困土)开发的关卡设计师:Jens Matthies也认为使用自己开发的引擎使开发者们有了"对游戏设计过程中的所有方面全面施以影响的权力". 他还说:"如果我想到了一个新点子, ...
|
Posted: 24 Aug 2008 11:59 PM CDT 生逢奥运在京城,
现场一见强百闻。 趁此良机开眼界, 我将感触来抒怀。 风尘未洗鸟巢进, 亲睹牙国飞人赢。 梦幻迷人水立方, 玲珑魔塔惊万人。 盘古大观火炬形, 超大屏幕显赛情。 回音壁旁聆儿声, 蓦然回首廿年整。 广场鲜花沁心扉, 国家剧院绝空前, 屏声静气观《立秋》, 主副轻重叠三线。 清华北大学府前, 畅想子孙只等闲。 听得孩童发奋语, 原来置身圆明园。 王府大街人如潮, 排队购物似长龙, 吉祥福娃难买到, 茯苓名饼亲友尝。 三号航楼巨无霸, 游子自此赶回家。 ![]() ![]() |
Posted: 24 Aug 2008 10:55 PM CDT 一、
开幕式很成功,闭幕式也不差,有效地平衡了民族特色和世界大同的主题,只要你不戴有色眼镜胡思乱想,就应当承认张艺谋的确震撼了国人和世界! |
Posted: 24 Aug 2008 09:50 PM CDT
网络游戏起源于一种叫MUD的互联网文字游戏,如今让人眼花缭乱的各种网游最早的雏形就是这种在互联网上用文字交流形式进行的游戏。中国最早的MUD游戏出现在95,96年,当时人们称之为网络泥巴。在那个时代,单机版的电脑游戏早已经图形化,而且视觉效果已经很不错了。而网络游戏,限于网络传输速度和电脑硬件的限制,还只能停留在文字交流的阶段。 随着之后十几年里互联网和计算机技术的飞速进步,很快,网络游戏就进入了图形时代。从最早的2d网络游戏到现在的3d网络游戏,仅仅用了10年时间。如今早期的2d网络游戏已经逐渐淡出了人们的视野,3d网游成为了主流。那么网络游戏的进一步发展方向在哪里呢?正如当年追随着单机游戏的脚步从文字时代进入图形时代,又从2d时代进入3d时代,我们也相信网络游戏在视觉效果方面的发展将会沿着单机版游戏走过的轨迹前行。
早期的网络游戏《石器时代》
美国Epic Games公司的《战争机器》和《虚幻竞技场》两款次世代标杆作品的问世在当年几乎囊括了全球所有的大小奖项,也标志着单机版游戏进入所谓的次世代游戏的新纪元。 次世代游戏的最大不同就是它惊人的画面效果。新近亮相的《战争机器2》在游戏画面效果上已经能够与许多电影相媲美,跟《侏罗纪公园》这样比较早期的电脑特技电影相比,其画面有过之而无不及。而这样的效果并非人们常见的经过预渲染的过场动画,而是实实在在的实时游戏画面。当然,这些都拜最新的次世代游戏开发技术所赐。法线贴图技术在次世代游戏开发中被广泛应用,这一标志性技术很好地解决了画面细致程度跟计算机运算速度的矛盾。这一系列次世代开发技术的运用导致了单机游戏画面效果有了革命性的进步。
《战争机器2》截图
而网络游戏在次世代游戏开发技术出现后无法第一时间跟上单机游戏的步伐,这一方面是限于网络传输速度,另一方面是网游的运营要考虑大部分玩家的硬件配置。随着这几年技术的不断进步,高性能显卡的不断普及,网络游戏进入次世代的硬件瓶颈已经逐渐被突破了。 据了解,国内几家上市游戏公司,金山、网易、网龙等都已经购买了Epic的unreal3引擎的授权,用以新一代游戏产品的开发。unreal3是Epic Games最新一款游戏引擎,全球游戏迷翘首期盼的《战争机器2》就是用该款引擎开发的,它的使用暗示着这几家国内网游巨头新研发的游戏将会是次世代级的新作品。而在国外,次世代网络游戏已经问世,韩国Ncsoft公司的新作《blade & soul》就是一款使用Unreal 3引擎的次世代网游。
韩国Ncsoft公司的新网游《blade & soul》(中文暂译名《刀与魂》)
技术的进步给玩家带来的是更酷更炫的新游戏,给游戏行业带来的是新的变化和挑战。次世代网游对于画面的质量,细节的表现都提出了更为苛刻的要求。游戏开发中美工的工作量将会更大,技术要求将会更高,开发团队也会变得更加庞大。熟悉次世代游戏开发技术的人才会成为网络游戏公司急需补充的力量。 为了适应网游产业的最新发展状况,培养更适合网游公司的开发人才,GA游戏教育基地最近对3D游戏美术精英就业班的课程做了调整。把网络游戏技术与次世代开发技术整合起来,对课程做了进一步优化,增加了网游方面的课程内容。与GA有长期良好合作关系的Epic Games China 派遣的技术指导专门针对次世代开发技术在网游中的应用设计了新的课程内容。调整后的游戏美术精英班将主要为国内的几大上市游戏公司输送人才。 |
创业者需要具备什么能力--走出软件作坊:三五个人十来条枪 如何成为开发正规军(四十二) Posted: 26 Aug 2008 05:57 PM CDT 前天看我的博客留言,有网友这样留言:看完博主的文章,想创业的都灰心了。还有的网友这样留言:楼主是教育人如何做一个老老实实的员工,这是企业领导层的险恶用心,让大家都服服帖帖为他干活罢了。还有的网友这样问:楼主你这能力那能力的,好像很高,你怎么不自己创业去?可见楼主是吹牛而已,自己意淫,和马克思在图书馆搭建自己的共产主义者学一样。还有的网友这样问:创业者,到底需要具备什么能力?我没有创过业,只有创业失败者才能体会到真正需要什么能力。不过我也思考过自己创业,也参与过朋友的创业起步过程,而且现在还在一直帮助朋友的公司出谋划策时常交流创业公司的经营难题,所以占在自己这个经历现状上,跟大家交流一下自己对于创业者能力的看法。我个人感觉,创业者第一需要的是眼光。我和许多创业者交流过,他们创业的开端,大部分都不知道为什么要创业,到底要奔向什么地方,都是有几个关系客户,有的干脆连客户资源都没有,就是和自己的朋友聊的非常热烈,觉得非常有戏,这次不抓住机会以后肯定后悔,也没经过什么论证,也没有很详细的量化目标,就创
|
《鬼屋魔影5:濒死调查》(Alone in the Dark: Near Death Investigation)中文破解版[ISO] Posted: 26 Aug 2008 09:55 AM CDT ![]() 中文名称:鬼屋魔影5:濒死调查 英文名称:Alone in the Dark: Near Death Investigation 游戏类型:动作冒险 开发厂商:Eden Studios 发行厂商:Atari 游戏文字:繁体中文/英文/韩文 游戏语音:汉语/英语/韩语 官方网站:http://www.centraldark.com/us 讨论专区: http://3dmgame.chnren.com/bbs/showforum-152.html [QUOTE]本光盘版基于:猪猪乐园发布的繁体中文CLONE镜像和darkcOder制作的破解补丁 安装步骤: 1、安装游戏 2、复制Crack文件夹内的alone.exe和paul.dll,粘贴到游戏安装文件夹,覆盖同名文件 3、双击securom.reg导入注册表 4、玩游戏 [/QUOTE] [QUOTE]【配置要求】 操作系统 Windows XP ista 32-bit & 64-bit 处理器 Intel Pentium 4 2.8 GHz or Athlon X2 +3800 (Intel Pentium 4 3.4 GHz 或 AMD Athlon 64 +4000 推荐) * 内存 1 GB RAM (2GB 推荐 硬盘空间 9.5 GB 剩余空间 DVD-ROM 光驱 4倍速以上 显卡 NVIDIA GeForce 7600 或 ATI Radeon X1950 or better (NVIDIA GeForce 7800 GTX 或者 ATI Radeon X1950 XTX 以上推荐) [/QUOTE] 【游戏简介】 本作故事设定在2008年的现代,主角依然是Edward Carnby,玩家要操纵他穿过纽约中央公园,探索由此所发生的一连串诡异、神秘的超自然现象,并揭开一个被隐藏多时的惊人秘密…… |
Posted: 26 Aug 2008 10:18 AM CDT 最近在看一本小书,体会到了久已不见得一种感触:爱不释手。
然爱不释手,却总有看完的一天。这就是艺术家黄永玉老在1990年左右所写的一些文字,所画的数十篇画,集合成的小册子。名字雅致,勾勒出的路线令人神往,沿着塞纳河到翡冷翠。翡冷翠者,佛罗伦萨也。书名却和内容有些不一致,黄老并非真的从塞纳河一路行至佛罗伦萨,其是乃两地游记分卷集合而已,一为沿着塞纳河,二为翡冷翠情怀。前项摘文十二篇,略占全书1/4篇幅,后者则有二十九篇文章。 此书用了890x1240的阔32开,正符合文画合一的版式,老先生在异国手绘的长卷一隅,素描写生,都有了舒展的空间,印刷又精良,画上的落款,记文都清晰可辨。纸张克数足量,整本书却并不显得重,托在手里舒服无比。因为文画合一,老先生娓娓道来他在法国和意大利的见闻,配上他在文中所叙之地的绘画作品,两相辉映,使得我们在相隔二十年后,几万里外,仿佛也投射到他的身边,化作树荫下的一个小圆点,陪他一起作画。 我不懂欣赏绘画,只觉在这本半游记,半画册的小书里,黄永玉的画都有一股鲜明亮堂的感觉。他在欧旅居的半年间,所绘画的作品,多是对当地名建筑的临摹,名城气概处,精致处的啜取,还有友人的画像,普通百姓家里院外的写意。他临摹的建筑,细部十分用心,整体取意至极,我也不知道他为什么用色那么精当,总让人觉得鲜明的光亮照射在建筑上,花园里,原野中。他在大色块的运用上,似乎是某种山水画的技巧,色块之间的空隙,色明的累进,组成了空气,树林,蓝天。在那篇感人的文章《婀娜河上的美丽项链一文》中,婀娜河上的桥,细部的色彩繁重无度,道不尽那条珠宝街的迤逦气氛,桥外的天色水面却浑然一体,仿佛底色般深沉的衬托桥的丰韵。 画里画外都是文章,这也是看这本书为何那么舒服的缘故。黄永玉的文字,多围绕他在欧洲旅居期间,勤奋作画的点滴故事而成。看故事,听他自嘲,复又欣赏他在故事中一路走,一路站定,一笔一划形成的作品,更觉雅趣无垠。不过,若只是雅趣,这本书断不会在某些章节,某些文字间,让我热泪盈眶,积郁良多。 巴黎卷中,有一篇文章追忆雕塑家郑可,书至中节,作者悲痛之声几欲破书而出:“15年在巴黎的学习,一身的绝技,化为泡影。”多年多年之后,当他徜徉在郑可之师,布德尔的作品下时,那种对故知的感怀更是溢于言表。出于惺惺相惜之意,在塞纳河卷中,作者还专门撰文介绍了那里的大艺术家,里维拉,莫迪里阿尼,梵高等人。画家在塞纳河畔,因为走过当年那些艺术家所待过的咖啡馆,联想起他们的逸事。在佛罗伦萨和意大利诸城,他却是实实在在的走进乔托,但丁,簿迦丘,达芬奇这些大师们的故居,走在大师们入画的桥上。后卷论艺术大师的篇幅很多,同时也引发了黄老对我国20世纪艺术史的诸多感慨。这些感慨汇聚了他本人的艺术经历,对故乡的怀念,对无知人们破坏艺术品的刻骨之痛,对师友的追忆,点滴往事,仿佛让作者那颗67岁的心远离了翡冷翠,塞纳河,回到了二十年前,三十年前,四十年前,回到了香江两岸的浅水湾,回到了皇城根儿下的家庭动物园,回到了凤凰古镇的古虹桥边…… 作者在提及大雕塑家布德尔时,曾感叹:“在他的作品面前,从艺者如果是个有心人的话,会认真地‘吮吸’,而不是肤浅的感动。会战栗,会心酸。”读黄永玉一辈艺术家的文章,欣赏他们的作品,大概也需如此,感动得默默落泪,泪一甩,什么都忘了,这样也不好。老先生说,“认认真真地做一种事业,然后凭自己的兴趣读世上一切有趣的书。”还是老老实实的干自己的事业,干着自己的事业,才有踏实的心境去流连在别人种下大树底下。大树承担了风雨和雷电,总有一天,我们也要走出树荫,走向荒原。但无论走向何方,走到什么地步:我与我周旋久,宁做我。 ![]() ![]() |
Eight Myths About Videogames Debunked Posted: 26 Aug 2008 10:14 AM CDT It looks like PBS has decided to play "Mythbuster" with eight assumptions people make about video games. They address misconceptions in two categories - the "video games are just for nerdy little boys" area, and the "video games turn kids into raving psychotic monsters" * The availability of video games has led to an epidemic of youth violence. Flying in the face of the dramatic decrease in violent crime since the release of Doom. * Scientific evidence links violent game play with youth aggression. Also linked: the alignment of the stars and planets with your likelihood of getting a traffic ticket today. * Children are the primary market for video games. Because the industry doesn't want all that filthy disposable income from the twenty-somethings. * Almost no girls play computer games. That's right - Bejeweled, The Sims, and Peggle are exclusively played by testosterone-laden boys in-between sessions of clubbing each other with tree branches in the back yard. Oh, and no girl could possibly have the mental capacity and skills necessary to pwn your newbie ass in Counterstrike. * Because games are used to train soldiers to kill, they have the same impact on the kids who play them. AKA the "David Grossman has convinced enough people to repeat him that it must be true" fallacy" * Video games are not a meaningful form of expression. But toilet seat art is. * Video game play is socially isolating. Because we gamers hate playing with each other, and we would never talk to each other about what games we play. * Video game play is desensitizing. This one may be true. It's desensitized me to television. Anyway, the article is much better-written than my commentary. Check it out here: Reality Bytes: Eight Myths About Video Games Debunked |
Did you enjoy this article? Be sure and check out past articles and the comments HERE. Rampant Games: Games With Personality! Latest games at Rampant Games: Depths of Peril and Eschalon: Book 1 |
think in google--think in 互联网系列2 Posted: 26 Aug 2008 05:44 PM CDT 搜索:网页、图片、地图、视频、资讯、博客、翻译、杀毒导航,这都和百度一样,用意也一样,在此不再赘述。但google有发布视频的平台youtube,也就是内容源,baidu没有。google也有图片修正工具,而baidu没有。google有3D建模工具,可以产生信息源,google有3D earth,可以产生信息源。搜索,最怕的就是没有信息可搜索,必须让整个盘都循环起来,一边产生内容,一边蜘蛛爬行索引,一边让用户来搜索应用。任何资源,不管是网页、图片、视频、文档、MP3、电影,在我眼中,他们都是信息对象,如何对信息对象展示播放、搜索、分享、传输、安全、压缩、存储、修改创作,这都是一个个的环节链条,就看你能不能每类信息对象都能通吃整个链条。拼音是文字信息对象的创作工具,所以非常值得做。如果有人过去不理解google和sohu为什么要做拼音输入法,现在应该理解了。但google有gmail、日历、文档、论坛,是面向企业的,baidu没有,baidu专心做自己的大众消费品。google有面向程序员整合的产品,如代码搜索、blog、论坛、视频、文件
|
《模拟人生2:公寓生活》(The Sims 2: Apartment Life)资料片破解版[ISO] Posted: 26 Aug 2008 09:56 AM CDT ![]() YYets服务器高速做源 中文名称:模拟人生2:公寓生活 英文名称:The Sims 2: Apartment Life 游戏制作:Maxis 游戏发行:Electronic Arts 游戏类型:Simulator 官方网站:http://thesims2.ea.com/ 讨论专区:http://3dmgame.chnren.com/bbs/showforum-249.html [QUOTE]本游戏为资料片,必须已装有原版(模拟人生2或模拟人生2DVD特典或模拟人生2假日特典)才能装本资料片破解版 序列号:2XL4-R5BG-BPSE-GBPS-JRLD ; 本ISO镜像内的CRACK文件夹里有破解补丁[/QUOTE] 这款《模拟人生 2》资料片让玩家的模拟人生踏出近郊住宅,搬入崭新繁忙的公寓大楼。随著他们探索周遭的新环境、出入咖啡店、造访游乐场、会见新朋友等,展开一连串的冒险、乐趣和戏码。由于在《模拟人生 2:公寓生活》里能够控制多户人家,你的模拟人生可以过著快乐融洽或是滑稽冲突的生活。 新的社交网路和人物类型,包括附庸风雅的放荡家伙、运动爱好人士、酷爱新奇玩意儿的电子迷,以及急躁的程式设计师,为模拟人生的生活增添风味。另外,透过全新的关系量表,玩家的模拟人生可以获得其他模拟人生的关注,成为邻近地区中人人称羡,或最不看好的模拟人生。名声越好,你的模拟人生越容易找到协助他们达成目标的适当朋友。 替模拟人生在《模拟人生 2:公寓生活》里打造出色的空间吧!五种新建筑类型,包括改装挪用的阁楼、宽敞漂亮的工作室,或是有男管家的奢华公寓,为冒险注入创意与玩家风格。选用种类繁多的新颖装饰项目,包括螺旋阶梯、挑高天花板等等。透过在狭窄空间中上演的戏码,你的模拟人生将获得全新体验。 游戏需搭配《模拟人生 2 双超值版》、《模拟人生 2 豪华版》、《模拟人生 2 DVD 特别版》或《模拟人生 2 欢乐假期版》执行。 The Sims 2: Apartment Life (c) EA 08/2008 :..... RELEASE.DATE .. PROTECTION .......: Securom 1 :.......... DISC(S) .. GAME.TYPE ........: Sims ▄▀▀ ▄▀▀▄ ▄▀▄▀▄ ▄▀▀ ▀ ▄▀▀▄ ▄▀▀▄ ▄▀▀▄ ▄▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▓ █▀▀▓ █ ▓ ▓▀ ▄ █ █ ▓ ▓▀ █ ▓ ▀▀▀█ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀ ▀ ▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀▀ This expansion pack for The Sims 2 takes your Sims out of the suburbs and into a brand new busy apartment building! Adventure, fun, and drama await them as they explore their new neighborhood, mingle in coffee shops, visit a playground, meet new friends, and much more. Because there is now the ability to control multiple households in The Sims 2 Apartment Life, your Sims can live in happy harmony, or comical conflict. New social networks and character types, including artsy bohemians, sports jocks, gadget-loving techies, and edgy gearheads spice up your Sims life. And, with a new reputation meter, your Sims can build up the respect they deserve from other Sims to be the most admired - or least-desired - Sim in the neighborhood. The better the reputation, the easier for your Sims to find the right friends to help them achieve their goals. Make your Sims' space look great in The Sims 2 Apartment Life! Five new building types that range from converted lofts to roomy and posh studios or luxury apartments with their own butler add to the creative and customized adventure. Enjoy a myriad of new decor options, including spiral staircases and lofty, high ceilings. Your Sims will get a whole new kind of experience through the drama of close quarters living! ▀ ▄▀▀▄ ▄▀ ▓▄▄ ▄▀▀▄ ▓ ▓ ▄▀▀▄ ▄▀▀▄ ▓▄▄ ▄▀▀ ▄▀ ▀▀▀▀▀▀▀▀▀▀ █ █ ▓ ▀▀▀█ █ ▄ █▀▀▓ █ █ █ ▓ █ ▓ █ ▄ ▓▀ ▄ ▀▀▀█ ▀▀▀▀▀▀▀▀▀▀ ▀ ▀ ▀▀ ▀▀▀ ▀ ▀▀▀ ▀▀▀ ▀ ▀▀ ▀▀▀ ▀▀▀▀ ▀▀ 1. Unrar. 2. Burn or mount the image. 3. Install the game, when asked for a serial enter one of the following: 2XL4-R5BG-BPSE-GBPS-JRLD SSW6-DYDH-JPAH-AJPA-MRLD SX6N-YF33-4KS6-24KS-ARLD A76W-H6LV-HQ2Q-LHQ2-URLD JD5V-RVD6-QG2H-YQG2-MRLD 4. Copy the cracked content over from the Crack directory on the disc to your installation directory. 5. Play the game. ▄▀▀ ▄▀▀█ ▄▀▀▄ ▓ ▄ ▄▀▀█ ▄▀▀▄ ▄▀▀▄ ▓▄▄ ▄▀▀ ▄▀ ▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▓ █▀▓ █ ▓ █ ▓ █▀▀ █ ▓ █ ▓ █ ▄ ▓▀ ▄ ▀▀▀█ ▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀ █ ▀▀ ▀▀ ▀ ▀ ▀▀ ▀▀▀ ▀▀▀▀ ▀▀ |
This posting includes an audio/video/photo media file: Download Now |
Posted: 26 Aug 2008 05:06 PM CDT 但是眼看着互联网风起云涌、新贵不断,而管理软件却波澜不惊,我们也在思索互联网和企业应用的结合,所以对携程、分众、百度、阿里、55bbs、51.com、QQ、网游、淘宝、开心网、校内网也经常性思考,希望能整合出新的创新模式。
百度究竟是个什么企业?
1花的力气中等,但人气很不错,赚钱也很不错,如搜索业务
2花的力气不多,但人气很不错,随着B2C业务的开发赚钱也很不错,如贴吧业务
3花的力气不多,但未来人气也配合B2C、IM、支付会越来越高,赚钱也会很不错,如空间博客业务
4花的力气很多,人气也越来越高,赚钱配合B2C也会越来越好,如知道业务
5花的力气不多,但人气很不错,赚钱不行,如MP3业务、地图业务、hao123业务
6花的力气很多,人气也越来越高,赚钱却不行,如百科业务。百科、wiki、google图书这类业务如何盈利,是我想不透的,难道会像现在的万方数据之类阅读收费?
7其他的合作如电影、MP3、地图、杀毒、翻译、游戏,都可能走先收费再分成的模式。
8餐馆宾馆搜索肯定以后要发展,爱帮、大众点评要注意了
9其他业务
|
Posted: 26 Aug 2008 09:09 AM CDT 过去一段长时间是:油价涨时股价跌,油价跌时股价涨。
现在油价涨时,股价还是跌,但等油价终于跌时,股价却继续跌。
![]() ![]() |
Posted: 26 Aug 2008 11:00 AM CDT |
The Professional Game Manual Maker Posted: 26 Aug 2008 04:00 AM CDT
|
Posted: 26 Aug 2008 02:23 AM CDT |
Posted: 26 Aug 2008 07:04 AM CDT Positech Games工作室的独立游戏开发者Cliff Harris,日前在他的博客上发表了一篇名为“为什么我的游戏会被盗版”的日志,希望借此机会了解盗版者以及盗版使用者们对于这一问题的看法,并试图从中找到更好的对策。 Harris收到了数以百计的回复和电子邮件, ...
|
Posted: 26 Aug 2008 07:12 AM CDT 独立﹕一种对自作主张的渴望,不等不承认有些时候我们确实有必要对玩家的一些行为进行限制,比如物理地图的边界或更常见的必须按照剧情发展和关卡设计来进行游戏等等,这些限制确实是必要,但如果你有条件提高游戏的“自由度的话”我想你得游戏会更受欢迎, ...
|
Posted: 26 Aug 2008 07:48 AM CDT 我到底是干什么的? 说我只负责服务器端的技术吧,我有时也弄弄客户端; 说我只作技术吧,我有时也想想策划案; 说我只作产品吧,我有时也想想营销手段; 说我只着眼于自己的开发吧,很多的时候我也在考虑如何更好的带团队。 简单地说,我希望自己涉足或有兴趣涉足的领域,包括了网游产品从研发,到运营,到市场推广的各个环节,我想弄清楚这所有环节的“猫腻”,想明白,亲身实践这其中的每一步,对整个产业链有一个足够充分的认识和体会,我不想呆在某一个固定的位置,一直作下去,我比较喜欢换位的感觉。 但是,我也知道,一个人,从其立身的角度而言,他始终要有一项自己踏实掌握的技能,这样,无论他在哪里,都可以从头开始。 所以,技术这个东西,将来无论我作了什么工作,应该都不会彻底放弃。 同样,不会放弃的,是我阅读和写作的习惯。因为我发现,写作,特别是有条理的写作,可以极大的提高你分析问题,阐述观点的能力,无论是说话,还是办事,都很有条理性,一是一,二是二,把步骤想得很明白。 我想,归根结底,我是一个或者说我想努力成为一个适合在多种场合冲锋陷阵解决问题的人,这里的“问题”,不仅仅是技术,还包括了其它涉及产品的诸多领域。 |
Posted: 23 Aug 2008 10:32 PM CDT 虽然身在北京距离奥林匹克公园的距离也就不到5公里的样子,但似乎从来都没有太多想去现场看奥运的想法。或者就和别人说的慢半拍一样,当真正奥运到来的时候,总觉得缺少一种存在感。 前日偶然得到机会可以去鸟巢看一场奥运会的比赛,一开始居然还有些抗拒感,觉得没啥意思。不过后来转念一想,怎么也是去新落成的国家体育场看一场奥运会撒,怎么有不去的道理……随后便开始期待起来。 票的比赛的场次是 A22,国家体育馆的田径比赛。票的有效时间是2008年8月22日上午7:30到下午16:30之间可以一次性进入国家体育馆。可以看到的比赛项目有男子50KM竞走和男子10项全能中的110米栏,铁饼和撑杆跳高三个子项。 其实进入奥林匹克场馆的方式还比较多样,但是似乎FXCarl选择的是一条不是最方便的线路。从地铁10号线的西土城站过安检,然后乘坐地铁8号线北上至奥林匹克公园站,接着下车步行前往鸟巢。一路见到的有趣东西颇多,甚至有分成多篇Blog写的冲动…… 奥运会的惊喜,从安检便逐渐开始。一张看起来渐渐的奥运会门票,其实除了右侧的可以撕去附件的条码部分有着数字化感觉之外,在门票的左侧,有着防危伪线附近居然还一块印刷的RFID。当把门票贴在读取器的表面时,可以识别出门票的细节信息。技术的先进之外,安检关口的管理上也很棒,十数个安检口一字排开,支援者们引导者观众一一通过安检,高效而有序。 目前从地铁10号线进入地铁8号线之前,需要持票通过安检,之后进入地铁8号线就是免票了。地铁8号线的装饰中大量的使用了青花瓷式的元素。很多奥运观众都在地铁中拍照留念,相信这样的风格一致会保留到将来吧……FXCarl没有相机,所以不得不说有些遗憾了。 奥林匹克公园站的地铁进出口不能不说设计的很有的特色。从地铁8号线下车之后,首先进入的空间是一个落在地面平面下的广场空间,这个空间似乎应该是叫做下沉花园。从花园里,可以看到很多有中国风格的建筑元素。从下沉花园向北,沿着台阶逐步而上,玲珑塔和国家体育场分列台阶两侧,同时遥望盘古大观。走到台阶顶端,事业顿时开阔,水立方,国家体育馆,新闻中心一一映入眼帘……整体的壮观程度已不用言述。 奥林匹克公园的大广场是铺装的地面,植被不多,感觉挺晒,纵横交错的塑胶线槽略微高出地面。当时中央大道正在进行的是男子50Km竞走的比赛。男子50Km竞走的比赛首先在奥林匹克广场的中轴线上长度约1Km的道路上往复进行,最后进入鸟巢冲线。 国家体育场——鸟巢的尺寸之大是从电视或其他媒体上所感觉不到的。鸟巢一样造型的来源,外部的钢架每一根都尺寸巨大。其施工难度之高,在看见鸟巢的一瞬才真正的理解。能造出出这样的体育场还真的是非常不易。体育场的入口很多,每个区域(Sector)都有两个入口。从入口进入后,通过长长的台阶可以直通目标区域。 FXCarl 的座位位置非常的接近鸟巢顶端 —— A区3层601通道31排27号,尽管是在鸟巢第三层接近最顶端的部分不过观看比赛的视野并未受到影响。鸟巢中看台的座位高度差随着高度的提升而逐渐拉大,这样即使坐在很高很靠后的位置因为没有看后脑勺之虞。 鸟巢的音箱和大屏幕系统都是由松下提供的,整个体育场内的音箱调整的相当之好,尽管发音单元非常多,但是声场的结像度一流,完全没有校运会那种大操场上高音喇叭式的感觉 …… 当然,奥运场馆肯定要是不一样才对就是了 A22场次可以看到的比赛不多, 男子10项全能的跨栏和铁饼项目和男子50Km竞走是同时进行的,相比10项全能的比赛来说,竞走受到了更多观众的关注。毕竟50Km竞走是奥运会中距离最长的竞赛项目,比马拉松的42公里还要长,每个运动员都格外值得尊敬。特别值得一说的是中国选手李建波在前40公里都保持在第一集团,有机会冲击奖牌,一直到45公里之后实在因为体力极限而逐渐被对手超越。能够做到这样的表现,真的非常出色! 鸟巢的饮料部并不提供主食,只有爆米花,烤香肠和饮料供应。所以下午的比赛观众少了很多,硕大的鸟巢内开始听见广播的回音——可见观众已经很稀少了。FXCarl也没有看完最后的10项全能撑杆跳高比赛,溜出来参观了一下奥林匹克公园的其他部分。 奥林匹克公园的龙形水系中的喷泉随着音乐起舞,岸边的水域里还培育着芦苇 …… 感觉生态环境超好的样子。沿着中轴线向北去则是各大奥运赞助商的展示厅,来奥林匹克公园的人真的不少,上午赛事结束后还没离开的与晚间赛事还没开始的游客混在一起,每一个展厅都需要等待非常长的时间。以至于最终并没有看到太多的内容,只是草草的了解了一下欧米茄和大众汽车…… 有这么一种说法,叫“奥运并未发生” 1991年让·鲍德里亚(Jean Baudrillard)发表著名的《海湾战争并未发生》(The Gulf War Did Not Take Place),引起了极大的争议。他的意思大致是,由于大众传媒的影响,战争对于我们而言已经变成了由各类新闻报道堆砌而成的虚拟事件。火炬熄灭了,曲终人散了,但所有这一切,连同之前半个月里上演的各种故事,对于很多人来说仅仅是通过电视、报纸和网络了解到的。北京奥运会的影响,基本都是以拐弯抹角和不露声色的方式进行的;而奥运会本身甚至不如玩一场电子游戏的感受真切和深刻。或者也可以这样说,奥运会并未发生。就像鲍德里亚所说,我们是以一种必需的幻觉方式、一种不在场的方式、一种非现实的和一种与事物非直接的方式生活。——引自酒游花 不过当亲临奥运之后,一切都变得不同了,甚至我们还发现了一个有趣的共性,那就是奥运会有着太多太多说不尽的有趣细节,以至于凡是文学功底不过硬的人,写出来的看奥运博文都像是个流水帐——FXCarl也是一样。或许这就是亲临奥运后的真实感吧。 随机文章:时间,从不曾改变什么 —— ExciteBike 与 Trials 2008-08-07 头文字D 单行本 37册 和 PS3 头文字D Extreme Stage 2008-07-21 硬盘该不会真的信不过了…… 2008-06-30 颐和园 2008-04-15 鼠年之前的最后更新 2008-02-06 收藏到:Del.icio.us |
Posted: 26 Aug 2008 02:34 PM CDT python 编程规范
|
Posted: 26 Aug 2008 04:43 AM CDT Positech Games工作室的独立游戏开发者Cliff Harris,日前在他的博客上发表了一篇名为“为什么我的游戏会被盗版”的日志,希望借此机会了解盗版者以及盗版使用者们对于这一问题的看法,并试图从中找到更好的对策。 Harris收到了数以百计的回复和电子邮件, ...
|
Posted: 26 Aug 2008 04:52 AM CDT 由新加坡媒体发展管理局(MDA),联系新加坡(CS),上海多媒体产业协会三方联合主办的“中新数字媒体行业交流周”将于9月下旬举行,其中的重头戏“新加坡数字媒体人才选拔会”将于 9月19日至9月21日分别在北京和上海两地召开。届时将有Kastria、Lights & Shadows以Ubisoft等多家新加坡顶尖数字媒体企业到场,选拔优秀人才前往新加坡就业。 主办方联系新加坡(CS)的官员表示,新加坡的数字媒体行业发展迅猛,对于人才的需求量很大,而新加坡本土的人口有限,急需引进游戏开发方面的专业人才。尤其是具有一定工作经验的游戏策划,游戏美工等技术人员是新加坡最紧缺的人才。 GA游戏教育基地专业从事游戏培训多年,为国内各大游戏公司输送了许多游戏开发人才, GA毕业的校友一直通过GA校友圈这个平台相互保持着密切的联系。8月24日,此次人才选拔会的主办方联系新加坡(CS)通过GA校友圈联络了从GA毕业的老学员,在GA游戏教育基地召开了一次有关“新加坡数字媒体人才选拔会”的宣讲活动。“联系新加坡”的谢仲贤主任专门来到GA,给GA校友详细介绍了新加坡的工作和生活环境,以及招聘企业的情况。讲解了新加坡政府对于吸引外籍人才的相关政策制度,并现场解答了大家关于赴新加坡工作和生活的各种问题。
据谢主任介绍,此次活动的新加坡主办方为两家权威官方机构:新加坡媒体发展管理局(MDA)和联系新加坡(CS),这充分保证了与会企业的高品质及选拔流程的正规性,还将提供赴新加坡就业的配套咨询服务,为人才免除后顾之忧,也为人才赴新加坡的各种后续手续铺平了到道路。参加本次人才选拔会,只需要在活动的官方网站www.careers-singapore.com完成注册,并详细填写简历,上传作品。企业将会以最快的速度筛选候选人,并及时发送面试邀请函。一旦通过企业的面试,新加坡政府机关会尽快办理就业准证等相关手续,以最快的速度促成人才引进的成功。 作为亚洲人均收入最高的国家,新加坡的收入水平具有不小的吸引力。游戏设计人才在新加坡的初始薪资平均折合人民币12000元左右,随着工作经验的增加还会有比较大幅度的提高。而相对比较高的收入来说,新加坡的个人税收却是全球最低的。月收入12000人民币的劳动者,在新加坡每年需要缴纳的所得税仅为280元左右。在生活方面,新加坡美丽的城市环境,舒适的生活条件,良好的社会治安,健全的社会保障体系在整个世界范围内都具有相当的竞争力。格外重要的是,新加坡海纳百川的国际包容性,吸引了无数来自全球的优秀人才,这样一个各种文化和思想汇聚的地方尤其适合需要激烈思想碰撞的游戏开发行业的发展。这些方面的优势引起了与会的GA校友浓厚的兴趣,现场气氛十分热烈,大家都就自己感兴趣的问题向谢主任现场提出了咨询。
我们随机采访了一名与会的GA校友,让我们来听听看他对新加坡人才选拔会的看法。
问:你是通过什么途径知道今天这个宣讲会的? 答:是GA校友圈的短信平台通知我的。其实我们GA毕业的同学虽然各自走上工作岗位,但是平时还是有联系的,GA会常常组织一些校友圈的活动,一般都会通过短信和电话通知我们。每年我们总要聚会几次,GA这边有什么新的行业信息,讲座,或者什么跟我们有关的新动向,都会通过这个校友圈传递消息给我们。呵呵,我们也算是消息灵通人士了。
问:今天这个会主要是宣传了新加坡的一些企业,以及新加坡的就业生活情况,你对去新加坡工作有兴趣么? 答:听说有这样的消息我就来听听看,如果各方面的条件优越,又能符合我个人的发展计划,去那边工作也是一种很不错的选择。不过做这种决定还是要很慎重的,所以我才想来多了解一点详细的信息。
问:那么哪些方面的因素是你最主要考虑的呢? 答:发展机会,薪资待遇当然是最重要考虑的。另外,生活成本,综合环境,人际圈子,这些因素也不能忽略。做这样的决定可能对今后很长的人生道路都会有所影响,所以不能太看重眼前利益,必须要有长期打算。 新加坡的企业相对国内的公司来说薪水还是比较高的,当然生活成本也比国内高挺多的。而且那边的环境比较国际化,对开阔眼界是有很大好处。不利的因素是本来熟悉的人际圈子都要从头来过,新的环境需要去适应,挑战也是很大的。总的来说我觉得利弊都有,我还会多了解一下情况,考虑得更成熟一点再做决定。
问:假如赴新加坡工作,你觉得在哪些方面会有所收获?而你本人最期待获得的收获是什么? 答:语言,新加坡有比较好的英语环境,在语言方面会有比较大的突破。 比较期待也比较看好的是新加坡国际化的整体环境,能够接触不同国家的人,感受不同的文化,开阔自己的视野。
问:你觉得国内的游戏开发人才参与国际的交流合作会不会存在问题,如果有的话,会是技术问题吗?还是其他方面的原因? 答:我觉得如果存在问题,应该也不是技术问题,国内的人才可以很快的接受新技术,可以做到与国际水平竞争。就目前我的工作经验来看,国内的制作水平从技术上来说并不比国外逊色。 如果说国内的游戏企业存在一些差距的话,主要还是在理念和管理水平上吧。简单说,单个员工的水平其实不差,但是整体团队的开发能力还有差距。具体制作的水平也不差,但是整体开发的能力却有差距。我觉得,这个需要一段时间来积累,当然,也需要更多的国际交流来学习。这里语言就成了一个问题,我觉得国内的很多游戏人才,如果进一步要寻求更好的发展,英语能力就很重要了。如果说选择去新加坡工作,那么能有比较好的英语环境来提高语言能力是我很看重的,而薪水反而不是最重要的。
问:如果你是企业选拔人才的负责人,你会被国内的游戏人才吸引么,如果会,他们吸引你的最大原因是什么。 答:这个问题,我觉得国外和国内的领导挑选人才的条件应该差不多吧。过硬的技术能力和丰富的工作经验应该是决定性因素吧。另外在英语方面应该有一些要求。从这个角度说,我觉得国内的游戏人技术上还是过硬的,只要英语能交流我想应该没问题。而且新加坡华人也很多,可能语言上的障碍相对别的国家会小一些的。
我们看到,新加坡国际化的环境,海纳百川的文化氛围对国内的游戏开发者还是具有相当的吸引力的。对于这样一次难得的机会,许多GA的老学员都表示正在积极考虑中。而随着国内的游戏开发行业发展越来越成熟,游戏开发从业者的技术水平越来越完善,今后这样的国际交流与合作机会也会越来越多。更多类似的信息共享,将会给大家都带来更多的机会。而GA校友圈正是这样一个校友之间互通信息,实现资源共享的平台。相信随着从GA走出来的游戏人越来越多,GA校友圈凝聚的力量也会日渐强大,成为所有GA校友职业发展的坚强后盾。 |
Posted: 26 Aug 2008 12:29 AM CDT 5 . 1 . 4 如何制订客户服务规则
客户服务规则的要点
客户服务规则的要点是语言通俗易懂、内容丰富全面、结构明朗、版式清晰。从而使人感到要点清晰可见、一目了然,因而需要具有很强的适用性。
客服人员绩效考核
目的
规范客户服务部员工绩效考评工作,确保公平、 ...
|
Posted: 26 Aug 2008 12:29 AM CDT 5 . 1 . 2 客户服务人员的基本素质
综合素质要求
良好的服务观念
需要具备一种玩家至上的服务观念,不应把游戏玩家仅仅看成是消费者,而要把客户服务看成是客户服务部门应尽的责任,理所当然要给游戏玩家提供更好的服务。
独立工作能力
优秀的游戏客户服务人员必须能独当 ...
|
Survey - When and where to hold next CSM class? Posted: 27 Aug 2008 11:53 AM CDT I've received many requests for another 2 day "Certified Scrum Master for Video Game Developers" class (the one in Austin last May filled up). So I'd like to collect a your opinions about when and where to hold the next class. If you are interested in attending one of these, please answer a few questions in the short survey below. Click Here to take survey Thanks! |
Would onsite coaching or classes help your team?
Visit www.ClintonKeith.com to find the services
I offer that can help your game development teams
adopt or improve how they use Scrum. |
Posted: 27 Aug 2008 11:25 AM CDT 注:本文同步发于我的CSDN BLOG( http://blog.csdn.net/sodme ) 互联网行业,往往被我们看作是最具创新精神的行业,但残酷的现实是,很多我们技术人员辛辛苦苦开发出来的自以为极具创新意识,对用户很有价值的功能,却不被用户发觉和使用,甚至,用户连尝试都不曾尝试过。 作为产品的开发者,你是否也曾因此懊恼过? 大 凡工科类的应用,其工作成果,必讲究实用。也就是说,你作出来的东西,首先,对用户而言,要是有用的,有价值的。如果只是开发者自己一厢情愿,凭着技术兴 趣作的一次技术尝试,那也就不用太过奢望用户会买你的账了。对用户无用的产品,就不具有价值,也理所应当不应该被用户接受,喜欢乃至使用。 互 联网产品的用户,动辄千万,这类产品的营销,不象卖保险,靠着一对一的忽悠去赢得订单。正是这样的应用特点,决定了互联网产品必须具备自我宣传,自我营销 的功能,当用户进入系统后,要让系统自己可以介绍自己,适时的引导用户去尝试新功能,从而依靠系统本身实现系统自己的自我营销,而完全不用产品运营者和产 品开发者的人工参与。 我认为,一款产品的营销,从其营销角度而言,可以分为外部营销和内部营销两个方面。内部营销,是指产品内部组织的营 销系统,比如各功能之间的互相推荐和关联提示;外部营销,指的是用户通过什么途径得知你的产品并对你的产品感兴趣。我也把内部营销,称为互联网产品的自我 营销。这两个方面,是一个产品被用户接受的两个阶段,外部营销决定了用户可以认识你,内部营销决定了用户是否满意你,并因此而留下。 作为一个技术开发者,除了实现技术本身的功能之外,还应该更多的考虑一个真实的新手用户,没有怎么接触过你的系统的用户,他会怎么样去使用你的产品,他会按照一个什么样的流程去体验你的产品。系统的提示明确吗?系统的功能易用吗?系统的操作简单吗? 我认为,网游产品中“小白化”的设计思路,也同样适用于其它互联网产品领域。“小白”,是说用户都是比较懒的,而并不是说用户都比较傻。这个世界上,谁也不比谁更聪明,同样,谁也不会比谁更傻。但是,这个世界上,总有比懒人还懒的人,这一点,你我都不得不承认。 带着“自我营销”这个思路去重新规划你的产品使用流程,重新规划你的新功能推出流程和引导,重新规划你的设计架构,你会发现,产品的用户忠诚度也必将会越来越高,当然,前提仍然是:进行“自我营销”的功能,对用户要是有价值的,否则,效果可能适得其反。 |
Posted: 27 Aug 2008 07:53 AM CDT 父母要尽可能利用机会鼓励宝贝独立游戏。当宝贝不哭不闹自己玩耍时,不要打扰宝贝。 错误8:在宝贝需要帮助时袖手旁观游戏是宝贝自己寻求答案的最佳途径。当宝贝热衷于游戏活动时,他们可能会提出一些比较特别的要求。这时,应尽量帮助他们,千万不要因为 ...
|
Posted: 27 Aug 2008 10:45 AM CDT About a year ago, I read an article about digital products and piracy. In the article, it was said that “kids like to buy MP3 players, but hate to buy music”. Basically, teenagers were willing to put 300 dollars for a device that plays music, but wouldn’t be willing to pay for the actual music. That should be free. Today I saw an article that reinforces this view. While the article is about ‘>PC manufacturer’s attitude (according to the CEO who was interviewed), it still reminds us that people are more likely to pay hardware than software. I suppose it can help hardware sales. If people know they get to play all the good games for free (illegally), then it can boost sales. I don’t know whether PC manufacturers view piracy as hidden benefit or not, but in my opinion it’s not their problem to solve. We game developers could suggest alternative business models… or just keep making so bloody good games that people can’t wait to pay for them. |
Posted: 27 Aug 2008 09:41 AM CDT 素胚勾勒出青花笔锋浓转淡
瓶身描绘的牡丹一如你初妆
冉冉檀香透过窗心事我了然
宣纸上走笔至此搁一半
釉色渲染仕女图韵味被私藏
而你嫣然的一笑如含苞开放
你的美一缕飘散
去到我去不了的地方
月色被打捞起云开了结局 如传世的青花瓷自顾自美丽 你眼带笑意 临摹宋体落款时却惦记着你 你隐藏在窑烧里千年的秘密 极细腻犹如绣花针落地 帘外芭蕉惹骤雨门环惹铜绿 而我路过那江南小镇惹了你 在泼墨山水画里 你从墨色深处被隐去 炊烟袅袅升起隔江千万里 在瓶底书刻隶仿前朝的飘逸 就当我为遇见你伏笔 天青色等烟雨而我在等你 月色被打捞起云开了结局 如传世的青花瓷自顾自美丽你眼带笑意 炊烟袅袅升起隔江千万里 在瓶底书刻隶仿前朝的飘逸 就当我为遇见你伏笔 天青色等烟雨而我在等你 月色被打捞起云开了结局 如传世的青花瓷自顾自美丽你眼带笑意 ![]() ![]() |
Posted: 27 Aug 2008 08:59 AM CDT 以下是7月的时候俺为自己定下的2008年下半年目标(部分),现在已经过去一个多月了,让我们看看完成的情况如何:
这是不行的啊啊啊啊啊!!!  ̄口 ̄ |
GameCareerGuide.com's Game Design Challenge: The Olympics Posted: 27 Aug 2008 04:00 AM CDT |
Posted: 26 Aug 2008 11:57 PM CDT 一个游戏设计师只要投入足够多的时间和想象力就能很好的掌握锁机制的正确使用。在一些游戏中(像上面提到的糟糕冒险游戏),错用锁机制会损害游戏性。但是只需要记住几个简单的准则就能保证锁机制的影响是积极的,并且能带来更好的游戏体验。 ...
|
Defining Boundaries: Creating Credible Obstacles In Games, Part 2 Posted: 27 Aug 2008 11:00 AM CDT |
Posted: 27 Aug 2008 05:14 AM CDT 要求有经验,有客户资源。
联系QQ:3503445
|
Posted: 27 Aug 2008 06:12 AM CDT 本文是参考《星际争霸II》的官方技术文档。(转游侠暴雪区) 原文档(PDF,英文)下载地址为:http://ati.amd.com/developer/SIGGRAPH08/Chapter05-Filion-StarCraftII.pdf |
|
|
|
|
|
一些效果演示图: |
《希魔复活复刻版》(Bionic Commando Rearmed)破解版[Bin] Posted: 27 Aug 2008 05:19 AM CDT ![]() 做源服务器:eDonkeyServer No1 中文名称:希魔复活复刻版 英文名称:Bionic Commando Rearmed 游戏类型:横版射击 游戏制作:GRIN 游戏发行:Capcom 官方网站:http://www.bioniccommando.com/en/pages/BCR_Game_Overview 讨论专区: http://3dmgame.chnren.com/bbs/showforum-153.html 虚拟光驱加载bin/cue,安装游戏,把CRACK里的文件覆盖到游戏目录 重要提示:部分进游戏报错的玩家反映,卸掉卡巴斯基就能玩了,同时也有玩家说卡巴斯基2009并不妨碍游戏。可见本游戏与某些版本的卡巴斯基存在冲突 [QUOTE]最低系统需求 Microsoft? Windows? XP (Service Pack 2)/Microsoft? Windows? Vista Intel Pentium 4 2 Ghz/AMD XP 2200+ 1GB RAM 650 MB free hard drive space 128 MB DirectX? 9c compatible card/ nVIDIA? GeForce 6600 GT/or ATI equivalent DirectX? 9 compatible sound card Internet connection Keyboard 建议系统需求 Microsoft? Windows? XP (Service Pack 2)/Microsoft? Windows? Vista Intel Core 2 Duo E6400/AMD Athlon 64 X2 4200+ 1 GB RAM 2 GB free hard drive space 256 MB DirectX? 9c compatible card/ nVIDIA? GeForce 7900/ ATI Radeon? X1850 or better DirectX? 9 compatible sound card Internet connection Xbox 360 Controller for Windows[/QUOTE] 【游戏简介】 《希特勒复活复刻版》以1988年所推出的FC版《希特勒复活》原作为基础,采高解析度全3D绘图方式加以重制,承袭原作玩法与内容,并加入众多原创要素。 游戏配合次世代硬体平台的处理效能,以高解析度全3D绘图重新建构原作的角色与场景,透过动态阴影、粒子特效以及场景破坏等先进视觉效果来呈现更华丽的画面。角色设定部分则是由CACPOM旗下知名画家森气楼(原SNK代表画家)执笔重新绘制。 游戏承袭原作的2D横向卷轴玩法与关卡内容,并强化战斗系统、追加隐藏新关卡、支援双人合作过关玩法,让玩家重温系列作首创的「钩索行动」玩法。支援跨游戏互动的功能,当玩家通过游戏的特定关卡后,即可开启续篇新作的新内容与过关提示。 【游戏截图】 DarkCoder presents: Bionic Commando Rearmed August 2008 Follow these instructions: Mount in DT and install the game Copy the content from the Crack folder on the CD, into your installed game folder Play the game Note: If you want to use my crack on with your own production, then remember to credit me! |
This posting includes an audio/video/photo media file: Download Now |
Posted: 27 Aug 2008 03:00 AM CDT
My question: to what extent can either of these games be enjoyed outside of the dedicated gamer niche? My immediate feeling is "not even remotely". After all, isn't this precisely the reason that the adventure game niche collapsed? Because the players in the mass market didn't enjoy (or couldn't solve - it amounts to the same thing) the difficult puzzles. Corvus' thoughts on Braid's narrative elements are also apposite in this regard. If these games can't be enjoyed by more than a small proportion of people, we probably shouldn't hold them out as exemplar cases of "games as art" unless we have no interest in games being taken seriously as an art form by the populace at large. Are there any games yet which might work in this wider context? (I know my friends over at Tale of Tales are trying!) What do you think? Update: There was some misconstrual of my position here. To clarify: I am not claiming that it
is necessary to art that it attracts a large audience - this is clearly
not the case. What I am claiming is that something which can only be enjoyed by a minority of people has a problem with its claim to
artistic status. See the comments for further discussion of this point. |
Posted: 27 Aug 2008 03:36 AM CDT 发现本写游戏行业业内工作生活的小说,叫啥《欲梦浮生》自己去网上搜,那人真敢真写啊,相当的无语
|
《模拟人生 2:公寓生活》(The Sims 2: Apartment Life)中英文合版CLONE版 Posted: 27 Aug 2008 01:08 AM CDT ![]() 共用伺服器: Razorback 3.0、Razorback 3.1、!! Saugstube !!、eDonkeyServer No1 共用服务时间: 全天不定时 免责声明: 该下载内容仅限於个人测试学习之用,不得用於商业用途,并且请在下载后24小时内删除。 资源版权归作者及其公司所有,如果你喜欢,请购买正版。 【游戏名称】:模拟市民 2:公寓生活 【游戏别名】:模拟人生 2:公寓生活 【外文名称】:The Sims 2: Apartment Life 【制作厂商】:美商艺电/Electronic Arts 【游戏发行】:美商艺电/Electronic Arts 【游戏语种】:繁体中文、英文、韩文 【游戏类型】:策略模拟/Virtual Life 【游戏人数】:1 人 【主机平台】:个人计算机/PC 【发售日期】:2008年8月 【官方网址】:http://www.ea.com.tw/Products/Products_Info.aspx?ID=762 【游戏简介】 ※ 请注意:此游戏为资料片,需搭配《模拟市民 2》主程式方可执行。 在狭窄空间中,为你的模拟市民带来的戏剧性、幽默、刺激的公寓生活 你的模拟市民搬入了崭新的公寓,他们的生活将截然不同!随著探索周遭新环境、会见新人士,他们将展开一连串的冒险、趣事和戏码。他们会带著小孩前往当地游乐场、在咖啡店廝混,或是造访公园学习霹靂舞? 狭窄空间意味著新契机-迁入志同道合的室友展开活跃的社交生活、透过适当的社交网路拓展你的职场生涯,或是在楼下的迎宾大厅里寻找真爱。无论他们住在附庸风雅的改装阁楼、究极工作室单身套房,或是有私人管家的豪华公寓,你的模拟市民都将体验多采多姿的公寓生活! 搬入完美的公寓: 适合年轻情侣、舒适宽敞的阁楼,或是与朋友合租、有多间卧室的公寓。 与一群新鲜的模拟市民往来: 时髦有形的社会名流、附庸风雅的放荡傢伙、爱好运动的人士、蒐藏新奇玩意儿的电子迷,以及急躁的程式设计师。 充分利用公寓生活的好处: 从社交网路到结交新朋友、拓展他们的职场生涯,或是追寻爱情。 为模拟市民的全新名声量表加分: 有了良好的名声,你的模拟市民可以找到适当朋友协助他们达成目标! 控制多户人家: 你的模拟市民将过著快乐融洽或是滑稽衝突的生活? 【系统需求】 作业系统:Windows 98SE / ME / 2000 / XP 中央处理器:1.3 GHz 或以上 记忆体:256 MB以上(若安装超过 5 个资料片或是组合,则需 512 MB记忆体) 硬碟空间:1.5 GB 以上硬碟空间 光碟机:16 倍速以上光碟机 显示卡:支援 DirectX 9.0c, 具 32 MB 以上记忆体之显示卡,且支援 T&L 功能,并仅支援 ATI Radeon 8500 以上 及 NVIDIA GeForce2 GTS 以上之晶片组 关於美商艺电 美商艺电Electronic Arts(EA)总公司设於加州红木市,是全球互动娱乐软体公司的领导者。公司创立於1982年,EA的主要营运范畴为於全球进行研发、发行以及销售个人电脑、行动电话游戏及电视游乐器相关软体。美商艺电将旗下的软体产品分成四个品牌商标销售於全世界:EA SPORTS?、EA SPORTS BIG?、EA、EA POGO?, 2006会计年度EA收益为美金三十点九亿,当年度有超过二十四套商品缔造销售超过百万套的纪录。EA ?品牌下的游戏包括荣誉勋章系列、极速快感系列、终极动员令系列、战地风云系列、哈利波特系列游戏、模拟市民系列游戏以及魔戒系列游戏等,1997年初正式成立美商艺电股份有限公司台湾分公司,目前美商艺电(EA)在台湾的发行包含PC, XBOX360,XBOX,PS3,PS2,PSP,NDS及GBA平台,未来更会将其他平台的游戏引进台湾, 让台湾的玩家能享受到高品质的游戏软体。更多关於EA产品的资讯,以及新闻稿全文可以参考(http://info.ea.com)以及台湾中文官方网站(http://www.ea.com.tw)。 【游戏截图】 |
|
《希魔复活复刻版》(Bionic Commando Rearmed)破解版[Bin] Posted: 27 Aug 2008 12:44 AM CDT ![]() 做源服务器:eDonkeyServer No1 中文名称:希魔复活复刻版 英文名称:Bionic Commando Rearmed 游戏类型:横版射击 游戏制作:GRIN 游戏发行:Capcom 官方网站:http://www.bioniccommando.com/en/pages/BCR_Game_Overview 讨论专区: http://3dmgame.chnren.com/bbs/showforum-153.html 虚拟光驱加载bin/cue,安装游戏,把CRACK里的文件覆盖到游戏目录 重要提示:部分进游戏报错的玩家反映,卸掉卡巴斯基就能玩了,同时也有玩家说卡巴斯基2009并不妨碍游戏。可见本游戏与某些版本的卡巴斯基存在冲突 [QUOTE]最低系统需求 Microsoft? Windows? XP (Service Pack 2)/Microsoft? Windows? Vista Intel Pentium 4 2 Ghz/AMD XP 2200+ 1GB RAM 650 MB free hard drive space 128 MB DirectX? 9c compatible card/ nVIDIA? GeForce 6600 GT/or ATI equivalent DirectX? 9 compatible sound card Internet connection Keyboard 建议系统需求 Microsoft? Windows? XP (Service Pack 2)/Microsoft? Windows? Vista Intel Core 2 Duo E6400/AMD Athlon 64 X2 4200+ 1 GB RAM 2 GB free hard drive space 256 MB DirectX? 9c compatible card/ nVIDIA? GeForce 7900/ ATI Radeon? X1850 or better DirectX? 9 compatible sound card Internet connection Xbox 360 Controller for Windows[/QUOTE] 【游戏简介】 《希特勒复活复刻版》以1988年所推出的FC版《希特勒复活》原作为基础,采高解析度全3D绘图方式加以重制,承袭原作玩法与内容,并加入众多原创要素。 游戏配合次世代硬体平台的处理效能,以高解析度全3D绘图重新建构原作的角色与场景,透过动态阴影、粒子特效以及场景破坏等先进视觉效果来呈现更华丽的画面。角色设定部分则是由CACPOM旗下知名画家森气楼(原SNK代表画家)执笔重新绘制。 游戏承袭原作的2D横向卷轴玩法与关卡内容,并强化战斗系统、追加隐藏新关卡、支援双人合作过关玩法,让玩家重温系列作首创的「钩索行动」玩法。支援跨游戏互动的功能,当玩家通过游戏的特定关卡后,即可开启续篇新作的新内容与过关提示。 【游戏截图】 |
Posted: 26 Aug 2008 08:31 AM CDT 这也是http://creators.xna.com上的一个示例。弹打飞碟游戏,3D的。
|
McAfee publishes virtual world fraud whitepaper Posted: 28 Aug 2008 10:17 AM CDT ![]()
|
Acting Like an Idiot Is Not Exactly a Good Way to Get Anywhere Posted: 28 Aug 2008 09:39 AM CDT It must be like 7-8 years since I last got upset over something work-related. Today, I unfortunately acted like an idiot. I had a pretty heated conversation with one game developer and attacks were done back and forth. It was stupid, and definitely not a professional way to deal with issues. (I don’t have a clue what made me get into this verbal fight). At one point of the discussion I started using my brains, and stopped to think whadda heck is going on here? Why am I defending myself like this? I’ve always told people that they don’t need to prove or defend themselves to anybody else. I really wondered how come I went into defensive mode. I seriously don’t understand this. The bottom line is that in life I do what I want in a way that’s hopefully as positive as possible, and if people don’t like what I’m doing then they don’t. It’s as simple as that. There’s no need to prove anything to anybody. Anyway, I think I managed to positively contribute in the discussion in the end, and helped getting it back to the right track. I was still bit pissed off, but at least the war was over. I thanked him for his opinions and said he is experienced developer. I tried to find good points and admitted my own shortcomings in certain areas. After saying bye, I started to think how I should treat with this person. I thought that if we’d talk more, we’d just run into more fights or somewhat negative attitudes. I wanted to make things right, because if we wouldn’t talk anymore it could leave a bad feeling about the incident. I felt I was trapped: if I’d talk with him, it could probably lead into a new fight over something. If I would stop talking to him, I think there could be some bad feelings that would be harmful. Then it struck to me… If you act like an idiot, you can try make things okay by apologizing And after that, I wouldn’t be seeking to discuss with him. In my opinion, there was fault in me, but I also think that our personalities or something might not match, so it’s perhaps better for both us to stay far away from each other. By apologizing my behavior (and truly meaning it) I’m correcting things (hopefully), and I can move on. There’s no bad blood between us anymore (well, at least not on my side - of course I cannot be 100% certain what the other guy thinks) and there’s no reason for me to be defensive or prove something to him. End of story. Man I feel like an idiot getting into stuff like this. |
Posted: 28 Aug 2008 10:01 AM CDT 《第二人生:Second Life》是由美国旧金山的「Linden Research」所开发,游戏中注重于模拟现实人生角色的扮演以及和其他玩家的互动,鼓励玩家在网路上创造出自己另一个人生。在《第二人生Second Life》中,玩家不需要进行无谓的练等解任务,或闯各种游戏关卡,一切模拟真实生活会发生的事情,随你要开拓事业、进行交易买卖,或是游走在各种社交活动中都可。当然你有钱(虚拟货币)的话,也可以做现实生活不太可能体验到的事情,像是盖博物馆、买游艇、收购企业、拥有自己的城堡等等。
线上游戏本来就是小型社会的缩影,一旦连游戏题材也以生活为主题时,玩家可以在这个虚拟世界尽情去做自己现实想做或不敢做的事,甚至在线上游戏找到属于自己的另一半也不奇怪;在上週惊传出一名现年 33 岁的女子「Kimberly jernigan」,因不满《第二人生》现年 52 岁的线上男友与他分手,愤而计划绑票犯罪行动。 他们分手之后,事后有依女方要求进而一步见面,女方宣称在八月初与男方一同驾车前往宾夕亚尼州的工作场所,进而瞭解男方的工作地点后,女方才起了犯罪的动机。经过警方调查,Kimberly jernigan 在事后两个多星期,跟踪男方回家,追踪到男方的住址,而且还是假扮成邮差来进行调查。她运用了玻璃刀潜入了男方家中进行埋伏,准备了手铐、BB枪、胶带以及她的爱犬 Gogi,待男方一回家便用手铐与BB枪、胶带綑绑了男方。 在她自以为万无一失时,男方机警的运用工具破开胶带逃脱报警,行迹败露的她便逃之夭夭;经过警方调查,她遗留了她的爱犬 Gogi 在浴室内,而且浴室内散落着许多用来阻止男方发出声音的胶带,警方随即展开追缉,在马里兰州郊外的一处休息站发现了她的踪影,经过一番抵抗扭打后,警方顺利逮捕了 Kimberly jernigan。 |
Posted: 28 Aug 2008 10:01 AM CDT 想成为刘翔?这不是梦想,在虚拟的奥运会中,我们可以成为任何一个心目中的偶像,化身姚明轻松投篮,试做费德勒抢夺金牌,在虚拟世界中,我们同样可以享受奥运会的真实盛况。
我的奥运会 “参加射击还是跳水呢?”玩家嘟嘟犹豫再三决定这两个项目都不放弃,在虚拟世界中,她可以随便参加自己喜爱的运动项目,在奥运会未开始之前就过足奥运瘾。当3D走入用户的视线,体验其中的自由和真实成了玩家们的最大乐趣。 由世嘉(SEGA)公司研发的奥运游戏《北京奥运2008》在未发售之前就吊足了玩家的胃口:在射击比赛中,先用X、Y两个坐标轴确定目标精度,将两个坐标轴的焦点尽量定位在标靶中心,击发,裁判宣布结果,掌声响起。这个过程虽比不得真实比赛,但握着实际存在的气手枪,瞄准击发,那一刻的激情与享受现场观众的掌声的快感是传统游戏所不能比拟的。 在《Second Life》2007年12月举办的首届虚拟奥运会上,来自国内外的30多位体育爱好者参加了比赛。比赛由红蓝两队组成,进行了约40分钟,运动员们参与热情极高,参赛者们在赛后还获得了组委会颁发的奖金。 而青岛市在2007年5月推出的虚拟奥运主题城,让普通市民也可以享受3D带来的奥运新体验。这个虚拟的主题城里面有奥运场馆和水上基地,市民们可以在虚拟场馆中体验奥运文化。 这些新的体验来自3D技术所带来的真实感,用户们或积极投入参与,或观望,而背后的3D开发商们都卯足了劲,准备在3D奥运的赛场上一争高下。 同台竞技 3D真实吸引的不仅仅是用户,还有看好这片肥沃市场的各个公司。在奥运临近之间,它们更是希望推出更好的服务,吸引用户的参与,提高用户的奥运体验。 研发奥运主题游戏《北京奥运2008》的世嘉公司(www.sega.com.cn)早在2004年就研发了奥运主题游戏《雅典奥运2004》,获得的效果让世嘉看好了《北京奥运2008》的前景。曾任职世嘉的扬耀网络科技有限公司总裁陈滨也对3D虚拟世界情有独钟,他在接受《互联网周刊》记者采访时透露,扬耀目前也正在研发一款名叫Mworld的虚拟社区产品,“在这里,用户可以完全按照自己的想法,装扮一个具有奥运风格的家。” 专注于虚拟世界的不仅仅是世嘉和扬耀,在《Second Life》之后,国内3D虚拟世界也开始热闹起来,他们打出的奥运牌也各有花样。 北京优万科技公司的虚拟社区“由我世界”已过了封测期,该公司总裁叶蓬在回答本刊记者提问时表示:“奥运期间,‘由我世界’中将会有更多用户自发举行的奥运活动,我们将提供支持和引导服务”。此前,“由我世界”中的用户自发组织了制作奥运五环的活动。 而处于内测阶段的HiPiHi则举办了第一届HiPiHi世界运动会,“这是针对现有居民的一个体验式娱乐活动,居民可以报名参加一些有意思的体育比赛项目,增进感情。”HiPiHi市场经理曹宇向《互联网周刊》介绍道。他表示,HiPiHi鼓励居民自发组织奥运相关活动,让用户能够亲身体验到在现实世界中无法完成的满足感。 “创想王国”不久前开通了虚拟奥运影院,用户可以在奥运期间通过3D虚拟社区获得最新的荧屏资讯,其宣称清晰的画面和流畅的速度,将毫不逊色于真实电视效果。 让虚拟更真实 在这个被越来越多目光关注的虚拟领域,产品固然重要,用户的体验也显得特别突出,但其中的瓶颈也值得业界人士思考。 虚拟中的真实固然吸引了不少用户,但是仍有很多用户徘徊在3D的门外:“会有技术门槛吗?不会3D操作怎么办呢?真的如现实交流中那么流畅吗?”技术门槛让潜在的用户望而却步。 相对于2D技术,3D技术独特的优势是三维展示可以让用户体验到更加真实的场景,但现在国内3D技术还处在发展初期,如何让用户的奥运体验更加真实,其中还有一些难度。 “3D奥运的重点有两个,一是用3D技术展现场馆,用社区来增加互动,让民众点评和留念。二是虚拟奥运会可以通过体育游戏,让奥运变成真正人人参与,让奥运变成草根,走进家庭。”陈滨这样定义他眼中的虚拟奥运会。陈滨表示,在用户进入虚拟世界后,运营商面临的一个重要问题就是如何解决用户的孤独感。据他透露,扬耀将从运营方式入手来解决这个问题。 优万科技的叶蓬则认为技术和用户体验是将影响3D奥运的两道坎。“虚拟奥运可以增加人们对于奥运的激情,但用户在奥运中的体验是否跟在真实中的一样,这个还需要突破技术难题。”他认为这个技术问题是需要业界共同努力,让虚拟世界更趋向于真实。 另一个不得不考虑的问题是,带宽是否能让用户的体验更加连贯。在《Second Life》的首届奥运会上,有用户就因网络延迟而导致比赛成绩不佳,这严重影响了用户的体验,也让业界为好的产品得不到完美的应用而遗憾。 相对于以上问题,业界人士更加关注的还是对用户市场的培育。“比较3D和2D的不同,还是可以看到虚拟社区发展的方向,但是这中间对于用户的培养还是需要一个过程的。”叶蓬认为业界的共同努力是做大这个行业必不可少的因素。曹宇表示有同路者是好事,“大家可以共同促进这个新产业的发展。”陈滨也持相同观点:“目前我们是做好了深挖洞、广积粮、打持久战的准备,我们相信虚拟世界中的真实能够吸引用户。” 对于奥运的激情让用户们跃跃欲试,也让3D业界更加有信心,他们对于3D技术的前景抱有非常乐观的态度。曹宇认为3D中的那种沉浸式体验、高仿真的环境是2D所不能及的。陈滨相信当越来越多的行业都实现了3D化以后,市场更需要的是一个整合的平台。而如何让虚拟离真实更近,如何让用户拥有更好的体验,是业界人士思考并践行着的话题 |
Posted: 28 Aug 2008 08:41 AM CDT 前记: 这是一篇同步发于我的CSDN博客文章,其思路主要来自于网游产品的研发。我认为,网游研发,是一种非常典型的互联网应用,要技术有一定的技术,要团队配合也需要团队配合,要市场研究也必须进行市场研究,给我们提供了一块充分发挥想象力和创造力的空间,这种感觉,很快乐。 互联网产品研发最大的特点是什么?一是需求变化快,二是研发周期短。谁能以更快的速度满足最新的需求,谁就能取胜。 上一篇,我谈了互联网产品要具有自我营销的理念,但仅仅有理念还是不行的,道理谁都会讲,我们需要的是办法,是实实在在的措施,我们需要知道应该从哪些小的方面入手去一步步把产品作踏实了。 也因此,我总结了互联网产品进行自我营销的几个关键点,自我营销包含的内容很多,我只是列出了一些绝大多数产品都可以把握的东西,其它更深层次的内容需要你自己去根据自己产品的特点再深度挖掘,以下是我的总结,仅供同行参考:(思路来自于网游产品的自我营销理念) 1.新手的引导流程: 重点是考虑如何引导一个从未使用过你的系统的新手用户用“最少的精力”,以“最快的时间”去熟悉系统“最常用”的功能。“最少的精力”,是说不要让用户花太多脑筋去思考怎么用;“最快的时间”,是说不要让用户花太多的时间去重复繁琐的步骤;“最常用的功能”,是说不要指望用户把系统所有的功能都一一使用过,我们在最开始的时候,只把最常用的功能介绍给用户,而且,要力争在第一次使用时就完全把他教明白,记得住,要达到第二次用时就能很快上手的效果,至于,常用功能之外的其它小功能和小细节,可以让用户在体验主流程时去自己尝试。这里,还有一个关键点,那就是要“尽可能地流程化”,就是说,在介绍功能时,最好能按流程一步步让用户操作下去,直到让用户熟悉了我们想让他熟悉的系统。之所以这么强调“流程化”,是想让用户使用系统时达成一种惯性,到了哪一步自然就知道下一步该干什么,而不是再去费神琢磨。“新手引导流程”的目的,是把一个新手变成一个老手。 2.新功能的引导和介绍: 这一点,与上面的“新手引导流程”并不矛盾,这主要是指处于成熟运营期的产品,在发布新功能时,要适当引导用户来尝试使用新功能。当然,这里的新功能应该是从用户需求角度而实现的,并不是单纯技术人员的技术尝试,引导的方式也可以不仅仅是文字提示,还可以加入其它更丰富的提示内容,比如CSDN个人空间的音乐分享这个功能,就可以由系统默认分享那首程序员的歌来提示用户可以分享音乐了。简单一句话,就是说,提示的形式可以多样化。“新功能引导和介绍”,是让一个老手去熟悉新功能,使用新功能,乐用新功能。 3.已有功能点之间的相互营销: 比如,CSDN的个人空间和个人博客,综合起来,有这些方面的功能:写文章,交朋友,找专家等。“文章”,“朋友”和“专家”,就构成了个人空间和博客的三大资源,如何更有效的使用这三大资源,更好的分别壮大这三大资源,就需要多考虑三大功能之间的相互营销。举例来说: 新手发文章时,发完后,系统可自动给出此文章所涉及领域的相关专家推荐(我看论坛里已实现,不知道博客能不能也实现),如果系统自动推荐比较难作,也可以改成新手的好友可以手工向这个新手就此文向他推荐专家的功能。甚至,我们想得更远一点,一个真正的新手,刚到CSDN时,必然是“举目无亲”的,那么我们CSDN是不是可以考虑建立一种“师傅带徒弟”的导师关系,让新手可以拜专家为师或者拜CSDN上的排行榜里的名人为师,而为师的,又可以利用上面手工推荐专家的方式为新手推荐其他更多的专家,而所带的新手数量和质量又可以成为专家排名的参考值之一。总之,要想办法让“文章,朋友,专家”这三个资源之间形成彼此支撑的局面,让整个产品成为一个整体而不是孤立的功能点。 4.用户疑难,意见建议及客服反馈: 用户在使用系统的过程中,必然会存在一些使用上的疑难问题,要注意收集这些疑难问题,把这些问题的答案放在合适的位置显示给用户看。比如,写文章的疑难问题的相关解答,就可以放在文章编辑界面;加好友的疑难问题相关解答,就可以放在“我的首页”的一个TAB上,等等,诸如此类。核心思想是:不要想着把所有问题的所有解答,只简单的列在一个统一的URL里,在这些细节方面体现对用户的体贴。还有,剩下的几个问题都是老生常谈了,但不说还不行,比如,针对一些用户普遍关心的问题,应该有个类似系统公告栏的东西,列出:新功能开发计划,BUG修正计划,新功能建议(但暂不开发,比较远的计划)等等,让用户对系统的下一步情况更了解,形成开发者与用户之间的有效反馈。 这样,通过以上的四个方面,基本上就构成了一个产品从推出产品,到推出新功能,体验新功能,再到反馈新功能的完整流程和良性循环,不仅仅达到了营销的目的,也同时达到了研发和运营的目的。 我们这些作互联网的,应该感到很幸福,因为我们不用象传统软件那样,卖软件时跟卖保险似的作上门推销,我们基本上还是只需要分析用户心理,关注网民需求以及关注产品本身的自我营销就好了,但即使这一点,试问一下你我自己的项目,我们作到了吗? |
Posted: 28 Aug 2008 09:36 AM CDT It is well understood that the game structures and mechanics that undergird most commercial virtual worlds today draw their underlying DNA from Diku-style text-based MUDs, though many contemporary players have only experienced the latest iterations or forms of those game mechanics. Many of these features are now so familiar and expected, so much a part of the grammar of play activity, that developers seem to implement them without asking what purpose or role they will serve in a particular gameworld. Moreover, precisely because these features have become so foundational, it seems difficult to think of new approaches or game mechanics, even those that offer only a mild twist. But even a single such innovation can do a lot to spark new interest among players. By way of illustration, a look at two such mechanics in two fairly new commercial virtual worlds, Age of Conan and Warhammer Online. (The latter is approaching open beta, with a release later in September 2008, but the NDA has been lifted .)
The Drop The drop, objects or money taken from dead or defeated enemies (usually but not universally computer controlled), is the central economic engine of all Diku-descended virtual worlds. Even resource extraction from the topography of the gameworld itself (mining or picking herbs, for example) usually follows the structure of the drop, only without the preceding combat. Value is contained within the corpse or object, revealed by player interaction. Most enemies (aka “mobs”) yield a direct currency payment that in theory should be appropriate to the challenge that the enemy represents. In many Diku-styled games, relatively ordinary or simple opponents may randomly yield an occasional item of high value, where that value is either realized directly through personal use or indirectly through exchanging the item with another player. Some of these are items which can be directly used by players to improve their ability to battle computer-controlled enemies and other players. Some of these are components or parts of a useful item that can be assembled later by someone who has acquired all the ingredients or pieces. Some components require possession of a particular trade skill in order for the player to be eligible to acquire them. A World of Warcraft character with skinning can convert some corpses into pieces of leather, while a Warhammer character with scavenging can acquire additional items, some of them components needed in other trade skills. Many quests also create special drops such as particular body parts or objects which the player can find for the duration of the quest, but once the quest is completed, such drops are no longer found. More routinely, drops are items with no special additional value (often known as “grey” drops after the WoW convention) but can be sold to computer-controlled vendors for a currency payment (hence the term “vendor trash”). In more than a few Diku-styled games, such drops have been only marginally tied to the fictional context in which they were obtained. Early on in World of Warcraft, for example, many enemies dropped a startling array of objects and body parts, many of which had no plausible connection to the mob itself. Over time many of these games tend toward mild rationalization of such drops so that enemies drop currency-equivalent items that have some marginal connection to their nature. Such rationalization also tends to reduce the variety of such drops so that they can be stacked within a single inventory slot. This opens up the key question around the routine currency-equivalent drop, namely, “Why have it at all?” High-value item or component drops drive the overall economy of these worlds, and provide a tremendous amount of the motivation for continued play over time. NCSoft’s City of Heroes/City of Villains notably lacked drops for much of its early existence, and many players complained about the absence. The routine drop, on the other hand, is really nothing more than currency in another form. Why not just give players the gold, silver, copper, etc. instead of grue spleens and ghoul toenails? A limited argument could be made that the routine drop enhances the gameworld fiction by populating it with objects that are appropriate to the setting and mythology. But these are transient objects, not trophies. Most are visually represented only by a small icon that exists entirely within the player’s inventory and cannot be shown to other players or manipulated as visible objects in the world itself. A few such objects are witty or unusual enough that players may retain them for a while for amusement: vendor trash in World of Warcraft includes weapons like The Stoppable Force or novelty items like A Gnome Effigy. The game-mechanical reason for the routine drop is essentially to put additional weight on the mini-game of inventory management that is a major part of day-to-day activity in most virtual worlds. Players have to decide how much vendor trash to pick up given limited space in their inventories, which vendor trash is worth picking up, and when they should return from adventuring to the location of a vendor in order to covert these items to currency. But as such, the routine drop needs the same kind of calibrated attention to balancing cost and benefit that goes into every other aspect of a Diku-style game, and here is where problems sometimes arise. When something like the routine drop becomes, well, routine, something which is a part of gameplay simply because it’s expected that it should be, it paradoxically becomes a game-mechanic which disrupts the activity of gameplay because it is so nonsensical. Funcom’s Age of Conan provides a good example of this problem. Even in the more tightly-designed initial experience of the game, virtually every enemy drops a great deal of vendor trash. There is little differential in value between routine trash drops and so very little reason to make careful discretionary decisions about which to pick up and which not to pick up. (As opposed to World of Warcraft, for example, where grey weapons often have a much higher currency value and some grey items stack within a single inventory slot, making it possible to pick up many of them without crowding out other items.) Moreover, early player inventory in Age of Conan is relatively small, meaning that a player who picks up all routine drops will quickly fill the inventory within the time it takes to complete a single quest. An Age of Conan player who returned to a vendor every time their inventory was full would spend much of their time simply going back and forth from vendor to quest and back again. As a result, the landscape of Age of Conan is often densely cluttered with routine drops abandoned by players. The collective cost/benefit judgment of players renders the entire game-mechanic of the routine drop a pointless nuisance, which in turn suggests in one fashion just how much the whole design reproduces an industrial standard without really thinking about its purpose.
The Public Quest Thinking carefully about the purpose of a Diku-style feature obviously helps a virtual world to function better, but it doesn’t guarantee an escape from some of the contradictions and tensions inherent in the genre as a whole. A good example of this is the mechanism of the public quest in the forthcoming Warhammer Online. Warhammer’s public quests remind me a bit of the grouping mechanism used in the game Toontown. In Toontown, in part to make social collaboration easier for the target audience of children, joining a group is simple and automatic. A character merely walks up to players who are engaged with enemies and is added to the group up to a limit of four characters, for as long as a particular battle or instanced series of battles lasts. In Warhammer, many locations within the gameworld contain public quests. Any player entering these areas is automatically counted as a participant in the quest. Such quests are typically divided into three stages, each progressively more difficult and usually requiring larger numbers or more coordinated effort as it progresses, though many work perfectly well when players carry out independent actions towards the declared objective or goal. If the third stage of the public quest is completed, the relative contribution of individual players is calculated, and this value then is added as a weighting onto a roll for loot. The weight of contribution is relatively small, however, in order to give all players a reason to participate. If contribution were much more highly weighted, most players would likely refuse to participate unless they believed they were near the top of the scale as the quest progressed. The design goals for the public quest as a mechanism are fairly clear. First, to create a relatively spontaneous, enjoyable pretext for social collaboration that requires very little prior arrangement or negotiation, and to do so in the visible and public spaces of the virtual world. Second, to provide a novel incentive for repeating the same content multiple times which carries less risk than the conventional “pick-up group” (pug) in a game like World of Warcraft. A typical pug may take several hours to complete, if it is completed at all, and leaves players vulnerable to misconduct or incompetence on the part of other players. A public quest in Warhammer, on the other hand, takes less time, requires no negotiation, carries little risk, and a player can participate in a relatively diffident manner while still having some hope of reward. Repetition of content is important from a designer’s standpoint simply because there is no hope of providing inexhaustible amounts of novel content within the current design paradigm. Still, the architecture of the public quest does produce some strange anomalies that are likely to be an ongoing source of sharp disagreement between Warhammer players. In my own experience, I have twice won loot from a public quest merely by traversing the area in which the public quest was transpiring, without making any actual contribution. It’s pretty easy to guess what might follow if that was a common enough outcome and the loot were sufficiently attractive: some players might well “park” an idle character at the outskirts of a public quest, or otherwise exploit the mechanism to the frustration of those players who really are throwing a lot of effort into the adventure. If the loot is trivialized to discourage exploiters, then this also discourages legitimate contributions. If more weight is given to contribution, then spontaneous participation by lower-level players is punished, which takes away a good deal of the fun and very public character of the system. Nevertheless, I was really struck by the public quest system, and the extent to which it demonstrated that it is readily possible even within the highly defined structure of a Diku-style world to come up with lively twists to the established game mechanics which can then have a larger impact on the social experience of the players as a whole. That requires thoughtfulness about the purpose, character and consequences of the underlying genetics that come with the Diku blueprint.
|
Posted: 28 Aug 2008 08:11 AM CDT |
The Megatrends of Game Design, Part 1 Posted: 28 Aug 2008 11:00 AM CDT |
Posted: 28 Aug 2008 05:26 AM CDT 招聘:策划(要求有产品策划之类的经验。文底好,会整理以及撰写各类型的文案)
运营(渠道,商务之类经验的)
有意向的把简历发,请注明应聘职位,工作地点上海。
|
Posted: 28 Aug 2008 07:15 AM CDT 作者: hardiwang 发表于: 2008-08-28 19:28:34 (GMT 8) 简介:公司简介:上海佳游网络科技有限公司本公司专心致力于高品质游戏的开发,是国内最具实力的独立游戏开发商之一。 随着公司业务的扩大,我们需要更多的游戏业的有志之士的加入。 ...
|
Posted: 28 Aug 2008 06:21 AM CDT 一本好的 Python 书要么在广度上有建树要么就是深度。广度上来说,《Python编程金典》做得不错;深度上, 《python cookbook》和《可爱的 Python》系列文章比较好。而DIP 这种四不像让人看完后只会更迷惑。
|
Posted: 28 Aug 2008 12:43 PM CDT 我在blog中已经讲到研发的组织结构与分工,实施部门的组织结构与分工,就能解决你的第二个问题。
但怎么从现状形成我讲到的良好分工合作,最重要的就是
1开发人员不出现场
2实施人员负责需求讨论、需求收集、需求传递。
3开发人员根据实施人员的需求列表来安排工作任务,做到工作明确可追查可量化。
这样做完后,再参考我的系列文章,里面有后续的落地方法。
|
Posted: 28 Aug 2008 12:44 AM CDT 您好!
河南万宇IDC数据服务中心为您提供最好的服务
本公司主迎业务:主机托管 主机租用 带宽租用等.我们提供了专业的服务与资深的系统工程师为您的机器运行保驾护航。
本着为客户提供专业,优质,高效VIP主机托管服务的宗旨,以客户满意为目标,并严格按照“内部技术服务流程”来 ...
|
Posted: 28 Aug 2008 07:26 PM CDT |
Posted: 28 Aug 2008 04:40 AM CDT 今日有一个病毒特别值得注意,它是:“线上游戏窃取者变种POI(Trojan.PSW.Win32.GameOL.poi)”病毒。这是个偷取游戏密码的病毒,它会注入到系统Explorer.Exe进程中,查找游戏进程,窃取游戏密码后发送给黑客指定的网址。
本日热门病毒:
“线上游戏窃取者变种POI(Trojan.PSW.Win32.GameOL.poi)”病毒:警惕程度★★★,盗号木马病毒,通过网络传播,依赖系统:Windows NT/2000/XP/2003。
这是一个偷游戏密码的病毒。病毒采用Delphi语言编写,Upack加壳。病毒运行后会释放一个名称为随机8位字母组合的exe和名称为随机八位字母组合的dll文件,设置自身属性为系统,隐藏,改写注册表项实现自启动。病毒会把动态库注入到Explorer.exe进程中并查找进程中是否存在游戏进程,当找到游戏进程时,把自己注到游戏进程中,获取用户输入的账号密码并发送到指定的网址。运行完毕之后,该病毒还会删除自身,逃避杀毒软件的查杀。
反病毒专家建议电脑用户采取以下措施预防该病毒:1、安装正版杀毒软件、个人防火墙和卡卡上网安全助手,并及时升级,瑞星杀毒软件每天至少升级三次;2、使用“瑞星系统安全漏洞扫描”,打好补丁,弥补系统漏洞;3、不浏览不良网站,不随意下载安装可疑插件;4、不接收QQ、MSN、Email等传来的可疑文件;5、上网时打开杀毒软件实时监控功能;6、把网银、网游、QQ等重要软件加入到“瑞星账号保险柜”中,可以有效保护密码安全;7、登陆http://tool.ikaka.com下载并安装免费的瑞星卡卡6.0,打开防护中心开启全部防护,防止病毒通过IE漏洞等侵入计算机。
如遇病毒,请拨打反病毒急救电话:82678800。能够上网的用户可以访问瑞星反病毒资讯网:http://www.rising.com.cn或登录http://help.rising.com.cn使用在线专家门诊进行免费咨询
|
Posted: 28 Aug 2008 04:39 AM CDT 随着游戏市场的发展,现在越来越多的人开始关注虚拟交易,虽然到目前为止绝大多数的玩家对虚拟交易还是骂声居多,不过想一下网络游戏市场的发展最初也是在众人的谩骂声中走到现在的,心里也就不奇怪这种现象了。关于虚拟交易对网络游戏平衡性所带来的影响一直饱受争议,不过在这过程当中看到有太多的人对虚拟交易缺乏足够的认知。
首先,虚拟交易是网络游戏市场发展的必然性。大多数网络游戏的玩家都是出于娱乐和消遣,但为了在游戏中满足虚荣心或者游戏乐趣的需求,玩家们往往会通过各种渠道来获取所需要的物品装备,当然通过交易也就是最直接的获取方式了,所以说虚拟交易也是游戏市场发展不可避免的。
其次,虚拟交易方便了游戏玩家的利益需求。虚拟交易可以让玩家通过游戏获利,这样玩家在游戏中的所得就有了实际的意义。只要选择了合适的网络游戏,通过正常的游戏方式就有可能获得一定的收益。很多玩家愿意通过虚拟交易节约自己的游戏时间,也有很多玩家愿意出售虚拟财富来增加自己的收入。
最后,虚拟交易的合理性。虚拟交易在某种程度上满足了玩家的一种需求,存在即合理用来形容虚拟交易再合适不过。它的合理性来源于三个方面,一是游戏自身设计的局限性,二是玩家需求的多样性,三是社会分配的差异性。就是因为有了这三方面原因,所以虚拟交易就自然而然的产生了。
|
Posted: 28 Aug 2008 04:27 AM CDT “中国的游戏产业起步晚,发展快,人才稀缺,游戏开发人员钱途无量。”这几乎已经成为了一种共识,高薪的神话让无数有志青年心动不已,趋之若鹜。事实上,游戏行业和所有其他产业一样,人才的需求和薪酬状况呈金字塔形,底层是运营、支持、服务等人才,中段是游戏设计与开发人才,塔尖才是主程序员、美术总监、策划总监等高级人才。处于金字塔尖端的主程,主策划,主美都是游戏项目的创意核心,年薪百万也属平常。而数量众多的运营,客服方面的人员薪水跟其他行业相比并没什么优势,月薪千余的比比皆是。 进入游戏行业,如果做金字塔的基座,从事技术含量不高的测试,客服等工作,其实与高薪没有什么关系。只有成为游戏制作的技术型人才,成为游戏开发者,才可能获得一个比较满意的收入。而只有技术精湛,实际工作能力强的游戏制作人才才能进一步往金字塔的顶端迈进。提高技术能力是游戏开发这一行唯一的高薪之路。 游戏产业在中国起步不过十来年,发展虽然非常快,但是技术原创性并不强。国内高校的相关专业也都成立于最近几年,缺乏积累,人才造血能力薄弱。纵观国内各大游戏公司,技术骨干力量要么是外籍专家,要么是著名国际游戏公司的海归华人。像Epic Games,Ubi,EA这些著名游戏公司登陆中国,客观上说,为国内的游戏行业孕育了第一批技术人才。近几年发展起来的国内游戏公司,原创团队和技术骨干,多半都和这些游戏开发巨头有着千丝万缕的联系,说它们是中国游戏开发业的黄埔军校并不为过。这些著名游戏公司掌握着游戏开发的核心技术,研发力量雄厚,游戏开发领域的技术进步很大程度上由它们在推动。 像Epic Games公司的Unreal 3游戏引擎,占有世界商用游戏引擎市场80%的份额,技术上的地位举足轻重。进入这样的公司工作,接触到的都是游戏开发行业中最尖端的领域,对于年轻从业者来说意味着更高的起点,更广的视野,在技术提升方面的作用是不言而喻的。而这些著名游戏公司在国内的发展也需要补充新鲜的血液,具有良好潜质的年轻人是它们非常欢迎的,每年它们在中国的分公司都会招聘新的开发人员。Epic Games在中国的分公司Epic Games China(英佩数码)领先一步,他们与著名游戏培训机构GA游戏教育基地密切合作,在人才培养方面走在了前面。 2008年8月Epic就业定向班的合作培养计划启动。GA游戏教育基地与Epic Games China合作的Epic就业定向班将完全由Epic方面派遣最优秀的一线开发专家授课,按照Epic游戏项目开发的实际工作流程编排课程内容。课程的教学质量将以Epic Games China的项目质量控制体系为标准,由Epic方面全程监控。每个阶段的学习结束后,都会按照Epic内部项目验收规范进行考核评估。 另外,Epic公司最著名的Unreal 3游戏引擎将会被系统地引入到Epic就业定向班的课程体系中来。这一款在全球商用游戏引擎市场上占据80%份额的著名引擎是Epic公司《虚幻竞技场3》和即将上市的《战争机器2》两款著名游戏的开发基础;为Epic公司在全球范围内赢得了无数奖项和赞誉。Epic就业定向班学员的主要就业导向是进入Epic Games China的开发团队工作,而这款在全球处于技术领先地位的引擎将是他们必须掌握的开发工具。GA是Unreal引擎在中国唯一授权的游戏培训学校,此次Epic就业定向班,来自Epic公司的技术专家将在GA的教学经验基础上进一步把Unreal 3游戏引擎技术的有关课程系统化,有机地结合到整个培训课程中来。 在就业方面Epic就业定向班的目标非常明确,学员在通过入学资格审核后,都会跟Epic Games China签订定向就业协议。合格的毕业生将进入Epic Games China的开发团队,并享有最低薪酬保障和9000元的学费返还。 定向就业班的开办,体现了Epic Games China在人才战略上未雨绸缪的长远计划。Epic方面表示,人才是游戏公司最宝贵的资源,引进人才是开采资源,而培养人才是发掘资源。Epic对于人才的重视是一贯的,对于人才的培养更是不遗余力的。 对于有志进入游戏行业的年青人来说,Epic Games China不仅具有雄厚的技术实力,是学习游戏开发最好的课堂。而且他们为新人的加入做了充分的准备,铺设了一条坦途。这无疑是一个非常理想的起点。当然,迈向游戏开发金字塔的顶端,最终还是要依靠自身的努力,技术能力是游戏开发领域不变的硬道理。 |
麦田守望者--走出软件作坊:三五个人十来条枪 如何成为开发正规军(四十三) Posted: 28 Aug 2008 12:16 PM CDT 《走出软件作坊》将于近期由电子工业出版社博文视点出版,要感谢诸多长久以来支持的网友大力支持与鼓励,也要谢谢博文的朋友们。
由于版权原因,所以我只能把草稿的一部份贴上来,还有40%的内容大家只能一睹书的芳容了。敬请大家期待。
---------------------------------------
我记得我刚入行的时候,企业客户的IT部门人员从数据库到代码开发、从需求调研到推动上线、从系统维护到硬件维修,样样精通。
在1990-1995年,是企业IT部门萌芽和发展的阶段。IT室还是打字室,电脑还是用绒布盖着的,入机房要换拖鞋,要穿白大褂,估计许多人都不知道这个阶段。
在1995-1998年,是企业IT部门最活跃的阶段,过去都是企业IT部门自己做局域网线水晶头,自己买散件组装PC,自己开发软件。
但是企业的应用越来越复杂,企业又不能把IT部门不断扩张成为一个小软件公司,于是必然走上外包的道路。这个阶段是从2000年开始的,我曾经做实施,替换下来的都是IT部门自己开发的软件。有的IT部门觉得自己大势已去,袖手旁观,有的IT部门
|
Posted: 28 Aug 2008 02:43 AM CDT 第四次北京网页游戏高端交流活动说明 参与人员:网页游戏公司创始人,网页游戏行业相关领域决策者,行业专家 第三次8月16日北京游艺春秋公司会议室 |
Posted: 28 Aug 2008 12:59 AM CDT 囧
![]() |
Posted: 29 Aug 2008 11:04 AM CDT 台湾学者李贞德的《公主之死》这本书,有一个副标题,名叫《你所不知道的法律史》。难得的是,对于我这种,没有什么“知道的法律史”人而言,也能拿起来看的下去。好歹有一点点周边知识,可以借此书的几个触点,尽尽然发散开去。不敢独享,也借由一点文字,来做读后心得的梳理,不至于因为不吃鱼太笨,导致放下书便忘了。
早年曾受家母之命,自学过几部法律方面的教材,可是临到婚姻与家庭法考试的时候,结果却大出我意料,本以为十拿九稳的一门,却落得不及格,令我丧失信心,也趁着大学毕业,远走他乡的混乱时机,丢了刚开了头的法律专业学习。当然,也就无缘接触此专业必考的《中国法制史》一科,以及更重要的《法理学》。《公主之死》这本书,谈的主题便是中国法制史上的一个时段,魏晋南北朝。虽然全书围绕着许多和“兰陵长公主驸马殴人致死案”类似的涉及妇女的刑事犯罪而起,牵连的根源却并未局限于刑事处罚的具体案例和判刑准则,而是从汉代以来的儒家家庭尊卑体系发散而开,为读者揭示出父权和夫权为中心的中国古代家族关系。当然,更重要的是,这也是法理之一。不过,法理也罢,道德体系也罢,都得从现实谈起,公元六世纪的中国现实,就是史称“大分裂”的南北朝时期,北方鲜卑立国,南方士族续着香火,少数民族一方面尽力融入汉族传统文化,另一方面又在以它自身的“野性”注入汉族的血液。兰陵长公主一案中,起着关键作用的灵太后,就是母系当权,女性地位突出的北魏王朝的代表人物。 作者本书中的着墨重点,从篇幅来看,似乎更倾向于魏晋时代女性问题。法律尔耳,不过是引发她对女性问题的探讨而已。从家庭暴力,到“五服”中反映的女性地位的变迁,以及妒妇和纳妾之间的矛盾与关联。对于最后一点,北齐的元孝友的观点好像一千四百年后库布里克电影中的那位奇爱博士:通过制度性规范,保障百官置妾的权利。各级官员应该按照流品等次,娶纳妻妾三女到九女不等,并且限定在一年之内,达到总人数……好像世道总如此,没本事的男人被别的男人欺负,他们只有用各种方式来欺负女人了事。妒妇也往往如此,她们受了屈辱,不能也不敢反对丈夫,只有拿小三出气。另外,书中还有对母权和女权的区分分析,以及在母亲杀父的情况下,儿女是否有权“容隐”条例的变迁。嫁出女是否还要承担父家连坐之刑等问题,这些似乎是本来不存在的问题,正如书的副标题说的那样,“你所不知道的”历史,令人侧目。 呵呵,也许你会感到奇怪,一千五百年前的女性地位问题,有那么重要么?无非就是几个历史学家想把某些空白处接续上而已。实际上却并非那么简单,因为研究古代,才能厘清当代法制中某些条款的渊源。也正因为如此,作者才会在楔子中谈到台湾地区民法近年来对涉及女性权利的修订,更是凸显出妇女史和法制史研究的必要。正如作者一而再引用的谢安夫人刘氏的话所说的那样:“周公是男子,相为尔,若是周姥撰诗,当无此也。”女性要想改变权利地位,只能从参与立法做起。书中还有许多细节值得回味,我虽然划了线,但是不及细细咀嚼。所幸,书并不长,才100余页,作者笔调客观,言辞之中甚或带点幽默,一点也不似看得让人想睡觉的学术“砖头”。好书值得重读,就看是在什么时机了。 ![]() ![]() |
Posted: 28 Aug 2008 12:23 PM CDT 每个人都是一个伪装者。 一边承诺,一边继续寻找猎物。 这样的生活是否真的有意义? 随机文章:. Indiana University 2008/08/29. 看活边了... 2008/08/29. 突然涌现的东西 2008/08/29. 瞬间 2008/08/28. 收藏到:Del.icio.us.
|
Posted: 29 Aug 2008 09:29 AM CDT |
Posted: 29 Aug 2008 08:10 AM CDT 俄 罗 斯真是一个神奇的地方。就是这个游戏让我对俄 罗 斯充满了好感。 hammerfall是我最期待的一个游戏。10m的容量承载了太多。美术设计,游戏关卡,音乐,还有惊人的物理效果。你绝对想不到这游戏只有10m,且游戏的版本号仅为0.21 ! hammerfall在08年的独立游戏节中入围了几个奖项,但是最后却空手而归,不知道是不是语言的原因,这么优秀的游戏最后一个奖也没得到....... 消息是从e文论坛传出来的,也是用google翻译的,看来懂俄语的人真是很少呀,可信度要打一点折扣。 但至少又两点是真可以确信的:
如果有懂俄文的朋友看到这个,能麻烦翻译一下么?感谢! 好像是一个俄文网站对hammerfight的介绍,不知道有没有有用的线索。 点击图片放大
贴几个自己做的游戏视频吧,原来做的,那时候声卡有问题,没有声音。
BOSS被我用道具扔死了 我是修炼暗器的 就是一片树叶在我手里可都是杀人的武器呀 (*^__^*) 这视频居然还是清晰的!!!
这个是加强版 加了字幕和慢动作 但是效果没这么清晰咧 http://v.youku.com/v_show/id_cg00XMTY2NTM0NDQ=.html
痛苦的攻关过程 最后竟然戏剧性的击中了燃料箱......一击必杀...... |
Sandbox becoming free, more free hardware: aurora Posted: 29 Aug 2008 10:01 AM CDT
I don't really know yet how to play Levelhead, but it has GPL-ed code and CC-BY-SA-ed art assets. This means it's good, right? Right? Well, I'll try to find out whether or not you can play it without having to cut a LCD display in mouth-sized pieces first.
There's news regarding Sandbox, the child-friendly Sauerbraten-based 3D game/engine/editor. A completely freely licensed version is in the works. (Code and media.) So, hopefully we'll have a release soon, which will be includable in Debian for example. I'm very interested in this project, as it's obvious aim is to make content/game-creation a child's play! MonkeyWorld 3D is a BSD Licensed scene editor for the jMonkeyEngine which I found through a thread on Radakan's forums.Radakan's WorldTool is currently frozen as the energy is now aimed towards the general MonkeyWorld 3D editor. Maybe even jClassicRPG will benefit from it. :) Speaking of Radakan: There's some tasty new gui design and concept art going on. Cool, I searched for "open source" on flickr and found a new toy: The aurora open source mixer. It's specifications and driver appear to be CC-BY-licensed. I'm not sure if the license is well suitable for hardware, but it does make the device attractive. I wonder if I can get enough motivation to get my soldering iron out. A GNU/Linux driver seems to be missing. |
New, Better, More: Epic's Approach to Gears of War 2 Posted: 29 Aug 2008 11:00 AM CDT
|
《半影:安魂曲》(Penumbra Requiem)资料片[Bin] Posted: 28 Aug 2008 06:01 PM CDT 不过这款游戏更像是一个扩展包而不是与前两作情节紧密联系,深入探索Tuurngait地区疾病感染内幕的独立游戏。游戏中你会遇到一些失散已久的朋友,不过他们不都是值得信任的,哪些是真相?哪些是骗局?你的直觉关系到能否生存下去。 ...
|
Posted: 29 Aug 2008 08:10 AM CDT hammerfall在08年的独立游戏节中入围了几个奖项,但是最后却空手而归,不知道是不是语言的原因,这么优秀的游戏最后一个奖也没得到....... kdfgfyde. hstpgxdn. 消息是从e文论坛传出来的,也是用google翻译的,看来懂俄语的人真是很少呀,可信度要打一点 ...
|
Posted: 29 Aug 2008 06:10 AM CDT 開始萌哥特風〜ゴス風畫起來很麻煩加油啊〜吾輩!
|
Day and Night Gameplay for Burnout Paradise Posted: 29 Aug 2008 06:03 AM CDT A big moment in Burnout history is just around the corner. We’re working flat out to bring you yet another free content pack for Burnout Paradise – and this one’s the Bike Pack! If you missed our recent posts, we’re trying something new with downloadable content this year. We want to completely change the game we brought you back in January with regular game changing updates. That means more than just a couple of cars and a new level. For the first time in a Burnout game, we’re bringing you motorcycles. We’ve already talked about the 2 bikes available from Day 1 and some of the bike-specific gameplay that’s on the way, but there’s more to this pack than that. We’re introducing night time to the streets of Paradise City and with it, some unique gameplay. When the pack arrives, just head for the nearest Junkyard and pick one of the bikes – either the Nakamura Firehawk V4 or the Nakamura FV1100.
From 8pm to 8am it’s night. We figured you’d want to decide how fast this comes around, so we made the clock customizable. You can easily switch between day and night and try out the different gameplay whenever you like. You can also control the speed of change – anything from 24 minutes to real-time (24hrs), if you’re up for an epic session!
We’ll be back with more next week – our final post before Bikes go live! And as always, if you want more details, head to our own website – www.criteriongames.com |
Posted: 29 Aug 2008 02:50 AM CDT 来源: www.levelup.cn 时间:2008-8-29 编辑: 六段音速 来自日本方面的最新消息,Square Enix预定于今天公布一项新的收购计划,而此次收购行动的对象,正是近来由于板垣伴信辞职风波而面临内忧外患的Tecmo。 虽然现在还不清楚此次收购的具体细节,但不难想象Square Enix借助收购Tecmo,将有望进一步拓展其在美国市场的业务范围,特别是Tecmo旗下拥有诸如《死或生》和《忍者龙剑传》这样在欧美备受欢迎的系列品牌。 另一方面,将擅长制作动作游戏的Tecmo以及Team Ninja这样的开发小组纳入麾下,也将有助于改善Square Enix的业务结构,避免由于对RPG类游戏过分依赖所可能导致的不平衡。 事实上这已经不是Square Enix第一次向日本本土的游戏开发商出手,早在2005年8月时Square Enix就收购了当时的Taito公司,随后在同年9月将该公司完全纳为自己的子公司。 一直以来,除了Halo以外,我最支持的就是Team Ninja的DOA和忍龙,如今板垣伴信离开了Team Ninja,一直很好奇以后还会不会出新的DOA和忍龙。如果被史可威尔收购的话,Tecmo应该会有更好的发展吧,顺便还可以期待一款最终幻想动作游戏。 标签 DOA, Square Enix, 忍龙相关日志
|
Posted: 29 Aug 2008 01:54 AM CDT 公司简介
上海维莱信息科技有限公司正式成立于2006年11月。它是以引进、推广、研发最新互联网及移动网技术为主的高科技企业,目前正致力于使用最新的互联网技术引进及研发基于网页游戏和手机平台网络游戏。
创新意识
从神奇的创意到最新的实用科技,探索永无止境,为用 ...
|
Posted: 29 Aug 2008 02:00 AM CDT
More nonsense from me next week! |
Guest Post: Wizardry 8 Designer Explains Arnika Road Posted: 29 Aug 2008 09:22 AM CDT Charles Miles, a member of the Wizardry 8 development team, takes responsibility for the much-maligned Arnika Road section of the game (which Scorpia likes to call, "The Terrible Road."). His self-appointed title was "Monster & Item Wrangler," and besides designing Arnika Road, he set up a lot of the data for the game. And - as luck would have it - after years of working on Zoo Tycoon games, he's finally back in the RPG business, working with Turbine. Scott MacMillan introduced us via email this week. Charles had some comments about Arnika Road, and about Wizardry 8 in general, which he has graciously allowed me to post here: People have screamed bloody murder about the Arnika road since Wizardry 8 was originally released. This is what the Arnika road was *supposed* to teach you:
Last but far from least, Wizardry 8 was one of the last North American RPGs to be unapologetically hard--we wanted surviving each level to feel like an achievement. In fact one of our concerns about Wizardry 8 was that it might be too *easy, *as crazy as that sounds today. We made Wiz 8 much easier than any of the earlier installments in the series (if you don't believe me then try, say, Wizardry 4) and we were worried the long-time fans might object. Anyway, I've always regretted that people had so much trouble with the Arnika road. If I were doing it today I'd do things differently--I might make it a bit easier and I would definitely put in a tutorial system that gave you guidance on how to survive. It's great to see people still playing the game, by the way. It's making feel all nostalgic |
Did you enjoy this article? Be sure and check out past articles and the comments HERE. Rampant Games: Games With Personality! Latest games at Rampant Games: Depths of Peril and Eschalon: Book 1 |
Happy birthday, blog: 10 years Posted: 29 Aug 2008 02:23 AM CDT ![]() ![]() The first posts on the ancestor of this site went up ten years ago today. The site was dark blue. It used this newfangled HTML tag called frames, and I added each post by handcoding the HTML and uploading the file to the server. I feel old. Some of the oldest things on this site date back before the site itself, to when I was a young punk designer of 25 or 26, cocky and arrogantly sure I knew everything. I turn 37 in a week. I like to think I’m still a young turk tilting at the windmills. Ten years ago, I started the site to archive some of the things I was telling the UO community and the LegendMUD community, things about the ways in which online communities can self-determine, things about how virtual worlds can serve as bridges, as ways to connect. To talk about how something people see as “mere games” can mean much more. I eagerly read everything I could by people like Randy Farmer & Chip Morningstar, Richard Bartle, and other pioneers. I collected aphorisms from mailing lists and gathered them into a reference source. I tried to share it back, to do my learning in public. In some ways, the site has become a book — most literally, in the way that A Theory of Fun was born from blog posts and snippets from MUD-Dev, but also in the over half a million words I have written here. ![]() "Wood site #2" -- there was a wood site #1 before that one. This is where the knotwork thing came from. I thought a good way to celebrate might be to turn things around on you. I am pretty sure that there are plenty of folks who haven’t been here that long — given that the site has gained several thousand daily readers i just the last year. So I thought I would ask some questions and use the anniversary as a chance to point people to some of the older material they might not have read. So I want to turn it around on you! I have questions for you! ![]() I don't seem to have the old art for wood site #1anymore... and there was one design older than this, all dark blue.
I have my favorites and am thinking of showcasing some of them over the next week, but I am curious, because I suspect that to some degree I am better known to many of you for what I have said than what I have done. So many of the things I have done aren’t really there to see anymore, but the things I have written and said are still here, for better or worse. So thanks for coming on the journey! Here’s to another ten years, another half a million words, and more learning in public. |
Posted: 29 Aug 2008 01:36 AM CDT 转自<家用电脑与游戏> 作者:醉酒狂牛
数月前食堂的一只麻辣苍蝇,彻底毁灭了笔者长久以来对川菜的喜欢。之后数日,新鲜出炉的A3外挂,令笔者再犯胃部肌肉痉挛半消化食物反涌之恶症,同时也彻底毁灭了笔者对A3的所有兴致。以上经历,在十年号家游杂志K文版块附有详情,有兴趣者可寻而阅之,不再赘述。 |
Piracy Is Not Theft (Fun Picture) Posted: 29 Aug 2008 12:13 AM CDT A friend of mine showed me this picture. Handy guide to those who wanna know what piracy is. (Don’t know who did it in the first place, so sorry for lack of credits. On the other hand, I’m sure he understand that I wasn’t stealing the picture, I was just pirating it…) |
Posted: 29 Aug 2008 12:05 AM CDT 好像距离上次发博文又有一段时间了,接着发在日本的照片吧。。。。。发到现在还没有发完 这里是一个中转地,人很多。 从这里可以继续向上登富士山,据说每年都有很多人从山脚下开始登山,一直徒步走到山顶就已经入夜了 登山装备一定要齐全。看我拿着借来的棍子假装很累 不知道为什么会有马和牵马的人 我们跟团么,所以不可能有太多的时间登山了,主要就是看了看五合目 接下来的时间,逛商店,买吃的和纪念品。说到这里我不得不说我在富士山上买的小零食实在是太好吃了 现在我正在挑选明信片准备从富士山上寄回去 商店门口 入住的酒店楼下有一个阿姨摆摊,她在卖自己手工制作的很有日本特色的头发饰物,毫不犹豫的买了一对可爱的小皮筋---我不是最近喜欢两条辫子么 那天天气不好,拍不到富士山的美景,所以我买了明信片留做纪念 |
Posted: 29 Aug 2008 12:01 PM CDT 当年很多游戏由于运营水平不高,导致很多内容没有得到充分利用,不过那已经是历史了,现在的情况已经反过来,很多开发商在坑害代理。
网络游戏不是一锤子买卖,因为没人能保证游戏能符合新的潮流,后期开发是很重要的。很多游戏一旦脱手,要么不再进行开发,让游戏逐渐被淘汰,要么预留一点点内容,像挤牙膏一样慢慢的开放。据说某游戏正式运营一年多后开放的内容,竟然是公测阶段就做好的,这些“新”内容和新的需求之间存在巨大落差也就不足为奇了。还有些版本或所谓的平衡更新,由于开发者的敷衍或故意,造成游戏越来越不稳定、不平衡,最终造成不敢再更新下去了,自然也就不用开发了。 运营能做的往往也就是办一点活动,可是很多游戏缺的不是活动,而是基本功能,如果游戏内容还是不变,作为活动的素材就很有限,活动后可以给的奖励也就很老套,活动自然也就没有吸引力。有些活动已经重复开了无数次,还要写各种不同的宣传文案,最后写得版本太多恐怕自己都觉得恶心了,可是又没有别的办法。 有些游戏在一开始规划的时候就是专门为坑人进行优化过的,就像个绣花枕头,有很多“系统”,看起来是内容很丰富的游戏,每个系统里只有很少的内容,非常不耐玩。做太多系统的结果往往让游戏本身变得“不系统”,这种游戏很难后续开发,如果有人员流动,还很难交接。不过这对他们来说都无所谓,因为根本没有打算后续开发。 |
Posted: 28 Aug 2008 08:53 PM CDT |
《自定义高尔夫2》(Customplay Golf 2)破解版[Bin] Posted: 30 Aug 2008 08:15 AM CDT ![]() YYets服务器高速做源 游戏名称:Customplay Golf 2 发行厂商:Fusion Software 开发厂商:CustomPlay 游戏类型:体育 官方网址:http://www.customplaygames.com/ [QUOTE]Minimum Specification Internet Connection Windows XP or Windows Vista 2.0Ghz Processor 1Gb Disc Space 512Mb System Memory 128Mb 3D Graphics Card DirectX9.0c DirectX compatible Sound Card Recommended Specification Internet Connection Windows XP or Windows Vista 3.0Ghz Processor 2Gb Disc Space 1024Mb System Memory 256Mb 3D Graphics Card DirectX9.0c DirectX compatible Sound Card [/QUOTE] 【游戏简介】 就象游戏的名字一样,本游戏给了玩家完全自由发挥的空间,在游戏中玩家可以按照自己的喜好创建球场,从表面,天空,天气到球场的构造都可以随你心愿来选择,游戏中玩家所控制的选手也是自由创建的,你可以随意创建从外形到习惯,以及能力各异的球手。2代中加入全新的编辑器,允许更快捷地创建多达27洞的赛程,包含新的物体、纹理、植被、灌木,玩家还可以导入上一代游戏的赛场设计文件。而且游戏具备真实的物理引擎,游戏提供子弹时间功能,让玩家可以欣赏自己的击球瞬间。 ? ??? ?? 哕 荥哌唼? ? 荥哌唼? ? 圮 曹 ? 苒? ? 曹 哌圹圮? ?苒? 槽? 咣圹?槽圮 苘圹圮苓 ? 槽圮苘苘苘圹圹圮 ?苒圻圹??槽鄄 ? ? 苒圹圻哌哌?槽鄄 槽圹圻鄄膊? 苘苘苘槽鄄 槽鄄 槽鄄?苒鄄 槽圮 槽鄄 鞍? 苒? 哌哌哌膊膊苓膊策卟膊? 哌? 鄄膊? 膊膊 膊膊哌膊曹?膊膊 ?膊膊 膊膊 鞍?膊膊 北北? 薇北臂薇? 薇北?膊膊厕北北 ?北北 北北 薇北臂鼙北 ?北北 北北 鞍?北北 鞍鞍??鞍鞍拜鞍 ?鞍鞍鞍鞍鞍薨鞍??鞍鞍 鞍鞍 ?鞍鞍鞍鞍??鞍鞍 鞍鞍 ? 鞍鞍 北北??北北陛北 ?北北避北北北北??北北 北北 ?北北陛北??北北 北策苒圹苓脖? 薏膊?稗膊膊膊膊 稗膊膊草膊膊薏膊草 膊膊 膊膊 稗膊膊膊膊??膊膊 膊膊策 卟膊膊 咣鄄 苒槽圻苒圻 槽圹鄄圹圻 槽圹曹懿圹曹槽? 槽圹?咣鄄 槽圻 槽圻 ??咣鄄 ? 哕圹哌 圻 苒槽圻 圻 ? 圹圹圻哌 ? ?捋鄄圯 ?咣圮圹??策 ? 咣 苓? ? 苒圹哌 ?唼苘 哌圹圹苘荥? ? 哌圹圮苘苘圹?Eboy 哕荥? ? 哌哌哌 S K i D R O W 苓 -> T H E L E A D i N G F O R C E <- 哕 哕 苓 哌哌哌哌哌哌哌哌哌?哌哌? ?proudly presents ? 哌哌?哌哌哌哌哌哌哌哌哌? ?圹鄄膊膊北卑? CustomPlay Golf 2 / CustomPlay Games 鞍北辈膊膊圹圹?? 避苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘? ? ? ? RELEASE DATE : 30-08-2008 PROTECTION : Activation + Custom ? ? GAME TYPE : Golf DISKS : 1 CD ? ? ? 咣策哌哌哌哌哌哌哌咣圻哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌 哌? ? 咣?Release Notes: 咣? ?? 荥 薏 苘苘苘苘苘苘苘苘苒圮 ?? ? 苒?? ?? 哌? ??CustomPlay Golf 2 - Create and play your own golf ?? ??course ?? ?? ?? ??All new editor, allowing bigger and better courses to be ?? ??created, faster and more easily ?? ?? ?? ??Up to 27 hole courses ?? ?? ?? ??Include playable driving, pitching and putting ranges in your ?? ??courses ?? ?? ?? ??All new libraries of objects, textures, panoramas etc ?? ?? ?? ??Includes the new and improved SpeedTree library of trees, ?? ??plants and bushes ?? ?? ?? ??Ability to add moving and/or animating objects to your ?? ??course ?? ?? ?? ??Import feature to enable you to load your old course from ?? ??CustomPlay Golf into CustomPlay Golf 2 and play ?? ??them ?? ?? ?? ??Improved draw distance, allowing the entire course to be ?? ??displayed in the distance ?? ?? ?? ??Zero load times between holes ?? ?? ?? ??All new characters and animations ?? ?? ?? ??Real-time passing of time - choose your tee time and watch ?? ??time fly! ?? ?? ?? ??All new graphical effects including enhanced lighting and ?? ??shadow systems for objects and terrain, normal map, detail ?? ??map, mega-texture and more ?? ?? ?? ??Fifteen courses available out of the box, with further courses ?? ??available to download, including real, licensed courses ?? ?? ?? ??All new physics engine, using real-world data ?? ?? ?? ??Massively improved mouse swing mechanics ?? ?? ?? ??Widescreen support - 4:3, 16:9 and 16:10 aspect ratio ?? ??options ?? ?? ?? ??New and improved PlayMail, allowing you to email, larger and ?? ??more detailed, playable holes to anyone, even if they don't ?? ??own the game ?? ?? ?? 咣策哌哌哌哌哌哌哌咣圻哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌 哌? ? 咣?Install Notes: 咣? ?? 荥 薏 苘苘苘苘苘苘苘苘苒圮 ?? ? 苒?? ?? 哌? ??1. Download Release ?? ??2. Mount/Burn Image ?? ??3. Install Game (read down for an additional install guide, if ?? ?? you got problems) ?? ??4. Check our cracktro out, it's located in the SKIDROW dir on ?? ?? the CD ?? ??5. Copy the cracked content from the SKIDROW dir andoverwrite ?? ??6. Play the game ?? ?? ?? ??Additional install notes: ?? ?? ?? ??This game need some custom service installed called ?? ??CustomPortal to setup various important stuff, like directory ?? ??directions. ?? ?? ?? ??When it ask you to create an account, just press cancel and ?? ??the installing process will continue. ?? ?? ?? ??You can uninstall CustomPortal after you have finished ?? ??installing the game or you can keep it in. Does not really ?? ??matter. ?? ?? ?? ??If you choose to uninstall CustomPortal, then answer NO, when ?? ??the CustomPortal uninstaller ask you this question " Do you ?? ??want to delete all game and resource files? " ?? ?? ?? ??Doing this will keep all install directories and other file ?? ??locations needed for config files. ?? ?? ?? ??Keep in mind that CustomPortal keep track on the games ?? ??shortcuts, as the protection verify your account activation ?? ??code, an activation code our crack of course does not need to ?? ??run. This result in invalid shortcuts, no matter if you ?? ??uninstall CustomPortal or not. So you have to manually fix ?? ??your shortcuts if you use shortcuts to play. ?? ?? ?? ??Help with the Shortcut problem note: ?? ?? ?? ??As this game only will let you install on the drive where you ?? ??got windows installed on, then here is a little help locating ?? ??your game dir. ?? ?? ?? ??We discovered that it installs at this location in ?? ??XP: ?? ?? ?? ??X:\Documents and Settings\All Users\Application ?? ??Data\CustomPortal\ ?? ?? ?? ??We discovered that it installs at this location in ?? ??Vista: ?? ?? ?? ??X:\ProgramData\CustomPortal\ ?? ?? ?? ??X marks the drive letter you got your windows version ?? ??installed and dirs might be different in other languages. ?? ?? ?? ??You can always do a search for CPGolf2.exe to locate the ?? ??correct dir :-) ?? ?? ?? ??Remember to check our cool new cracktro first! :P ?? ?? ?? 咣策哌哌哌哌哌哌哌咣圻哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌 哌? ? 咣?Greetings: 咣? ?? 荥 薏 苘苘苘苘苘苘苘苘苒圮 ?? ? 苒?? ?? 哌? ??Salutes to our old Amiga friends from: ?? ?? ?? ??FAIRLIGHT - RAZOR 1911 - VISION FACTORY - PARADOX - QUARTEX ?? ??DCS - CRYSTAL - ZENITH - ACCESSSION - ALPHA FLIGHT - PRODIGY ?? ??THE COMPANY - LEGEND - TRSI - ORACLE - ANTHROX ?? ?? ?? ??Salutes to our new friends in: ?? ?? ?? ??0x0007 - UNLEASHED - TiNYiSO - BREWERS - RELOADED - ENiGMA ?? ??ELECTRIC DRUGGIES - AVENGED - ADDONiA - HATRED - DAWN ?? 圮败苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苒馨 哌鄄? Logo and layout by: Eboy/SAE 懿圻? 苓哌 薏草 Last updated 21/07/2007 by [XXX] 薏草 荥哌? 哕 哌哌?? 哌?哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌 哌? ?哌哌? 苓 ? ? |
This posting includes an audio/video/photo media file: Download Now |
Posted: 30 Aug 2008 08:59 AM CDT 看李铸晋著论赵孟頫三世人马图,其中提到赵孟頫画法取古意,所画人马图有李公麟《五马图》之风,特找来对比着看。 将军魏武之子孙,于今为庶为清门。 英雄割据虽已矣,文彩风流今尚存。 学书初学卫夫人,但恨无过王右军。 丹青不知老将至,富贵于我如浮云。 开元之中常引见,承恩数上南薰殿。 凌烟功臣少颜色,将军下笔开生面。 良相头上进贤冠,猛将腰间大羽箭。 褒公鄂公毛发动,英姿飒爽犹酣战。 先帝玉马玉花骢,画工如山貌不同。 是日牵来赤墀下,迥立阊阖生长风。 诏谓将军拂绢素,意匠惨淡经营中。 斯须九重真龙出,一洗万古凡马空。 玉花却在御榻上,榻上庭前屹相向。 至尊含笑催赐金,圉人太仆皆惆怅。 弟子韩干早入室,亦能画马穷殊相。 干惟画肉不画骨,忍使骅骝气凋丧。 将军画善盖有神,偶逢佳士亦写真。 即今漂泊干戈际,屡貌寻常行路人。 途穷反遭俗眼白,世上未有如公贫。 但看古来盛名下,终日坎壈缠其身。 |
Done with World of Warcraft Forever Posted: 29 Aug 2008 10:54 PM CDT I haven’t played World of Warcraft in several years, since a few months after the game was released. (I played for a while in the open beta before that.) At the time, I had a lot going on in my life, my internet connection wasn’t stable enough to play long term, and all my friends who were playing were rapidly outpacing me in leveling, making adventuring with them impossible. So, I quit. I had heard that even if you stop paying for the account, you can still return to your characters if you ever reactivate the account. Off and on I’ve toyed with the idea of playing again, especially as friends of mine from college dived into the game hardcore, and talked about it often whenever I’d visit. The goal would be to hang out with them online on a regular basis, moreso than playing the game itself. A few weeks ago, I start receiving emails about “server transfer” for my characters in WoW. A few of the character names I recognize as ones I’ve made (most notably my human bow-user named “Ollie”) and a few I don’t. I was a bit worried that my account had been hacked, and I was paying for someone else to play WoW. But I checked my credit card statements and there were no charges to back it up. Still, hacked is still bad, and I consulted a few of my friends who still play. They recommended reporting it, so I did. About a day later, I receive an auto-response saying that due to the volume of email, it could take up to a week for someone to get back to me. A week passed. No answer, but still more server transfer requests are sent to me. Finally, I receive an email telling me that my account is being closed because I engaged in “illegal financial transactions” or somesuch- I read it to be my account was being used for gold farming. Still no response to my complaint that my account had been hacked. Still don’t know if any of my personal information was compromised. Oh, and even though I tried to head it off on day 1, my account was used for something they didn’t want. And yet, here I am, with a closed account. Thus, I’m done with World of Warcraft. Apparently I’m a fugitive gold farmer anyway, so even if I wanted to resume with my characters, I can’t. (Not a big deal since my highest level character was level 21.) I’m also pretty upset at the level of customer service demonstrated. Thanks for nothing Blizzard. Maybe I’ll pick up your two games that don’t require accounts, but I’m not as certain that I want to support them anymore. Besides, I have D&D Fourth Edition, and that’s close enough, right? (Just kidding!) |
Posted: 28 Aug 2008 03:04 PM CDT In case you haven’t already, head over to Gnome Stew (which you should be reading anyway) and leave a comment on this post to be entered into a contest for one of the coolest prizes I’ve ever seen for RPGs: custom sound effects for your game! The sound effects are made by the professional sound engineer that runs World of Twilights Studio so it’s not just some bum in a basement hitting bottles… it’s real quality work (and check out the samples if you don’t believe me.) Be sure to enter by Labor Day this Monday for your chance to win! |
Posted: 30 Aug 2008 05:27 AM CDT 一,Adjust 主要都是一些调整参数的滤镜,主要包括以下滤镜: 01,Brightness&Contrast 用于调整亮度和对比度 02,Channel Mixer Channel Mixer用于通道混合,可以用当前彩色通道的值来修改一个彩色通道。应用Channel Mixer可以产生其它颜色调整工具不易产生的效果;或者通过设置每个通道提供的百分比产生高质量的灰阶图;或者产生高质量的棕色调和其它色调图像;或者交换和复制通道。 Red/Green/Blue-Red/Green/BIue/Const分别表不不同的颜色调整通道,Const用来调整通道的对比度。参数以百分比表示,表明增强或减弱该通道的效果。 其默认的参数为 Red-Red Green-Green Blue-Blue都是 1O0%,其它为 O%,表示初始的RGB通道值。 最下方的Monochrome选项是可以将图像应用为灰阶图 03,Color Balance Color Balance用于调整色彩平衡。通过调整层中包含的红、绿、蓝的颜色值,颜色平衡. 效果控制参数 Shadow Red/Blue/Green Balance用于调整 RGB彩色的阴影范围平衡。 Midtone Red/BIue/Green Balance用于调整 RGB彩色的中问亮度范围平衡。 Hilight Red/Blue/Green Balance用于调整 RGB彩色的高光范围平衡。 Preserve Luminosity选项用于保持图像的平均亮度,来保持图像的整体平衡。 04,Curves Curves用于调整图象的色调曲线,通过改变效果窗口的Curves曲线来改变图象的色调。也可以用Level完成同样的工作,但是Curves的控制能力更强。 05,Channel 用于选择要进行调控的通道,可以选RGB彩色通道,Red红色通道、Green绿色通道、Bule蓝色通道和Alpha透明通道分别进行调控。 Curves曲线用来调整Gamma。值,即输入(原是亮度)和输出的对比度。 06,Hue/Saturation Hue/Saturation用于调整图像中单个颜色分量的Hue色相、Saturation饱和度和 Lightness亮度。其应用的效果和Color Balance一样,但利用的是颜色相位调整轮来进行控制。 效果控制参数 Channel Control用于选择所应用的颜色通道,选择 Master表示对所有颜色应 用,或者Reds红色、 Yellows黄色、 Greens绿色、 Cyans青色和 Blue Magentas 洋红。 Channnel Range显示颜色映射的谱线,用于控制通道范围。上面的谱线表示调 节前的颜色;下面的谱线表示在全饱和度下调整后所对应的颜色。 Master Hue用于调整主色调,取值范围-180度~+ 180度。 Master Saturation用于调整主饱和度。 Master Lightness用于调整主亮度。 Colorize用于调整图像为一个色调值,成为双色图,就像旧电影的棕色。 Colorize Hue用于调整双色图色相。 Colorize Saturation用于调整双色图饱和度。 Colorize Lightness用于调整双色图亮度。 07,Levels Levels用于将输入的颜色范围重新映射到输出的颜色范围,还可以改变Gamma 正曲线。Levels主要用于基本的影像质量调整,效果控制参数 Levels参数中,Channel用于选择要进行调控的通道,可以选择RGB彩色通道、Red红色通道、Green绿色通道、blue蓝色通道和Alpha透明通道分别进行调控。HIStogram该谱线图显示像素值在图像中的分布,水平方向表示亮度值,垂直方向表示该亮度值的像素数量。没有像素值会比输出黑色值更低,比输出白色值更高。 InPut Black输入黑色用于限定输入图像黑色值的阀值。 InPut White输入白色用于限定输入图像白色值的阀值。 Gamma用于设置Gamma值,调整输入输出对比度。 OutPut Black输出黑色用于限定输出图像黑色值的阀值。 outPut White输出白色,用于限定输出图像白色值的阀值。 08,Posterize Posterize用于为每个通道指定一定范围的色调或亮度的级别。如同划分几档 Posterize使像素调整到最近的级别上,如图所示。Level 用来设置划分级别的数量,范围从2--32。 09,Threshold Threshold用于将灰度图或彩色图象转化为高对比度的黑白二进制图象,Level 用来设置阀值级别,低于这个阀值的像素转化为黑色,高于这个阀值的像素转化为白色 二,Audio文件夹内包括音频方面的滤镜,如下: 今天把Audio 效果方面的整理出来了!不过我的老师讲AE的音频处理不如PR,建议把音频文件拿到PR中处理。本人这方面实践的比较少,不好说什么,请高手指教、指教!! Audio 效果,Audio 音频效果用来为音频进行处理.音频效果包括: Backwards\Bass&Treble\ Delny、Flange&Chorus、Higl-Low Pass、 Modulator、 Parametric EQ、 Reverb、Stereo Mixer、 Tone。其中 Flange& Chorus。High-Low Pass、 Modulator、 Parametnc EQ、 Reverb和 Tone都是 After Effects 5.5 Production 中包含的"高级"音频效果 1,Backwards Backwards用于将音频素材反向播放,从最后一帧播放到第一帧,在时间线窗口中,这些帧仍然按原来的顺序排列。Swap Channels用于将两个音轨交换 2,Bass& Treble Bass& Treble用于调整高低音调。如果你需要“更强大的音调控制,就要 ParametricEQ参数均衡器。 Bass 用于升高或降低低音部分。 Treble 用于升高或降低高音部分。 3,Delay Delay用于延时效果,可以设置声音在一定的时间后重复的效果。用来模拟声音被物体反射的效果。 Delay Time 延时时间,以ms为单位。 Dalay Amount 延时量。 Feedback 反馈。 Dry out 原音输出,表示不经过修饰的声音输出量. wet out 效果音输出,表示经过修饰的声音输出量 4,Flange&Chorus 这个参数稍多了点:) Flange&Chorus包括两个独立的音频效果, Chorus用于设置和声效果, 使单个语音或者乐器听起来更有深度,可以用来模拟“合唱”效果。Flange 用于设置变调效果,通过拷贝失调的声音,或者把某个频率点改变,调节声 音分离的时间、音调深度。可以用来产生颤动、急促的声音。应用这个效果 的时候,默认的设置为应用Flange效果。 Voice Separation Time(ms)用于设置声音分离时间,单位是 ms。每个分离 的声音是原音的延时效果声。设置较低的参数值通常用于Flange效果,较高 的数值用于Chorus效果。 Voice用于设置和声的数量。ModulationRate用于调整调制速率,以Hz为单位,指定频率调制。Modulation Depth调制深度。Voice Phase Change 声音相位变化。Invertphase讲声音相位相反。Stereo Voices 设置为立体声效果。 Dry on原音输出。wet out效果音输出。 如果应用合唱效果,将 Voice Separation Time设置为 40以上,Voice设置为 4,Modulation Rate设置为0.1 Modulation设置为 50%, Voice Phase Change设置为 90,选择Steroe Voice选项,Dry/Wet 都设置为50%。 5,high-Low Pass High-Low Pass应用高低通滤波器,只让高于或低于一个频率的声音通过。可以用来模拟增强或减弱一个声音,例如可以用 High Pass滤除外景中的噪音(通常存在于低频),让人声更清晰,LowPass可以消除高频噪声(如静电和峰鸣声)。可以用来改变声音的重点,例如在混合了音乐和人声的声音中突出人声或音乐声。可以 独立输出高低音等等。Filter options 用于选择应用High Pass高通滤波器和Low Pass低通滤波器 Cutoff Frequency用于切除频率。 Dry out原音输出。 Wet OUt效果音输出。 6,Modulator Modulator用于设置声音的颤音效果,改变声音的变化频率和振幅。使用产生声音的多谱勒效果,比如一列火车*近观察者的时候,啸叫声越来越高,通过时降低。 Modulation TyPe用于选择颤音类型,Sine为正弦值,Triangle为三角形. ModulationDepth用于设置调制深度。 AmplitudeModulation用于设置振幅 7,Parametric EQ Parametric EQ用于为音频设置参数均衡器。强化或衰减指定的频率。对于增强音乐的效果特别有效。Frequency Response频率响应曲线,水平方向表示频率范围,垂直表示增益值。Bandl/2/3 Enable应用第1/2/3条参数曲线。最多可以使用三条,打开后可以对下面的相应参数进行调整。(这里只使用了一条)Frequency设置调整的频率点。Bandwidth设置带宽。Boost/Cut提升或切除,调整增益值。 8,Reverb Reverb通过加入随机反射声模拟现场回声效果。 Revefb Time(ms)用于设置回音时间,以 ms为单位 Diffusion用于设置扩散量。 Decay衰减度,指定效果消失过程的时间。 Brightness明亮度 Dry out原音输出 Wetout效果声输 9,Stereo Mixer Stereo Mixer用来模拟左右立体声混音装置。可以对一个层的音频进行音量大小和相位的控制。 Left Level左声道增益,即音量大小。 Right Level右声道增益。 Left Pan左声道相位,即声音左右定位。 Right Pan右声道相位。 10,Tone Tone效果用来简单合成固定音调。比如潜艇的隆隆声、电话铃声、警笛声以及激光对每一种效果,最多可以增加5个音调产生和弦。我们可以对没有音频的层应用该效对音频层或包含音频的层应用该效果,将只播放合成音调。Waveform options用于选择波形形状。Sine表示正弦波;Square表示方波,产生随失真的声音;Triangle“表示三角波; Saw接近方波音调。Freqencyl/2/3/4/5分别设置五个音调的频率点,如果要关闭某个频率的时候参数设置为0。Level调整振幅。如果预览的时候出现警告声,说明Level设置过高。依照使用的音调个数除100%,如果用满5个音调,则Level值为20%\ 三,Blur& Shmpen使图像模糊和锐化效果 Blur& Sharpen效果 使用 Blur& Shmpen效果用来使图像模糊和锐化。其中包括: Channel Blur Compound Blur、 Fast Blur、 Gaussian Blur、 Motion Blur( Direction Blur方向模糊)Radial Blur、 Sharpen、 Unsharp Mask,模糊效果可能是最常应用的效果,也是一种简便易行的改变画面视觉效果的途径。动态的画面需要“虚实结合”,这样即使是平面合成,也能给人空间感和对比,更能让人产生联想,而且可以使用模糊来提升画面的质量,可能即使是很粗糙的画面,经过处理后也会赏心悦目。所以,应该充分利用各种模糊效果来改善作品质量。 1, Channel Blur Channel Blur可以称为“通道模糊”,分别对图像中的红、绿、蓝和 Alpha通道进行模糊,并且可以设置使用水平还是垂直,或者两个方向同时进行,如图,只对蓝色通道进行模糊处理。当该层设置为最高质量(Best Quality)的时候,这种模糊能产生平滑的效果。这种效果的最大好处是可以根据画面颜色分布,进行分别模糊,而不是对整个画面进行模糊,提供了更大的模糊灵活性。可以产生模糊发光的效果,或者对Alpha通道的整幅画面应用,得到不透明的软边 Red Blutriness设置红色通道模糊程度。 GreenBlutriness设置绿色通道模糊程度。 BIueBlurriness设置蓝色通道模糊程度。 Alph。Blutriness设置Alph。通道模糊程度。 Edge Behavior点击选择 RePeat Edge Pixels表示图像外边的像素是透明的;不选择表示图像外边的像素是半透明的。可以防止图像边缘变黑或变为透明。Blur Dimensions设置模糊方向,可以选择 Horizontal and Vertical同时向两个方向; Horizontal表示水平方向;Vertical表示垂直方向。 2, ComPound Blur Comnound Blur称为“混合模糊”。依据某一层(可以在当前合成中选择)画面的亮度值对该层进行模糊处理,或者为此设置模糊映射层,也就是用一个层的亮度变化去控管另一个层的模糊。图像上的依据层的点亮度越高,模糊越大;亮度越低,模糊越小。 当然,也可以反过来进行设置。 Blur Layer用来指定当前合成中的那一层为模糊映射层,当然可以选择本层。 Maximum Blur最大模糊,以像素为单位。 Stretch Map to Fit如果模糊映射层和本层尺寸不同,伸缩映射层。 Invert Blur反向模糊。 Compound Blur可以用来模拟大气,如烟雾和火光,特别是映射层为动画时,效果更生动;也可以用来模拟污点和指印,还可以和其它效果,特别是Displacement组合时更为有效。 3, Fast Blur Fast Blur称为“快速模糊”,用于设置图像的模糊程度。它和Gaussian BIur 十分类似,而它在大面积应用的时候速度更快。 Blurrriness用于设置模糊程度。 Blur Dimensions设置模糊方向,可以选择Horizontal and Vertical同时向两个方向; Horizontal表示水平方向; Vertical表示垂直方向。 4, Gaussian Blur Gaussian Blur称为“高斯模糊”,用于模糊和柔化图像,可以去除杂点, 层的质量设置对高斯模糊没有影响。高斯模糊能产生更细腻的模糊效果, 尤其是单独使用的时候。 Blutrriness用于设置模糊程度。 BIur Dimensions设置模糊方向,可以选择 Horizontal and Vertical同时向两个方向;Horizontal表示水平方向;Vertical表示垂直方向。 5, directional Blur也可以称之为(motion blur) Motion Blur称为“ 运动 模糊”,也称为Directional Blur方向模糊”。这是一种十分具有动感的模糊效果,可以产生任何方向的运动幻觉。当图层为草稿质量的时候,应用图像边缘的平均值;最高质量的时候,应用高斯模式的模糊,产生平滑、渐变的模糊效果。Direction设置运动模糊方向,以度数为单位。Blur Length用于设置运动模糊的长度。注意:MotionBlur运动模糊效果不同于时间线窗口中的MotionBlur开关, MotionBlur开关是针对某个层的运动画面进行补偿的工具。 6, Radial Blur Radial Blur称为“圆周模糊”,在指定的点产生环绕的模糊效果,越靠外模糊越强如图所示。草稿质量时,只显示纹理。这种效果在隔行显示的时候可能会闪烁。Amount模糊程度。Center设置中心位置。Type模糊类型,可以选择Spin旋转,则模糊呈现旋转状;Zoom变焦,模糊呈放射状。Antialiasing(Best Quality)用于设置反锯齿的作用, High表示高质量;Low示低质量,这个选项只有在最高质量是才有效。 7, Sharpen Sharpen用于锐化图像,在图像颜色发生变化的地方提高对比度。vSharpen Amount用于设置锐化的程度 8, Unsharp Mask Unsharp Mask用于在一个颜色边缘增加对比度。和 Sharpen不同,它不对颜色边缘进行突出,看上去是整体对比度增强。Amount设置效果应用的百分比。 Radius指定两个颜色的边界,受调整的像素的范围。 Threshold指定边界的容限,调整容许的对比度范围 避免调整整个画面的对比度而产生杂点。 #注意在做blur的时候要对层开高精度显示,也是反锯齿显示,这样,计算才会正确。 四, 今天主要是介绍一下Channel效果, 相关特效在实际应用中非常有用,跟其他特效配合使用,变化更是精妙,这里的一些效果图只是单一的演示,并不能真正体现这些特效的神髓,其深远的东西有待朋友们再实际的工作中发觉探索!!Channel效果Channel通道效果用来控制、抽取、插入和转换一个图像的通道。通道包含各自的颜色分量( RGB)、计算颜色值( HSL)和透明值( Alpha)。 Channel通道效果中包含Alpha Levels、 Arithmetic、 Blend、ComPound Arithmetic、Invert、Minimax、Remove Color Matting、Set Channels、SetMatte、 Shift Channels 01, 其中 Alpha Level是高级工具包提供的插件, 其主要用来调整通道透明程度.Alpha Levels透明程度设置 AlPha Levels透明程度设置,用于将遮罩中的纯白或纯黑的区域 调整为灰色半透明区域,也可以将灰色半透明区域调整为白色 不透明区域或黑色透明区域。应用的时候选择菜单Effect> Channel> Alpha Levels。Alpha数值通过改变输入限制( input Limits)、输出限制( Output Limits)和 Gamma值(控制透明程度)。输入和输出限制用来指示透明的起始和结束,Gamma值用来调整灰度的范围。Gamma值为1,表示灰度为线性值;小于1,灰度值变暗,显得更透明;大于1,灰度值变亮,显得更不透明。在效果窗口可以对 Alpha Levels透明程度进行如下控制InPut Black Level小于或等于此值的 Alpha值为全透明。InPut White Level大于或等于此值的 Alph。值为不透明。Gamma用于调整灰度曲线。Output Black Level用于设置 Alpha值的输出下限。OutPut White Level用于设置 Alph。值的输出上限。注意:转换半透明为完全透明和不透明时, Oupout Black Level设为 0(最小), Output White Level设为 255(最大); 转换完全透明或不透明区域为半透明时,如果 Alpha值,小于 OutPut Black Level,则提升到该值, Alpha值大于 Output White Level,则降低到该值 . 02, Arithmetic Arithmetic称为“通道运算”,对图像中的红、绿、蓝通道进行简单的运算, operator选择不同的算法。Red Value应用计算中的红色通道数值。GreenValue应用计算中的绿色通道数值。BIue Value应用计算中的蓝色通道数值。Clipping选择Clip Result Values选项用来防止设置的颜色值超出所有功能函数项的限定范围。 03, Blend Blend效果称为“通道融合”,可以通过五种方式将两个层融合。和使用层模式类似,但是使用层模式不能设置动画,而Blend通道融合最大的好处是可以设置动画。Blend With Lnyer用于在本合成中选择对本层应用融合的层。Mode选择融合方式,其中包括 Crossfade淡人淡出、Color only颜色融合、Tint色彩融合、 oparken only加深融合 和Lighten only加亮融合。Blend With original设置融合程度。 If Layer Sizes Differ如果两个层的尺寸不同,选择Center进行中对齐, Stretchto Fit伸缩自适应。注意:在对一个层应用Blend效果时,可以关闭选择的融合层的可视性。 04,compound Arithmetic compound Arithmetic称为“混和运算”,可以将两个层通过运算的方式混合,实际上是和层模式相同的,而且比应用层模式更有效、更方便。这个效果主要是为了兼容以前版本的 After Effects效果。Second Source Layer选择混合的(第二个)图像层。 Operator混合算法,其效果和层模式相同。Operate on Channel应用通道,可以选择 RGB、 ARGB和 Alpha通道 ,Overflow Behavior选择对超出允许范围的像素值的处理方法,可以选择Clip、Warp和Scale。 Stretch Second Source to Fit如果两个层的尺寸不同,进行伸缩自适应。 05, Invert lnvert称为“反转效果”,用于转化图像的颜色信息。反转颜色通常有很好的颜色效果Channel选择应用反转效果的通道。Blend Wth original和原图像的混合程度。 06, Minimax Minimax称为“最大最小值效果”用于对指定的通道进行最大值或最小值的填充 Maximum是以该范围内最亮的像填充;Minimax是以该范围内最暗的像素填充.而且可以设置方向为水平或垂直,可以选择应用通道十分灵活,效果出众。Operation 用于选择作用方式,可以选择Maximum最大方式、Minimax最小方式、Minimax then Maximum先最小再最大和 Maximum then Minimax先最大再最小,四种方式。Radius设置作用半径,也就是效果的程度。Channel选择应用的通道,我们可以对R、G、B和Alpha通道单独作用,这样可以不影响画面其它元素。Direction选择方向为 Horizontal& Vertical水平和垂直、Just Horizontal仅水平方向和fust Vertical仅垂直方向。 07, Remove Color Matting Remove Color Matting称为“这罩颜色消除”,用来消除或改变这罩的颜色。这个效果也常常用于使用其它文件的Alpha 通道或填充的时候。如果输人的素材是包含背景的Alpha(Premultiplied Alpha),或者图像中的 Alpha通道是由 After Effects创建的,可能需要去除图像中的光*,而光*通常是和背景及图像有很大反差的。我们可以通过Remove Color Matting来消除或改变光*。 08,Set Channels Set Channel称为“通道设置”,用于复制其它层的通道到当前颜色通道和 Alpha通道中。比如,选择某一层的亮度值应用到当前层的颜色通道中,该效果等于重新指定当前层的Alpha通道。Source Layerl/2/3/4可以分别将本层的RGBA四个通道改为其它层。 Set Red/Green/Blue/Alpha To Source l/2/3/4’s用于选择本层要被替换的 RGBA通道。 if Layer Sizes Differ当两层图像尺寸不同的时候,选择 Stretch Layers to Fit伸缩自适应,来使两层变为同样大小。 09, Set Matte Set Matte称为“遮罩设置”,用于将其它图层的通道设置为本层的遮罩,通常用来创建运动遮罩效果。应用时如同使用时间线窗口中的TrkMat轨道遮罩,设置、上面的层设置、上面的层为遮罩层。而 Set Matte效果主要是用来和以前版本的AfterEffects兼容.Take Matte From Layer选择要应用这罩的层。Use For Matte选择哪一个通道作为本层的遮罩。Invert Matte遮罩反向。 If Layer Sizes Differ如果两层尺寸不同,选择 Stretch Matte to Fit伸缩遮罩层自适应, Composite Matte with Original将这罩和原图像合成, Premultiply Matte Layer选择和背景合成的遮罩层。 10, Shift Channels Channels称为“通道转换”,用于在本层的RGBA通道之间转换 主要对图象的色彩和亮暗产生效果,也可以消除某种颜色, Take Alpha/Red/Green/Blue分别从旁边的弹出菜单中选择本层 的其它通道应用到Alpha、Red、Green和Blue通道。 11, Cineon tools效果概述 在这个子菜单中,只包含 Cineon Coverter一个效果,其实它更主要是设置10位的Cineon文件,让它如实还原本色,以适应 8位的 After EffectS处理。由于胶片扫描而来的 Cineon 10位文件,有着更宽的动态范围,所以这个工具基本用来设置10位和8位之间的白、黑点对应以及Gamma还原曲线值。 注意:Cineon Coverter只是一个转换器,而不是特技效果,所以我们最好不要用它来处理其它8bit图像。Conversion Type选择转换类型。 10/8 Bit Black Point分别设置对应的黑点参数。 10/8Bit White Point分别设置对应的白点参数。 Gamma调整Gamma还原曲线。 Highligh Rolloff高光滤除,通常 10bit的图像动态范围更大体现在失真的高光区域,调整这个值可以很有效地还原图像。 五, Video效果 Video视频效果中,包含广播级颜色、场控补偿和时间码几个效果,其菜单如下. 1, Broadcast Color roadcast Color用于校正广播级的颜色和亮度。由于电视信号发射带宽的限制,如我国用的PAL制发射信号为8MHz带宽。美国和日本使用的NTSC发射信号为 6MHz,由于其中还包括音频的调制信号,进一步限制了带宽的应用。所以并非我们在电脑上看到的所有颜色和亮度都可以反映在最终的电视信号上,而且一旦亮度和颜色超标,会干扰到电视信号中的音频而出现杂音。那究竟什么样的信号不会超过电视台的播出技术标准呢?如我们通常见到的彩条信号,它的亮度和颜色饱和度大约是可见光范围的75%,所以也称为75%彩条,制作中应用的颜色和亮度应低于这个值。在电视台的合成机房中,包含有两个信号监测的是波器,一个叫波形示波器,监视亮度信号的幅度;一个叫矢量示波器,监视颜色信号的饱和度。 Broadcast Locale选择应用的电视制式, PAL或 NTSC。 How to Make Color Safe实现“安全色”的方法,包括 Reduce Luminance降低亮度、 Reduce Saturation降低饱和度、 Key out Unsafe将不安全的像素透明和Key out Safe将安全颜色透明。后两项主要用来了解安全色的区域。 Maximum Signal Amplitude(IRE)限制最大的信号幅度,最大为120可能已经超标,用默认的110比较保守。 2, Reduce Interlance Flicker Reduce Interlance Flicker用于消除隔行闪烁现象。对于图像中的高色度部分,隔行扫描的时候可能会出现闪烁,应用本效果可以将过高的色度降低。此外也可以消除水平线调和残影,但对于一般图像并不明显。 softness柔化图像的边界,避免细线条隔行扫描的时候产生闪烁。 3, Timecode Timecode是时间码,影视后期制作的时间依据,由于我们渲染的影片还要拿去配音或者加入三维动画等等,每一帧包含时间码会有利于其它制作方面的配合,Mode选择时间码显示模式。Display Format设置时间码格式,电视用 SMPTE HH:MM:SS:FF,电影用 Frame Number胶片编号。 Time Units时间单位,应该跟合成设置对应,比如 PAL制的 25帧/秒。 Starting Frame设置初始数值。 Text Position时间码显示位置。 Text Size时间码字号。 Text Color时间码颜色。 六, 今天主要是把Perspective特效方面的整理出来了!! Perspective用于制作各种透视效果,在简单的三维环境中放置图像,可以增加深度和调节Z轴。这部分效果是从 After Effects 4.0以后加入的,由此可见After Effects正向三维合成努力。但它不像 Discreet Logic Effect*那样从根本上集成了三维合成,而且包括灯光、摄像机以及画面产生各种光感的效果。Perspective只提供了基本的三维环境中的几何变换,使我们可以做出有“深度”的图像。 1, Basic 3D Basic 3D基本三维效果,用来使画面在三维空间中水平或垂直移动,也可以拉远或靠近,此外还可以建立一个增强亮度的镜子以反射旋转表面的光芒。因为默认的光源来自图像上方,所以如果想看到图像反射光线,只有让图像向后倾斜。Swivel控制水平方向旋转。 Tilt控制垂直方向旋转。 Distance to Image图像纵深距离。Specular Highlight用于添加一束光线反射旋转层表面。Preview选择 Draw Preview Wireframe用于在预览的时候只显示线框。这主要是因为三维空间对系统的资源占用量相当大,这样可以节约资源,提高响应速 度。这种方式仅在草稿质量时有效,最好质量的时候这个设置无效。 2, Bevel Alpha Bevel Alpha是“ Alpha斜切”,可以使图像出现分界,是通过二维的Alpha 通道效果形成三维外观。此效果特别适合包含文本的图像.Edge Thickness边缘厚度。 Light Angle 灯光角度。Light Color灯光颜色。Light Intensity灯光强度。 3, Bevel Edge Bevel Edge称为“边缘斜切”用于对图像的边缘产生一个立体的效果,看上去是三维的外观。此外,只能对矩形的图像形状应用,不能应用在带有Alpha通道的图像上。 Edge Thickness边缘厚度。 Light Angle灯光角度。 Light Color灯光颜色。 Light Intensity灯光强度。。 4, Drop Shadow Dron Shadow用于产生“投影效果”,是在层的后面产生阴影。产生阴影的形状由 Alphs通道决定。 Shadow Color阴影颜色。 Direction阴影方向。 Distance阴影距离。 softness柔化效果。 5, 再补充一个Transform ,其实这个特效在变形文件夹里面. Transform称为“变换效果”,用于在图像中产生二维的几何变换,从而增加了层的变换属性。Anchor Point定位点设置。Position位置设置。 Scale Height/ Width高度/宽度缩放。 Skew倾斜大小。 Skew Axis倾斜轴线。 Rotation旋转方向。 opacity不透明度。 Shutter Angle快门角度设置,由此决定运动模糊的程度。 七,Image Control效果 Image Control图像控制效果主要用来对图像的颜色进行调整。其中包括 ChangeColor、 Color Balance、 Equalize、 Gamma/pedestal/Gain、 Median、 PS ArBitrary MaP和Tint。 我们可以选择菜单 Effect> Image Control下面的选项来应用效果。 1,Change Color Change Color称为颜色替换,用于改变图像中的某种颜色区域(创建某种颜色遮罩)的色调饱和度和亮度。可以通过制定某一个基色和设置相似值来确定区域,View选择合成窗口的观察效果。可以选择Color Correction Layer颜色校正视图或 Color Correction Mask颜色校正遮罩。 Hue Transform色相调制,以度为单位改变所选颜色区域。 Lightness Transform亮度调制。 Stauration Transform饱和度调制。 Color To Change选择图像中要改变颜色的区域颜色。 Matching Tolerance调整颜色匹配的相似程度。 Matching Softness匹配柔和度。 Match color选择匹配的颜色空间。可以使用 RGB、 Hue色相和 Chroma浓度。 Invert Color Correction Mask颜色校正遮罩反向 2,Color Balance(HLS) Color Balance称为“颜色平衡”,用来调整图像色调。这个效果主要是为了和以前的After Effects兼容,所以在这里就不详细讲述了,在After Effects 5.5中,使用Hue/Saturaion更为有效 3,Equalize Equalize颜色均衡效果,用来使图像变化平均化,Equalize选择均衡方式。可以选择RGB、Brightness亮度值和Photoshop Style表示应用Photoshop风格的调整。 Amount to Equalize设置重新分布亮度值的百分比。 4,Gamma/Pedestal/Gain Gamma/Pedestal/Gain用来调整每个RGB独立通道的还原曲线值,这样可以分别对某种颜色进行输出曲线控制。对于Pedestal和Gain,设置0为完全关闭,设置1为完全打开 Gamma/Pedestal/Gain控制参数如下: Black Stretch用来重新设置黑色(最暗)强度。 Red/Green/Blue Gamma分别调整红色/绿色/蓝色通道的 Gamma曲线值 Red/Green/Blue Pedestal分别调整红色/绿色/蓝色通道的最低输出值。 Red/Green/Blue Gain分别调整红色/绿色/蓝色通道的最大输出值。 5,Median Median称为“中值效果”,使用给定半径范围内的像素的平均值来取代像素值。取较低数值的时候,该效果用来减少画面中的杂点;取高值的时候产生一种绘画效果, Radius指定像素半径。operate on Alpha Channel应用于 Alpha通道。 6,PS Arbitrary Map PS Arbitrary Map用于调整图像的色调的亮度级别。如同在 Photoshop文件中我们可以设置一个层的Arbitrary Map文件然后应用到整个层, Phase颜色相位。Apply Phase Map To Alpha应用相位图到Alpha通道。 7,Tint Tint用来调整图像中包含的颜色信息,在最亮和最暗的之间确定融合度;所示。黑色像素被映射到Map Black To项指定的颜色;白色像素被映射至Map White TO项指定的颜色,介于两者之间的颜色被赋予对应的中间值。Map Black to映射黑色到某种颜色。 Map White to映射白色到某种颜色。Amount to Tint应用程度。 8,Colorama 这个特效比较特别,可以用来实现彩光、彩虹、霓虹灯等等多种神奇效果。 具体的应用只有多多实践才能体会! 八,这次主要是Distort效果 此类特效在AE中应用很广泛,教程中不可能把其千变万化的效果完全体现出来,这里只是讲个大概,个中滋味,自己体验吧!!(图片上有的特效,教程中没有提到的,是第三方插件), Distort效果主要用来对图像进行扭曲变形,是很重要的一类画面特技。在AfterEffects5.5 Production Bandle中提供了十分丰富的变形效果。其中只有 Mirror、 offset、Polar Coordinates、 Smear、 Spherize为标准版中所带的,其它的都是高级工具包中的 1, Bezler Warp Bezier Warp称为“曲线变形”,可以多点控制。在层的边界上沿一个封闭曲线来变形图像。曲线分为四段,每段由四个控制点组成,其中包括两个定点和两个切点,顶点控制线段位置,切点控制线段曲率。 我们可以利用Bezler Warp产生标签贴在瓶子上的效果,或者用来模拟镜头,如鱼眼和广角。或者可以校正图像的扭曲。通过设置关键帧,还可以产生液体流动和简单的旗飘效果等等!! Top Left/Right Vertex用于定位上面的左右两个顶点。 Top Left/Right Tangent用于定位上面的左右两个切点。 Right Top/Bottiom Vertex用于定位右面的上下两个顶点。 Right Top/Bottiom Tangent用于定位右面的上下两个切点。 Bottom Left/Right Vertex用于定位下面的左右两个顶点。 Bottom Left/ Tangent用于定位下面的左右两个切点。 Left Top/Bottom Vertex用于定位左面的上下两个顶点。 Left Top/Bottom Tanget用于定位左面的上下两个切点。 Elasticity用来设置弹性方式,可以选择Stiff如同冷橡胶,图像变形较小; Normal普通;Loose松动,接近液体效果;Liquid如同热橡胶,允许图像像液体一样变形。 特别注意:应该避免产生褶皱现象(因为会出现锯齿变形);也应该避免产生钝角(因为图像不能紧密的跟随变化)。可以通过弹性选择,改善褶皱和变形产生的不如意的结果。 2, Bulge Bulge称为“凸凹效果”或“放大镜效果”,模拟图像透过气泡或放大镜的效果 Horizontal Radius水平半径。 Vertical Radius垂直半径。 Bulge Center定位点。 Bulge Height凸凹程度设置,正值为凸,负值为凹。 TaPer Radius锥形半径,用来设置凸凹边界的锐利程度。 Antialiasing反锯齿设置,只用于最高质量。 Pinning选择 Pin All Edges为定住所有边界。 3, Corner Pin Corner Pin称为“边角定位”,通过改变四个角的位置来变形图像,主要是用来根据需要定位,可以拉伸、收缩、倾斜和扭曲图形,也可以用来模拟透视效果,可以和运动遮罩层相结合,形成画中画效果。 Upper Left左上定位点 。Upper Right右上定位点。 Lower Left左下定位点。Lower right右下定位点。 控制很简单。 4,DisplacementMap Diaplacement Map称为“映射置换”或“层位移贴图”可以使用任何层作为映射层,通过映射的像素颜色值来对本层变形。实际是应用映射层的某个通道值对图像进行水平或垂直方向的变形。 Displacement Map Layer选择本合成中的图像层为映射。 Use ForHorizontal/Vertical Displacement 选择映射层对本层水平或垂直方向起作 用的通道。 Max Horizontal/Vertical Displacement最大水平或垂直变形程度。 Displacement Map Behavlor置换方式, Center Map映射居中, Stretch Map toFit伸缩自适应。 Tile Map置换平铺。 Edge Behavior边缘设置,可以选择Warp Pixels Around变形像素包围。选择映射层, 5,Mesh Warp Mesh Warp称为“面片变形”,应用网格化的曲线切片控制图像的变形区域,对于画片变形的效果控制,更多的是在合成图像中通过鼠标拖曳网格的节点完成。可以将静态图片做成“开口笑”等等,很有意思。Rows用于设置行数。Columns用于设置列数。 Elesticity弹性设置. Gird Value网格值显示,用于改变分辨率使行列数发生变化时显示. 拖拽节点如果要调整更细微的效果,可以增加行/列数(控制节点): 6,Mirror Mirror称为“镜面效果”,通过可以设定角度的直线将画面反射,产生对称效果。 Reflection Center设置反射中心,也就是反射参考线的位置 Reflection Angle用于设置反射角度,也就是反射参考线的斜率。 7,offset offset称为“偏移效果”,用于在图像内,图像从一边偏向另一边。 Shift Center To用于设置原图像的偏移中心 , Blend With original和原图像混合程度。 8,OPTICS COMPANSATION 用来模拟摄象机透视效果,参数比较简单,可以自己调调看。 9,Polar Coodlnates Polar Coordinates称为“极坐标”,用来将图像的直角坐标转化为极坐标,以产生扭曲效果。 Interpolation设置扭曲程度。 Type of Conversion设置转换类型, 其中选择 Polar to Rect表示将极坐标转化为直角坐标; Rect to polar表示将直角坐标转化为极坐标。 10, RESHAPE 称为“再成型效果”,需要借助几个遮罩才能实现,通过同一层中的三个遮罩,重新限定图象形状,并产生变形效果。使用方法: 1-在素材加上此特效。 2-在素材的起始状态建一个遮罩。 3-在素材的结束位置建一个遮罩。 4-再建一个能框住前两个遮罩的大区域遮罩。 5-把Source Mask选Mask 1,Destination Mask选Mask 2, Boundary Mask选Mask 3。 6-Percent调成100。 调整参数: Source Mask设置源遮罩。 Destination Mask设置目标遮罩。 Boundary Mask设置边界遮罩。 Percent设置变化百分比。 Elashcity弹性设置。 Correspondance Points指定源遮罩和目标遮罩对应点的数量。 Interpolation Method插值方式。 Discrete表示离散的, Linear表示线性的 Smooth表示平滑的。 注意:在设置遮罩的时候使用不同的这罩名称,对本效果十分有利。 11,RIPPLE 称为"波纹效果"或“涟漪效果”,就像水池表面的波纹。 12,Smear Smear称为“涂抹效果”,通过使用遮罩在图像中定义一个区域,然后用作用遮罩 移动位置来进行“涂抹”变形。 使用方法:1-先在素材上画两个遮罩。2-调整Precent的值。 Source Mask设置源遮罩。 Boundary Mask设置边界遮罩。 Mask Offset遮罩位移。 Missk Rotation遮罩旋转。 Mask Scale遮罩大小。 Precent变化程度百分比。 Elasticity弹性设置。 Interpolation Method插值方法,Discrete 表示离散的,Linear 表示线线性的 Smooth表示平滑的。 13, Spherize Spherize“球面化效果”,如同图像包围到不同半径的球面上。 控制参数如图: Radius设置球面半径。 Center of Sphere设置球心。 14,transform 可以称为“变换效果”。比较简单,自己尝试。 15,twirl 可以称为“旋涡效果”。太常见了,PS里就有,不多解释了。 16,Wave Warp Wave Warp称为“波浪变形”,可以设置自动的飘动或波浪效果。 控制参数如图: wave Type选择波形类型,包括正弦、方波、三角波和噪波等。 Wave Hight设置波形高度。 Wave Width设置波形宽度。 Direction设置波动方向。 Wave Speed设置波动速度,可以按该速度自动波动。 Pinning设置边角定位,用于显示或不显示图像边缘的各种波浪效果。可以分别控制某个边缘,从而带来很大的灵活性。 Phase设置相位。 Antialiasing选择反锯齿程度。 注意:使用Wave Warp的最大好处是可以让波形“自动”移动,而不需要用关键帧来设置运动效果。可以轻易地制作出动态的旗飘和波浪效果,并且可以通过对波动速度设置关键帧,改变固有的变化频率,产生生动的效果。 magnify---放大镜效果???? 九,Simuation中的 Partcle Playground。 Simuation中的 Partcle Playground应用综述:Particle Playground是“粒子场”,也就是 After Effects中的粒子效果。粒子在后期制作中的应用十分广泛,是高级后期制作软件的标志。可以用粒子系统来模拟雨雪、火和矩阵文字等。 Cannon控制项,用于设置粒子发射器 Position用于定位粒于发射器。 Particles Per Second每秒产生粒子数目。 Direction粒子方向。 Direction Random Spread方向随机性。 Velocity 初始速度。 Velocity Random Spread速度随机性。 Color粒子颜色。 Particle Radius粒子半径。 Gird控制项,在每个网格的节点处产生新粒子,用于产生一个均匀的粒子面,产生的粒子不存在速度问题,完全由重力、斥力墙和属性映射来控制。默认的设置,由于重力打开,所以都向下运动。 Position用于确定网格中心的位置。 Width网格宽度。 Height网格高度。 Particles Across确定水平方向上产生的粒子数 ,默认的情况为0,所以看不到粒子。 Particies Down确定垂直方向上产生的粒子数。 Color粒子颜色。 Particie Radius粒子半径。 注意:默认的情况下,使用Cannon产生粒子,如果要使用Gird,则需要将 Cannon中的Particle Per Second设为0,同时设置适当的Particles Across/Down的数值。 Layer Exploder控制项,用于设置层爆破,从而分裂一个层作为粒子。 我们经常可以看到把一个画面粉碎成小块,同时可以模拟烟火和增加粒子数量。 Layer Explode对层应用 Explode Layer设置应用粒子的层。 Radius of New Particles新产生粒子半径。 Velocity Dispersion速度分布。‘ Particle Exploder选择项,用于对粒子场应用爆破效果 Radius of New Particles新产生粒子半径。 Velocity Dispersion速度分布。 Affects对粒子场影响。必须应用本属性才能应用于一个粒子集。 Layer Map控制项,用新的物件代替由 Cannon、 Gird和Layer/Particle Exploder产生的粒子。 Use Layer用于指定作为映射的层。 Time offset Type时间位移类型。 Affects影响属性。 Gravity控制项,用于设置重力场。 Force重力大小。 Force Random Spread重力随机性。 Direction重力方向。 Affects影响属性。 Repel选择项,设置斥力。 Force斥力大小。 Force Radius斥力半径。 Repller斥力控制器。 Affects影响属性。 Wall选择项,设置墙属性。 Boundary选择封闭遮罩作为边界。“ Affects影响属性。 Persistent Property Mapper选择项,用于指定持久的属性映射器 Use Layer As Map选择一个层修改粒子属性。 Affects影响属性。 Map Red/Green/Blue to映射粒子的 RGB通道的算法。 Min/Max指定最小/最大变化范围。 Ephemeral Property Mapper选择项,用于指定暂时属性映射器, 其中的子属性和上面持久的属性映射器相同。 总之,我们可以用After Effects的粒子场来产生很多的纷乱复杂的事物,通过替换 粒子映射,也就是说粒子是由其它物件构成,产生不同的效果, 十,今天整理出风格化(StyliZe)效果 这组特效,详情如下:特效在实际应用中变化无穷,这里的例图只是表现了某一方面的效果,并不能完全体现其精髓,这只能靠自己在实践中体验了:)StyliZe是一组风格化效果,用来模拟一些实际的绘画效果或为画面提供某种风格化效果。风格化效果菜单包含如笔触/描边浮雕/发光/噪波等效果!Brush Strokes ,Color Emboss ,Emboss ,Find Edges ,Glow,Leave Color,Mosaic,Motion Tile,Noise,Roughen Edges ,Scatter,Strobe Light,Texturize,Write-on 1, Bruse Strokes Brush htrokes称为“笔触效果”,对图像产生类似水彩画效果。 Stroke Angle 笔触角度 Brush Size笔触大小 Stroke Length笔触长度 Stroke Density笔触密度。 Stroke Randomness笔触随机性。 Paint Surface绘画表面。 Blend With Original和原图像混合 2, Color Emboss Color Emboss称为“彩色浮雕”,效果和Emboss浮雕效果类似,不同的是本效果包含颜色,如图所示:Direction浮雕方向。 Relief浮雕大小。 Contrast对比度。 Blend With original和原图像混合 3, Find Edge Find Edge称为“勾边效果”,通过强化过渡像素产生彩色线条。Invert用于反向勾边结果。Blend With original和原图像混合。 4, Glow Glow称为“发光效果”,经常用于图像中的文字和带有Alpha通道的图像,产生发光效果。 Glow Base on选择发光作用通道。可以选择 Color Channel和 Alpha Channel Glow Threshold发光程度。 Glow Radius发光半径。 Glow Intensity发光密度。 Composite original和原画面合成。 Glow operation发光模式,类似层模式的选择。 Glow Colors发光颜色。 Color Looping颜色循环 Color Loops颜色循环方式。 Color Phase颜色相位, ColorA&B Midpoint颜色A和B的中点百分比。 ColorA选择颜色A。 ColorB选择颜色B。 Glow Dimensions发光作用方向(水平/垂直/水平十垂直) 5, Leave Color Leave Color用于消除给定颜色,或者删除层中的其它颜色 Amount to Decolor设置脱色程度。 Color TO Leave选择脱色。 Tolerance相似程度。 Edge Softness边缘柔化。 Match colors颜色对应。可以使用 RGB和 Hue。 6, Mosaic Mosaic效果称为“马赛克效果”,使画面产生马赛克. 效控参数:Horizontal Blocks水平色块大小。 Vertical Blocks垂直色块大小。 7, Motion Tile Motion Tile称为“运动分布”,同屏画面中显示多个相同的画面。 Tile Center分布定位。 Tile Width分布宽度。 Tile Hight分布高度。 output Width输出宽度。 output Hight输出高度。 Phase分布相位。 Horizontal Phase Shift应用水平位移。 8, Noise Noise用于产生画面噪波,主要是通过在画面中加入细小的杂点。Amountof Noise设置噪波数量,调整噪波密度。Noise Type噪波类型。选择Color Noise使噪波应用彩色像素。 Clipping使原像素和彩色像素交互出现。 9, Roughen Edges Roughen Edges边缘粗糙化,可以模拟腐蚀的纹理或融解效果。 Edge Type 边缘类型 Edge Color边缘颜色 Border边沿 Edge Sharpness轮廓清晰度 Fractal Influence 不规则影响程度 Scale 缩放 Stretch Width or Height 控制宽度和高度的延伸程度 Offset (Turbulence) 偏移设置 Complexity 复杂度 Evolution 控制边缘的粗糙变化 Evolution Options Cycle (in Revolutions) 循环旋转 Random Seed 随机速度 10, Scatter Scatter称为“分散效果”,像素被随机分散,产生一种透过毛玻璃观察物体的效果,scatter Amount像素分散数量。 Grain设置分散方向。 Scatter Randomness设置随机性。选择 Randomize Every Frame使每帧画面重新运算。 11, Strobe Light Strobe Light称为“闪光灯效果”,它是一个随时间变化的效果,在一些画面中间不断地加入一帧闪白、其它颜色或应用一帧层模式,然后立刻恢复,使连续画面产生闪烁的效果,可以用来模拟电脑屏幕的闪烁或配合音乐增强感染力,Strobe Color选择闪烁色。 Blend With Original和原图像混合程度。 Strobe Duration(secs)闪烁周期,以秒维单位。 Strobe Period(secs)间隔时间,以秒为单位。 Random Strobe Probablity闪烁随机性。 Strobe闪烁方式,可以选择 operates On Color Only在彩色图像上进行或 Mask Layer Transparent在遮罩上进行。 Strobe Operator选择闪烁的叠加模式。 12, Texturize Texturize称为“贴图化效果”,应用其它层对本层产生浮雕形式的贴图效果。控制参数如下:Texture Layer选择合成中的贴图层。 Light Direction灯光方向。 Texture Contrast贴图对比度。 Texture Placement贴图放置,可以平铺、居中或拉伸。 13, Emboss Emboss称为“浮雕效果”,不同于 Color Emboss的地方在于本效果不对中间的彩色像素应用,只对边缘应用。Direction浮雕方向。 Relief凸起高度。 Contrast边缘对比度。 Blend With Original和原图像混合。 14, Write-on Write-on效果是用画笔在一层中绘画,模拟笔迹和绘制过程。 其应用相对有些复杂,下面举个简单的例子介绍一种用法。 做一个蓝色图象随着手绘的线路移动: 第一步:新建一个固态层 第二步:单击motion sketch 第三步:点START CAPTURE 第四步:按住鼠标左键在固态层(Solid1)上随便移动,这时,在固态层(Solid1)上会随着鼠标移动的路径出现连续的“点”,其连续“点”的最大时间长度受Comp设定的时间长度限制。画完后,松开鼠标左键。 第五步:再新建固态层2 第六步:给固态层2加Write-on特效 第七步:启动Motion math... 第八步:调整参数,如图 第九步:点Load..选一个脚本文件 第十步:点APPLY后,按小键盘上的“0”键就可以预览了。 十一,Text特效 Text效果用来产生重叠的文字、数字(编辑时间码)、屏幕滚动和标题等等。在AE5.5中有3项 Basic Text Basic Text用于生成基本文字 Font/Style:字体/风格 Direction(Horizontal/Vertical/Rotate): 书写方向(水平/垂直/旋转) Alignment:对齐方式 Top 顶部 Center居中 Bottom底部 Show Font输入时显示字体 Position 书写位置 Display Options 文字外观设置,可选择只显示面、边,面在边上或边在面上。 Fill Color面颜色 Stroke Color边颜色 Stroke Width 设置边的宽度 Size 字的大小 Tracking 字间距 Line Spacing 字行宽 Composite On Original与原图像合成,否则背景为黑色。 2,Numbers称为“数字效果”。 产生相关 的数字,可以编辑时间码、十六进制数字、当前日期 等,并且可以随时间变动刷新,或者随机乱序刷新。 参数基本同Basic Text的相似,解释几个不同的,其余不说了。 Type设置数字类型,可以选数字、时间码、日期、时间和十六进制数字 Random Values选择数字随机变化 Decimal Places小数点位置 Value/Offset/Random Max设置数字随机离散范围 3,Path Text 路径文字特效,另外,文字运动路径还可以通过自定义MASK实现 十二,“抠像”即“键控技术”在影视制作领域是被广泛采用的技术手段,实现方法也普遍被人们知道一些――当您看到演员在绿色或蓝色构成的背景前表演,但这些背景在最终的影片中是见不到的,就是运用了键控技术,用其它背景画面替换了蓝色或绿色,这就是 “抠像”。当然,“抠像”并不是只能用蓝或绿,只要是单一的、比较纯的颜色就可以,但是与演员的服装、皮肤的颜色反差越大越好,这样键控比较容易实现。如果是实时的“抠像”都需要视频切换台或者支持实时色键的视频捕获卡。但价格比较昂贵,个人基本上是承受不了的。在After Effects中,实现键控的工具都在特技效果中,标准版的After Effects 5.5内置的特效只包括Color Key色键和Luma Key亮键:完整版After Effects 5.5 Production Bandle包含了 Color Difference Key颜色差值键、 LinerColor Key线性色键, Difference Matte差值遮罩、 Color Range颜色范围键控、 Extract抽取键控。 1, 应用Color Key 对于单一的背景颜色,可称为键控色。当选择了一个键控色(即吸管吸取的颜色〕,应用Color Key,被选颜色部分变为透明。同时可以控制键控色的相似程度.调整透明的效果。还可以对健控的边缘进行羽化,消除“毛边”的区域。效控参数如图: 具体使用Color Key色键的方法:举个小例子,使用一张白色背景的蝴蝶图片和一张黑背景的花朵图片,抠去蝴蝶图片的白色背景,使其看上去好像落在花上。首先选择要应用色键的层。――-在例子中我选择白色背景的蝴蝶图片。再给其加上Color Key特效(菜单Effect>Keying>Color Key), 应用Color Key色键。 其次,效果控制窗口中,单击小吸管,鼠标箭头变成吸管状,然后在蝴蝶图片的白色区域单击一下,(或者点击颜色方块,弹出“颜色”对话框,用HSL或RGB方式指定一个颜色)。击“吸管”按钮,在层窗口或合成窗口中选择颜色,如图--单击后,我们看到白色区域消失了,但蝴蝶边缘还有白色的锯齿毛边。这时需要调整以下参数: Color Tolerance用于控制颜色容差范围。值越小,颜色范围越小。 Edge Thin用于调整键控边缘,正值扩大遮罩范围,负值缩小遮罩范围。 Edge Fether用于羽化键控边缘,产生细腻、稳定的键控遮罩。 2,使用Color Range颜色范围键控 Color Range颜色范围键控通过键出指定的颜色范围产生透明,可以应用的色彩空间包括Lab、YUV和RGB。这种键控方式,可以应用在背景包含多个颜色、背景亮度不均匀和包含相同颜色的阴影(如玻璃、烟雾等), 遮罩视图 用于显示遮罩情况的略图。 键控滴管 用于在遮罩视图选择开始的键控色。 加滴管 增加键控色的颜色范围。 减滴管 减少键控色的颜色范围。 Fuziness 用于调整边缘柔化度、 Color Space选择颜色空间,有 Lab、YUV和RGB可供选择。 Min/Max精确凋整颜色空间参数L,Y,R、a,U,G和b,V,B代表颜色空间的三个分量。Min**调整颜色范围开始,Max**调整颜色范围结束。 3,使用Difference Matte差值遮罩 Difference Matte差值遮罩通过比较两层画面,键出相应的位置和颜色相同的像素。 最典型的应用是静态背景、固定摄像机、固定镜头和曝光,只需要一帧背景素材,然后让对象在场景中移动,效果控制参数如图: View可以切换预览窗口和合成窗口的视图,选择Final Output最终输出结果、Source Only显示源素材和Matte Only显示遮罩视图。Difference Layer选择用于比较的差值层,None表示没有层列表中的某一层。If Layer Sizes Differ用于当两层尺寸不同的时候。可以选择Center将差值层放在源层中间比较,其它的地方用黑色填充:Stretch to Fit伸缩差值层,使两层尺寸一致,不过有可能使背景图像变形。Matching Tolerance用于调整匹配范围。Matching Softness用于调整匹配的柔和程度。Blur Before Difference用于“模糊”比较的像素,从而清除合成图像中的杂点,而并不会使图像模糊。举个简单的例子说明一下使用方法: a调入素材。一个“奔跑恐龙”的动画文件和一幅背景图片, b调整好素材的大小和位置。给“奔跑恐龙”做个位移,并记录关键祯,并再复制两层“奔跑恐龙”。分别做位移,如图: c给“奔跑恐龙”加Difference Matte特效,如图: 这时,我们看到“奔跑恐龙”消失了,那是因为Difference Layer默认的是“奔跑恐龙”当前层。 d因为“奔跑恐龙”的背景色为白色,所以要新建一层白色的固态层,放到最下面,再回到特效窗口,将Difference Layer处改选成Solid1,恐龙回来了:)。 4,使用Extract抽取键控 Extract抽取键控根据指定的一个亮度范围来产生透明,亮度范围的选择基于通道的直方图(Histogram),抽取键控适用于以白色或黑色为背景拍摄的素材,或者前、后背景亮度差异比较大的情况,也可消除阴影。 控制参数如图。 直方图 用于显示从暗到亮的亮度标尺上分布的像素数量。 控制面板 用于调整透明的变化范围。 Channel 用于选择应用抽取键控的通道,可以选择Luminance亮度通道、Red 红色通道、Green绿色通道、Blue蓝色通道和Alpha透明通道。 Black Point 设置黑点,小于黑点的颜色透明。 White Point 设置白点,大于白点的颜色透明。 黑柔和 用于设置左边暗区域的柔和度。 白柔和 用于设置右边亮区域的柔和度。 lnvert 用于反转键控区域。 5,Inner Outer Key借助遮罩抠像 此特效须借助遮罩遮来实现,适用于动感不是很强的影片。用Inner Outer KeyInner 来处理毛发效果比较好!参数: 下面以一个简单例子说明一下Inner Outer Key的使用方法 a, 调入素材,给“001”加Inner Outer Key特效,控制参数如下图: b, 建一个遮罩,把整个人,包括毛发都框起来。 c, 再第一个遮罩里建第2个遮罩,把人的轮廓框出来,如图; d, 在Foreground (Inside)处选MASK2,在Background (Outside)处选MASK1, e ,我们还可以建多个遮罩,用来处理小细节的地方,在Additional Background的选项下,最多可以选择10个遮罩。这里就不再抠了。 f, 需要更加精细的效果,可以调整以下调整项(Edge Thin调整边缘的精细度、Edge Feather调整边缘的羽化值、Edge Threshold 可让边缘更锐利、Blend with Original与原图像的融和度) 6,使用Linear Color Key线性色键 Linear Color Key线性色键是一个标准的线性键,线性键可以包含半透明的区域。线性色键根据RGB彩色信息或Hue色相及Chroma饱和度信息,与指定的键控色进行比较,产生透明区域。之所以叫做线性键,是因为可以指定一个色彩范围作为键控色,它用于大多数对象,不适合半透明对象。 素材视图 用于显示素材画面的略图。 预览视图 用于显示键控的效果。 键控滴管 用于在素材视图中选择键控色。 加滴管 用于为键控色增加颜色范围,从素材视图或预览视图中选择颜色。 减滴管 用于为键拧色减去颜色范田,从素材视图或预览视图中选择颜色。 View 用于切换预览窗口和合成窗口的视图,可以选择Final Output最终输出结果、Source Only显示源素材和Matte Only显示遮罩视图。 Key Color 设胃基本键控色,可以使用颜色方块选择或使用滴管工具在合成窗中选择。 Match colors 用于选择匹配颜色空间,可以选择Using RGB使用RGB彩色、 Using Hue 使用色相和Using Chorma使用饱和度。 Matching Tolerance 用于调控匹配范围。 MatchingSoftness 用于调整匹配的柔和程度。 KeyOperMion 用于选择Key Colors键出颜色和Keep Colors保留颜色。 7,Luma Key 使用亮键 对于明暗反差很大的图像,我们可以应用亮键,使背景透明,亮键设置某个亮度值为“阀值”,低厂或高于这个值的亮度设为透明。使用LumaKey亮键的方法: 1.选择要应用亮键的层。(001.psd)应用Luma Key亮键 2-在Key Type处选择键控类型有四种可以选择(Key Out Brighter 键出的值大于阀值,把较亮的部分变为透明。Key Out Darker 键出值小于阀值,把较暗的部分变为透明。 Key Out Similar键出阀值附近的亮度。Key Out Dissimilar 键出阀值范围之外的亮度。) 3-调整其它参数: Threshold 用于设置阀值。 Tolerance 用于控制容差范围。值越小,亮度范围越小。 Edge Thin 用于调整键控边缘,正值扩大遮罩范围,负值缩小遮罩范围。 Edge Fether 用于羽化键控边缘。 在After Effects标准版中Color Key色键和Luma Key亮键都是属于二元键控”。即键控的图像,或者完全透明,或者完全不透明,没有半透明的区域。这主要运用于有锐利边缘的固态对象,这是最简单的键控。 8,使用Spill puppressor溢出控制器 Spill Suppressor溢出控制器,可以去除键控后的图像残留的键控色的痕迹。滥出控制器用作上除图像边缘溢出的键控色,这些溢出的键控色常常是由于背景的反射造成的。 ColorTo Suppress 用于设置“溢出颜色”。叮以刚滴管在应川的键控效果小,点击键控色的力块。 ColorAccuracy 用于算法的选择,可以选择Faster更快(主要针对红绿蓝色) 和Barter更好。 Suppressor用于设置抑制程度。 注意: 如果使用溢出控制器还不能得到满意的结果, 可以使用效果中的 Hue/Saturation色相/饱和度效果,降低饱和度,从而弱化键控色 9,使用Color Difference Key颇色差值键控 Color Difference Key颜色差值键控从不同的起始点把图像分成四个遮罩,即“遮罩A(Matte Partial A)”和“遮罩B(Matte Partial”。其中.遮罩B是甚于键控色的, 而遮罩A是键控色之外的遮罩区域。然后组合两个遮罩,得到第三个遮罩,称为Alpha遮罩, Color Difference Key颜色差值键控产生一个明确的透明值。 ‘ 参数如图: 素材视图 用于显示源素材画面的略图。 遮罩视图 用于显示调整的遮罩情况,点下面的“A” “B” “a”分别察看“遮罩A”、 “遮罩B”和“Alpha遮罩”。 键控滴管 用于从素材视图中选择键控色。 黑滴管 用于在遮罩视图中选择透明区域。 白滴管 用于在遮罩视图中选择不透明区域。 View 用于切换合成窗口中的显示。可以选择多种视图。 Key Color用于选择键控色。可以使用调色板,或用滴管在合成成窗口或层窗口中选择。 Color Matching Accuracy 用于设置颜色匹配的精度, 可选择Fast更快或Accurate”更精确。 Partial A * 对遮罩A的参数精确调整。 Partial B * 对遮罩B的参数精确调整。 Matte * 用于对Alpha遮罩的参数精确调整。 注意:要键出蓝色背景,选择默认的蓝色(B-255), 因为键控色和实际颜色的差别不会影响透明.使用白滴管,在Alpha遮罩视图中白色(不透明)区域中最暗的部位点击,设置不透明区域。使用黑滴管,在Alpha遮翠视图中黑色(透明)区域中最亮的部位点击,设置透明区域。 另外,“键控技术”应和遮罩结合使用,效果会更加完美。以后我会逐步整理相关的资料,也请高手给予帮助!!! 补充: 一般高级键控常用的合成的方法: (1)如果素材图像主要为蓝背景,首先用某种色键(如Color Difference Key颜色差值键),建一个橙色固态层作为参考背景,通过遮罩视图(Matte View)调整键控范围,包括透明、半透明和不透明的区域.再使用Spill Suppressor溢出控制器,消除键控色留下的痕迹;Alpha Level调整Alpha通道的透明程度:Matte Choker遮罩堵塞工具凋整遮罩中的空洞.调整到满意后,在合成图像中,将固态层替换为新的背景素材。最后,根据素材变化,调整键控及遮罩参数,并设置关键帧,完成作品。 (2)对在蓝色或绿色背景中具有平稳亮度的素材键控的方法: 首先可以用Color Difference Key颜色差值键控,再用Spill Suppressor溢出控制器,清除键控色的痕迹。如果要求更高,还可 以使用Simple Choker简单堵塞工具和Matte Choker遮罩堵塞工具进行精细调整。如果结果还不满意,暂时关闭Color Difference Key,重新使用Linear Color Key线性色键。 (3) 对在蓝色或绿色背景中包含有多种颜色或亮度不稳定的素材键挖的方法: 首先应用Color Range颜色范围键控,再用Spill Suppressor溢出控制器和其它遮罩工具。如果结果不满意,重新使用或加入Linear Color Key线性色键。 (4)在黑暗和阴影的区域产生透明的方法: 先用Extract抽取键控,设置为Luminance Channel亮度通道。 (5)对固定背景(可以是复杂背景)应用键控的方法: 首先用Difference Matte差值遮罩键控,以单独的背景图层作为遮罩参考,进行差值。再加入Spill Suppressor溢出控制器和其它遮罩工具。 对于不同的实际情况,应该选择适当的键控方法,以得到满意的效果。对复杂的键控处理,可能要用到不同的键控才能得到满意的结果, 可以组合两个或者更多的键控和遮 罩。通过效果开关应用或不应用效果,观察键控效果。 十三,TIME效果 TIME效果提供和时间相关的特技效果,以原素材作为时间基准,在应用时间效果的时候,忽略其他使用的效果,TIME效果中有3个特效Echo\Posterize time\Time displacement. 1,Echo 称为“画面延续”或“时间延迟”,类似于声音效果里的回声效果,可以营造一种虚幻的感觉。而且,延续的画面可以比原画面早。Echo效果针对包含运动的画面,而且忽略遮罩和以前应用的特技效果。 效控参数如图; 时间类的特效比较简单,我就不举图例了! Echo Time (seconds) 设置延时图像的产生时间,以秒为单位,正值为之后出现,负值为之前出现 Number Of Echoes 延续画面的数量 Starting Intensity 延续画面的透明度 Decay 设置延续画面的透明比例 Echo Operator 叠加模式设置如图 2,Posterize time 称为“抽帧效果”或叫“闪白”,这种效果经常会出现在传统的视频特技台上,将当前正常的播放速度调制到新的播放速度,但播放时长不变。如果低于标准速度,会产生跳跃现象。效控参数如图 Frame Rate调制到新的帧数。 3,Time displacement. Time Displacement称为“时间替换效果”,可以在同一画面中反映出运动的全过 程。应用的时候要设置映射图层,然后基于图像的亮度值,将图像上明亮的区域替换为几秒钟以后该点的像素。 Time Displacement Layer选择时间替换层 MaxDisplacementTime(sec) 设置最大位移时间,以秒为单位。 Time Resolution(fps) 时间分辨率,这个值应该不大于层的标准播放速度. If Layer Size Differ 如果替换层和原图像尺寸不同,选择Stretch Map to Fit拉伸替换图像 十四,Transition效果 Transition效果是一系列的转场效果,由于After Effects并非视频编辑软件,所以不 像Premiere那样提供了那么多种转场,况且在Premiere中转场是作用在两个镜头之间的,而在After Effects中转场作用在某一层图像上,所以两层 之间的转场效果并不适用于多层合成的After Effects。 Transition中包含的转场效果有如下几种 1,Block Dissolve Block Dissolve称为“板块叠化”,随机产生板块溶解图像。 Transition Completion转场完成百分比。 Block Width /Block Height板块宽度/板块高度。 Feather板块边缘羽化。 2,Gradient Wipe Gradient Wipe称为“渐变转场”,是依据两个层的亮度,值进行的,其中一个层叫渐变层(Gradient Layer),用它进行参考。 Transition Completion转场完成百分比。 Transition Softness边缘柔化程度。 Gradient Layer选择渐变层进行参考。 Gradient Placement 渐变层的放置,包括居中、平铺和拉伸。 Invert Gradient渐变层反向,使亮度参考相反。 3,Iris Wipe Iris Wipe以辐射状变化显示下面的画面,可以指定作用点、外半径及内半径来产生不同的辐射形状Iris Center 辐射中心位置 Iris Points—设置辐射多边形形状。 Outer Radius 外半径。 Inner Radius 内半径,要应用必须将UselnnerRadius打开。 Rotation 旋转设置。 Feather 边缘柔化。 4,Linear Wipe效果控制 Linear Wipe效果成为“线性扫画”。形成从某个方向的擦拭效果,扫画的效果和素材的质量有很大关系,在草稿质量下,图象边界的锯齿会较明显,最高质量下,经过反锯齿处理边界会变的平滑。利用此特效,可以扫出层中遮罩的内容。 Transition Completion 转场完成百分比。 Wipe Angle 转场角度。 Feather 边缘羽化。 5,RadialWipe称为“旋转扫画” 是通过旋转完成扫画。效果控制参数(如图7-220)o Transition Completion转场完成百分比。 Start Angle 初始角度。 Wipe Center扫画中心位置。 Wipe 扫画类型,可以选择顺时针、逆时针两个方向 Feather边缘羽化。 6,Venetian Blinds Venetian Blinds称为“百叶窗扫画”,过程类似百叶窗的开合。 Transition Completion 转场完成百分比。 Direction 设置方向。 Width设置宽度。 Feather 边缘羽化。 十五,Render效果 Render效果组里包含很多特效,(4 color Gradient/Advanced Lightning/Audio Spectrum/Audio Waveform/ Beam/Cell Pattern/Ellipse/Fill/Fractal/Fractal Noise/Grid/Lens Flare/Lightning/Radio Waves /Ramp/Stroke/Vegas)十七项----没有在这里列举的是第三方插件,就不讲解了。可以创造一些原画面中没有的效果,而且这些效果在制作的过程中应用广泛、频繁,但After Effects毕竟不是一个绘图软件或三维动画软件,所以我们能够利用Render直接产生一些效果物件,才是简单易行的。我们可以使用 Adjustment Layer制造效果,而不影响其它层的图像。由于此类特效多应用于动态,所以一些详细的参数调整非常频繁,就不一一罗列了,具体参数调整动动手就有体会了。这里举的小例子只是体现了这个特效组万千变化中的一方面,要体会它的强大功能,只有自己去实践。另外,由于这组特效的特性关系,用于演示的GIF文件多了些,朋友们打开网页的速度可能会慢些,建议在个人属性里把每页显示帖子数改小点。 (一)4 color Gradient 4 color Gradient称为“四色渐变”,可以模拟霓虹灯,流光异彩等谜幻的效果。 效控界面如图: Positions & Colors用来设置四种颜色的中心点和各自的颜色。 Blend融合度 Opacity 透明度 Transfer Mode叠加模式 (二)Advanced Lightning 可以称为“高级闪电效果”。 控制参数如图 Lightning Type闪电的类型 :Direction,Strike,Breaking,Bouncey,Omni ,Anywhere,Vertical ,Two-Way Strike Origin起始位置 Direction结束位置 Conductivity State状态设置 Core Settings用来设置闪电主干和分支的颜色/半径透明度等 Glow Settings用来设置闪电外围辐射的颜色/半径/透明度等 Alpha Obstacle Turbulence混乱程度 Forking 设置闪电的分支 Decay 衰减设置 Decay Main Core Add to Original Expert Settings高级设置 在高级设置Expert Settings中又包含如下参数控制,这里就不一一详述了。 Complexity 设置闪电的复杂程度 Min. Forkdistance调整闪电分支延展长度和稀密度 Termination Threshold调整闪电分支的极限(长短,强弱) Main Core Collision Only Fractal Type分型模式 Core Drain设置闪电主干核心的衰减度 Fork Strength设置分支强度变化 Fork Variation设置分支变化频率 (三)Audio Spectrum称为“音频图像” Audio Spectrum用于产生音频频谱,有力地推动音乐感染力,效果控制参数 Audio Layer选择合成中的音频参考层。 Strar Point起点位置。 End Point终点位置。 Path选择路径。可以用笔工具在层窗产生一个路径,让波形沿路径变化。 Start Frequency起始频率,设置参考的最低音频频率,人耳的听觉范围是20-20000 HZ。 End Frequency截止频率。 Maximum Height频谱显示的振幅。 Audio Duration波形保持时长。 Audio offset波形位移。 Thickness波形宽度。 Softness软边程度。 inside Color中间颜色。 outside Color外围颜色。 Hue Interpolation颜色插值。 Dynamic Hue Phase颜色相位变化。 Color Symmetry颜色对称。 Display option显示设置,可以选择 Digital显示数值波形, Analog Line显示模拟谱线和Analog Dots显示模拟频点。 Side Option边缘设置,可以选择半边或整个波形显示。 Duration Averaging平均化。 Composite on original和原画面合成。这样既可以显示原画面,又可以叠加音频谱线。但我们最好新建一个 Adjustment Layer来应用此效果。 (四)Audio Waveform称为“音乐波形”。 Audio Waveform用于产生音频波形,和上面的Audio Spectrum音频频谱差不多,如果用电子工程来解释就是一个表示“时间域”,一个表示“频域”。由于上面已经详细介绍各项参数,两种设置大体相同,所以就不再详述。效控参数如图 (五)Beam Beam称为“激光束效果”,用来模拟激光束移动,如图所示 效果控制参数 Starting Point起点。 En**** Point终点。 Length长度。 Time时间。 Starting Thickness起点宽度,可以设置为梯形 Softness边缘柔化。 Inside Color中间颜色。 Outside Color外围颜色。 3D Perspective三维纵深。 Composite on original和画面合成。 (六)Cell Pattern称为“纹理或细胞”效果 Cell Pattern纹理(细胞)类(Bubbles/Crystals/Plates/Static Plates/Crystallize/ Pillow/Crystals HQ/Plates HQ/Static Plates HQ/CrystalliMixed Crystals/Tubular) Invert反转 Contrast 对比度 Overflow溢出设置( Clip/Soft Clamp/Wrap Back) Disperse 分散设置 Size 大小尺寸的设置 Offset偏移设置 Tiling Options模拟陶瓷效果的相关设置 (Enable Tiling--Cells Horizontal/Cells Vertical) Evolution 发展运动变化设置 Evolution Options Cycle Evolution循环设置 Cycle (in Revolutions) 旋转循环 Random Seed 随机速度 (七)Ellipse Ellipse用来产生椭圆形,也可以模拟激光圈等,如图所示 效果控制参 Center椭圆位置。 Width宽度。 Hight高度。 Thickness边缘厚度。 Softness边缘柔化。 Inside/Outside Color中间/外围色。 Composite On Original与画面合成。 (八)Fill Fill称为“填充效果”,可以向图层的遮罩中填充颜色,如图所示 Fill Mask选择要填充的遮罩。 Color选择颜色。 Horizontal Feather水平边缘羽化。 Vertical Feather垂直边缘羽化。 Opacity不透明度。 (九)Fractal称为“万花筒”,可以用来模拟细胞体,制作分型效果等。 参数如下Set Choice精细设置,有六种模式 (Mandelbrot/Mandelbrot Inverse/Mandelbrot over Julia/Mandelbrot Inverse over Julia/Julia/Julia Inverse) Equation方程式 ( z = z^3 + c/z = z^5 + c/z = z^7 + c/z = z^2 + c/z = z^3 + c)Mandelbrot(X (Real)/Y (Imaginary)/Magnification/Escape Limit)Julia( X (Real)/Y (Imaginary)/Magnification(放大倍率)/Escape Limit(溢出限定)) Post-inversion offset(X (Real)/Y (Imaginary)) Color{Overlay(再叠加一种纹理)/Transparency/Palette(Lightness Gradient/Hue Wheel/Black And White/Solid Color/Escape Angle/Grayscale/Apple ][)/Hue/Cycle Steps/Cycle Offset /Edge Highlight (Force LQ)) High Quality Settings高质量设置{Oversample Method(Edge Detect-Fast-May miss pixels/Brute Force-Slow-Every pixel)/Oversample Factor} (十)Fractal Noise称为“分形噪波”。可以模拟纹理图案/烟/云/水流等。详细的应用,大家可以参考《AE5.5影视合成风暴》 第53页第3章After Effects常用基础特效:) Fractal Type各类分形算法方式 Noise Type噪波类型 Invert反转 Contrast对比度 Brightness明亮度 Overflow溢出处理 Transform变换设置 Complexity复杂度 Sub Settings噪波的子分形变化的相关设置(如子分行影响力、子分形缩放等) Evolution控制噪波的分行变化相位 Evolution Options控制分形变化的一些设置(循环、随机种子等) Opacity不透明度 Transfer Mode叠加模式 这一部分动态性非常强,应用也非常繁复,用静态方式讲清楚这部份知识,我还没那本事, (十一)Grid称为“网格”效果 Anchor(Corner Point/Width Slider/Width & Height Sliders) Gridsize From Corner Width宽度 Height高度 Border Feather羽化 Invert Grid Color颜色 Opacity 不透明度 Transfer Mode变换模式 效控参数如图。应用Grid与Bulge (十二)Lighting Lighting称为“闪电效果”,可以用来模拟真实的闪电和放电效果,并自动设置动画。 Start/End Point起始/结束位置。 Segments段数。分段数越多,闪电越扭曲。 Amplitude幅度。 Detail Level精细程度。 Detail Amplitude细节幅度。 Branching分支数量。 Rebranching再分支数量。 Branch Seg. Length分支线段长度。 Branch Segments分支段数。 Branch Width分支宽度。 Speed闪电变化速度。 Stability稳定性。较高的数值使闪电变化剧烈。 Fixed Endpoint固定结束点。 Width闪电宽度。 Width Varation宽度变化。 Core Width核心宽度。 Outside Color外围颜色。 Inside Color内部颜色。 Pull Force拉力。 Pull Direction拉力方向。 Random Speed随机速度。 Blen**** Mode叠加模式。 Simulation选择 Rerun At Each Frame使每一帧重新生成闪电. (十三)Lens Flare Lens Flare称为“镜头光斑”,模拟镜头照到发光物体上,由于经过多片镜头能 产生很多光环,这是后期制作中经常使用的提升画面效果的手段,如图所示。 Flare Center光斑位置。 Flare Brightness光斑亮度。 Lens Type镜头类型 Blend With Original和图像混合程度。 (十四)Radio waves称为“电波扩散效果” Producer Point 电波产生的核心点 Parameters are set at Render Quality质量补偿控制 Wave Type电波的类型 Polygon多边形控制 Image Contour图象控制(当Wave Type选Image Contour有效) Mask遮罩选择(当Wave Type选NASK时有效) Wave Motion波形运动设置 Stroke波形描边设置 (十五)Ramp Ramp用来创建彩色渐变,使产生的黑白渐变为应用层模式( Blend Mode)和原图像 混合,如图所示。 Start of Ramp渐变起点。 Start Color起点颜色。 End of Ramp渐变终点。 End Color终点颜色。 Ramp Scatter渐变扩散。 BIend With original和原图像混合 (十六)Stroke Stroke称为“描边效果”,可以沿路径或遮罩产生边框,可以模拟手绘过程,如图 所示。 Path选择遮罩或路径。 Color选择颜色。 Brush Size画笔粗细。 Brush Hardness设置画笔边缘。 Opacity不透明度。 start设置起点。可以设置动画产生绘画过程。 End设置终点。 Spacing指定笔触的间隔。 ![]() ![]() |
Posted: 30 Aug 2008 10:42 PM CDT |
Posted: 30 Aug 2008 06:19 PM CDT |
Posted: 30 Aug 2008 02:26 AM CDT 摘要: 最近在优化客户端性能的时候,看到了Early ZBuffer。在VSPS中间GPU会对进行Z-buffer预判机制,对无效像素进行剔除,ATI、NVIDIA都有自己的Z-buffer预判机制。其实Doom3的时候已经开始使用预填充ZBuffer了,因为Doom3的PS需要处理阴影、NormalMap、LightMap及其他贴图处理,PS指令非常多,所以无效像素的剔除对性能影响是很大的,越早将无效像素剔除,显卡便能获得更多的时间对有效像素进行渲染 阅读全文
[新闻]Google推出Android Market挑战App Store |
New Content Available: AI Flocking, Shadow Mapping, and Multipass Lighting Shaders! Posted: 29 Aug 2008 11:51 PM CDT The XNA Team announces a new set of educational content for XNA Game Studio:
|
Posted: 30 Aug 2008 12:59 AM CDT 小白挂了……享年两岁。 由于没有墓,就把墓志铭写这里吧: “你一直都很白。” |
Posted: 30 Aug 2008 02:00 PM CDT |
Posted: 29 Aug 2008 10:02 PM CDT 传播在于效果的实现,本次北京网页游戏交流活动传播目的有多方面,首先介绍一下采用的方式 -----------------世界因分享而美丽---------------------------------
9月7日第四次北京网页游戏高端交流 |
|
收费标准:以往历次活动参与者随喜方式 第一次参加者收费一百元 第三次8月16日北京游艺春秋公司会议室
|
Remember Road Rash? back in 1991 here's what you would change. by eddyisme Posted: 29 Aug 2008 09:32 PM CDT you make a bike racing game kinda the same as Road Rash of course with copyright you would either have to buy permission or think of a creative name. it can be online multi-player or single player you can have weapons (chains bats nunchunks) in the original game you could only kick/punch or use melee weapons .in this one though you can have a wide variety of weapons that you would buy at a pawn shop (this would be the main stores ---armor shop(leather jackets you design the color) bike shop(crappy bikes to awesome) repair man and tire shop(use what's on the bike or buy totally new ones!) its all about racing i think it may be a damn good idea with the graphics we have in our grasp it would be for (wii ps3 pc and possibly some handhelds) think about it. create all new ideas for weapons bike's (Only One Big Thing it cannot be a serious game make the characters have quotes make jokes threaten you or be friends with them.) Eddy out.. |
Posted: 30 Aug 2008 12:52 PM CDT |
Penny Arcade Expo 08: See our booth Posted: 29 Aug 2008 09:15 PM CDT I hope you’re reading this from a Seattle-area hotel room, or on your iPhone on the way to the Washington State Convention & Trade Center. I really do. Penny Arcade Expo 2008 is now underway, and tens of thousands of you will finally be able to get their hands on games that have been for Press Hands Only at E3 and Games Convention Leipzig. The PlayStation PAX booth improves upon our awesome Comic-Con setup by adding twelve Resistance 2 stations, playable WipEout HD, Savage Moon, Crash Commando and a number of Resistance Retribution-equipped PSPs. Take a look as I give you the quick tour:
Now I know that many (well, most) of you can’t make it to Seattle by Sunday - so here’s how you can get involved in the PAX action. Tomorrow I’ll be talking with the development teams on Resistance 2 and inFamous. What should I ask them? Comment below. I conducted an interview with Joel DeYoung of Hothead Games (Penny Arcade Adventures) earlier today using only your questions, and you’ll see the results of that next week. Oh, and here’s the link to enter to win a free PS3 that I mentioned in the video. Good luck! |
Posted: 29 Aug 2008 07:17 PM CDT 在国外,除系统与世界观、背景剧情等结合极其紧密的游戏外,剧情、脚本和对话大都由专业的作家或专职游戏作家写好;某些具体的特殊对话,则由关卡设计师和游戏设计师一起讨论后进行调整。当然,如果策划经验比较丰富,游戏剧情和对话会由他们直接完成。 ...
|
Posted: 29 Aug 2008 07:20 PM CDT 好的故事类文案可以在某种程度上起到鼓舞士气的效果,当团队每个成员都阅读打动人心的故事情节、精彩的任务时;当美术设计人员、关卡设计人员以及其他开发者参照包含在任务中角色的特征、场景、主要事件的任务说明进行开发制作时,兴趣和动力都会有明显的 ...
|
A Theory of Fun is available again on Amazon Posted: 29 Aug 2008 08:32 PM CDT ![]() ![]()
I don’t know for how long, or why (maybe the publisher stuff is sorted out? Maybe someone found a cache of them hidden under a mossy rock north of Pirate Cove) — but it’s claims 1-3 weeks shipping time, and it’s $17.24, and it’s not used copies. As you may or may not know, it’s been out of print since last October or so, and copies have been going for as high as $300. If you’ve been waiting, now might be the time to order it! Theory of Fun for Game Design @ Amazon BTW, if any current owners want to review it, it could use some fresh reviews… |
Posted: 30 Aug 2008 11:01 AM CDT |
Posted: 30 Aug 2008 10:49 AM CDT |