ソラマメブログ
< 2008年08>
S M T W T F S
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
アクセスカウンタ
オーナーへメッセージ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。 解除は→こちら
現在の読者数 4人

2007年10月06日

ハートスティック(リンデンスクリプト Tips)

 今日は、お遊びグッズを作ってみました。
指定した相手に対してハートのパーティクルを飛ばすスティックです。
飛ばすパーティクルには、以前Tipsで紹介した、ハートスクリプトを流用しています。
スティックはこんな感じ

しかし、いかついおやじがもつとキモイ・・・

このスティックをクリックすると半径10m以内にいるアバターを検出して、
名前をダイアログに表示します。


名前を選択すると、相手に対してハートのパーティクルが飛びます。
(OFFを押すとパーティクルをストップします。)
実行するとこんな感じw



(特別協力: 島娘のMewblue Luschさん。ご協力ありがとうw)


以下が、このスティックに仕込んだスクリプト内容です。

「スクリプト内容」

// INPUT CHANNEL
integer input_ch = -1;
// SENSOR RANGE(m)
float range = 10;
// SENSOR ARC FOR X
float arc = PI;


 string texname;
integer handle;
integer i;
integer counter;
list idlist;
list namelist;
key uid;


 HeartOut (string msg) {
  
       if (msg=="ON") {
               llParticleSystem([
               PSYS_SRC_TEXTURE , texname
               ,PSYS_PART_START_ALPHA ,1.0         
               ,PSYS_PART_END_ALPHA , 1.0         
               ,PSYS_PART_START_SCALE ,<0.08,0.08,0.0>
               ,PSYS_PART_END_SCALE ,<0.08,0.08,0.0>
               ,PSYS_SRC_BURST_SPEED_MIN ,0.2
               ,PSYS_SRC_BURST_SPEED_MAX ,0.2
               ,PSYS_PART_MAX_AGE ,3.0                 
               ,PSYS_SRC_MAX_AGE,0.0   
               ,PSYS_SRC_ACCEL ,<0,0,0>           
               ,PSYS_SRC_PATTERN , PSYS_SRC_PATTERN_EXPLODE
               ,PSYS_SRC_ANGLE_BEGIN , PI_BY_TWO
               ,PSYS_SRC_ANGLE_END , PI_BY_TWO             
               ,PSYS_SRC_BURST_PART_COUNT , 1
               ,PSYS_SRC_BURST_RADIUS , 0.0
               ,PSYS_SRC_BURST_RATE , 0.9
               ,PSYS_SRC_TARGET_KEY, uid               
               ,PSYS_PART_FLAGS , (0
                       | PSYS_PART_EMISSIVE_MASK
                       | PSYS_PART_INTERP_SCALE_MASK
                       | PSYS_PART_TARGET_POS_MASK
                 )
               ]);
       } else if (msg=="OFF") {
               llParticleSystem([]);
       }
}



 default {
       
       state_entry(){
               llSetTimerEvent(0.0);
               HeartOut("OFF");
       }


        on_rez(integer param){
               llResetScript();
       }


        touch_start(integer t) {
               if (llDetectedKey(0)==llGetOwner()) {
                       idlist=[];
                       namelist=[];
               handle = llListen(input_ch, "", llGetOwner(), "");
                       llSensor("","",AGENT,range,arc);
               }
       }
       
       // Sensor handler
       sensor(integer total_number) {
               for (i = 0; i < total_number; i++) {
                       if (i<11) {
                                       idlist+=llDetectedKey(i);
                                       namelist+=llDetectedName(i);
                       }
               }
               namelist+="OFF";
               llDialog(llGetOwner(), "PLEASE SELECT AVATORS", namelist, input_ch);
               llSensorRemove();
       }


          // listen handler
       listen(integer ch, string name, key id, string message) {
               if (message=="OFF") {
                       llSetTimerEvent(0.0);
                       HeartOut("OFF");
               } else {
                       integer findIndex = llListFindList(namelist, [message]);
                       if (findIndex != -1) { 
                               uid = llList2Key(idlist,findIndex);
                               // particle start
                               llSetTimerEvent(0.5);
                               
                       }
               }
               llListenRemove(handle);
       }
       
       // timer Event
       timer(){
               counter ++;
               if (counter == 2){
                       counter = 0;
                       texname="a1d48734-bb17-4fb3-4e5c-131bb2b73ada";
               } else if (counter == 1){
                       texname="3e887ba1-8bc6-e3e2-6d5b-8d39a03a5690";
               }
               HeartOut("ON");
       }


 }



 「スクリプトの説明」

1. llListenを使用して、チャットチャンネル-1でオーナーからの発言を待ちます。
2. llSensorを使用して、半径10m範囲に存在するアバターを検出します。
3. 検出したアバターのリストを作成し、ダイアログとして表示します。
4. ダイアログ上のアバター名をクリックすると、チャットチャンネル-1を通して
     アバター名を発信します。
5. アバター名の発言をlistenイベントで検出すると、llParticleSystemの
  PSYS_SRC_TARGET_KEYを使用して、アバターに対してパーティクルを
  飛ばします。


リンデンスクリプト Tips Intexへ


この記事へのトラックバックURL