博文

游戏编程入门——入门者必看的好贴(2007-02-09 15:34:00)

摘要:主题:★(★(游戏编程入门——入门者必看的好贴★(★(

作者:gamejobnet    


经常有人问我,没有编程经验的人该如何开始开发游戏。在此之前,我总是一个个的尽力回答。然而,后来提相同问题的人数增长到难以处理的地步。我决定,是时候把我所有的建议写成文章,作为一个大概。   这篇文章是针对那些想要开发自己游戏,但几乎没有编程经验的人。事实上,我假设读者没有任何编程经验。我主要讨论游戏开发的程序和设计方面,而不是艺术性。我也不准备讲述如何进入游戏行业(这方面已经有足够的资料),而只是让你逐步的开始开发自己的游戏。最后,我所指出的这条道路也并不能作为唯一的,或是最好的路径来学习开发游戏,但至少对我和一些人很有用。   选择一门语言   你要做的第一件事就是选择一门开发语言。你有很多选择,包括Basic,Pascal,C,C++,Java,等等。也经常会有人争论对于初学者那一门语言是最好的。对于这一系列流行语言的讨论,你可以参看John Hattan的著作,What Language Do I Use?(我用什么语言?)   我的建议是以C和C++开始。有些人会说这些语言对初学者来说太高级了,但因为我自己就是学C++,我并不同意这一说法。而且,C/C++是当今使用最广泛的语言(译者认为应该是汉语。。。),所以你可以找到大量学习资料和帮助。你先学C或C++都无所谓,因为只要学了一个,再学另外一个就很容易。但是,如果你先学C++,请保证在学习面向对象编程之前能理解和使用过程编程(等编程熟练再去学习类)。(译者:C是过程性语言,C++是面向对象语言)   如果你开始学习C/C++,发现太难,那再学一个简单一点的也没关系,比如Basic或Pascal。但是我真的认为,如果你坚持努力,而且有好的资料,学C/C++应该没有太大问题。   你的下一个问题可能会是:“我该怎么学C/C++?”我很高兴你这样问。最好的办法是上课。有老师可以回答你的问题,帮助你产生很大进步,编程练习作业也可以保证你能用到所学的东西。   如果你不觉得上课是个好主意,那最好的办法就是买一些好书。不要花太多时间去选一本什么“超级宝典”或“万用全书”,因为你最终可能会买几本。我建议你去一家书店,然后拿几本比较入眼的......

阅读全文(4300) | 评论:2

C++0x草案将于年内发表,C++即将重大升级 孟岩(2007-02-09 14:34:00)

摘要:C++0x草案将于年内发表,C++即将重大升级 孟岩  C++标准委员会主席Herb Sutter在最新的Blog里透露,C++0X的草案将很有可能在07年10月完成。这意味着“标准C++ 2.0”即将露出庐山真面目。

    Sutter在这篇文章里描述了C++0x的几个重大进展:

1. 库增强:标准库TR1和TR2中的库增强组件;

2. 垃圾收集:符合C++0x的编译器必须提供垃圾收集器;

3. Concept:可简化泛型程序的开发;

4. 并发内存模型和并发库:使C++能够在多核时代健康成长;

    没有被包括在C++0x中的重要特征包括:

1. 统一的动态加载模型;

2. 模块。

    Sutter承诺说,C++0x发布之后会立刻着手做这两项工作。

    从Sutter的叙述来看,C++0x将是C++的一次重大升级,如果编译器厂商能够尽快提供编译器产品,那么C++将能够在新的多核时代保持自己独特的优势,从而发展下去。当然,要完全达到标准的要求并不容易,时间上看,恐怕2009年之前不会出现符合C++0x的编译器产品。
......

阅读全文(4787) | 评论:0

关于windows编程的一些心得 来自csdn(2007-02-09 14:24:00)

摘要:关于windows编程的一些心得 来自csdn (1) windows操作系统是靠消息的驱动的,所有的事件都被封装为各种各样的消息,系统和其他程序通过接受消息,分析消息附带的参数,再分别进行相关的处理,然后完成相关的任务。不管用什么语言,或者什么开发工具,只要是在windows下可以运行的程序,在他的本质上都有一个接受消息、处理消息的循环。这就是win32程序乃至整个windows操作系统本身的运做本质。 windows自己定义了很多的消息,我们可以使用它,因为这是系统已经定义了的,我们甚至可以直接构造这样的消息发给系统本身,让他来为我们做点什么事情。也可以发一些消息给别的应用程序,当然你发给他的消息他可以接受并可以处理才可以,不然,结果当然是肉包子打狗,有去无回,血本无归啊~呵呵,呵呵我们甚至可以让我们自己的程序接受并且可以处理某些我们自己定义的消息(和windows已经定义了的肯定不能重复三~),然后在程序中的其他部分,比如一个子线程中,发一个这样的消息给主窗口或者其他可以接受并处理我们自己定义的这个消息的地方,然后处理他---------这其实有点象台湾的RPG游戏,比如仙剑三,人物走到某个特定的区域,就“触发”了某个事件,于是,就有怪出来和英雄们战斗啦~ 在csdn上的VC/MFC专区里面见过很多人一头雾水的问高手门类似于下面这样的问题:我用MFC画了一个XX控件,我怎么样可以把他的外观变漂亮一点啊,比如把字体变成XX字体啦,把背景颜色换成XX颜色啦,把线条变....等诸如这样的问题,这样的人,我只能说他太浮躁了,他不了解win32的消息机制,不了解在非游戏的情况下,windows界面上的各种元素是怎么样出来的。其实很简单,MFC只是对API进行了简单的封装,他处理程序的最本质还是消息,这就是你在MFC中仍然可以一大堆WM_XXXX这样和win32中定义的一样的消息了,上面说了,windows是靠消息来驱动的,你用MFC做了一个控件,你的操作很简单,因为MFC、资源脚本文件帮你隐藏了很多细节,比如GDI对象啊,画笔啊等等,MFC和资源脚本当然也不是万能的,他们也不可能知道你想用什么颜色,什么字体,什么线条。他们只是简单的按照windows默认的颜色、线条、字体来为你处理事情,所以当然没有那么好看,你想让他变好看,你就要在程序界面显示之间在程序内部给那......

阅读全文(3764) | 评论:0

异步IO、APC、IO完成端口、线程池与高性能服务器 (2007-02-09 11:15:00)

摘要:异步IO、APC、IO完成端口、线程池与高性能服务器 原作者姓名 Fang(fangguicheng@21cn.com)

异步IO、APC、IO完成端口、线程池与高性能服务器之一 异步IO

背景:轮询 PIO DMA 中断

    早期IO设备的速度与CPU相比,还不是太悬殊。CPU定时轮询一遍IO设备,看看有无处理要求,有则加以处理,完成后返回继续工作。至今,软盘驱动器还保留着这种轮询工作方式。
     随着CPU性能的迅速提高,这种效率低下的工作方式浪费了大量的CPU时间。因此,中断工作方式开始成为普遍采用的技术。这种技术使得IO设备在需要得到 服务时,能够产生一个硬件中断,迫使CPU放弃目前的处理任务,进入特定的中断服务过程,中断服务完成后,再继续原先的处理。这样一来,IO设备和CPU 可以同时进行处理,从而避免了CPU等待IO完成。
    早期数据的传输方式主要是PIO(程控IO)方式。通过对IO地址编程方式的方式来传 输数据。比如串行口,软件每次往串行口上写一个字节数据,串口设备完成传输任务后,将会产生一个中断,然后软件再次重复直到全部数据发送完成。性能更好的 硬件设备提供一个FIFO(先进先出缓冲部件),可以让软件一次传输更多的字节。
    显然,使用PIO方式对于高速IO设备来说,还是占用了 太多的CPU时间(因为需要通过CPU编程控制传输)。而DMA(直接内存访问)方式能够极大地减少CPU处理时间。CPU仅需告诉DMA控制器数据块的 起始地址和大小,以后DMA控制器就可以自行在内存和设备之间传输数据,其间CPU可以处理其他任务。数据传输完毕后将会产生一个中断。

同步文件IO和异步文件IO

下面摘抄于MSDN《synchronous file I/O and asynchronous file I/O》。
有两种类型的文件IO同步:同步文件IO和异步文件IO。异步文件IO也就是重叠IO。
在同步文件IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行。而异......

阅读全文(3783) | 评论:0

走进Boost(2007-02-08 19:03:00)

摘要:走进Boost 阿炯 摘要 一直流传这么一个说法,想成为高手,一定要多读高手写的源代码。哪些代码是好材料呢?C++标准库的源代码?不,如果您读过,就会发现:要么是各种实现独有的表达方式让人摸不着头脑,要么是恐怖的代码风格(如到处是下划线)憋得人难受。Boost库的代码则相当清晰,注释合理,命名规范,绝对是适合阅读的典范。同时,Boost内容广泛,数值计算、泛型编程、元编程、平台API……不妨从容选择自己感兴趣的部分,细细品味。 在本文中,我们将会介绍了Boost库的下载与安装,并将体验Boost库中一个非常简单实用的组件lexcial_cast。 目录 Boost简介 下载与安装 lexical_cast 字符串→数值 数值→字符串 异常 注意事项 小结 Boost简介 Boost是什么?一套开放源代码、高度可移植的C++库。
谁发起的?C++标准委员会库工作组。所以,质量保证,不怕遇到假冒伪劣产品。
有些什么呢?瞧瞧: 正则表达式,可以与POSIX API和Perl语言处理正则表达式的功能相媲美,而且还能支持各种字符类型(如char、wchar_t,甚至还可以是自定义字符类型); 多线程,想了很久的跨平台多线程库了; 数据结构“图”,再加上即将加入标准的hash_set、hash_map、hash_multiset、hash_multimap等等(事实上不少STL实作,如SGI STL,已经支持以上数据结构),C++对数据结构的支持已近完备; python,没错,对Python语言的支持; 智能指针,与std::auto_ptr一起善加使用,可杜绝内存泄露,效率更不可和垃圾收集机制GC同日而语; 更有循环冗余的CRC、可轻松定义返回多个值函数的元组tuple、可容纳不同类型值的any、对标准库各方面的补充…… 还在迅速扩大中,部分内容有望进入C++标准库…… 下载与安装 去哪下载Boost呢?英文http://www.boost.org[1],中文http://boost.c-view.org,可以找到一个.zip或.tar.gz格式的压缩包。下载完毕后,解压到某个目录,比如boost_1_26_0,里面......

阅读全文(4732) | 评论:0

C++学习基础知识-csdn论坛(2007-02-04 02:14:00)

摘要:C++学习基础知识-csdn论坛 小狼注:原文《C++学习重点分析》,本人认为这些仅仅是C++比较基本的基础知识而已,因此更名 一、#include “filename.h”和#include 的区别 #include “filename.h”是指编译器将从当前工作目录上开始查找此文件 #include 是指编译器将从标准库目录中开始查找此文件   二、头文件的作用 加强安全检测 通过头文件可能方便地调用库功能,而不必关心其实现方式   三、* , &修饰符的位置 对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名   四、if语句 不要将布尔变量与任何值进行比较,那会很容易出错的。 整形变量必须要有类型相同的值进行比较 浮点变量最好少比点,就算要比也要有值进行限制 指针变量要和NULL进行比较,不要和布尔型和整形比较   五、const和#define的比较 const有数据类型,#define没有数据类型 个别编译器中const可以进行调试,#define不可以进行调试 在类中定义常量有两种方式 1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 2、 用枚举代替const常量。   六、C++函数中值的传递方式 有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) void fun(char c) //pass by value void fun(char *str) //pass by pointer void fun(char &str) //pass by reference 如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 函数的类型不能省略,就算没有也要加个void   七、函数体中的指针或引用常量不能被返回 Char *func(void) { char str[]=”Hello Word”; //这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 return str; } 函数体内的指针变量并不会随着函数的消亡......

阅读全文(6874) | 评论:2

一个极其简单的防止SQL注入的办法(只针对部分有效)转自csdn论坛(2007-01-30 19:23:00)

摘要:一个极其简单的防止SQL注入的办法(只针对部分有效)转自csdn论坛 首先,先声明一下,这个办法是我WoW时候忽然想出来的,绝不会完美。 其次,说明一下我的方法的大致思想:判断最后要提交到数据库的SQL,通过禁止某些可能具有危害性的SQL的执行而达到防止SQL注入的目的。判断每个QueryString是很麻烦的(至少像我这种懒人觉得麻烦),而只判断最后那句SQL要简单很多。并且可以做个通用的函数,简单地调用一下即可。
先研究一下可能的SQL注入的特点。如果什么安全措施也不做,那么最后提交到数据库的SQL很可能是这样: http://www.abcdefg.com/type.asp?id=6;update admin set password='helloworld' where username='admin'--   
Select * from abc where id = 6 ;update admin set password ='helloworld' where username='admin'-- 那么应对措施如下:
1) 判断SQL中有没有注释符号
  自己写的SQL还用得着注释?并且注释居然不是写在代码里而是写在SQL里?先汗一下。在SQL中出现注释符号的直接pass,这必然不是什么好东西。   if ( sql.Contain("--") ) throw new Exception("SQL injection!"); 2) 判断SQL是不是一句话
  上例中因为有; 的存在而使本来好好的一个查询变成了两句话,而第二句话基本上就不会是什么好东西了。我可以通过判断这个SQL中有没有;的存在来判断这句SQL是不是一句话。   if ( sql.Contain(";") ) throw new Exception("SQL Injection!"); 3) 很有可能这些危险的符号是用十六进制存放的,那么就需要翻译一下。
  所谓“智者 当借力而行”,我们可以用现成的库函数来实现这个翻译过程   sql = Server.UrlDecode( sql ); // 把这句话放在 1 和 2 的前面 4) 说不定在一些奇怪的查询中,;是作......

阅读全文(3920) | 评论:0

从VC++到GCC移植:谈两者的语法差异-csdn许式伟(2007-01-29 21:57:00)

摘要:从VC++到GCC移植:谈两者的语法差异 许式伟 http://blog.csdn.net/xushiweizh/archive/2007/01/28/1496534.aspx 
2007-1-28

类型引用 template <class T>
class  Foo
{
    typedef T::SomeType SomeType;
}; 这段代码在VC++中一点问题也没有,但是GCC并不允许,因为它不知道T::SomeType是什么。你需要改为: template <class T>
class  Foo
{
    typedef typename T::SomeType SomeType;
}; 通过typename T::SomeType告诉GCC,SomeType是一个类型名,而不是其他东西。 当然,这种情况不只是出现在typedef中。例如: template <class Container>
void visit(const Container& cont)
{
    for (Container::const_iterator it = cont.begin(); it != cont.end(); ++it)
         ...
} 这里的Container::const_iterator同样需要改为typename Container::const_iterator。   基类成员引用 template <class Base>

阅读全文(4576) | 评论:1

Visual Studio 2005 使用技巧一则 转(2007-01-27 02:22:00)

摘要:Visual Studio 2005 使用技巧一则 转自:http://blog.csdn.net/forlinux/archive/2006/09/20/1250258.aspx 最近系统在我安装了N多软件又卸载了N多软件后老是出现莫明其妙的错误,懒得手动去修复,尝试下载了超级兔子清理/修复了下。旧的问题解决后却发现新的问题也来啦,VS2005就没有办法新建项目了!系统提示,没有可用的模版,还好另一个提示蛮有用的,提示查看事件日志 。那就查看下吧,         进入 控制面板->管理工具->事件查看器 后,可以找到如下所示(图一)的错误提示                                                       图一、提示模版不可用 根据提示,似乎解决的方法可以有两个 1.devenv /installvstemplates 2.重装VS(恶梦!重新安装太麻烦了吧。) 还好,我选择第一个方法,发现可以修复。现在使用就非常的正常了。 其实,devenv /?后你还可以发现更多有用的参数,很多问题都应该可以不用重新安装VS而得到修复。 D:Program FilesMicrosoft Visual Studio 8VC>devenv /?

Microsoft (R) Visual Studio 8.0.50727.42 版。
版权所有 (C) ......

阅读全文(4389) | 评论:0

VC2005使用boost (转)(2007-01-27 02:19:00)

摘要:VC2005使用boost 引自: http://blog.csdn.net/lidongfeng/archive/2006/05/24/752588.aspx
今天闲来无事,突然想学习boost,看看这个庞大的基础类库里面到底有些啥东西,以下是我的安装使用过程:
1、访问www.boost.org,下载源代码boost_1_33_1.exe,这个是个自解压文件,解压缩后放到了E:\boost_1_33_1
2、首先需要编译bjam工具,因为需要使用它来编译生成boost的库文件,进入命令提示符窗口:
cd E:\boost_1_33_1\tools\build\jam_src,修改build.bat文件,将里面关于vc7的路径设置为世纪的路径,我的 为E:\Program Files\Microsoft Visual Studio 8\VC\bin\VCVARS32.BAT
3、执行build.bat,完成后会在E:\boost_1_33_1\tools\build\jam_src\bin.ntx86目录下面生成一个bjam.exe的文件,就是用它来编译生成boost的库文件
4、为了方便,将bjam.exe的文件路径放到系统环境变量Path里面
5、cd  E:\boost_1_33_1,执行命令bjam "-sTOOLS=vc-8_0" install
6、然后就是100%的cpu占用,等待吧。。。
7、完成后,会在c:\boost下面生成库文件,里面也会有需要的头文件 8、接下来就是在vc++里面使用了,启动vs2005,打开“工具”-》“选项”,选择“项目和解决方案”->“vc++ 目录”,将c:\boost\lib和C:\Boost\include\boost-1_33_1分别添加到库文件和包含文件中 9、开始使用把~~!
......

阅读全文(4770) | 评论:0