游戏中地图的画法 |
| 作者:佚名 来源:本站整理 发布时间:2008-4-8 0:57:43 |
|
导读
在游戏程序中的一个重点是背景的滚动。大多数的动作游戏,射击游戏都使用背景滚动的技术。相对于我们游戏宽广的背景空间(例如太空)来说,我们的屏幕实在是太小了。 背景移动技术 我们有若干种方法移动我们的背景。例如,侧滚(横滚),上下滚(竖滚),等轴滚动,向4个方向滚动等等。每种方法都有超过一种的实现技术。以前,计算机速度很低,要想在上面运行一些游戏,使它们有一个可以滚动的背景,可能需要专用硬件设备。现在,最低配置的PDA的速度大约是30MHz,而Pocket PC的速度达到了160-206 MHz。因此,我们能通过软件来生产背景移动的效果,而不用额外的硬件。 大多数的滚动(也是经典的)是向下滚动。一些经典的太空射击游戏大多使用这种方法的,象Galaka,隼等等。现在,我们将开始学习它。 虽然我们看到,硬件技术的发展使以前的机器和现在相比不可同日而语。机器早就摆脱了1MB或者更少的存储空间的限制。但如果你放一张拥有256种颜色,大小为240X320象素的图象(非-移动)到机器上。它大约需要占用75KB的内存。显然太多了。因此游戏程序员们需要一种合适的技术可以使它执行效率得到提高。 一个经典的空间背景 这个典型例子使用的技术是用黑颜色填满屏幕。因此我们不需要任何额外的资源。它看起来像你在太空里。然后画出一些星星,从屏幕的顶部飞到屏幕的底部(也可以从右向左)。我们怎么制做一个逼真的星空呢?首先我们可以用一些白色的或者亮颜色的象素代表星星。近处的星星应该比远处的星星更加明亮些。而且也应该移动的更快。 好我们来看一下我们的算法: 1、设定一个结构变量用来表示星星 2、初始化星星的数据库 3、用黑颜色添充画面 4、画星星(仅画一个象素) 从数据库到画面以外 5、更新星星位置(增加[y]值) 6、更新当前的屏幕 7、重复的从第3步开始循环 <下面是一个星空的源码> #include <windows.h> //*** TODO: insert off screen code here **** //*** The sample code for stars *** #define MAXSTAR 100 typdef struct { int x, y; int t; } STAR; static STAR *stars; void InitStars(void) { int cnt; stars = (STAR*)malloc(sizeof(STAR)*MAXSTAR); for(cnt=0; cnt<MAXSTAR; cnt++) { stars[cnt].x = Random() % 240; stars[cnt].y = Random() % 320; stars[cnt].t = Random() % 255; } } void DeinitStars(void) { free(stars); } void DrawStars(void) { int cnt, speed, bright; PatBlt(hOffscreenDC,0,0,240,320,BLACKNESS); for(cnt=0; cnt<MAXSTAR; cnt++) { speed = 10 - (stars[cnt].t / 20); bright = 256 - stars[cnt].t; SetPixel(hOffscreenDC,stars.x,stars.y,RGB(bright,bright,bright)); stars.y += speed; if(stars.y > 320) { stars[cnt].x = Random() % 240; stars[cnt].y = 0; stars[cnt].t = Random() % 255; } } } LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam) { switch(message) { case WM_WMTIMER: DrawStars(); UpdateDisplay(hWnd); break; case WM_CREATE: InitOffscreen(240,320); InitStars(); break; case WM_DESTROY: DeinitStars(); DeinitOffscreen(); PostQuitMessage(0); break; case WM_KEYDOWN: DestroyWindow(hWnd); break; default: DefWindowProc(hWnd, message, uParam, lParam); } return 0; } 让我们看看它是如何工作的? 一颗星星由位置(x,y)与距离(t)组成的变量表示。初始的位置可能在屏幕的任何位置(随机的)。距离(深度) 是被设置成0-255之间。我们通过深度计算星星移动的速度和亮度。在上面给出的例子源码中,我们共画了100颗星。这已经足够模拟出令人激动的无垠的太空了。还有当一颗星星移动出屏幕时,我们会使它重新回到屏幕,并重新为它分配新位置和新距离。 |
| [] [返回上一页] [打 印] |
|
文章评论 |
