loglave 发表于 2006-8-9 20:25:31

因为以前没有写过rpg,所以一开始的时候我到处找关于rpg的代码,幸好有幸看了下时空引擎的代码,
那时我主要看了引擎中对事件处理的部分,了解到脚本的概念,由于是针对性地看,所以对时空的理解也不太深入

多人处理的话,我一般是分成这样的模块
定义一个结构
{
命令;
对象编号;
详细命令;
}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;
}

loglave 发表于 2006-8-9 20:35:10

还有就是如果制作过不使用时空引擎的RPG的作者应该都会有这样的体会,就是电脑上资源编辑器比起lava的代码更难写,宠物没有继续制作下去的很大一方面是电脑上的工具没有写好,或者说写好了一部分,但跟我心中所想要的差别太大的,操作上很不方便……太习惯于写控制台程序,写windows的程序很不习惯……

最爱口袋 发表于 2006-8-10 08:38:22

谢谢>_<

好东西啊仔细研究下^_^

最爱口袋 发表于 2006-8-9 19:31:32

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]
查看完整版本: LogLava大哥 请教一个技术上的问题^_^