天天看点

3D塔防游戏实现 5.1 3D炮塔能攻击了(Feekood语言)

(Feekood语言介绍与习)

http://www.wooyoogame.com/doc/index(学习)

http://www.wooyoogame.com(首页)

http://www.feekood.com/ (开发页面)

——————————

在前面的阶段实现了:3D地图、2D地图、视角控制、创建炮塔、创建怪物、怪物移动、怪物连续刷新等功能。下面也是最后的一个阶段:炮塔攻击、怪物死亡、信息展示这3个方面的介绍。

❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤

今天来介绍3D炮塔能攻击了:

修改原“TurretMesh.ais”脚本

3D塔防游戏实现 5.1 3D炮塔能攻击了(Feekood语言)
LoadImage("TurretImg",":/Wooyoo/tower/turret01.jpg");  //炮塔纹理
//炮塔模型
LoadModel("TurretA1model",":/Wooyoo/tower/flame_thrower_01.obj","obj");
//炮弹模型
BulletA=IncludeAisx(":/Wooyoo/window7/ROCKETMOUNT3.aisx");
BulletA.action="WALK";//炮弹动画
BulletA.Scale={,,};//缩放炮弹模型
//炮塔模型数据
TurretBaseMesh=   
{
    type:"mesh";   //类型  mesh
    model:"TurretA1model"; //模型为炮塔A
    texture:"TurretImg";   //模型的纹理
    SimplerState:"wrap";   
    Shader:"phong";
    Scale:{,,};   //缩放下模型大小
    leftName:"";           //存储左炮弹名称
    rightName:"";          //存储右炮弹名称
    x:;
    y:;
    z:;
    OldXZ:{};  //保存炮弹的初始XZ坐标 
    //isloaded为创建后执行一次的事件,这里为创建左右炮弹
    isloaded:=>{
        PX=;    //右炮弹X平移炮弹的 
        PX1=-;  //左炮弹X平移
        PZ=;     //炮弹Z平移
        //根据炮塔模型的旋转角度来计算左右两炮弹的位置
        xx1=PX*cos(pi()*owner.rotation/)+PZ*sin(pi()*owner.rotation/);     
        zz1=(-*PX)*sin(pi()*owner.rotation/)+PZ*cos(pi()*owner.rotation/);

        xx2=PX1*cos(pi()*owner.rotation/)+PZ*sin(pi()*owner.rotation/);     
        zz2=(-*PX1)*sin(pi()*owner.rotation/)+PZ*cos(pi()*owner.rotation/); 
        //创建左右两炮塔
        owner.leftName=create({x:owner.x+xx1;y:owner.y+1;z:owner.z+zz1;Rotation:owner.Rotation;show:owner.show}::BulletA);
        owner.rightName=create({x:owner.x+xx2;y:owner.y+1;z:owner.z+zz2;Rotation:owner.Rotation;show:owner.show}::BulletA);
        //保存初始化的炮弹位置
        owner.OldXZ={Lx:owner.x+xx1;Lz:owner.z+zz1;Rx:owner.x+xx2;Rz:owner.z+zz2};
    };
    //炮塔旋转度变化时刷新炮弹角度与位置
    BreakRotation:false;
    BreakRotation:=>{
        PX=;   //右炮弹X平移
        PX1=-; //左炮弹X平移
        PZ=;    //炮弹Z平移
        //根据炮塔模型的旋转角度来计算左右两炮弹的位置
        xx1=PX*cos(pi()*owner.rotation/)+PZ*sin(pi()*owner.rotation/);     
        zz1=(-*PX)*sin(pi()*owner.rotation/)+PZ*cos(pi()*owner.rotation/);

        xx2=PX1*cos(pi()*owner.rotation/)+PZ*sin(pi()*owner.rotation/);     
        zz2=(-*PX1)*sin(pi()*owner.rotation/)+PZ*cos(pi()*owner.rotation/); 
        //更新两炮弹的X.Y.Z及旋转度
        Getdata(owner.leftName).x=owner.x+xx1;
        Getdata(owner.leftName).y=owner.y+;
        Getdata(owner.leftName).z=owner.z+zz1;
        Getdata(owner.leftName).Rotation=owner.Rotation; 
        Getdata(owner.rightName).x=owner.x+xx2;
        Getdata(owner.rightName).y=owner.y+;
        Getdata(owner.rightName).z=owner.z+zz2;
        Getdata(owner.rightName).Rotation=owner.Rotation;
        //保存初始化的两炮弹位置
        owner.OldXZ={Lx:owner.x+xx1;Lz:owner.z+zz1;Rx:owner.x+xx2;Rz:owner.z+zz2};
    };
    Rotation:; //旋转度
//新增加内容%%%%%%%%%%%%%%%%%%%%% 
    range:;//攻击范围
    TargetName:"";//对象名称
    AttackValue:; //攻击力
    AttackSpeed:;//秒
    AttackSpeed:->{  //攻击速度控制
      case(owner.AttackSpeed>,owner.AttackSpeed=);    
    };
    ClickTime:;//攻击时间控制
    IsAttack:true; //是否攻击
    IsUpdated:=> { //每次刷新执行
        owner.ClickTime+=Sys().USEDTIME;  //累加时间
        //当时间大于该攻击时间后执行
        case(owner.ClickTime>(-owner.AttackSpeed*),
        {   owner.ClickTime=;//攻击时间清0
            owner.IsAttack=true;//设置攻击
            Siz=Size($("FoePanel").FoeAssemble);
            for(i=;i<Siz;i+=1,
            {   Tname=$("FoePanel").FoeAssemble->i;
                //怪物存在、怪物未死亡、能攻击
                case(Tname!=null&&Getdata(Tname)!=null&&!Getdata(Tname).Die&&owner.IsAttack,
                {
                    TargetX=Getdata(Tname).x;  //怪物X点
                    TargetZ=Getdata(Tname).z;  //怪物z点
                    //计算距离
                    leng2=pow(owner.x-TargetX,)+pow(owner.z-TargetZ,);
                    case(leng2<Pow(owner.range,),
                    {  owner.IsAttack=false;  //关闭攻击
                       owner.TargetName=Tname; //攻击怪物对象
                       //调整炮塔角度
                       owner.Rotation=Angle2(TargetZ-owner.z,TargetX-owner.x); 
                       owner.Attack=true;//炮塔攻击
                       owner.BreakRotation=true;//刷新炮弹角度
                    });
                });
            });
        });
    };
    //攻击
    Attack:false;
    owner.Attack==>{
       owner.Attack=false; //关闭攻击
       case(owner.TargetName!=""&&Getdata(owner.TargetName)!=null&&owner.leftName!=""&&owner.rightName!="",
       {   
           TargetX=Getdata(owner.TargetName).x;
           Targetz=Getdata(owner.TargetName).z;
           Targety=Getdata(owner.TargetName).y;
           //重置炮弹位置
           Getdata(owner.leftName).x=owner.OldXZ.Lx;
           Getdata(owner.leftName).z=owner.OldXZ.Lz;
           Getdata(owner.leftName).y=owner.y+;
           Getdata(owner.rightName).x=owner.OldXZ.Rx;
           Getdata(owner.rightName).z=owner.OldXZ.Rz;  
           Getdata(owner.rightName).y=owner.y+;
           //炮弹攻向怪物
           Getdata(owner.leftName).x<:"Clear"<:{TargetX,};
           Getdata(owner.leftName).z<:"Clear"<:{Targetz,};
           Getdata(owner.leftName).y<:"Clear"<:{Targety,}<::{owner.BreakRotation=true;};
           Getdata(owner.rightName).x<:"Clear"<:{TargetX,};
           Getdata(owner.rightName).z<:"Clear"<:{Targetz,};
           Getdata(owner.rightName).y<:"Clear"<:{Targety,}<::{
               owner.BreakRotation=true;//炮弹刷新
               case(Getdata(owner.TargetName).Data.Blood!=null,
               {  //怪物的血量-少炮塔攻击力数
                  Getdata(owner.TargetName).Data.Blood-=owner.AttackValue; 
               });
            };
       });
    };
 //新增加内容%%%%%%%%%%%%%%%%%%%%% 
    ScopeRadius: ; //模型的范围半径
    ShowScope: true; //显示模型的范围半径
    show:true;     //显示
    show:->        //控制左右炮弹的显示与隐藏 
    {
       Getdata(owner.leftName).show=owner.show;
       Getdata(owner.rightName).show=owner.show;   
    };
    //炮塔移动时炮弹也跟着移动
    x:->{
      Getdata(owner.leftName).x=owner.x;
      Getdata(owner.rightName).x=owner.x;    
    };
    z:->{
      Getdata(owner.leftName).z=owner.z;
      Getdata(owner.rightName).z=owner.z;    
    };
};

// create(TurretBaseMesh);
//  print(TurretMesh);
           

继续阅读