FreeDirectDraw();
FreeDirectInput(); // 释放资源 PostQuitMessage( 0 ); return 0L;
3 在HRESULT ReadImmediateData( HWND hWnd ) 函数中进行了这样的处理,来时时改变小娃娃的坐标。
for( i = 0; i < 256; i++ ) {
if( diks[i] & 0x80 ) {
switch(i) {
case 200: //上键
if( g_me.fPosY > g_me.fVelY) g_me.fPosY -= g_me.fVelY; else
g_me.fPosY = 0; break;
case 208: //下键
if( g_me.fPosY <= WINDOW_HEIGHT - SPRITE_DIAMETER - g_me.fVelY) g_me.fPosY += g_me.fVelY; else
g_me.fPosY = WINDOW_HEIGHT- SPRITE_DIAMETER; break;
case 203://左键
if( g_me.fPosX > g_me.fVelX) g_me.fPosX -= g_me.fVelX; else
g_me.fPosX = 0; break;
case 205://右键
if( g_me.fPosX <= WINDOW_WIDTH - SPRITE_DIAMETER - g_me.fVelX) g_me.fPosX += g_me.fVelX;
else
g_me.fPosX = WINDOW_WIDTH- SPRITE_DIAMETER; break; } } }
这些只是其中一些比较重要的改动,还有许多改动,读者会在实际的程序中看到的。如果你觉得:“啊!到这里就结束了,可是我还是感到似乎莫不到头绪,就
这样草草收尾了?”,其实文章并没有结束,重头戏还在后面呢,那就不是我的工作了,而是看你有没有耐心去仔细阅读代码了,因为想要把握程序的整体,与其让我将代码放在文章中,还不如读者自己在编译器中自己运行实践一下好,其实我们已经在第二个工程代码中有过详细的解释。但记住一定要按照顺序阅读 工程1,工程2 ,工程3。工程1就是 DirectX中提供的原代码,工程2就是我们改了一个背景的工程,而3就是我们讨论的工程。
斜45度角地图拼接
All Rights Reserved to Lacutis, 2004
有人在新浪网的游戏制作论坛问这个,那我随便说说这个问题的解法,先看看地图元素:
可以看出来是个扁的菱形。这个地图元素的大小是64X32,你可以随意决定元素长宽,在设计程序时,地图元素大小并不重要,只要把尺寸扔进绘图方程,程序就能正确地绘制地图。在这个例子中,我们就先用64X32来演示。
那么这个公式是怎么样的呢?先看看Staggered地图:
<-- Staggered
这个地图有5行,看着这个地图你会想,怎么拼图才能将地图拼出来。再画张图来演示:
从这张图可以看出,拼图时从左到右,从上到下,跟正规的矩形拼图一样,唯一同的是,地图元素与元素之间有重叠,看看第一行和第二行之间,第二行的地图元素会压在第一行的元素上,而第三行的的地图元素则压在第二行的元素上。所以,只要找到正确的公式,你就能正确地设计程序,再来一张图:
图上绿点(是高亮度绿色,不是暗绿色)是每块地图元素的起点,第一行的座标是0,第二行的座标是1,第三行的座标是2,......由这些行位座标决定你的地图元素的起点,从这个规律中看出行位座标0,和行位座标2的横向座标X的起点是一样的是0,行位座标1的起点是向右移半块地图元素。
再从纵向座标找规律,看行位座标0和行位座标2,两块地图元素之间的距离刚好是一块地图元素的高。再看看行位座标0和行位座标1,两块地图元素之间的距离刚好是半块地图元素的高。所以,计算每块地图元素的位置,你的公式刚好是:
void CalculateMapTilePos(int n_map_pos_x, int n_map_pos_y, int & n_scrn_pos_x, int & n_scrn_pos_y) { n_scrn_pos_x = n_map_pos_x * iso_tile_size_x + (n_map_pos_y & 1) * (iso_tile_size_x / 2); n_scrn_pos_y = (n_map_pos_y) * iso_tile_size_y / 2; } 在这个公式中,n_map_pos_x是地图纵横的横向座标,n_map_pos_y是地图纵横的纵向座标,n_scrn_pos_x和n_scrn_pos_y是地图元素在屏幕上的纵横座标。
重要:
首先以上的公式只适用于Staggered斜45度角地图,而slide,和Diamond形地图,这个公式要稍加修改才能用。 Slide:
Diamond:
角色移动的步长、步速与滑步现象
滑步只跟步长有关,就是一轮人物行走(或跑步)实际移动的像素。
当然国产游戏大多做的不好。大多数根本不去认真做人物行走的播放程序,简单一帧帧播放动画,并随意移动小人在地图上的位置了事。
防止滑步又可以随意改变人物移动速度的方法是这样的:
将走路的程序用步长和步速两个量来控制。步长必须定死,按做出来的图片中小人一组动画下来,移动的像素为准。
步速是任意的,可以用游戏每帧或每 1/100 秒,人物移动的像素数来表示(可以是小数,比如每帧刷新移动 1.2 个像素)。
简化讲解,我以横版水平移动走路举例:(斜视角可以类推)
假设步长为 step(pixel),步速为 speed(pixel/frame),人物行走动画帧数为 n(frame)。
注: 其中 step 和 speed 可以是小数; n 是整数。 以下运算全部是浮点运算,真实游戏酌情考虑用定点数。
现在要把人物从坐标 0 移动到 100。
我们可以算出,这个过程是需要 100/speed 帧来完成的。
那么第 i 帧画面,人物在的位置:
pos=i*100/speed
这个时候,需要画第几帧图象呢?
首先我们需要知道第 i 帧画面,也就是 pos 这个位置,人物已经走了t=|pos/step| 步 (t 取整了);
我们的小人正在走在第 t+1 步的 m=(pos-t*step) * 100% 时刻m 是一个 0~1 之间的数字。
f=|n*m| 就是我们在此时刻需要画的行走图片帧了。
加快行走速度,无非是加快了频率,不可能导致滑步的,因为一步迈出的距离根本不会变。
ps. 对于跑步、有腾空,轻微滑步是允许的,所以可以适当加大步长是允许的。
by http://www.codingnow.com
Tile Based Engine 中的墙壁自动拼接处理
基于 Tile 的引擎中重复利用率最高的图素,除了地面就是墙壁了, 大家回想一下恺撒III 中的修筑城墙, 或是 Simcity2000 中拉扯电线, 道路,每种物体都只有十几种基本的图素来拼接,而交叉处理都是程序自动选择正确的图素. 假设我们做一个地图编辑器, 这个功能应该也不能少吧:-)
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库游戏编程文章搜集资料(4)在线全文阅读。
相关推荐: