セカCHU☆

SecondLifeのこと

チョコパイ作成 その3

2010年02月24日 02時57分54秒 | セカンドライフのすくりぷと
モノを投げるscriptはイロイロあるけど、ちょっと違った味付けが出来たかなぁって思います
甘くてちょっときちゃないパイ投げを、召し上がれ

pie-puff
pie-scratch

持つパイscriptここから
//臨時objectを打ち出すscriptです
//最初はゆっくり、時間が経つにつれてどんどん早く力が

float pow = 0;  //投げる力の初期値
float charge = 0.1;  //投げる力の現在値
float CHARGEINIT = 0.02; //溜める基本値の初期値(時間毎に増えます)
float POWMAX = 30;  //投げる力の最大値
float REZPOS = 0.5;  //Rezする地点の自分からの距離

rotation getPieRot(){
  //パイのクリーム地を前にして投げるために、回転角度を調整します
  //回転値を返します
  rotation rot = llEuler2Rot(<90,0,0> * DEG_TO_RAD);
  rot = rot * llEuler2Rot(<0,0,90> * DEG_TO_RAD);
  rot = rot * llGetRot();
  return rot;
}

throw(float power){
  //投げる部分をまとめて、コメントしやすいようにしてます
  vector relVec = llGetPos();  //投げ始める位置(方向含みます)
  rotation relRot = llGetRot(); //投げる方向(向いてる方向)
  vector fceVec = llRot2Fwd(relRot);  //投げる力の方向・大きさ

  llStartAnimation("pie-throw");
  llSleep(0.1);
  llSetTexture(TEXTURE_TRANSPARENT,0);

  relVec += fceVec;
  relVec.z += 0.7;    //投げ始める位置をちょこっと高くします
  fceVec *= power; //溜めた力を合成します
  llRezObject("throwing chocolate pie",relVec,fceVec,getPieRot(),0);
  llSleep(1);
  llStopAnimation("pie-throw");
  llSetTexture("pie-texture",0);
}

default
{
  state_entry()
  {
    llRequestPermissions(llGetOwner(),
      PERMISSION_TRIGGER_ANIMATION
    | PERMISSION_TAKE_CONTROLS);
  }

//装着した時の処理:パーミッションの取得
  attach(key uuid_av)
  {
    if(uuid_av != NULL_KEY){
      llOwnerSay("get mouselook & throwing pie!");
      llRequestPermissions(llGetOwner(),
        PERMISSION_TRIGGER_ANIMATION
      | PERMISSION_TAKE_CONTROLS);
    } else {
      llOwnerSay("CU~.");
    }
  }

//パーミッション取得処理
  run_time_permissions(integer perm)
  {
    if(perm & PERMISSION_TRIGGER_ANIMATION){
      llStartAnimation("pie-hold");
    }
    if(perm & PERMISSION_TAKE_CONTROLS){
      llTakeControls(CONTROL_ML_LBUTTON,TRUE,FALSE);
    }
  }

//コントロール処理
  control(key uuid2, integer held, integer edge)
  {
    if (held & CONTROL_ML_LBUTTON){
    //左ボタンを押し続けてる間の処理
      //ぐるぐるアニメスタート
      if(pow==0){
        llStartAnimation("pie-charge");
        llLoopSound("cartoon185SL",1);
      }
      //ちからを溜めるよ
      pow += charge;
      charge += CHARGEINIT;  //次に溜めるちからの値は、少しだけ多く
      if(pow > POWMAX){ pow = POWMAX;}  //最大値以上は溜めません
    } else if (edge & CONTROL_ML_LBUTTON){
      //左ボタンを離した時の処理
      //ぐるぐるアニメストップ
      llStopAnimation("pie-charge");
      llStopSound();
      throw(pow);  //投げる処理と投げアニメ
      pow = 0;
      charge = CHARGEINIT;
    }
  }
}
ここまで

臨時objectの投げるパイscriptは、ここから
// クリーム跡をしっかり表示します。
// 30秒間テクスチャをその場所に表示
put_cream(){
  string texture = "pie-scratch";//テクスチャ名
  llParticleSystem(
  [PSYS_PART_FLAGS , ( 0 |
   PSYS_PART_EMISSIVE_MASK |
   PSYS_PART_INTERP_COLOR_MASK |
   PSYS_PART_INTERP_SCALE_MASK
   )
  ,PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE
  ,PSYS_PART_START_ALPHA, 1.0
  ,PSYS_PART_END_ALPHA, 1.0
  ,PSYS_PART_START_COLOR, <1,1,1>//色
  ,PSYS_PART_END_COLOR, <1,1,1>//色
  ,PSYS_PART_START_SCALE, <0.7,1.4,0.7>//大きさ 最大4x4x4
  ,PSYS_PART_END_SCALE, <0.7,1.4,0.7>//大きさ 最大4x4x4
  ,PSYS_SRC_MAX_AGE, 0.5
  ,PSYS_PART_MAX_AGE, 30.0
  ,PSYS_SRC_ACCEL, <0.0, 0.0, 0.0>
  ,PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>
  ,PSYS_SRC_ANGLE_BEGIN, PI
  ,PSYS_SRC_ANGLE_END, 0*DEG_TO_RAD
  ,PSYS_SRC_BURST_PART_COUNT, 1
  ,PSYS_SRC_BURST_RATE, 1.0
  ,PSYS_SRC_BURST_SPEED_MIN, 0.0
  ,PSYS_SRC_BURST_SPEED_MAX, 0.0
  ,PSYS_SRC_TEXTURE,texture
  ]);
}
// クリーム跡をちょっと表示します。
// べちゃっとした感じに
scatter_cream(){
  string texture = "pie-puff";//テクスチャ名
  llParticleSystem(
  [PSYS_PART_FLAGS , ( 0 |
   PSYS_PART_EMISSIVE_MASK |
   PSYS_PART_INTERP_COLOR_MASK |
   PSYS_PART_INTERP_SCALE_MASK
   )
  ,PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE
  ,PSYS_PART_START_ALPHA, 1.0
  ,PSYS_PART_END_ALPHA, 1.0
  ,PSYS_PART_START_COLOR, <1,1,1>//色
  ,PSYS_PART_END_COLOR, <1,1,1>//色
  ,PSYS_PART_START_SCALE, <0.4,0.4,0.4>//大きさ 最大4x4x4
  ,PSYS_PART_END_SCALE, <0.7,0.7,0.7>//大きさ 最大4x4x4
  ,PSYS_SRC_MAX_AGE, 0.5
  ,PSYS_PART_MAX_AGE, 3.0
  ,PSYS_SRC_ACCEL, <0.0, 0.0, 0.0>
  ,PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>
  ,PSYS_SRC_ANGLE_BEGIN, PI
  ,PSYS_SRC_ANGLE_END, 0*DEG_TO_RAD
  ,PSYS_SRC_BURST_PART_COUNT, 1
  ,PSYS_SRC_BURST_RATE, 1.0
  ,PSYS_SRC_BURST_SPEED_MIN, 0.0
  ,PSYS_SRC_BURST_SPEED_MAX, 0.0
  ,PSYS_SRC_TEXTURE,texture
  ]);
}

default
{
  state_entry()
  {
    float force = llVecMag(llGetAccel());
    if(630 < force){
      llPlaySound("Rico02SL",1);
    } else {
      llPlaySound("ZipIn+",1);
    }
  }

  on_rez(integer param){
    llResetScript();
  }

  collision_start(integer col_num)
  {
    //まず一度非物理にして勢いをなくして、もう1度物理にします
    llSetStatus(STATUS_PHYSICS,FALSE);
    //衝突した時にavatarかobjectか判別します。
    //今回は地面との衝突は判定しません
    if(llDetectedType(0) & PASSIVE){
      //止まってるモノに当たった場合
      //べちょ
      put_cream();
      llPlaySound("ZipFart",1);
    } else {
      //人、動いてるモノ、動きそうなモノに当たった場合
      //べちょ
      scatter_cream();
      llPlaySound("ZipFart",1);
    }
    //重力にまかせて落っこちます
    llSetStatus(STATUS_PHYSICS,TRUE);
    //script自体を停止させます
    llSetScriptState("collision script",FALSE);
    }
}
ここまで