> 神唱K歌 > 【由我脚本学习】高级相册——左键菜单添加/删除照片

【由我脚本学习】高级相册——左键菜单添加/删除照片

新家具上线没多久,不知道各位有没有发现家里的家具(吊灯、床之类)点击有菜单弹出,可以选择开灯、休息之类的功能了。比以前酷多了吧,哈哈!
今天这个相册就来介绍一下菜单功能。需要这相册实现的功能有:点击弹出菜单,可以选择添加或者删除照片,也可以设定自动播放照片的时间。以前的那些相册啊,换个照片还要自己到脚本里面修改,真心麻烦。

脚本如下:(友情提醒一下,脚本有点大,准备一个10K球哦)
MyTable =
{
EntryInfo = {ONLOADED, "state1"};
StateList = {"state1","state2","state3","state4"};
state1 =
{
Timer = 1000, --每1秒钟执行一次OnTimer(args)函数。
TimeOut = -1,
NextState = "nil",
EventList = {ONCLIENTINPUT};
MyEventList = {"1,string1,切换时间","2,string2,添加照片","3,string3,删除照片"};--自定义左键菜单
};
state2 =
{
Timer = -1,
TimeOut = -1,
NextState = "nil",
EventList = {ONCLIENTINPUT};
};
state3 =
{
Timer = -1,
TimeOut = -1,
NextState = "nil",
EventList = {ONCLIENTINPUT};
};
state4 =
{
Timer = -1,
TimeOut = -1,
NextState = "nil",
EventList = {ONCLIENTINPUT};
};
}

----------------------------------------------进入状态1

function MyTable.state1.OnEnter(args)

counter=0;
if uGetItemProperty("时间")=="" then --如果物品没有名为“时间”的属性,那么。。。
uAddItemProperty("时间",5); --给物品添加一个名为“时间”的属性,属性值为“5”。
end
if uGetItemProperty("数量")=="" then --如果物品没有名为“数量”的属性,那么。。。
uAddItemProperty("数量",0); --给物品添加一个名为“数量”的属性,属性值为“0”。
end

temp=uGetItemProperty("数量");--获得物品的“数量”属性值,并赋值给变量temp。
if uTonumber(temp)~=0 then
a={}
for h=1,temp do
a[h]=uGetItemProperty(h) --建立储存相片地址的数组
end
b={}
for j=9,temp+8 do
b[j]=uGetItemProperty(j) --建立储存相片名称的数组
end
end

end

function MyTable.state1.string1(args) --点击左键菜单中第一个选项“切换时间”时,执行此函数。

uSendMsgBoxThree(uGetToucherId(),"时间","请设置相片切换的时间(只能从1~99选择)",""); --给点击物品的人弹出输入框,并触发下面的MyTable.state1.OnClientInput(args)函数。
end

function MyTable.state1.OnClientInput(args)
if args. m_nOptType==0 then --若用户取消输入则回到状态1。args. m_nOptType是uSendMsgBoxThree的返回值之一,具体请看帮助。
uTransState("state1");
end
if args. m_nOptType==1 then --若用户确认输入,则进行以下判断。
time_sz=args.text; --将刚刚输入的内容赋给time_sz。
time_z= uTonumber(time_sz)
if uTonumber(args.text)==nil then--若输入不合法,则。。。
uSayChannel("输入不合法,请输入一个数字")
uTransState("state1")
elseif time_z<1 or time_z>99 then --若输入超出范围,则。。。
uSayChannel("时间超出范围,请重新输入")
uTransState("state1")
else --若是其他情况,则。。。
uSetItemProperty("时间",time_sz,uGetItemId());--将用户输入信息存入物品的“时间”属性。
uSayChannel("时间设定成功。");
end
end
end

function MyTable.state1.string2(args) --点击左键菜单中第二个选项“添加照片”时,执行此函数。

temp=uGetItemProperty("数量"); --获得物品的“数量”属性值,并赋值给变量temp。
if uTonumber(temp)==8 then --将字符串变量temp转换为数值,并进行比较,如果temp值等于8,那么。。。
uSayChannel("该相册最多只能添加8张照片,已经到达最大容量无法继续添加。"); --在聊天频道中显示()中的语句。
uTransState("state1");
else
id=uGetToucherId(); --将点击物品人物的ID赋值给变量id
uTransState("state2"); --跳转到状态2。
end
end

function MyTable.state1.string3(args) --点击左键菜单中第三个选项“删除照片”时,执行此函数。
temp=uGetItemProperty("数量"); --获得物品的“数量”属性值,并赋值给变量temp。
if uTonumber(temp)==0 then
uSayChannel("相册里没有照片")
uTransState("state1");
else
id=uGetToucherId(); --将点击物品人物的ID赋值给变量id
uTransState("state4"); --跳转到状态4。
end
end

function MyTable.state1.OnTimer(args) --每秒钟执行一次此函数,用于显示照片。
temp=uGetItemProperty("数量");--获得物品的“数量”属性值,并赋值给变量temp。
g=uTonumber(temp); --将temp转换为数值,并赋值给变量g。
if g~=0 then
counter=counter+1;
time_sz=uGetItemProperty("时间");
--uPrintf(time_sz)
h=uTonumber(time_sz);
if counter==h then
counter=0;
y=uRandom(1,g); --在1到g之间取随机数。
pro=uGetItemProperty(uTonumber(y))--获得属性名为y的属性值,即储存在y名下的照片地址。
uSetItemTexture(uGetItemId(),pro);--设置物体表面贴图,即显示图片。
end
end
end

function MyTable.state1.OnExit(args)
end
----------------------------------------------进入状态2

function MyTable.state2.OnEnter(args)--状态2,添加相片地址。

uSendMsgBoxThree(id,"地址","请输入地址(注:输入的地址必须正确且存在,否则无法显示。例:uw://zero/User/3659174772821546_龙.jpg)","请把您照片的资源地址复制到这里");
end

function MyTable.state2.OnClientInput(args)
if args. m_nOptType==0then--若用户取消输入则回到状态1。args. m_nOptType是uSendMsgBoxThree的返回值之一,具体请看帮助。
uTransState("state1");
return
else
address=args.text; --将刚刚输入的内容赋给address。
temp=uGetItemProperty("数量");
temp=temp+1; --数量的属性值+1
uSetItemProperty("数量",temp); --将temp值赋给物品的“数量”属性。
uAddItemProperty(temp,address); --添加物品属性,属性名为temp(1、2…),属性值为刚刚输入的地址。
uTransState("state3");--转入状态3.
end
end

function MyTable.state2.OnExit(args)
end

---------------------------------------------------进入状态3

function MyTable.state3.OnEnter(args)--状态3,添加相片名称,

uSendMsgBoxThree(id,"地址","请输入这张相片的名称。","请注意:照片必须命名,并且命名后将无法修改。");
end

function MyTable.state3.OnClientInput(args)
if args. m_nOptType==0 then --若用户取消输入则回到状态1。args. m_nOptType是uSendMsgBoxThree的返回值之一,具体请看帮助。
uSayChannel("照片添加失败,必须给添加的照片命名");
uDeleteItemProperty(temp,uGetItemId()); --删除刚刚输入的地址。
temp=temp-1;
uSetItemProperty("数量",temp);--重新设置属性值。
uTransState("state1");
else
name=args.text; --将刚刚输入的内容赋给name。
ntemp=temp+8
uAddItemProperty(ntemp,name); --添加物品属性,属性名为ntemp(9、10…),属性值为刚刚输入的名称。
uSayChannel("照片添加成功。");
uTransState("state1");
end
end

function MyTable.state3.OnExit(args)
end

-----------------------------------------------------进入状态4

function MyTable.state4.OnEnter(args) --状态4,删除照片。
temp=uGetItemProperty("数量");
s=uConcat(b,",",9,temp+8); --将数组b中“9到temp+8”位置的元素,用“,”连接成字符串,并赋值给s。(b是用所有照片的名称建立的数组,在状态1。)
uSendMsgBoxFour (id,"选择框","请选择你要删除的照片",s); --向用户弹出选择框,并触发MyTable.state4.OnClientInput(args)函数,按钮为各个照片的名字。
end

function MyTable.state4.OnClientInput(args)
dn=args. m_nOptType;
temp=uGetItemProperty("数量");
for u=1,temp+8 do
uDeleteItemProperty(u); --用for循环删除“1到temp+8”的所有属性,即所有照片地址和名称。
end
uRemove(a,dn); --删除数组a的地dn项,即玩家想要删除的照片的地址
uRemove(b,dn+8); --删除数组b的地dn+8项,即玩家想要删除的照片的名称
temp=temp-1;
uSetItemProperty("数量",temp);
for t=1,temp do
uAddItemProperty(t,a[t]); --用for循环重新添加所有物品属性,属性名为t(1、2…),属性值为照片地址。
uAddItemProperty(t+8,b[t+8]); --用for循环重新添加所有物品属性,属性名为t+8(9、10…),属性值为照片名称。
end
uSayChannel("照片删除成功")
uTransState("state1");
end

function MyTable.state4.OnExit(args)
end

-----------------------------------------------------完毕

脚本有点长,思路流程就写在回复里吧。另外想要相册又觉得自己做太麻烦的同学,可以期待一下了,目前有一批各种好玩功能的家具正在制作中,用不了多久就会上线。其中就包括功能更完善的相册、大幅壁画。
当然如果谁有好玩的家具点子,可以在任何一个脚本贴里提出来,八手鼓掌欢迎啊。

2012-7-6 18:02:36 上传

下载附件 (40.35 KB)

脚本有点长,思路流程就写在下面吧。另外想要相册又觉得自己做太麻烦的同学,可以期待一下了,目前有一批各种好玩功能的家具正在制作中,用不了多久就会上线。其中就包括功能更完善的相册、大幅壁画。
当然如果谁有好玩的家具点子,可以在任何一个脚本贴里提出来,八手鼓掌欢迎啊。

脚本有点长,思路流程就写在回复里吧。另外想要相册又觉得自己做太麻烦的同学,可以期待一下了,目前有一批各种好玩功能的家具正在制作中,用不了多久就会上线。其中就包括功能更完善的相册、大幅壁画。
当然如果谁有好玩的家具点子,可以在任何一个脚本贴里提出来,八手鼓掌欢迎啊。