WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章手机编程Win Mobile游戏开发游戏中地图的画法

游戏中地图的画法
作者:佚名  来源:本站整理  发布时间: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颗星。这已经足够模拟出令人激动的无垠的太空了。还有当一颗星星移动出屏幕时,我们会使它重新回到屏幕,并重新为它分配新位置和新距离。

[1] [2] [3]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码