|
写在前面:
在看这个帖子之前,我建议你先在资源商店上下载白嫖MOD体验一下,有助于加深理解。毕竟真的是白嫖
然后,这不是零基础教学,而是思路分享。如果你没有任何基础,我建议你先自己做一个MOD。如果您是高手,我恳请您提出宝贵的建议和批评。
最后要说的点,就是在iFAction之前,我没有接触过js,我到现在还是不知道什么时候要打分号。所以这些代码效率不可能高,格式也潦草。如果你和
我的情况差不多,我的代码是没有参考价值的。
以上。
正文:
白嫖MOD,其实就是主要功能就是偷窃,在IFA中实现像刺客信条大革命开箱子或者中国式家长收红包那样的一个功能。
总结一下:靠近一个NPC有可以偷窃的提示,玩一个小游戏,从NPC的商店中获得物品。
用词可能不准确,看官理解就好。
第一步:小游戏
先做小游戏,因为小游戏能够大幅提升游戏的细节体验,除了这个MOD,其他很多功能也能用得上。就算后面失败了也是个好MOD.
我的小游戏是点击屏幕让窄框停在特定区域,因为这很简单。三个精灵,一个精灵当背景,一个精灵当判定区域,随机生成,一个精灵上
下移动,速率可调。三个精灵的x轴宽度都是一样的,然后居中。
PIao.ss = new IColor(0,191,225,155); //用drawRect 会更好
PIao.bb = new ISprite(60,10,PIao.ss);
PIao.ss = new IColor(190,190,190,165); //凑合着看吧
PIao.ll = new ISprite(60,460,PIao.ss);
PIao.ss = new IColor(84,255,159,155);
PIao.jj = new ISprite(60,20,PIao.ss);
PIao.bb.x = RV.NowProject.gameWidth/2;
PIao.bb.y = 100;
PIao.bb.z = 99999; //别忘了图层
PIao.ll.x = RV.NowProject.gameWidth/2;
PIao.ll.y = 50;
PIao.ll.z = 99997;
PIao.jj.x = RV.NowProject.gameWidth/2;
PIao.jj.y = rand(70,400);
PIao.jj.z = 99998;
更改y轴就能上下移动了
this.update = function(){
if (PIao.bb.y >= 500){
times = -1;
}else if (PIao.bb.y <= 50){
times = 1;
}
PIao.bb.y += PIao.hard * times; //难度乘方向
wait += 1;
if (IInput.down == true && wait > 30) { //等待30帧,防止玩家手贱
if (PIao.bb.y >= PIao.jj.y && PIao.bb.y <= PIao.jj.y + 20){ //判定是否在区域内
PIao.are = true;
PIao.end = true;
}else{
PIao.are = false;
PIao.end = true;
};
};
};
完事了释放就可以了
第二步:测距离
玩家和触发器的距离。最难的是找数据,不过还是顺藤摸瓜找到了LTrigger
LTrigger = function(trigger , view , mdata , blocks , mapdata)
这个trigger就是DTrigger的实例
所以我们只用这样就能读到了(为了方便)
PIao.LTrigger = LTrigger;
LTrigger = function(trigger , view , mdata , blocks , mapdata){
PIao.LTrigger.call(this, trigger , view , mdata , blocks , mapdata);
this.cof = trigger;
}
剩下的两点距离公式算就可以了,注意触发器坐标要乘上blockSize(也许角色的坐标除以blockSize才是最好的)
var max_dis = 99999;
for(i=0;i<RV.NowMap.getEvents().length;i++){ //遍历找出最近的距离和触发器
var temp_dis = Math.sqrt(Math.pow(RV.NowMap.getEvents().cof.x*RV.NowProject.blockSize-RV.NowMap.getActor().getCharacter().x, 2)+Math.pow(RV.NowMap.getEvents().cof.y*RV.NowProject.blockSize-RV.NowMap.getActor().getCharacter().y,2)); //(a**2+b**2)**0.5
if(max_dis > temp_dis){
max_dis = temp_dis;
temp_tri = RV.NowMap.getEvents();
};
};
再绘制提示
if(max_dis<20 && PIao.playing == false && PIao.can){
var cc = new IColor(255, 255, 255, 155);
PIao.white = new ISprite(RV.NowProject.gameWidth/20,RV.NowProject.gameWidth/20,cc);
PIao.white.x =RV.NowProject.gameWidth - RV.NowProject.gameWidth/6;
PIao.white.y = 20;
PIao.white.z = 99990;
PIao.playing = true;
}else{
if (PIao.playing == true){
if (max_dis >= 20 || !PIao.can){
PIao.white.dispose();
PIao.playing = false;
PIao.touch = false;
huan_chong = 0; //缓冲
};
};
};
第三步:玩家玩玩了游戏后的操作
在白嫖MOD里,操作是从商店中拿东西,你的情况不同就改。
在第二步,我们顺便拿到了离我们最近的触发器,检查它的code,读它的event.args,再对每个元素切片。然后我们就会惊奇地发现,直接上RV.GameData.addItem就行了
PIao.areDo = function(tri){
var take = [];
for(i=0;i<tri.cof.page.length;i++){
var nmml = tri.cof.page[0].events.length; //用这个变量名称是因为我当时很暴躁。。。
for(k=0;k<nmml;k++){
if (tri.cof.page.events[k].code == 601){
take.push(tri.cof.page.events[k].args[rand(0,tri.cof.page.events[k].args.length-1)]);
i = 99999;
k = 99999;
}
}
}
if(take == []){ //如果偷的触发器中没有商店
var trigger = RV.NowSet.findEventId(PIao.kong);
if(trigger != null){
trigger.doEvent();
}
}else{
for(i=0;i<take.length;i++){
var temp = take.split('|');
RV.GameData.addItem(temp[0],temp[1],1);
}
}
};
同理失败惩罚也是一样的
var trigger = RV.NowSet.findEventId(PIao.publish);
if(trigger != null){
trigger.doEvent();
}
字变绿了,复制粘贴的结果。。。
最后一步:完善功能和设计触发器
其实还有很多功能可以做,比如根据商品价值,人物等级增加或减少偷窃难度,设置不能被偷窃的NPC,可以偷窃更多的东西,甚至是友军的战利品。。。
我设置了两个触发器,一个是刷新偷窃cd (上面的代码没有,但是确实是有的),一个是弹出小游戏界面,如果胜利,则执行一个通用触发器。但其实你可以设置更多
暂时想到这么多,以后再补充
|
|