游戏开发论坛

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

3D塔防游戏实现 2.2 管理建炮塔规则(Feekood语言)

[复制链接]

8

主题

9

帖子

804

积分

高级会员

Rank: 4

积分
804
发表于 2015-3-2 09:51:03 | 显示全部楼层 |阅读模式
本帖最后由 xxx19900915 于 2015-3-2 09:54 编辑

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

——————————
在上一章创建炮塔中,把炮塔分为两个阶段:
1.创建炮塔精灵按钮、3D模型。
2.管理建炮塔规则(不重叠、高地建设、在3D地图上创建炮塔)。
接下来加介绍第二阶段:
在上一文件夹层级的基础上,我们新增2脚本,“TurretPanel.ais”管理炮塔与“Main.ais”程序主入口。
如图:
首先把“TurretMesh.ais”中最后一句注释掉

下面是“TurretPanel.ais”的代码:

I
  1. nclude("TurretSpriteBtn.ais"); //引入精灵按键
  2. Include("TurretMesh.ais");//引入炮塔模型基础数据
  3. //创建一个单独的炮塔模型,用以创建时移动与对比用
  4. Create(CreateTurretTab={
  5.     type:"mesh";
  6.     model:"TurretA1model";
  7.     texture:"TurretImg";
  8.     SimplerState:"wrap";
  9.     Shader:"phong";
  10.     Scale:{0.6,0.6,0.6};
  11.     show:false;
  12.     Rotation:180;
  13.     ScopeRadius: 2;
  14.     ShowScope: true;
  15. });
  16. //炮塔管理面板
  17. TurretPanel={
  18.   CreateTab:false; //是否创建标志
  19.   CreateTab:->{    //属性改变时触发事件
  20.     case(!owner.CreateTab,
  21.     {   //创建完成后恢复炮塔精灵按钮的图片  
  22.         $("TurretASpriteBtn").texture="TurretAImg";
  23.     });
  24.   };
  25.   target:"";//创建炮塔类型
  26.   TurretAssemble:{};//已经创建炮塔的名字
  27.   targetXYZ:{}; //创建炮塔的空间坐标
  28.   targetXYZ:->  //坐标改变时触发
  29.   {
  30.     case(size(owner.targetXYZ)>0,
  31.     {      //创建炮塔
  32.            TurretName=create({
  33.                x:owner.targetXYZ.x,
  34.                y:owner.targetXYZ.y,
  35.                z:owner.targetXYZ.z,
  36.                Scale:{0.6,0.6,0.6};
  37.                model:owner.target+"1model";
  38.            }::TurretBaseMesh);
  39.            //把创建的炮塔放入TurretAssemble变量中
  40.            owner.TurretAssemble<<TurretName;   
  41.     });
  42.     //清空坐标
  43.     owner.targetXYZ={};
  44.   };
  45. };
复制代码

因为所以到3D地图上点击、移动所以“3D地图/MainMap.ais”脚本进行补充代码如下:(增加了IsClick与IsMouseMove事件)

  1. include("MapBase.ais");//引入地图基础文件
  2. include("../navcontrol/UiPanel.ais");//应用视角文件
  3. include("2DMap/2Dmap.ais");//引入2D地图
  4. create({
  5.     //主地图名称  可以通过Getdata("MainMap")获取  2D地图中用到
  6.     name:"MainMap";
  7.     opposite:{};
  8.     opposite:->{ //通过2D地图传送比例过来
  9.         //3D地图的长宽都为32格,然后每格大小为4  所以总的长宽都为120左右
  10.         //所以3D地图的四个区域的大小都是60*60
  11.         TargetX=60*(owner.opposite.X);//根据传过来的比例算3D空间的X
  12.         TargetZ=60*(owner.opposite.Z);//根据传过来的比例算3D空间的Z
  13.         TargetY=MainCamera.Position->1;//获取当前视角的3D空间的Y
  14.         //控制500毫秒内移动到目标3D视角中眼镜的空间坐标
  15.         MainCamera.Position<:{{TargetX,TargetY,TargetZ+40},500};
  16.         //控制500毫秒内移动到目标3D视角中目标物的空间坐标
  17.         MainCamera.Target<:{{TargetX,0,TargetZ},500};
  18.     };
  19.     IsHitTest:true;  //开始鼠标点击
  20.     IsClick:=>     //点击3D地图地面
  21.     { //判断炮塔面板中的CreateTab属性是否为true,以及内部属性Createtab
  22.       case($("TurretPanel").CreateTab==true&&owner.Createtab,
  23.       {  //向炮塔面板传递创建完成信息
  24.          $("TurretPanel").CreateTab=false;
  25.          //向炮塔面板传递创建空间点信息
  26.          $("TurretPanel").targetXYZ={x:owner.hitx,y:owner.hity,z:owner.hitz};
  27.          //内部属性置为false
  28.          owner.Createtab=false;
  29.          //单独的炮塔隐藏
  30.          CreateTurretTab.show=false;
  31.       });
  32.     };
  33.     Createtab:true;//炮塔是否能创建标记
  34.     IsMouseMove:=> {  //鼠标移动事件
  35.         //判断炮塔面板中的CreateTab属性是否为true
  36.         case($("TurretPanel").CreateTab==true,
  37.         {   
  38.             owner.Createtab=true;  //初始化Createtab为true
  39.             //单独的对比炮塔属性赋值
  40.             CreateTurretTab.texture="TurretImg";  //炮塔纹理
  41.             CreateTurretTab.show=true; //炮塔显示
  42.             CreateTurretTab.x=owner.hitx;  //炮塔X坐标改变为鼠标点
  43.             CreateTurretTab.y=owner.hity;  //炮塔Y坐标改变为鼠标点
  44.             CreateTurretTab.z=owner.hitz;  //炮塔Z坐标改变为鼠标点
  45.              //炮塔在高地(5)以下不能建造
  46.             case(CreateTurretTab.y<4.9,   
  47.             {
  48.                 CreateTurretTab.texture="clear";//去掉炮塔纹理
  49.                 owner.Createtab=false;//设置内部属性Createtab为不能创建
  50.             });
  51.             //遍历查看创建的炮塔是否与已经创建的重叠
  52.             foreach(TurretPanel.TurretAssemble,
  53.             {   //hit为检测是否碰撞函数(系统内置)
  54.                 case(hit(CreateTurretTab.name,value),
  55.                 {   
  56.                     CreateTurretTab.texture="clear";//去掉炮塔纹理
  57.                     owner.Createtab=false;//设置内部属性Createtab为不能创建
  58.                 });
  59.             });
  60.         });
  61.     };
  62. }::MapA);//创建地图,::为继承
复制代码

新增一个主脚本来控制整个游戏入口“Main.ais”。
代码如下:

  1. Include("3D地图/MainMap.ais");//引入3D地图模块
  2. Include("Turret/TurretPanel.ais");//引入炮塔模块
复制代码

该阶段截图:

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


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

本版积分规则

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

GMT+8, 2025-5-29 16:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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