移动精灵:实现精灵移动

显示游戏精灵
作者:kylinx(吴振华) E-mail: [email protected]
Homepage: http://kylinx.yeah.net
版权所有 显示不动游戏精灵:

大家看到游戏里每幅精灵图片都是由很多个方向和脚步区别精灵构成
由于我没有用任何斜视角所以精灵图片有4个方向:上下左右
先看看我是怎样显示所有玩家:

void DrawPlayerWait
{
tFrame=0;
tFrame;
(tFrame>=21)
tFrame=0;
for( i=0;i<GetPlayerNum;i)
{
(player.roles[i].IsVisible && player.roles[i].IsDeadFALSE)
{
player.roles[i].StepFrame=tFrame/7+1;
SetRect(&BltRect,(player.roles[i].StepFrame-1)*32,
(player.roles[i].FaceTo-1)*48,
(player.roles[i].StepFrame*32),
(player.roles[i].FaceTo*48));
ClipBlt(lpDDSBack,player.roles[i].NowPos.Line*32-ScreenMapX,
player.roles[i].NowPos.Row*32-ScreenMapY,
lpDDSRolePlayer[player.roles[i].MovePicID],
BltRect,TRUE);
}
}
}

tFrame是帧数
If(tFrame>=21)tFrame=0;这句是什么意思呢?

看看我游戏里\"玩家\"图片都是96*192大小每幅图包含了3个区别脚步
我每隔7帧才换次\"脚步\"注意我在游戏中设定每秒刷新33次!
如果你觉得7帧不合适还可以自己修改!不过要把上面IF语句条件也要做相应修改
那个for循环中GetPlayerNum是得到当前玩家角色数目(具体实现请看后面)
再下来语句是判断这个角色是否可见如果是则画的
SetRect是WinAPI就是设定个矩形注意是如何计算:

先插入句:player是个类为
Player
{
public:
long money;//金钱
PlayerEquip pe[MAX_EQUIP];//玩家所有物品这个结构有ID(编号),Count(数量)
Role roles[MAX_ROLES];//这个是个结构里面包含了角色所有信息
};
Player player;

(player.roles[i].StepFrame-1)*32,这是要显示精灵图片矩形左端
注意我设定StepFrame是从1到3所以这里要减1
(player.roles[i].FaceTo-1)*48是要显示精灵图片矩形上端
注意我设定FaceTo,想想精灵图片从上到下FaceTo依次为下
我定义下为1左为2…所以要减1
当然后面两个参数就是要显示精灵图片矩形右端和下端了!

注意:如果为了提高点速度可以这样写

(player.roles[i].StepFrame-1)*32ó (player.roles[I].StepFrame-1)<<5,
(player.roles[i].FaceTo-1)*48 ó(player.roles[I].FaceTo-1)<<5+(player.roles[I].FaceTo-1)<<4

\"<<\"是左移位移动n位就相当于乘上2n次方
同理\">>\"是右移移动n位就相当于除上2n次方

好了现在得到了矩形了要把这个矩形里东西放到屏幕上显示
显示坐标为:
player.roles[I].NowPos.Line*32-ScreenMapX 和
player.roles[I].NowPos.Row*32-ScreenMapY

解释下:
player.roles[I].NowPos是个TilePos类(上面有声明)想想地图格式就知道为什么要乘上32了吧?(和显示地图原理是!还有这类游戏人物只能在地图小块中出现!和其他游戏有区别至于为什么会这样到了下面就会知道了!)
减去个ScreenMapX意思是什么?
慢慢来:记住游戏里所有坐标都是以大地图为参考
象这样:



图中蓝色部分表示地图橙色部分表示显示屏绿色就表示精灵
注意精灵坐标也是以地图为参考
这下知道了吧?
大家可能还有个问题就是如果精灵不在屏幕上呢?
这不用担心ClipBlt这个会把不在屏幕东西裁剪掉
好了这样就可以把不移动精灵给显示出了!
对于显示敌人和NPC道理不过有点点小问题:看看游戏里敌人图片是不是有大有小?
这就要分开考虑了但是原理都是


Tags:  精灵移动动作条 按键精灵鼠标移动 移动精灵

延伸阅读

最新评论

发表评论