| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4136 人关注过本帖, 1 人收藏
标题:[原创]有关VC游戏编程的几点建议(已更新)
取消只看楼主 加入收藏
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
结帖率:100%
收藏(1)
 问题点数:0 回复次数:1 
[原创]有关VC游戏编程的几点建议(已更新)

(待续部分: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编辑过]

搜索更多相关主题的帖子: 游戏 原创 
2007-06-15 21:03
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
MFC他封装了很多API,你想是直接调用更快还是通过MFC间接调用快?

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-02-17 11:41
快速回复:[原创]有关VC游戏编程的几点建议(已更新)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024643 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved