(待续部分:http://bbs.bc-cn.net/viewthread.php?tid=149858&star=at#)
我从初三开始学VB,高一学VC,平时除了普通代码,看的最多的就是游戏代码了,在这里我有几点总结告诉大家.
1.选择编程软件.
最好选择VC++或Delphi.如果你选VC++的话,建议不要使用MFC AppWizard,因为涉及到MFC类可能是你的游戏运行速度减慢.
建议选择Win32 Applicaion工程.
最好不要用VB,因为VB组建的EXE需要MSVB98.dll的支持,大大减慢了运行速度.
2.动画.
说道游戏就离不开动画,那么怎样把不会动的图片组合成动画呢?在我看来,用象Flash的帧来组合动画更好处理.每个帧都有一个帧动作,表示这一帧要显示什么图片.这就涉及到脚本(Script).脚本可以用代码来表示:
文件Init.dat
//loadbmp(文件名,赋予的内部名称);
loadbmp("Hero.bmp","hero");
文件hero.fra
cut("hero",5,3,24,44,-11,0);//把图片hero复制到显示器
call("stdw"); //内部影片剪辑状态
stop; //停止播放
| //"|"号是区分每一帧的符号
cut("hero",6,51,22,44,-12,0);
call("stdl");
stop;
|
cut("hero",4,99,25,44,-12,0);
call("stdr");
stop;
|
cut("hero",4,147,25,44,-12,0);
call("stdu");
stop;
|
call("wkd");
cut("hero",36,4,26,44,-12,0);
wait(25); //等待25毫秒播放
y+=3; //Y坐标+3
|
cut("hero",98,4,28,44,-14,0);
wait(25);
y+=3;
stop;
|
call("wkl");
cut("hero",36,52,29,44,-12,0);
wait(25);
x-=5;
|
cut("hero",99,52,25,43,-14,0);
wait(25);
x-=5;
stop;
|
call("wkr");
cut("hero",32,100,29,44,-12,0);
wait(25);
x+=5;
|
cut("hero",102,100,22,43,-7,0);
wait(25);
x+=5;
stop;
|
call("wku");
cut("hero",37,148,22,43,-12,0);
wait(25);
y-=3;
|
cut("hero",100,148,24,43,-14,0);
wait(25);
y-=3;
stop;
|
以上是我做的游戏里的脚本代码,至于怎样运行这些代码,以后我会把VC编的脚本运行程序代码发布到网上.
3.碰撞检测
如果要做横版游戏(如冒险岛),碰撞检测要基于像素的,即要用个循环来检查是否有一个像素碰撞,这样比较耗时间.
如果要做格点型45度角游戏(如传奇),只要检测人物周围8个格子,即
。。。
。P 。
。。。
这样可以使运算速度和编程难度大大降低.
代码:
CString mapstr;//
int FindChar(CString str,int idx,LPCTSTR ch) //找字符
{
int start=0;
int cnt=0;
int tmp;
while(cnt<idx)
{
if((tmp=str.Find(ch,start))!=-1)
{
start=tmp+1;
cnt+=1;
}
else return (-1);
}
return (start-1);
}
CString GetOne(CString str,int idx,LPCTSTR ch)//获得一组
{
int s=FindChar(str,idx,ch)+1;
int ln=FindChar(str,idx+1,ch)-s;
if((s==-1)||(ln+s==-1))return ("ERROR");
return (str.Mid(s,ln));
}
BOOL HitMap(int x,int y)
{
if(y<1)return TRUE;
if(x<1)return TRUE;
CString xstr,ystr;
ystr=GetOne(mapstr,y*2-1,";");
if(ystr=="ERROR")return TRUE;
if(x>ystr.GetLength())return TRUE;
xstr=ystr.Mid(x-1,1);
if(xstr==".")return FALSE;
else return TRUE;
}
4.图片的先后顺序
比如传奇这个游戏,如果有人在你下方,你会被它挡住.这里有涉及到排列算法:
typedef struct{
CString name,id,objcode[MAXCODE],State;
BOOL cancnt,cando,candocode,visible;
int NowCnt,FutureCnt,CntMax,waitcnt;
int x,y,fx,fy;
}OBJ;
void Order()
{
OBJ tmpobj;
for(int i=0;i<=objmax-1;i++)
for(int j=i+1;j<=objmax;j++)
{
if(olist[i].y<olist[j].y)
{
tmpobj=olist[j];
olist[j]=olist[i];
olist[i]=tmpobj;
}
}
}
(未完待续:http://bbs.bc-cn.net/viewthread.php?tid=149858&star=at#)
[此贴子已经被作者于2007-7-4 11:35:34编辑过]