在Pocket PC上编写游戏之七
敬业的IT人
互联网
佚名
2008-1-4 14:00:41
导读
在游戏程序中的一个重点是背景的滚动。大多数的动作游戏,射击游戏都使用背景滚动的技术。相对于我们游戏宽广的背景空间(例如太空)来说,我们的屏幕实在是太小了。
背景移动技术
我们有若干种方法移动我们的背景。 例如,侧滚(横滚),上下滚(竖滚),等轴滚动,向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;
}
我们还能改进这一技术,来使它看上去更加的逼真。例如,让一部分星星闪烁,画一个彗星,用一个可以产生动画效果的星星的精灵替代象素表示的星星。
这些技巧可以被用于侧滚但是这样应用好象缺乏空间的感觉。另外显得和其他游戏式样格格不入。
好了,还是让我们学习些其他的技巧吧....
- ·小设置让宽屏液晶玩游戏画面不被拉伸
·使用SDL打造游戏世界之入门篇
·最超值的Conroe电脑 游戏专用配置推荐
·教你用3D制作游戏角色贴图教程
·将劲舞团游戏录像转成WMV录像的方法
·看谁最发烧 十款游戏运行时显卡温度测
·卡通:游戏卡通人物头像
·为3D游戏角色人物身体贴图
·蜘蛛侠3-游戏操作方式 Spider-Man 3
·XP中包括的声音和游戏端口驱动程序列
全景
全景或视差是一种很流行的的技术,被许多游戏使用。当计算机有了更多的内存时这个技术被开发存储更大的图片。让我们看下面的图片。图片的从右到左都是没有任何缺陷的,并且图片非常的精细。
<图6>
现在, 让我们试试这代码。
<第五段源码>
static int nRunning;
static HBITMAP hBitmap1;
static HDC hDCBitmap;
case WM_CREATE:
hBitmap1 = LoadBitmap(...);
hDCBitmap = CreateComaptibleDC(GetDC(0));
SelectObject(hDCBitmap,hBitmap1);
nRunning = 0;
....
break;
case WM_TIMER:
if(++nRunning > nBitmapWidth)
nRunning = 0;
n1 = 320 - nRunning;
PatBlt(hOffscreenDC,0,0,240,320,BLACKNESS);
BitBit(hOffscreenDC,0,320-55,min(n1,240),55,hDCBitmap,nRunning,0,SRCCOPY);
if(n1 < 240)
BitBit(hOffscreenDC,n1,320-55,240-n1,55,hDCBitmap,0,0,SRCCOPY);
UpdateDisplay(hWnd);
break;
....
如果你试了它你将会注意到,背景的移动是光滑的,漂亮的,并且和使用贴图比更容易实现。而且你可以以象素为单位移动背景。好,我们在背景上加上一个精灵看看。 试试下面的代码;
<源码6> 请从原文网站下载,这里就不提供了。
--> Clouds.bmp.zip
--> Mountain.bmp.zip
--> Road.bmp.zip
--> Panorama.demo.zip
...NYI
它怎么工作?你能看到我们有3张平行的背景图片。先出现一张云照片它在最后面,是一个静止的图象。山脉图片是一个精灵。它被画在云照片上。最后一个是一条道路的图片。它放在最顶上。使用不同的移动速度,我们能生产非常有趣的游戏。
我们把它们融合到一起使用怎么样!!完全正确,并没说一个游戏中使用一种技术。为了做到领先一步,我们往往需要使用超过一种技术来生产更有趣的游戏。另外,计算机技术的发展回带来更新的开发技术。也许我们今天讨论的技术并不适合现在的PDA设备,但掌握它们肯定是不会错的。
还有其他的技术吗?当然,还有有很多有趣实用技术,但在这里讨论它们显得太复杂了,所以我并没有在这个初级教程中涉及它们。
- 最新文章
- Java web应用开发概览[01-04]
- Jakarta-Tomcat简明中文版用户指南[01-04]
- Jakarta-Tomcat 简明中文版用户指南第二部分[01-04]
- Jakarta-Tomcat 简明中文版用户指南第一部分[01-04]
- samba做文件服务器常见问题[01-04]
- samba中文乱码问题终极篇[01-04]
- 相关文章
