Code

2010年7月24日星期六

urban terror

今天玩了一天的urban terror,颓废了一天。为了在小猫面前掩饰我的心虚,我把玩这个游戏跟FYP扯上关系,美其名曰熟悉游戏。。。
其实这个用quake 3引擎作成的仿CS游戏玩起来还是很不一样的。它加入了很多CS里没有的元素,比如说power slide,体力值,救治等等。这些都是游戏的节奏上有很多不同。刚开始玩的时候还很不适应,感觉怎么敌人速度那么快,自己队友也在天上跳来跳去的,追都追不上。自己当然也是经常拖后腿,K/D 比率低之又低。。今天之所以玩了一整天是因为发现了power slide原来是这么让人上瘾。在掌握了技巧之后,我也可以在屋顶上飞来飞去。边飞还可以边杀人。这个的确非常过瘾。不过,这种游戏如果小猫来玩肯定没完一下就晕了。。恩,节奏很快的一个游戏。
当然,这个游戏跟FYP还是有点关系的。它跟我所研究的ioquake的code base是一样的。所以说游戏里的很多machanism 都在ioquake里可以实现。除了这个之外,对于我找游戏省电的idea也有点帮助。至于有什么帮助,现在还没想出来。
现在脑袋里只有一阵阵枪声。。

2010年7月19日星期一

Bitwise Operation

今天看了一下 bitwise operation的用法与用处,在这里总结一下。

主要语法有四种 &,|,^ 和 <<(>>)
所谓bitwise也就是他们提供给他们的数字都是转化成2进制来计算的。
and(&)
x AND 0 = 0
x AND 1 = x
用法:x = x & 0x5
or(|)
x OR 0 = x
x OR 1 = 1
用法:x = x | 0x5
xor(^)
x XOR 0 = x
x XOR 1 = ~x
shift(<< or >>)
也就是把2进制的往左或者右移动一定数位。
左右补位都用0。
用法:x = x << 2 Bitwise operation的用处有好几个: 一是在计算图像颜色的时候。一般的颜色是32-bit,也就是高8位是alpha,然后是8位红,8位绿,底8位蓝。所以要提去某一种颜色,用一个and去mask一下然后再shift相应的位数就行了。如果要clear一个颜色,用提取颜色的mask的1s complement去mask一下就行了。如果要set一个颜色用or比较efficient。 另一个用处是在用作function flag的时候来轻便的获得状态。比如 #define ANIM_LOOP 1 // (0000 0001) #define ANIM_ONCE 2 // (0000 0010) #define ANIM_MAXSPEED 4 // (0000 0100) #define ANIM_MINSPEED 8 // (0000 1000) #define ANIM_CUSTSPEED 16 // (0001 0000) #define ANIM_LINK 32 // (0010 0000) #define ANIM_LINKALL 64 // (0100 0000) 注意define状态的时候一定要是set 一个bit,而且不能跟其他的状态相同。 Animate(lpdds, 8, ANIM_LOOP | ANIM_MAXSPEED | ANIM_LINK); call的时候就可以得到一个有多个bit set的二进制数。 int Animate(LPDIRECTDRAWSURFACE lpdds, int nFrames, DWORD dwFlags) { // test for looping if ((dwFlags & ANIM_LOOP) > 0)
anim.bLoop = TRUE;

// test for maximum speed
if ((dwFlags & ANIM_MAXSPEED) > 0)
anim.nSpeed = MAX_SPEED;

然后用and test 状态所占的那个bit有没有set。

// ...and so on
}

我觉得这种方法很巧妙。

还有一种更巧妙的用途是在swap number的时候,用bitwise operation可以不用第三个变量。


//  Value of x                         Value of y
// -----------------------------------------------
int x, y;           //  0                                  0
x = CONST_A;        //  CONST_A                            0
y = CONST_B;        //  CONST_A                            CONST_B
x = x ^ y;          //  CONST_A ^ CONST_B                  CONST_B
y = x ^ y;          //  CONST_A ^ CONST_B                  CONST_A ^ CONST_B ^ CONST_B == CONST_A ^ 0 == CONST_A
x = x ^ y;          //  CONST_A ^ CONST_A ^ CONST_B        CONST_A
//  == 0 ^ CONST_B == CONST_B          CONST_A
//  CONST_B                            CONST_A


很牛逼我觉得。

还有一种用处是替代十进制计算,比较方便的有:1.乘以2的阶层 2 (shift left) 2.除以2的阶层 (right shift) 3.对2的阶层求余 (and 2的阶层 - 1)


其实所有计算都可以用bitwise来做,计算机在进行2进制计算的速度是非常快的,所以在C 游戏编程里面一般都会尽量用到bitwise operation。

另外:在C里面数值是不能直接用2进制来表示的,但可以写成16进制的。2进制的数字很容易写成16进制,这使得bitwise operation非常方便。
nValue = 0x3FC;
另外一些以前不是很注意的东西
2 bytes = 16 bits = 1 word
2 words = 32 bits = 1 dword

------------------------------------------------
PS: (2011/3/22)
如果n是2的幂, 那么(i/n) = (i>>log2(n)), (i%n) = (i&(n-1)).
这个property在用1D数组表示2D数据的时候非常有用。CUDA 和 QUAKE3里都有这样的optimization.

2010年7月17日星期六

Ubuntu 10.04

终于,我成功在我的vostro 1720上面装了ubuntu 10.04。两个月前刚出来的时候想装,刻了碟子装,但双系统老出问题。貌似windows 7跟ubuntu 10.04有冲突,可能是他们共享一个启动程序,win 7 启动了几次之后grub就坏掉了,不得不fix mbr 然后删掉ubuntu。

那时装不了不急,但现在要做FYP了,发现必须要装了。顺便提一下我的FYP, 需要compile ioquake的source code。但我的win 7 是64位的,没有出相应的patch,compile时总是出现 "operating system not supported" 的错误。无奈,我想在vm里面装个ubuntu 10.04 i386的,然后在里面跑。折腾了一整天,我终于在vm 里compile成功了。其中有个问题困扰了我很久,error15总是在compile的时候出现。我google了半天终于发现要安装openal 的 library,官网上明明写着optional,靠。compile成功后还要下载地图包,都是些pak.pk3的文件,这些在官网上可以找到。但其中有一个pak0.pk3的文件网上没有,那个本来是要钱买的。不过从idsoftware的官网上下的quake3demo里有这个文件,可以直接拿来用。这个跟cdrom里的不同是不能网上对战,只能局域网对战。好,这些东西都有了,游戏是可以run了,但又有问题了。由于vm上不支持显卡硬件加速,quake3的图像很laggy,而且打开游戏后鼠标也出现问题了。我放弃vm了。

在网上看了些教程,发现国内人好多都用硬盘直接安装。要自己写boot files,自己下grub放在系统盘下,然后重启安装。我照着网上的教程(多是ubuntu cn里)安装,却老是无法摆脱一个叫busybox的程序。我当时快要发疯了,不管怎么改boot files的参数都会看到这个busybox。再后来洗了个澡回来发现,可以用一个叫wubi的程序装。靠,当时发现自己挺sb的。用这个程序花了不到半个小时,没有遇到任何问题,安装成功了。我当时就疯了,折腾了这么久的ubuntu就这么简单就安装成功。

现在可以开始享受ubuntu 10.04了。界面极其凸显简单美,感觉有点像mac,但没有mac华丽。由于在wubi里有set好locale,整个系统已经跟我装好了所有的中文支持,包括有联想功能的输入法。使用过程没有发现任何乱码。在原生的ubuntu里面compile ioquake我没有遇到任何问题,可以全屏流畅的运行。我还装了eclipse for c/c++ 可以直接从eclipse里面compile ioquake, 这个是我之前在vm里面实验没有成功的。最近发现的一款通过ioquake改编的fps游戏 urban terror我也下到的ubuntu里。这个免费的开源的游戏,有点像cs,还可以网上对战,很不错的一款linux游戏。我还下了HoN的客户端,成功运行。我发现在linux上面装东西一般都很方便。没有注册表,隐藏文件,temp文件等等的,并在windows下干净很多。

ubuntu 10.04里的rhythmBox可以很容易的安装mp3 plugin,我记得在ubuntu 8.04的时候还要自己找plugin。empathy通讯程序也很好用,它把im, email, broadcast三个程序整合了,节省了桌面资源。

才用了一天,所以体验不算丰富,但感觉相当不错。今后有新的体验继续写。