- UID
- 68510
- 好友
- 0
- 记录
- 0
- 日志
- 0
- 相册
- 0
- 回帖
- 19
- 主题
- 0
- 分享
- 0
- 精华
- 0
- 积分
- 15
- 阅读权限
- 1
- 注册时间
- 2016-7-10
- 在线时间
- 5 小时
- 最后登录
- 2019-1-20
新手上路
- 威望
- 0 点
- 冒险币
- 51 个
- 贡献值
- 0 点
- 好评度
- 0 点
|
发表于 2016-7-16 00:52:34
|
显示全部楼层
【授人以渔】长篇基础技术介绍——JS 脚本基础语法 [复制链接]
nil
175
帖子
19
主题
155
积分
侠客
威望17 点冒险币805 个贡献值0 点好评度0 点
原创先锋奖助人为乐奖新人进步奖
发消息
电梯直达
跳转到指定楼层 楼主
发表于 2013-3-9 17:55:54 | 只看该作者 回帖奖励
本帖最后由 nil 于 2013-3-9 18:38 编辑
什么是脚本,为什么要脚本?
冒险岛服务端的脚本是在服务端外,当服务器接受游戏发来数据时(比如登陆,升级,接任务,进入地图等)执行的一些代码,以脚本方式实现的话不会在服务端里写死,添加了游戏的可扩展性和可玩性,你也可以自己写脚本添加任务或事件
本帖隐藏的内容
js脚本是什么?
js=javascript 是个网页上通用的脚本代码 虽然叫javascript 但是和java没有太大关系,在java中倒是可以很容易调用js脚本,并把内部函数暴露给js脚本
脚本目录的结构
item
目录 里的文件是id.js 当你使用或获取 物品的会执行对应id的脚本
quest
任务 对应的id.js 接到 任务 执行任务 完成对应的任务都可能触发对应的 脚本
event
这个的文件名随意,脚本内会指定触发的时间间隔等一些触发条件
npc
点击对应npc就会触发其中的脚本
portal
一般是到达某地图,登陆服务器等触发的事件,没固定名称,会根据 enter 函数 执行触发条件
js的书写语法
完整的js教程看http://www.w3school.com.cn/js/index.asp
这里只说下基本语法,和java 较类似
大括号 是用来表示开始和结束的,一般在每个函数,if,for ,while ,switch的时候都要表明开始很结束
分号,一句话执行后都要用分号来表示这句话结束了
例子:
var status;分号,一句话结束了
function start() {
status = -1;
}大括号开始很结束
if(status==1)
{im.dispose();}
else {}大括号
switch (selection) {
case 0:
im.warp(100000000, 0);
break;
default:
break;}//大括号
//和/**/这个是注释,//表示后面到换行前的都是废话,没任何作用
/* 这里面的都是废话,包括换行 指导遇到后面那个 */
关键字介绍:
var 是申明变量,一般是是存放状态的,一般都会声明 全局变量 var status;用来 保存我是点到第几级菜单了,或者第几次点击这个npc了
例如:
var status;
function 是说这是和函数 后面添函数,一般都有固定的函数名要求,后面是一个括号,里面是参数列表,也一般是固定的,名称是随意的,但顺序是很重要的,这里的参数是你这里在这个函数内使用的,一般是服务端在接收后,把一些他知道的消息告诉你,就算没有参数,你也要来个括号
例如
function start() {
status = -1;
}
作用域介绍:
一般我这里只说函数内和函数外,你函数内的var 申明的变量,只能在这个函数里让他的值,如果你在函数外声明的,在所有函数都可以修改,查看他的值
函数调用:
脚本里的函数和变量除了你可以在这个脚本里看得到的以外其他的都是服务端已经定义好的。
函数就是一些代码的集合
比如:
function start() {
status = -1;
action(1, 0, 0);//这里,我调用了下面定义的action函数,他是有3个参数的,我这里也要写3个参数,参数可以是变量比如status或者直接是常量,1,0这些
}
function action(mode, type, selection) {}
函数的返回值:
在一个函数里你可以返回一个数给调用函数的那个东西比如x=action(1,0,0);就是把action返回值给x
如何写返回值
就是在函数体内,写 return 返回的东西; 不返回,但是要退出函数就return
比如
function action(mode, type, selection) {return 1;}//返回1这个数
注意,return 以后,这个函数后面的代码不会再执行了
常见的符号
= 赋值,就是把右边的东西,拷贝都左边
比如 status = -1;
+ - * / 数学运算加减乘除
()这个一般把一堆的东西搞成一个集合,比如函数定义和函数调用的时候,还有在for if switch while结构的时候都会出现,
还有就是像我门在四则运算里,它可以让某个算式先算
.是对类函数调用时候先指定对象,再指定 函数,
我门一般就用到cm im两个
++ 自加1相当于 x=x+1; ++在变量前还是后是有区别的,但是作为新手不用管
双引号 说明里边是字符,字符必须上双引号如x="#r Welcome"
-- 类似上面的相当于 x=x-1;
== 判断左右是否一样,如果一样就返回true,否则false ,如果是true,在判断语句中就会进到分支里
!= 判断左右是否不一样
> >= <= < 一看就知道是啥
再介绍两个逻辑运算的 || 或 &&与 高中数学中的简单 逻辑学过我们都知道 或 与是啥了 , 这两个一般只对 前面几个判断结果的 再次运算
x==1 || x==2 这个就是x是一或二
x>1&&x<5 这个就是 1<x<5
常见的控制结构:
顺序结构:
就是一条条代码用分号不停写下去,分号后面换不换行是无所谓的函数为了看起来好看点,换行是必要的
分支判断:
if判断
最常用结构 if(x==1){y=1;} //像这样,先判断 x是否为1 如果是 1 ,就y变成 1 ,
实际的话 if(cm.getJob()==1) { cm.sendSimple("是这个职业哦!");}
另外常用的是if(x==1){y=1;}else {y=2;} 这个和上面不同的是如果x不是1,那么y就要变成2
实际的话 if(cm.getJob()==1) { cm.sendSimple("是这个职业哦!");}else{ cm.sendSimple("不是这个职业哦!");}
另外还有一种 就是很多判断 ,我建议如果是对一个变量的多值判断用switch
if(x==1){y=1;}else if(x==2){y=2;} else if(x==3){y=3;}else {y=4};
switch 判断
这个就是对某一个值判断他到底是多少 1 还是 2 还是 3;或者其他
基本结构
switch(x)
{
case 1:y=1;break;//这个不用加大括号,但是结尾要加break
case 2:y=2;break;
default :y=2;break;//default 这个就是前面所有没出现的情况
}
我们来看一段实际的代码
switch (selection) {
case 0:
im.warp(100000000, 0);
break;
case 1:
im.warp(101000000, 0);
break;
case 2:
im.warp(102000000, 0);
break;
case 3:
im.warp(103000000, 0);
break;
}
这段就是先判断 selection,按照他不同的值,触发不同 事件
循环 我看一般没什么在脚本出现就不讲了
好了 看个实际的脚本讲解下
//看到没有,开始的注释
/*
脚本类型: 传送NPC
修改: 一纸离人醉丶
技术指导: 芬芬时尚潮流
*/
var status = 0; //常见的全局变量
function start() {//关于函数的 名称 被服务端调用的时机 以及形参,我会在下个帖子讲
status = -1;//函数赋值
action(1, 0, 0);//调用函数
}
function action(mode, type, selection) {
if (status == 0 && mode == 0) { //判断 与
cm.dispose(); //调用类对象的函数 cm对服务端有的函数,你把它当成已经声明的变量使用
return;//返回
}
if (mode == 1) {
status++; //加加
} else {
status--;//减减
}
if (cm.getMapId() == 180000001) {
cm.sendOk("很遗憾,您因为违反用户守则被禁止游戏活动,如有异议请联系管理员.")
cm.dispose();
}
else if (status == 0) {
var selStr = "#L0#黄金祭坛#L1#苦难之屋"; //格式文本之后将
cm.sendSimple(selStr);
} else if (status == 1) { //这个就是嵌套的if 多值判断
switch (selection) { //switch判断
case 0:
if (cm.getPlayer().getLevel() > 80) {
cm.warp(252030100);
} else { //简单的if
cm.sendOk("你的等级小于80,不能进入 请练级");
}
cm.dispose();
break; //break要记得
case 1:
if (cm.getPlayer().getLevel() > 80) {
cm.warp(252020700);
} else {
cm.sendOk("你的等级小于80,不能进入 请练级");
}
cm.dispose();
break; //可不要default
}
}
} |
|