码迷,mamicode.com
首页 > 编程语言 > 详细

3D塔防游戏实现 4.2 3D怪物连续刷新(Feekood语言)

时间:2015-03-05 22:25:09      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:3d引擎   3d游戏开发   在线开发   

(Feekood语言介绍与习)
http://www.wooyoogame.com/doc/index(学习)
http://www.wooyoogame.com(首页)
http://www.feekood.com/ (开发页面)

——————————
该阶段同样用到http://www.wooyoogame.com资源:
http://www.wooyoogame.com/resource/5399 (3D蝎子 )
http://www.wooyoogame.com/resource/5075 (3D熊)
http://www.wooyoogame.com/resource/5143 (3D蜘蛛)
技术分享 —–技术分享
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
本阶段主要文件截图:
技术分享
效果截图:
技术分享技术分享技术分享
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
该阶段源码链接: http://pan.baidu.com/s/1kTpBCGn 密码: wi13
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
正文:
补充上一微博脚本“FoeMoveBase.ais”:

//引入怪物模型
Foe1=IncludeAisx(":/Wooyoo/window7/SCORPION.aisx");
Foe2=IncludeAisx(":/Wooyoo/dosdos/BEAR.aisx");
Foe3=IncludeAisx(":/Wooyoo/window7/CRYPTFIEND.aisx");
//模型纹理Mipmap化
CreateMipmap(Foe1.texture);
CreateMipmap(Foe2.texture);
CreateMipmap(Foe3.texture);
// 引入移动点数据
Include("MoveData.ais");

FoeMoveBase={
     //怪物数据
     Data:{
          Blood:50;
          Exps:10;
          Grade:1;
          speed:3;
     };
     Action:"STAND";//怪物动作
     x:0;y:0.1;z:0;
     show:false;
     IsHitTest:true;//启动鼠标拾取
     IsHitPass:false; //是否击穿
     state:"";//怪物状态
     MI:0;//记录创建怪物移动点
     Rotation:0;//旋转度
     owner.MoveTargetX:100000; //目标位置X
     owner.MoveTargetZ:100000; //目标位置Z
     MoveTime:0;//记录移动时间
     leng2:0; //记录距离的2次方
     //A==> 为 当A为true时  会每一次刷新都执行  
     //怪物移动状态,并且被创建成功
     (owner.state=="Move"&& owner.name!=null)==>
     {  owner.state=""; //状态清空 
        case(owner.MoveTargetX!=100000&&owner.MoveTargetZ!=100000,
        {   owner.Action="RUN";  //设置怪物跑起来
            //计算当前位置与目标位置 的角度,并让怪物旋转方向
            owner.Rotation=Angle2(owner.MoveTargetZ-owner.z,owner.MoveTargetX-owner.x);
            //计算当前位置与目标位置的距离的平方
            owner.leng2=pow(owner.MoveTargetZ-owner.z,2)+pow(owner.MoveTargetX-owner.x,2);
            owner.MoveTime=0;//初始化移动时间
            //根据上述距离 与 自身 速度 计算移动时间
            owner.MoveTime=Sqrt(owner.leng2)/owner.Data.speed*500;
            //怪物X/Z 在计算时间内向目标移动
            owner.x<:"clear"<:{owner.MoveTargetX,owner.MoveTime};
            owner.z<:"clear"<:{owner.MoveTargetZ,owner.MoveTime}<::{
                //<::{};为 在计算时间后才执行
                owner.MI+=1;//下一个点
                //判断下一个点是否存在,
                case($("MoveData_"+owner.FoePosition)->(owner.MI).x!=null,
                {  //存在,下一个点赋值给目标点
                   owner.MoveTargetX=$("MoveData_"+owner.FoePosition)->(owner.MI).x;
                   owner.MoveTargetZ=$("MoveData_"+owner.FoePosition)->(owner.MI).z;
                   //并且执行移动
                   owner.state="Move";
                },!($("MoveData_"+owner.FoePosition)->(owner.MI).x!=null)),
                {  //没有点后 怪物STAND
                   owner.Action="STAND";  
                };    
            };
        });     
     };
     //怪物方向 (设计东南西北方向,所以路径也不一样)
     FoePosition:"";
     IsLoaded:=> {     //创建成功后执行一次
        case(owner.FoePosition!="",{  
            owner.MI=0;   //初始下一点 0号点
            //初始化目标点
            owner.MoveTargetX=$("MoveData_"+owner.FoePosition)->0.x;
            owner.MoveTargetZ=$("MoveData_"+owner.FoePosition)->0.z;
            //走起
            owner.state="Move";
        }); 
     };
     IsHitT:false;//是否进入生命塔标记
     IsHitTarget:false;//是否碰到生命塔
     targetName:"";//生命塔名称
     IsUpdated:=>  //每一吃刷新 都判断是否碰到生命塔
     {   //判断怪物是否存在,以及生命塔是否存在、碰撞。 
         case(!(owner.IsHitT)&&owner.targetName!=""&&(!owner.clearOneself),
         {   //碰撞生命塔后 Hit  返回  true-false
             owner.IsHitTarget=Hit(owner.targetName,owner.name);
         });
     };
     //碰撞到生命塔
     IsHitTarget:->
     {    
          owner.state="";//怪物状态清空
          owner.Action="STAND";//怪物STAND
          //把怪物从怪物集中移除
          $("FoePanel").FoeAssemble>>>owner.name;
          //怪物1S内向上移动
          owner.y<:{owner.y+9,1000}<::{
              owner.state="success"; //怪物成功到达
              owner.clearOneself=true;//清除自己
          };
          owner.isHitT=true;//标记以及到达

     };
     //消除自己
     clearOneself:false;
     clearOneself:->{
       Clear(owner.name); 
     };
     //等级改变后 改变怪物属性
     Grade:0;
     Grade:->{
       owner.Data.Blood=(((owner.Grade-1)*50)+50);//血量
       owner.Data.Exps=(((owner.Grade-1)*5)+10);//加钱
       owner.Data.Grade=owner.Grade;//等级
    };
};

移动数据脚本“MoveData.ais”:

//东南西北移动点数据
MoveData_East={
    {x:46;z:0},
    {x:46;z:-46},
    {x:25;z:-46},
    {x:25;z:0},
    {x:0;z:0}};

MoveData_South={
    {x:0;z:46},
    {x:46;z:46},
    {x:46;z:25},
    {x:0;z:25},
    {x:0;z:0}};

MoveData_West={
    {x:-46;z:0},
    {x:-46;z:46},
    {x:-25;z:46},
    {x:-25;z:0},
    {x:0;z:0}};

MoveData_North={
    {x:0;z:-46},
    {x:-46;z:-46},
    {x:-46;z:-25},
    {x:0;z:-25},
    {x:0;z:0}};

怪物刷新管理面板“FoePanel.ais”:

include("FoeMoveBase.ais");//引入怪物移动基础
FoePanel={  //怪物面板
    FoeAssemble:{};//存储创建的怪物名字
    FoeData:{      //刷新怪物的数据  Foe1 为怪物1  可以更换别的怪物
        //方向、怪物类型、怪物数量、怪物等级
        {"East","Foe1",20,1};
        {"South","Foe2",20,2};
        {"West","Foe3",20,3};
        {"North","Foe1",20,4};
        {"East","Foe2",20,5};
        {"South","Foe3",20,6};
        {"West","Foe1",20,7};
        {"North","Foe2",20,8};
        {"East","Foe3",20,9};
        {"South","Foe1",20,10};
    };
    FoeCheckpoint:1;//记录怪物波数
    Direction:""://记录方向
    FoeType:0;//记录怪物类型
    FoeNumber:0;//记录怪物数量
    FoeTime:0;//怪物刷新间隔变量
    FoeGrade:1;//记录怪物等级
    NewFoeNumber:0;//本波怪物数量
    FoeRefurbish:false; //怪物是否刷新
    FoeRefurbish:=>{    //怪物刷新
        //怪物波数数据存在
        case(Size(owner.FoeData->(owner.FoeCheckpoint-1))>0,
        {   //根据怪物波数数据,初始化本波数据
            owner.Direction=owner.FoeData->(owner.FoeCheckpoint-1)->0;
            owner.FoeType=owner.FoeData->(owner.FoeCheckpoint-1)->1;
            owner.FoeNumber=owner.FoeData->(owner.FoeCheckpoint-1)->2;
            owner.FoeGrade=owner.FoeData->(owner.FoeCheckpoint-1)->3;
            //本波怪物数据出书啊
            owner.NewFoeNumber=0;
            //面板状态。刷新开启
            owner.State="Refurbish";
        });
    };
    RefurbishTab:true;//怪物刷新标记量  后续用于设置怪物完状态
    FoePositionXZ:{z:0;x:0;};
    State:"";//状态
    //A==> 为 当A为true时  会每一次刷新都执行  
    //Refurbish状态  并且 能刷新 RefurbishTab=true
    (owner.State=="Refurbish"&&owner.RefurbishTab)==>{
        owner.State=""; //清空刷新状态
        owner.FoeTime=0; //初始化话刷新间隔时间标记
        owner.FoeTime<:{0,1,1000}<::{ //一秒后刷新
            //调用2D地图中的四个方向的怪物条显示
            $("Map2DFoeShow"+owner.Direction).show=true;
            owner.FoePositionXZ={z:0;x:0};//初始化刷新点
            //根据怪物信息在对应的方位刷新怪物
            case(owner.Direction=="East",
            {
               owner.FoePositionXZ={z:1;x:55};
            },owner.Direction=="South",
            {
              owner.FoePositionXZ={z:55;x:1};  
            },owner.Direction=="West",
            {
              owner.FoePositionXZ={z:1;x:-55};
            },owner.Direction=="North",
            {
              owner.FoePositionXZ={z:-55;x:1};
            });
            //创建怪物  运用多继承
            //::owner.FoePositionXZ 刷新坐标
            //::FoeMoveBase  怪物移动Base
            //::$(owner.FoeType)); //怪物类型
            owner.FoeAssemble<<create({Grade:owner.FoeGrade;FoePosition:owner.Direction;targetName:LifeTower.name;}::owner.FoePositionXZ::FoeMoveBase::$(owner.FoeType)); 
            owner.NewFoeNumber+=1;//本波怪物数量+1
        }<::{
            //属性玩怪物后执行
            //判断怪物数量
           case(owner.NewFoeNumber<owner.FoeNumber,
           {   //第一个刷新的怪物
               case(owner.NewFoeNumber==1,
               {  //向怪物信息框传递怪物信息
                  GameFoeInfoCtl.FoeInfo=Getdata(owner.FoeAssemble->0).Data;
               });
               //刷新下一个怪物
               owner.State="Refurbish";
           },!(owner.NewFoeNumber<owner.FoeNumber),
           {   //波数+1
               owner.FoeCheckpoint+=1;
               //是否刷新下一波
               owner.ISRefurbishNext=true;
           }); 
        };
    };
    // //刷新下一波时间变量
    RefurbishTime:0;
    RefurbishTabS:false;//下一波刷新初始化变量
    RefurbishTabS:=>{  //
        owner.RefurbishTime=0; //初始化时间变量
        GameFoeInfoCtl.FoeInfo={a:1};//清空怪物信息
        owner.RefurbishTime<:{0,1,20000}<::{
          owner.FoeRefurbish=true;   //20秒后刷新 初始化本波怪物信息
        };
    };
    //刷新下一波变量
    ISRefurbishNext:false;
    owner.ISRefurbishNext==>{//刷新下一波
      owner.ISRefurbishNext=false;
      //当前怪物级为0 并且  能刷新 RefurbishTab = true
      case(size(owner.FoeAssemble)==0&&owner.RefurbishTab,
      {   //启动下一波刷新时间间隔
          owner.RefurbishTabS=true;
      },size(owner.FoeAssemble)!=0,
      {   //本波还有怪物,所以继续判断是否刷新下一波
          owner.ISRefurbishNext=true;
      });    
    };
};
//开始游戏按钮
GameButtonCtl=
{
    Type:"Button";              //按钮类型
    Text:"开始游戏";               //显示click文字
    X:50%;                        //水平居中
    Y:50%;                        //垂直居中
    Width:150;                    //宽度100像素
    Height:60;                    //高度60像素
    FontSize:16;                  // 文字大小
    FontBold:true;               // 文字是否粗体
    FontBrush:"#ff03FCBC";      // 文字颜色
    BorderRadius:{10,10,10,10};
    CenterX:50%;                         
    CenterY:50%;
    BackgroundBrush:"#ff0D0D0D";//背景色白色
    IsClick:=>                    //设置click事件触发器,click按钮打印"click"
    {   
        case(owner.Text=="重新开始",
        {   owner.show=false;
            //是否能刷新怪物标记 设为true
            FoePanel.RefurbishTab=true;
            //开启怪物刷新
            FoePanel.FoeRefurbish=true;
        },owner.Text=="开始游戏",
        {
            owner.show=false;
            //开启怪物刷新
            FoePanel.FoeRefurbish=true;
        });
    };
};

Create(GameButtonCtl);                //创建按钮
//怪物信息按钮
GameFoeInfoCtl=
{
    Type:"Button";              //按钮类型
    Text:‘怪物信息\r\n‘;               //显示click文字
    X:0;                        //水平居中
    Y:0;                        //垂直居中
    Width:100;                    //宽度100像素
    Height:90;                    //高度60像素
    FontSize:16;                  // 文字大小
    FontBold:true;               // 文字是否粗体
    FontBrush:"#ff03FCBC";      // 文字颜色
    BorderRadius:{10,0,0,0};
    BorderBrush:"#ffffffff";    // 边框颜色画刷
    BorderThickness:{1,1,1,1}; 
    Padding:{5,5,0,0};
    HAlign:"left";         
    VAlign:"top";           
    IsTopToBottom:false;
    IsLeftToRight:false;
    FoeInfo:{};
    FoeInfo:->{
       case(size(owner.FoeInfo)>1,
       {
           owner.text=‘怪物信息\r\n血量:‘+text(owner.FoeInfo.Blood)+‘\r\n等级:‘+text(owner.FoeInfo.Grade)+‘\r\n金钱:‘+text(owner.FoeInfo.Exps);
       },size(owner.FoeInfo)==1,
       {
           owner.text=‘怪物信息‘; 
       });
       owner.FoeInfo={};
    };
};
Create(GameFoeInfoCtl);                //创建按钮 

然后在主函数中加怪物刷新面板“Main.ais”:

Include("3D地图/MainMap.ais");//引入3D地图模块
Include("Turret/TurretPanel.ais");//引入炮塔模块
Include("OtherTower/TransmissionTower.ais"); //引入怪物们
Include("OtherTower/LifeTower.ais");//引入中间生命塔
Include("Foe/FoePanel.ais");//引入怪物刷新面板

3D塔防游戏实现 4.2 3D怪物连续刷新(Feekood语言)

标签:3d引擎   3d游戏开发   在线开发   

原文地址:http://blog.csdn.net/xxx19900915/article/details/44086783

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!