(Feekood语言介绍与习)
http://www.wooyoogame.com/doc/index(学习)
http://www.wooyoogame.com(首页)
http://www.feekood.com/ (开发页面)
——————————
在前面的阶段实现了:3D地图、2D地图、视角控制、创建炮塔、创建怪物、怪物移动、怪物连续刷新等功能。下面也是最后的一个阶段:炮塔攻击、怪物死亡、信息展示这3个方面的介绍。
❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤
今天来介绍3D炮塔能攻击了:
修改原“TurretMesh.ais”脚本
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);