AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

有关VC游戏编程的几点建议

51自学网 2015-08-30 http://www.wanshiok.com

原帖及讨论: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不保证资料的完整性。
上一篇:深度解析VC中的消息传递机制  下一篇:在MATLAB7.0中编译与发布可执行文件的详细步骤与一些问题解答