Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
您现在的位置: 天极网 > 开发频道 > 在Pocket PC上编写游戏之七
全文

在Pocket PC上编写游戏之七

2004-04-08 19:19 作者: 雷神编译 出处: vchelp 责任编辑:方舟
天极IT资讯短信服务 电脑小技巧
资费:包月5元
手机:
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。

  导读

  在游戏程序中的一个重点是背景的滚动。大多数的动作游戏,射击游戏都使用背景滚动的技术。相对于我们游戏宽广的背景空间(例如太空)来说,我们的屏幕实在是太小了。

  背景移动技术

  我们有若干种方法移动我们的背景。 例如,侧滚(横滚),上下滚(竖滚),等轴滚动,向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颗星。这已经足够模拟出令人激动的无垠的太空了。还有当一颗星星移动出屏幕时,我们会使它重新回到屏幕,并重新为它分配新位置和新距离。

  现在,让我们把一个飞碟精灵放到屏幕的底部。在屏幕上显示出的效果好象我们的飞碟正在无垠的太空中飞行。

  <下面是我们的第二段源码>

HBTIMAP hUFO;
....
LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam)
{
switch(message)
{
case WM_WMTIMER:
DrawStars();
TransparentImage(hOffscreenDC,100,300,24,20,hUFO,...);
UpdateDisplay(hWnd);
break;
case WM_CREATE:
InitOffscreen(240,320);
InitStars();
hUFO = LoadBitmap(hInst,(TCHAR*)1);
break;
case WM_DESTROY:
DeleteObject(hUFO);
DeinitStars();
DeinitOffscreen();
PostQuitMessage(0);
break;
case WM_KEYDOWN:
DestroyWindow(hWnd);
break;
default:
DefWindowProc(hWnd, message, uParam, lParam);
}
return 0;
}

  我们还能改进这一技术,来使它看上去更加的逼真。例如,让一部分星星闪烁,画一个彗星,用一个可以产生动画效果的星星的精灵替代象素表示的星星。

  这些技巧可以被用于侧滚但是这样应用好象缺乏空间的感觉。另外显得和其他游戏式样格格不入。
好了,还是让我们学习些其他的技巧吧....

共3页。 1 2 3 :
网友关注
最新上市
编辑推荐
文章阅读排行
周排行
月排行
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml