> 神唱K歌 > 【由我脚本学习】用小键盘控制物体移动

【由我脚本学习】用小键盘控制物体移动

前两天,脚本群里有同学想做一个脚本,用小键盘控制物体飞起来。这想法相当有意思啊,uworld有支持这种功能。如果扩展出去可以有很多好玩的玩法哦,比如现在线上的家具——钢琴,就可以用小键盘自己弹音乐~
这里写了一个小键盘控制物体前后左右移动的脚本,介绍下小键盘响应的基本结构:(对了,感谢“提供员”同学,不知道你最后让汽车飞起来没?)

MyTable =
{
EntryInfo = {ONLOADED, "state1"};
StateList = {"state1"};
state1 =
{
Timer = 1000, --每1秒加载一次后文的OnTimer(args)函数。
TimeOut = -1,
NextState = "nil",
EventList = {ONKEYINPUT};--事件列表,ONKEYINPUT即对小键盘按键做出响应。
};
}
function MyTable.state1.OnEnter(args)
id=uGetItemId();--获得物品ID
pos=uGetItemPos(id);--获得物品初始位置。
end
function MyTable.state1.OnExit(args)
end

function MyTable.state1.OnTimer(args)--每1秒加载一次此函数
uSetPlayerEvent(uGetItemOwnerId(id),0); --当有小键盘输入时,触发function MyTable.state1.OnKeyInput(args)函数。
end

function MyTable.state1.OnKeyInput(args)
if args.key==KC_NUMPAD4 then--用args.key接收按键,判断按键是不是小键盘5。若按下小键盘5,则执行下面语句。
local pos1=uGetItemPos(id);--获得物品此时的坐标。
local pos2 = G3D.Vector3:new(pos1.x+2,pos1.y,pos1.z);--设定新坐标,在原坐标的X上+2米。
uMoveItemTo(uGetItemId(),pos2);--瞬间移动物体到新坐标点。
elseif args.key==KC_NUMPAD6 then --若按下小键盘6,则执行下面语句。
--uPrintf("6")
local pos1=uGetItemPos(id);
local pos2 = G3D.Vector3:new(pos1.x-2,pos1.y,pos1.z);
uMoveItemTo(uGetItemId(),pos2);
elseif args.key==KC_NUMPAD2 then --若按下小键盘2,则执行下面语句。
local pos1=uGetItemPos(id);
local pos2 = G3D.Vector3:new(pos1.x,pos1.y-2,pos1.z);
uMoveItemTo(uGetItemId(),pos2);
elseif args.key==KC_NUMPAD8 then --若按下小键盘8,则执行下面语句。
local pos1=uGetItemPos(id);
local pos2 = G3D.Vector3:new(pos1.x,pos1.y+2,pos1.z);
uMoveItemTo(uGetItemId(),pos2);
elseif args.key==KC_NUMPAD5 then --若按下小键盘5,则执行下面语句。
uMoveItemTo(uGetItemId(),pos);--移动物体到初始坐标。
end
end

此脚本逻辑很简单,介绍下关键API:
uSetPlayerEvent
此API目前只用于触发键盘响应事件。角色身上共有0-7八个事件槽,此API将脚本所在物体绑定至对应人物的指定事件槽。当某人物触发小键盘数字键后,如物体关心键盘触发事件且已和该人物事件槽绑定,则物体会收到小键盘消息。未进行绑定的物体不受人物小键盘数字键的操作。
Eg:
(1) uSetPlayerEvent(uGetToucherId(),0);
--设置触发脚本角色第0号事件槽与脚本绑定物体的“ONKEYINPUT”事件绑定,绑定情况下,用户可以通过小键盘“1-9”数字键触发该脚本MyTable.state1.OnKeyInput(args)函数。
(2) uSetPlayerEvent(uGetToucherId(),0,0, uGetItemId());
--接除触发脚本角色第0号事件槽与脚本绑定物体的 “ONKEYINPUT”事件绑定。