- 注册时间
- 2005-1-30
- 最后登录
- 1970-1-1
|
发表于 2006-8-9 20:25:31
|
显示全部楼层
因为以前没有写过rpg,所以一开始的时候我到处找关于rpg的代码,幸好有幸看了下时空引擎的代码,
那时我主要看了引擎中对事件处理的部分,了解到脚本的概念,由于是针对性地看,所以对时空的理解也不太深入
多人处理的话,我一般是分成这样的模块
定义一个结构
{
命令;
对象编号;
详细命令;
}mon[];
int 我方怪兽个数myNum
int 敌方怪兽个数emNum
定义函数
函数一: 执行命令(怪兽ID) 说明:执行已经下达给mon[ID]的操作
函数二: 下达命令(怪兽ID) 说明:给mon[ID]下达命令
函数三: 执行()
{
枚举我方所有怪兽
{
判断是否执行(死亡,攻击概率等),成功的话执行函数一
}
枚举敌方所有怪兽
{
判断是否执行(死亡,攻击概率等),成功的话执行函数一
}
}
例如我定义 mon[6];
然后默认我方怪兽是从mon[0]~mon[myNum]
敌方怪兽从mon[3]到mon[3+emNum]
//命令处理
void RunOrder(int mode)
{
int i,j,l;
char str[30];
for(i=0;i<mon_num[0];i++)/*枚举所有怪兽*/
{
if(field_mon.HP<=0) continue;
if((field_mon.state&BitN[0]) != 0)/*field_mon.state&BitN[0] ,利用位操作判断怪兽的状态,每个bit对应一个状态,一下类同*/
{
j=1+field_mon.ability[1]/25;
sprintf(str," %s因中毒HP -%d",field_mon.name,j);
ShowAt(str);
field_mon.HP=field_mon.HP-j;
if(field_mon.HP<=0)
{
field_mon.HP=0;
if(mon_num[0]==1) Block(3+53,14,51+53,62,0);
else Block(3+53*i,14,51+53*i,62,0);
Refresh();
for(l=0;l<mon_num[0];l++)
{
if(field_mon[l].HP>0) break;
}
if(l==mon_num[0]) result=1;
}
}
}
和:
//发送命令
int Order()
{
int i,j,p;
char str[15];
for(i=0;i<mon_num[1];i++)
{
Refresh();
for(p=0;p<mon_num[0]+mon_num[1];p++)
{
if(order[p][0]==3+i) break;
}
if(field_mon[3+i].HP<=0) continue;
strcpy(str,"攻击防御特技");
j=SelectBoxH(65,18,4,3,3,str,4,0);/*选择对怪兽的操作*/
if(j==-1) return 0;
if(j==1) /*防御*/
{
order[p][2]=-3;
continue;
}
else if(j==0);/*攻击*/
{
j=SelMon(0);/*选择对象*/
if(j==-1) return 0;
order[p][1]=j;
order[p][2]=-1;
}
else if(j==2)/*特技*/
{
if(field_mon[3+i].skill_num<=0) continue;
j=SelectSkill(i+3);
if(j==-1) return 0;
fseek(f_mon,SSkill+52*field_mon[3+i].skill[j],0);
fread(ski_tmp,1,52,f_mon);
if(ski_tmp.ability[7]>field_mon[3+i].MP)
{
MsgBox(30,30,16,1," MP不足! ",1);
return 0;
}
order[p][2]=field_mon[3+i].skill[j];
order[p][1]=SelSkiUser(field_mon[3+i].skill[j]);
if(order[p][1]==-1 || (field_mon[3+i].skill[j]<27 && order[p][1]==2)) return 0;
}
}
return 1;
} |
|