2008年11月19日
チョッパーの作り方 - 逐次解説(その2)
//-----
// File: BMW Motor.lsl
// Date Author number of nodes
// 2008/11/16 walkinglint 156
//
key agent;
vector PUSH_OFF = <0, 10, 10>;
integer gLightsOn = FALSE;
integer iChan = 0;
key owner;
vector startColor = <1, 0.5, 0.5>;
vector endColor = <1, 0, 0>;
integer onoff = TRUE;
string last_wheel_direction;
string cur_wheel_direction;
-----
変数の初期化とか
-----
default {
state_entry() {
-----
rez されると以降を実行
-----
gLightsOn = FALSE;
llMessageLinked(LINK_SET, gLightsOn, "lights_off", "");
-----
リンクされているプリムにメッセージ
-----
llSetSitText("Ride");
-----
円メニューの Sit Here を Ride に
-----
// llSitTarget(<0.18, 0.00, 0.4>, <0.0, -0.08, 0.0, 1>);
llSitTarget(<-0.3, 0.00, 0.3>, <0.0, -0.08, 0.0, 1>);
-----
座る位置と向きを設定(ここは自分用に変更した w)
-----
llSetCameraEyeOffset(<-6.0, 0.0, 3.0>);
-----
カメラの位置(オフセット)を設定
-----
llSetCameraAtOffset(<3.0, 0.0, 1.0>);
-----
カメラの向く位置(オフセット)を設定
-----
llSetVehicleFlags(-1);
llSetVehicleType(VEHICLE_TYPE_CAR);
llSetVehicleFlags(VEHICLE_FLAG_NO_DEFLECTION_UP | VEHICLE_FLAG_LIMIT_ROLL_ONLY
| VEHICLE_FLAG_LIMIT_MOTOR_UP);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.2);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.80);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 0.10);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.10);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 1.0);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.2);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.1);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.5);
llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <1000.0, 0.50, 1000.0>);
llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <10.0, 5.0, 1000.0>);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.75);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 0.25);
llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 1.0);
llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 0.01);
-----
乗り物用のパラメタを設定
-----
owner = llGetOwner();
llListen(iChan, "", owner, "");
-----
所有者のチャットを聞く
-----
}
//
// touch_start(integer num)
// {
//
//
// if(llDetectedKey(0) != llGetOwner())
// {
//
// llWhisper(0, "AKIRA bike");
//
// }
// else
// {
// if(llAvatarOnSitTarget() != llGetOwner()) llWhisper(0, "Right Click and choose 'Ride' from the pie menu.");
// }
//
// }
listen(integer chan, string name, key id, string msg) {
list command = llCSV2List(msg);
-----
, でチャットの内容を分割し command というリストに入れる
-----
// Lights
if (chan == iChan & msg == "lights on") {
gLightsOn = TRUE;
llMessageLinked(LINK_SET, gLightsOn, "lights_on", "");
}
-----
lights on とチャットされた場合 リンクしているプリムにメッセージ
-----
しかし & は && のほうが? 何か意味がある?
-----
if (chan == iChan & msg == "lights off") {
gLightsOn = FALSE;
llMessageLinked(LINK_SET, gLightsOn, "lights_off", "");
}
-----
lights off の場合も同様に
-----
// Colour presets
if (llList2String(command, 0) == "color" | llList2String(command, 0) == "colour") {
-----
, の前が color もしくは colour の場合で
-----
if (llList2String(command, 1) == "red") {
startColor = <1, 0.5, 0.5>;
endColor = <1, 0, 0>;
}
-----
, の後が red であった場合 startColor と endColor を赤なカラーリング用の色に設定
-----
if (llList2String(command, 1) == "green") {
startColor = <0.5, 1, 0.5>;
endColor = <0, 1, 0>;
}
if (llList2String(command, 1) == "blue") {
startColor = <0, 1, 1>;
endColor = <0, 0.25, 1>;
}
if (llList2String(command, 1) == "purple") {
startColor = <1, 0.5, 1>;
endColor = <1, 0, 1>;
}
if (llList2String(command, 1) == "yellow") {
startColor = <1, 1, 0.5>;
endColor = <1, 1, 0>;
}
}
// Colour via RGB values
if (llList2String(command, 0) == "rgb") {
if (llList2String(command, 1) != "") {
startColor = <1, 0.5, 0.5>;
endColor = <1, 0, 0>;
}
}
-----
, の前が rgb で , の後が 存在していた場合... ん~ これって処理端折ってないか? w
-----
}
changed(integer change) {
if (change & CHANGED_LINK) {
-----
リンクに変更があった場合
-----
key agent = llAvatarOnSitTarget();
if (agent) {
-----
アバターが座った場合
-----
if (agent != llGetOwner()) {
llSay(0, "You aren't the owner");
llUnSit(agent);
llPushObject(agent, <0, 0, 100>, ZERO_VECTOR, FALSE);
-----
所有者でなかった場合 所有者でないとメッセージを出し 降ろし 上方に 弾く
-----
} else {
llTriggerSound("bike_start", 1);
llSleep(.4);
llSetStatus(STATUS_PHYSICS | STATUS_ROTATE_X | STATUS_ROTATE_Y | STATUS_ROTATE_Z, TRUE);
llSleep(.1);
llCollisionSound("", 0);
llSetTimerEvent(0.5);
llLoopSound("bike_idle", 1);
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);
-----
所有者だった場合 開始処理
-----
}
} else {
-----
アバターが降りた場合
-----
llSetTimerEvent(0);
llStopSound();
llSetStatus(STATUS_PHYSICS | STATUS_ROTATE_X | STATUS_ROTATE_Y | STATUS_ROTATE_Z, FALSE);
llReleaseControls();
llStopAnimation("NN riding 1 4");
llPushObject(llGetOwner(), PUSH_OFF, <0, 0, 0>, TRUE);
gLightsOn = FALSE;
llMessageLinked(LINK_SET, gLightsOn, "lights_off", "");
-----
終了処理
-----
}
}
}
(続く)
Posted by walkinglint at 14:16│Comments(0)
│walking のスクリプティング講座