易码技术论坛

 找回密码
 加入易码
搜索
查看: 220749|回复: 3

LogLava大哥 请教一个技术上的问题^_^

[复制链接]
发表于 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;
}
发表于 2006-8-9 20:35:10 | 显示全部楼层
还有就是如果制作过不使用时空引擎的RPG的作者应该都会有这样的体会,就是电脑上资源编辑器比起lava的代码更难写,宠物没有继续制作下去的很大一方面是电脑上的工具没有写好,或者说写好了一部分,但跟我心中所想要的差别太大的,操作上很不方便……太习惯于写控制台程序,写windows的程序很不习惯……
 楼主| 发表于 2006-8-10 08:38:22 | 显示全部楼层
谢谢>_<  

好东西啊  仔细研究下^_^
 楼主| 发表于 2006-8-9 19:31:32 | 显示全部楼层 |阅读模式
  LogLava大哥 请教一个技术上的问题^_^

想问一问  像勇者斗恶龙中的多人物战斗模式是

怎样实现的  实现起来难吗?请教教偶  

恩  偶记得你一开始也是从时空引擎编游戏的

后来才改用自己的引擎  那想必对时空引擎有很好的

理解吧  偶想在时空中实现把战斗改成多人  这肯定要改源码

不过庭难  你能在这帖中给偶说说实现多人战斗的技巧吗?

特别是源码上的帮助  谢谢^_^

能不能解释下你的源码:

//命令处理
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)
    {
      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;
}

[s:5]  [s:5]  [s:5]
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2022-5-27 10:22 , Processed in 0.017947 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表