那时我主要看了引擎中对事件处理的部分,了解到脚本的概念,由于是针对性地看,所以对时空的理解也不太深入
多人处理的话,我一般是分成这样的模块
定义一个结构
{
命令;
对象编号;
详细命令;
}mon[];
int 我方怪兽个数myNum
int 敌方怪兽个数emNum
定义函数
函数一: 执行命令(怪兽ID)说明:执行已经下达给mon的操作
函数二: 下达命令(怪兽ID)说明:给mon下达命令
函数三: 执行()
{
枚举我方所有怪兽
{
判断是否执行(死亡,攻击概率等),成功的话执行函数一
}
枚举敌方所有怪兽
{
判断是否执行(死亡,攻击概率等),成功的话执行函数一
}
}
例如我定义 mon;
然后默认我方怪兽是从mon~mon
敌方怪兽从mon到mon
//命令处理
void RunOrder(int mode)
{
int i,j,l;
char str;
for(i=0;i<mon_num;i++)/*枚举所有怪兽*/
{
if(field_mon.HP<=0) continue;
if((field_mon.state&BitN) != 0)/*field_mon.state&BitN ,利用位操作判断怪兽的状态,每个bit对应一个状态,一下类同*/
{
j=1+field_mon.ability/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==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;l++)
{
if(field_mon.HP>0) break;
}
if(l==mon_num) result=1;
}
}
}
和:
//发送命令
int Order()
{
int i,j,p;
char str;
for(i=0;i<mon_num;i++)
{
Refresh();
for(p=0;p<mon_num+mon_num;p++)
{
if(order==3+i) break;
}
if(field_mon.HP<=0) continue;
strcpy(str,"攻击防御特技");
j=SelectBoxH(65,18,4,3,3,str,4,0);/*选择对怪兽的操作*/
if(j==-1) return 0;
if(j==1) /*防御*/
{
order=-3;
continue;
}
else if(j==0);/*攻击*/
{
j=SelMon(0);/*选择对象*/
if(j==-1) return 0;
order=j;
order=-1;
}
else if(j==2)/*特技*/
{
if(field_mon.skill_num<=0) continue;
j=SelectSkill(i+3);
if(j==-1) return 0;
fseek(f_mon,SSkill+52*field_mon.skill,0);
fread(ski_tmp,1,52,f_mon);
if(ski_tmp.ability>field_mon.MP)
{
MsgBox(30,30,16,1," MP不足! ",1);
return 0;
}
order=field_mon.skill;
order=SelSkiUser(field_mon.skill);
if(order==-1 || (field_mon.skill<27 && order==2)) return 0;
}
}
return 1;
} 还有就是如果制作过不使用时空引擎的RPG的作者应该都会有这样的体会,就是电脑上资源编辑器比起lava的代码更难写,宠物没有继续制作下去的很大一方面是电脑上的工具没有写好,或者说写好了一部分,但跟我心中所想要的差别太大的,操作上很不方便……太习惯于写控制台程序,写windows的程序很不习惯…… 谢谢>_<
好东西啊仔细研究下^_^
LogLava大哥 请教一个技术上的问题^_^
LogLava大哥 请教一个技术上的问题^_^想问一问像勇者斗恶龙中的多人物战斗模式是
怎样实现的实现起来难吗?请教教偶
恩偶记得你一开始也是从时空引擎编游戏的
后来才改用自己的引擎那想必对时空引擎有很好的
理解吧偶想在时空中实现把战斗改成多人这肯定要改源码
不过庭难你能在这帖中给偶说说实现多人战斗的技巧吗?
特别是源码上的帮助谢谢^_^
能不能解释下你的源码:
//命令处理
void RunOrder(int mode)
{
int i,j,l;
char str;
for(i=0;i<mon_num;i++)
{
if(field_mon.HP<=0) continue;
if((field_mon.state&BitN) != 0)
{
j=1+field_mon.ability/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==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;l++)
{
if(field_mon.HP>0) break;
}
if(l==mon_num) result=1;
}
}
}
和:
//发送命令
int Order()
{
int i,j,p;
char str;
for(i=0;i<mon_num;i++)
{
Refresh();
for(p=0;p<mon_num+mon_num;p++)
{
if(order==3+i) break;
}
if(field_mon.HP<=0) continue;
strcpy(str,"攻击防御特技");
j=SelectBoxH(65,18,4,3,3,str,4,0);
if(j==-1) return 0;
if(j==1)
{
order=-3;
continue;
}
else if(j==0)
{
j=SelMon(0);
if(j==-1) return 0;
order=j;
order=-1;
}
else if(j==2)
{
if(field_mon.skill_num<=0) continue;
j=SelectSkill(i+3);
if(j==-1) return 0;
fseek(f_mon,SSkill+52*field_mon.skill,0);
fread(ski_tmp,1,52,f_mon);
if(ski_tmp.ability>field_mon.MP)
{
MsgBox(30,30,16,1," MP不足! ",1);
return 0;
}
order=field_mon.skill;
order=SelSkiUser(field_mon.skill);
if(order==-1 || (field_mon.skill<27 && order==2)) return 0;
}
}
return 1;
}
页:
[1]