游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2579|回复: 0

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

[复制链接]

8

主题

9

帖子

804

积分

高级会员

Rank: 4

积分
804
发表于 2015-3-5 21:49:51 | 显示全部楼层 |阅读模式

(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蜘蛛)
—–
❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤
本阶段主要文件截图:

效果截图:

❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤
正文:
补充上一微博脚本“FoeMoveBase.ais”:

  1. //引入怪物模型
  2. Foe1=IncludeAisx(":/Wooyoo/window7/SCORPION.aisx");
  3. Foe2=IncludeAisx(":/Wooyoo/dosdos/BEAR.aisx");
  4. Foe3=IncludeAisx(":/Wooyoo/window7/CRYPTFIEND.aisx");
  5. //模型纹理Mipmap化
  6. CreateMipmap(Foe1.texture);
  7. CreateMipmap(Foe2.texture);
  8. CreateMipmap(Foe3.texture);
  9. // 引入移动点数据
  10. Include("MoveData.ais");

  11. FoeMoveBase={
  12.      //怪物数据
  13.      Data:{
  14.           Blood:50;
  15.           Exps:10;
  16.           Grade:1;
  17.           speed:3;
  18.      };
  19.      Action:"STAND";//怪物动作
  20.      x:0;y:0.1;z:0;
  21.      show:false;
  22.      IsHitTest:true;//启动鼠标拾取
  23.      IsHitPass:false; //是否击穿
  24.      state:"";//怪物状态
  25.      MI:0;//记录创建怪物移动点
  26.      Rotation:0;//旋转度
  27.      owner.MoveTargetX:100000; //目标位置X
  28.      owner.MoveTargetZ:100000; //目标位置Z
  29.      MoveTime:0;//记录移动时间
  30.      leng2:0; //记录距离的2次方
  31.      //A==> 为 当A为true时  会每一次刷新都执行  
  32.      //怪物移动状态,并且被创建成功
  33.      (owner.state=="Move"&& owner.name!=null)==>
  34.      {  owner.state=""; //状态清空
  35.         case(owner.MoveTargetX!=100000&&owner.MoveTargetZ!=100000,
  36.         {   owner.Action="RUN";  //设置怪物跑起来
  37.             //计算当前位置与目标位置 的角度,并让怪物旋转方向
  38.             owner.Rotation=Angle2(owner.MoveTargetZ-owner.z,owner.MoveTargetX-owner.x);
  39.             //计算当前位置与目标位置的距离的平方
  40.             owner.leng2=pow(owner.MoveTargetZ-owner.z,2)+pow(owner.MoveTargetX-owner.x,2);
  41.             owner.MoveTime=0;//初始化移动时间
  42.             //根据上述距离 与 自身 速度 计算移动时间
  43.             owner.MoveTime=Sqrt(owner.leng2)/owner.Data.speed*500;
  44.             //怪物X/Z 在计算时间内向目标移动
  45.             owner.x<:"clear"<:{owner.MoveTargetX,owner.MoveTime};
  46.             owner.z<:"clear"<:{owner.MoveTargetZ,owner.MoveTime}<::{
  47.                 //<::{};为 在计算时间后才执行
  48.                 owner.MI+=1;//下一个点
  49.                 //判断下一个点是否存在,
  50.                 case($("MoveData_"+owner.FoePosition)->(owner.MI).x!=null,
  51.                 {  //存在,下一个点赋值给目标点
  52.                    owner.MoveTargetX=$("MoveData_"+owner.FoePosition)->(owner.MI).x;
  53.                    owner.MoveTargetZ=$("MoveData_"+owner.FoePosition)->(owner.MI).z;
  54.                    //并且执行移动
  55.                    owner.state="Move";
  56.                 },!($("MoveData_"+owner.FoePosition)->(owner.MI).x!=null)),
  57.                 {  //没有点后 怪物STAND
  58.                    owner.Action="STAND";  
  59.                 };   
  60.             };
  61.         });     
  62.      };
  63.      //怪物方向 (设计东南西北方向,所以路径也不一样)
  64.      FoePosition:"";
  65.      IsLoaded:=> {     //创建成功后执行一次
  66.         case(owner.FoePosition!="",{  
  67.             owner.MI=0;   //初始下一点 0号点
  68.             //初始化目标点
  69.             owner.MoveTargetX=$("MoveData_"+owner.FoePosition)->0.x;
  70.             owner.MoveTargetZ=$("MoveData_"+owner.FoePosition)->0.z;
  71.             //走起
  72.             owner.state="Move";
  73.         });
  74.      };
  75.      IsHitT:false;//是否进入生命塔标记
  76.      IsHitTarget:false;//是否碰到生命塔
  77.      targetName:"";//生命塔名称
  78.      IsUpdated:=>  //每一吃刷新 都判断是否碰到生命塔
  79.      {   //判断怪物是否存在,以及生命塔是否存在、碰撞。
  80.          case(!(owner.IsHitT)&&owner.targetName!=""&&(!owner.clearOneself),
  81.          {   //碰撞生命塔后 Hit  返回  true-false
  82.              owner.IsHitTarget=Hit(owner.targetName,owner.name);
  83.          });
  84.      };
  85.      //碰撞到生命塔
  86.      IsHitTarget:->
  87.      {   
  88.           owner.state="";//怪物状态清空
  89.           owner.Action="STAND";//怪物STAND
  90.           //把怪物从怪物集中移除
  91.           $("FoePanel").FoeAssemble>>>owner.name;
  92.           //怪物1S内向上移动
  93.           owner.y<:{owner.y+9,1000}<::{
  94.               owner.state="success"; //怪物成功到达
  95.               owner.clearOneself=true;//清除自己
  96.           };
  97.           owner.isHitT=true;//标记以及到达

  98.      };
  99.      //消除自己
  100.      clearOneself:false;
  101.      clearOneself:->{
  102.        Clear(owner.name);
  103.      };
  104.      //等级改变后 改变怪物属性
  105.      Grade:0;
  106.      Grade:->{
  107.        owner.Data.Blood=(((owner.Grade-1)*50)+50);//血量
  108.        owner.Data.Exps=(((owner.Grade-1)*5)+10);//加钱
  109.        owner.Data.Grade=owner.Grade;//等级
  110.     };
  111. };
复制代码

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

  1. //东南西北移动点数据
  2. MoveData_East={
  3.     {x:46;z:0},
  4.     {x:46;z:-46},
  5.     {x:25;z:-46},
  6.     {x:25;z:0},
  7.     {x:0;z:0}};

  8. MoveData_South={
  9.     {x:0;z:46},
  10.     {x:46;z:46},
  11.     {x:46;z:25},
  12.     {x:0;z:25},
  13.     {x:0;z:0}};

  14. MoveData_West={
  15.     {x:-46;z:0},
  16.     {x:-46;z:46},
  17.     {x:-25;z:46},
  18.     {x:-25;z:0},
  19.     {x:0;z:0}};

  20. MoveData_North={
  21.     {x:0;z:-46},
  22.     {x:-46;z:-46},
  23.     {x:-46;z:-25},
  24.     {x:0;z:-25},
  25.     {x:0;z:0}};
复制代码

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

  1. include("FoeMoveBase.ais");//引入怪物移动基础
  2. FoePanel={  //怪物面板
  3.     FoeAssemble:{};//存储创建的怪物名字
  4.     FoeData:{      //刷新怪物的数据  Foe1 为怪物1  可以更换别的怪物
  5.         //方向、怪物类型、怪物数量、怪物等级
  6.         {"East","Foe1",20,1};
  7.         {"South","Foe2",20,2};
  8.         {"West","Foe3",20,3};
  9.         {"North","Foe1",20,4};
  10.         {"East","Foe2",20,5};
  11.         {"South","Foe3",20,6};
  12.         {"West","Foe1",20,7};
  13.         {"North","Foe2",20,8};
  14.         {"East","Foe3",20,9};
  15.         {"South","Foe1",20,10};
  16.     };
  17.     FoeCheckpoint:1;//记录怪物波数
  18.     Direction:""://记录方向
  19.     FoeType:0;//记录怪物类型
  20.     FoeNumber:0;//记录怪物数量
  21.     FoeTime:0;//怪物刷新间隔变量
  22.     FoeGrade:1;//记录怪物等级
  23.     NewFoeNumber:0;//本波怪物数量
  24.     FoeRefurbish:false; //怪物是否刷新
  25.     FoeRefurbish:=>{    //怪物刷新
  26.         //怪物波数数据存在
  27.         case(Size(owner.FoeData->(owner.FoeCheckpoint-1))>0,
  28.         {   //根据怪物波数数据,初始化本波数据
  29.             owner.Direction=owner.FoeData->(owner.FoeCheckpoint-1)->0;
  30.             owner.FoeType=owner.FoeData->(owner.FoeCheckpoint-1)->1;
  31.             owner.FoeNumber=owner.FoeData->(owner.FoeCheckpoint-1)->2;
  32.             owner.FoeGrade=owner.FoeData->(owner.FoeCheckpoint-1)->3;
  33.             //本波怪物数据出书啊
  34.             owner.NewFoeNumber=0;
  35.             //面板状态。刷新开启
  36.             owner.State="Refurbish";
  37.         });
  38.     };
  39.     RefurbishTab:true;//怪物刷新标记量  后续用于设置怪物完状态
  40.     FoePositionXZ:{z:0;x:0;};
  41.     State:"";//状态
  42.     //A==> 为 当A为true时  会每一次刷新都执行  
  43.     //Refurbish状态  并且 能刷新 RefurbishTab=true
  44.     (owner.State=="Refurbish"&&owner.RefurbishTab)==>{
  45.         owner.State=""; //清空刷新状态
  46.         owner.FoeTime=0; //初始化话刷新间隔时间标记
  47.         owner.FoeTime<:{0,1,1000}<::{ //一秒后刷新
  48.             //调用2D地图中的四个方向的怪物条显示
  49.             $("Map2DFoeShow"+owner.Direction).show=true;
  50.             owner.FoePositionXZ={z:0;x:0};//初始化刷新点
  51.             //根据怪物信息在对应的方位刷新怪物
  52.             case(owner.Direction=="East",
  53.             {
  54.                owner.FoePositionXZ={z:1;x:55};
  55.             },owner.Direction=="South",
  56.             {
  57.               owner.FoePositionXZ={z:55;x:1};  
  58.             },owner.Direction=="West",
  59.             {
  60.               owner.FoePositionXZ={z:1;x:-55};
  61.             },owner.Direction=="North",
  62.             {
  63.               owner.FoePositionXZ={z:-55;x:1};
  64.             });
  65.             //创建怪物  运用多继承
  66.             //::owner.FoePositionXZ 刷新坐标
  67.             //::FoeMoveBase  怪物移动Base
  68.             //::$(owner.FoeType)); //怪物类型
  69.             owner.FoeAssemble<<create({Grade:owner.FoeGrade;FoePosition:owner.Direction;targetName:LifeTower.name;}::owner.FoePositionXZ::FoeMoveBase::$(owner.FoeType));
  70.             owner.NewFoeNumber+=1;//本波怪物数量+1
  71.         }<::{
  72.             //属性玩怪物后执行
  73.             //判断怪物数量
  74.            case(owner.NewFoeNumber<owner.FoeNumber,
  75.            {   //第一个刷新的怪物
  76.                case(owner.NewFoeNumber==1,
  77.                {  //向怪物信息框传递怪物信息
  78.                   GameFoeInfoCtl.FoeInfo=Getdata(owner.FoeAssemble->0).Data;
  79.                });
  80.                //刷新下一个怪物
  81.                owner.State="Refurbish";
  82.            },!(owner.NewFoeNumber<owner.FoeNumber),
  83.            {   //波数+1
  84.                owner.FoeCheckpoint+=1;
  85.                //是否刷新下一波
  86.                owner.ISRefurbishNext=true;
  87.            });
  88.         };
  89.     };
  90.     // //刷新下一波时间变量
  91.     RefurbishTime:0;
  92.     RefurbishTabS:false;//下一波刷新初始化变量
  93.     RefurbishTabS:=>{  //
  94.         owner.RefurbishTime=0; //初始化时间变量
  95.         GameFoeInfoCtl.FoeInfo={a:1};//清空怪物信息
  96.         owner.RefurbishTime<:{0,1,20000}<::{
  97.           owner.FoeRefurbish=true;   //20秒后刷新 初始化本波怪物信息
  98.         };
  99.     };
  100.     //刷新下一波变量
  101.     ISRefurbishNext:false;
  102.     owner.ISRefurbishNext==>{//刷新下一波
  103.       owner.ISRefurbishNext=false;
  104.       //当前怪物级为0 并且  能刷新 RefurbishTab = true
  105.       case(size(owner.FoeAssemble)==0&&owner.RefurbishTab,
  106.       {   //启动下一波刷新时间间隔
  107.           owner.RefurbishTabS=true;
  108.       },size(owner.FoeAssemble)!=0,
  109.       {   //本波还有怪物,所以继续判断是否刷新下一波
  110.           owner.ISRefurbishNext=true;
  111.       });   
  112.     };
  113. };
  114. //开始游戏按钮
  115. GameButtonCtl=
  116. {
  117.     Type:"Button";              //按钮类型
  118.     Text:"开始游戏";               //显示click文字
  119.     X:50%;                        //水平居中
  120.     Y:50%;                        //垂直居中
  121.     Width:150;                    //宽度100像素
  122.     Height:60;                    //高度60像素
  123.     FontSize:16;                  // 文字大小
  124.     FontBold:true;               // 文字是否粗体
  125.     FontBrush:"#ff03FCBC";      // 文字颜色
  126.     BorderRadius:{10,10,10,10};
  127.     CenterX:50%;                        
  128.     CenterY:50%;
  129.     BackgroundBrush:"#ff0D0D0D";//背景色白色
  130.     IsClick:=>                    //设置click事件触发器,click按钮打印"click"
  131.     {   
  132.         case(owner.Text=="重新开始",
  133.         {   owner.show=false;
  134.             //是否能刷新怪物标记 设为true
  135.             FoePanel.RefurbishTab=true;
  136.             //开启怪物刷新
  137.             FoePanel.FoeRefurbish=true;
  138.         },owner.Text=="开始游戏",
  139.         {
  140.             owner.show=false;
  141.             //开启怪物刷新
  142.             FoePanel.FoeRefurbish=true;
  143.         });
  144.     };
  145. };

  146. Create(GameButtonCtl);                //创建按钮
  147. //怪物信息按钮
  148. GameFoeInfoCtl=
  149. {
  150.     Type:"Button";              //按钮类型
  151.     Text:'怪物信息\r\n';               //显示click文字
  152.     X:0;                        //水平居中
  153.     Y:0;                        //垂直居中
  154.     Width:100;                    //宽度100像素
  155.     Height:90;                    //高度60像素
  156.     FontSize:16;                  // 文字大小
  157.     FontBold:true;               // 文字是否粗体
  158.     FontBrush:"#ff03FCBC";      // 文字颜色
  159.     BorderRadius:{10,0,0,0};
  160.     BorderBrush:"#ffffffff";    // 边框颜色画刷
  161.     BorderThickness:{1,1,1,1};
  162.     Padding:{5,5,0,0};
  163.     HAlign:"left";         
  164.     VAlign:"top";           
  165.     IsTopToBottom:false;
  166.     IsLeftToRight:false;
  167.     FoeInfo:{};
  168.     FoeInfo:->{
  169.        case(size(owner.FoeInfo)>1,
  170.        {
  171.            owner.text='怪物信息\r\n血量:'+text(owner.FoeInfo.Blood)+'\r\n等级:'+text(owner.FoeInfo.Grade)+'\r\n金钱:'+text(owner.FoeInfo.Exps);
  172.        },size(owner.FoeInfo)==1,
  173.        {
  174.            owner.text='怪物信息';
  175.        });
  176.        owner.FoeInfo={};
  177.     };
  178. };
  179. Create(GameFoeInfoCtl);                //创建按钮
复制代码

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

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

该阶段源码链接: http://pan.baidu.com/s/1kTpBCGn 密码: wi13


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 20:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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