原帖及讨论:http://bbs.bccn.net/thread-147831-1-1.html 我从初三开始学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; } } } (未完待续……)
 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
|