3D塔防游戏实现 4.2 3D怪物连续刷新(Feekood语言)
(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; //目标位置Xowner.MoveTargetZ:100000; //目标位置ZMoveTime: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)),{ //没有点后 怪物STANDowner.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-falseowner.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),{ //波数+1owner.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 = truecase(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;//是否能刷新怪物标记 设为trueFoePanel.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塔防游戏实现 5.2 3D怪物死亡(Feekood语言)
(Feekood语言介绍与习) http://www.wooyoogame.com/doc/index(学习) http://www.wooyoogame.com(首页) http://www.fee ...
- 十大iOS塔防游戏评点
塔防游戏,即炮塔防御(Tower Defence,TD)游戏的简称.炮塔防御游戏起源于PC时代,有不少移动平台上的塔防游戏都是从PC游戏改编而来.现在除了单纯的建造炮塔防御怪物的传统模式(其中又包括固 ...
- unity塔防游戏怪物转向_Unity官方新手游戏项目推荐合集
Unity官方新手游戏项目推荐合集 今天给同学们介绍一些Unity官方发布过的一些游戏项目,这些项目都简化了游戏开发的入门学习过程,可以快速地制作出游戏,适合新手入门体验,下面就带同学们看一看: Un ...
- IOS塔防游戏《坦克对大炮》的开发设计记录
IOS塔防游戏<坦克对大炮>的开发设计记录 引子 游戏已经在App Store上线几个月了,一直很想写点什么记录一下.真要写的时候,却又发现无从下笔没啥好写的.在2012年进入IOS,对于 ...
- 超人气塔防游戏:气球塔防6 for Mac(v26.2.4058中文版)
气球塔防6中文版Bloons TD 6是一款超人气塔防游戏,气球塔防6中文版延续前作的玩法的基础上进行创新和升级,丰富的游戏场景和完善的武器.道具系统使游戏更具趣味性和挑战性,更有关卡等你来体验,还等 ...
- 【HMS Core案例分享】华为分析 X 江湖游戏 | 揭秘塔防游戏的增长秘籍
江湖游戏是一家集网络游戏发行.运营和服务于一体的公司,于2018年成立,是国内新兴的游戏发行商之一.江湖游戏凭借着3D欧美卡通塔防巨作<塔塔帝国>,以及诙谐幽默的<泡面三国>, ...
- (译)如何使用cocos2d制作一个塔防游戏:引子
原文链接地址:http://www.iphonegametutorials.com/2011/04/11/cocos2d-game-tutorial-how-to-build-a-tower-defe ...
- 塔防游戏的路径寻找算法分析
在塔防游戏中,有很多敌人都是向着同一目标前进的.在众多塔防游戏当中,有一条或几条预定好的路径.在一些塔防游戏中,比如经典的<Desktop Tower Defense>,你可以将塔放在地图 ...
- 用Unity开发一款塔防游戏(一):攻击方设计
大家好.偶尔想起了这个手把手教学的.但现已长满杂草的坑,还是来挖几铲子. 这一期的游戏是最常见的类型之一--塔防. 塔防游戏相信大家并不陌生,几个主要元素如下: 1.敌方士兵 2.我方防御塔 3.我方 ...
最新文章
- ubuntu firefox播放不了视频的解决办法 安装chrome 解决
- 《c语言从入门到精通》看书笔记——第14章 文件
- git push时报错fatal: Could not read from remote repository.
- MariaDB:删除数据库报错:error: 'Error dropping database (can't rmdir './shiro', errno: 39)'
- python怎么用split字符串全部分开_请教一下python怎么用split对一句话拆分两次?...
- 和整数相乘_人教版五年级上册第1单元《小数乘整数》课件及同步练习
- mysql:mysql安装及一些配置和图形界面介绍
- Android Fragment之间的切换
- 温州大学c语言作业布置的网站,2016年温州大学物理与电子信息工程学院综合卷之C语言程序设计复试笔试仿真模拟题...
- JavaWeb开发Listener学习
- usb转rs232驱动无效,已经电脑自动扫描检测硬件改动.设备无法运行错误代码10
- MATLAB学习八(二):标准差std
- 简单银行管理系统C#版本
- 5.2 Photoshop复制图层的几种方式 [原创Ps教程]
- python笔记:7.2.2.2 一元多因素方差分析_交互效应图(购房面积影响因素交互效应)
- 计算机桌面文件能单独设密码吗,告诉你怎么给文件夹设置密码
- 项目实训(十二)——FPS游戏枪械射击弹孔及子弹散射
- 关于注册时验证邮箱,并实现类似安卓的吐丝效果
- ts中的never类型
- AD19 基础应用技巧(快速定义PCB板框,CAD中DWG转DXF格式导入)