2008年10月31日
3段階スピード切り替えHUDで羽ばたく羽スクリプトじゃよ。

前回紹介致した<3段階スピード切り替えHUDで羽ばたく羽>のデモはご覧になり申したであろうか?
天使の羽を持つキティちゃん気分にひたれそうじゃろう。(笑)
さて、先般の予告通りスクリプトを公開するでござるよ。
先ずは羽のスピードを切り替えるHUD。
HUDは4つの丸いプリムをそれぞれ<stop><slow><fast><more fast>のボタンとして縦一列に並べてリンク致したシンプルな作り。
リンクはそれら4つのプリムを順次選択致してツールメニューのリンクをクリクすればよし。
最後に選択したプリムがルートプリムになるが、このHUDではどの順番に選択してリンクしても動作に影響しないので問題ござらんよ。
4つのプリムそれぞれのコンテンツ内に下のHUD用スクリプトを入れて下され。
太文字の2箇所をそれぞれのスピードに合わせて変更するのじゃ。
リンク後に作業しておるようなら、プリムを選択するとルートプリムが編集されるゆえ、各ボタン用プリムを個別に編集するにはプリム右クリック~パイメニュー編集で表示される編集画面にある<リンク部位を編集>ラジオボタンにチェックを入れるのじゃ。
で、全部終わればチェックをはずすべし。
//HUD各ボタン,stop,slow.fast,more_fast
default{
state_entry(){
llSetText("Stop",<1, 1, 0>, 1 );//それぞれslow,fast,more_fastに変更
}
touch_start(integer total_number){
llSay(7,"stop");//それぞれslow,fast,more_fastに変更
}
}
スピード切り替えHUDの制作は以上。
次に羽じゃが、記事写真を見て下され。
羽の付け根側に赤い長方形が見えてござろう。
これは拙者が説明のためにダミーで描いたものじゃが、羽にリンクさせておる回転用のポールじゃ。
円柱を引き伸ばして羽のテクスチャを適用致した立方体(板のように薄く編集)とリンクさせおるのじゃが、これもどちらがルートでもよろしい。
しかし、下の回転スクリプトはポールの方に入れるのじゃ。
透明にしておるが、これもスクリプトに書きおるゆえプリム編集での設定は不要でござる。
回転方向が違うゆえ、右用、左用それぞれのスクリプトがあるぞよ。
で、最速時にはアバターが浮遊するのじゃが、そのスクリプトは左羽用に入れてござる。
原理はシンプル。
HUDよりllSayにて発言されしスピード或いはストップをlistenで聞き取り対応するのじゃ。
各スピードに対応した羽回転用のオリジナル関数が始めに定義されておるで御座ろう。
ポールでは0.1秒間隔のタイマーによって常にカウンターが作動しおり、カウント数字によって羽の回転角度が全てアナログ的にオリジナル関数内で設定されおる次第。
HUDの発言をlistenした時にスピードフラグhene_flagを設定いたして状態分けしおるのが見て取れよう。
それらのフラグによってタイマーが0更新されるカウントを切り替えおるのじゃ。
好みでカウント数と回転角度、タイマー間隔を変えて調整して下され。
//Pole_Hane_Left,hane_floatingアニメはこちら側のみ入れてアニメ制御
hane_slow(integer time_cnt){
integer on=hane_flag;//タイマーで呼ばれる毎に羽ストップチェック
if((time_cnt==0)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 45.0> * DEG_TO_RAD));//45初期位置
}
if((time_cnt==1)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 25.0> * DEG_TO_RAD));//53初期位置
}
if((time_cnt==2)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 10.0> * DEG_TO_RAD));//78初期位置
}
if((time_cnt==3)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));//折り返しポイント
}
if((time_cnt==4)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 10.0> * DEG_TO_RAD));//78初期位置
}
if((time_cnt==5)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 25.0> * DEG_TO_RAD));//53初期位置
}
if((time_cnt==6)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 45.0> * DEG_TO_RAD));//中間ポイント
}
if((time_cnt==7)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 65.0> * DEG_TO_RAD));//27初期位置
}
if((time_cnt==8)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 80.0> * DEG_TO_RAD));//12初期位置
}
if((time_cnt==9)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 90.0> * DEG_TO_RAD));//折り返しポイント
}
if((time_cnt==10)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 80.0> * DEG_TO_RAD));//12初期位置
}
if((time_cnt==11)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 65.0> * DEG_TO_RAD));//27初期位置
}
if((time_cnt==12)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 45.0> * DEG_TO_RAD));//45初期位置
}
}
hane_fast(integer time_cnt){
integer on=hane_flag;//タイマーで呼ばれる毎に羽ストップチェック
if((time_cnt==0)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 45.0> * DEG_TO_RAD));//45初期位置
}
if((time_cnt==1)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));//90初期位置
}
if((time_cnt==2)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 45.0> * DEG_TO_RAD));//45初期位置
}
if((time_cnt==3)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 90.0> * DEG_TO_RAD));//0.0初期位置
}
if((time_cnt==4)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 45.0> * DEG_TO_RAD));//45初期位置
}
}
//hane_more_fast
hane_more_fast(integer time_cnt){
integer on=hane_flag;//タイマーで呼ばれる毎に羽ストップチェック
if((time_cnt==0)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));//45初期位置
}
if((time_cnt==1)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 90.0> * DEG_TO_RAD));//90初期位置
}
if((time_cnt==2)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));//45初期位置
}
}
rotation rot;
float timer_tick=0.1;//タイマー作動間隔
integer hane_flag;
integer cnt;
string anim_name="hane_floating";
default{
state_entry(){
llSetAlpha(0.0,ALL_SIDES);//羽のポールは透明に
rot=llEuler2Rot(<0.0, 0.0, 45.0> * DEG_TO_RAD);//45左羽は<0.0,0.0,-45.0>
integer handle = llListen(7, "", NULL_KEY, "");
hane_flag=0;
llSetRot(rot);
llSetTimerEvent(timer_tick);
}
listen(integer channel, string name, key id, string message){
if(message=="stop"){
hane_flag=0;
//llSetTimerEvent(0.0);
llSetRot(rot);//羽ストップ初期開き状態に
llStopAnimation(anim_name);//浮遊終了
}else if(message=="slow"){//hane_flag=1 or 2 ゆっくり動き、または羽ばたき
hane_flag=1;
cnt=0;
llStopAnimation(anim_name);//浮遊終了
}else if(message=="fast"){
hane_flag=2;
cnt=0;
llStopAnimation(anim_name);//浮遊終了
}else if(message=="more_fast"){
hane_flag=3;
cnt=0;
llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);//浮遊パーミション
}
}
run_time_permissions(integer perm) {//
if(perm & PERMISSION_TRIGGER_ANIMATION){
llStartAnimation(anim_name);//浮遊スタート
}
}
timer(){
cnt++;
if(hane_flag==1){
if(cnt>=12){//概ね15度回転
cnt=0;
}
hane_slow(cnt);
}else if(hane_flag==2){
if(cnt>=4){//概ね15度回転
cnt=0;
}
hane_fast(cnt);
}else if(hane_flag==3){
if(cnt>=2){//概ね15度回転
cnt=0;
}
hane_more_fast(cnt);
}else{//stop
cnt=0;
}
}//timer
}
//Pole_Hane_Right
hane_slow(integer time_cnt){
integer on=hane_flag;//タイマーで呼ばれる毎に羽ストップチェック
if((time_cnt==0)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 315.0> * DEG_TO_RAD));//45初期位置
}
if((time_cnt==1)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 335.0> * DEG_TO_RAD));//53初期位置
}
if((time_cnt==2)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 345.0> * DEG_TO_RAD));//78初期位置
}
if((time_cnt==3)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 360.0> * DEG_TO_RAD));//折り返しポイント
}
if((time_cnt==4)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 350.0> * DEG_TO_RAD));//78初期位置
}
if((time_cnt==5)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 335.0> * DEG_TO_RAD));//53初期位置
}
if((time_cnt==6)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 315.0> * DEG_TO_RAD));//中間ポイント
}
if((time_cnt==7)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 295.0> * DEG_TO_RAD));//27初期位置
}
if((time_cnt==8)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 280.0> * DEG_TO_RAD));//12初期位置
}
if((time_cnt==9)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 270.0> * DEG_TO_RAD));//折り返しポイント
}
if((time_cnt==10)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 280.0> * DEG_TO_RAD));//12初期位置
}
if((time_cnt==11)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 295.0> * DEG_TO_RAD));//27初期位置
}
if((time_cnt==12)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 315.0> * DEG_TO_RAD));//45初期位置
}
}
//反対側羽
hane_fast(integer time_cnt){
integer on=hane_flag;//タイマーで呼ばれる毎に羽ストップチェック
if((time_cnt==0)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 315.0> * DEG_TO_RAD));//45初期位置
}
if((time_cnt==1)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));//90初期位置
}
if((time_cnt==2)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 315.0> * DEG_TO_RAD));//45初期位置
}
if((time_cnt==3)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 270.0> * DEG_TO_RAD));//0.0初期位置
}
if((time_cnt==4)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 315.0> * DEG_TO_RAD));//45初期位置
}
}
//hane_more_fast
hane_more_fast(integer time_cnt){
integer on=hane_flag;//タイマーで呼ばれる毎に羽ストップチェック
if((time_cnt==0)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));//45初期位置
}
if((time_cnt==1)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 270.0> * DEG_TO_RAD));//90初期位置
}
if((time_cnt==2)&&(on!=0)){
llSetRot(llEuler2Rot(<0.0, 0.0, 0.0> * DEG_TO_RAD));//45初期位置
}
}
rotation rot;
float timer_tick=0.1;//タイマー作動間隔
integer hane_flag;
integer cnt;
default{
state_entry(){
llSetAlpha(0.0,ALL_SIDES);//羽のポールは透明に
rot=llEuler2Rot(<0.0, 0.0, -60.0> * DEG_TO_RAD);//左羽は<0.0,0.0,-45.0>
integer handle = llListen(7, "", NULL_KEY, "");
hane_flag=0;
llSetRot(rot);
llSetTimerEvent(timer_tick);
}
listen(integer channel, string name, key id, string message){
if(message=="stop"){
hane_flag=0;
//llSetTimerEvent(0.0);
llSetRot(rot);//羽ストップ初期開き状態に
}else if(message=="slow"){//hane_flag=1 or 2 ゆっくり動き、または羽ばたき
hane_flag=1;
cnt=0;
}else if(message=="fast"){
hane_flag=2;
cnt=0;
}else if(message=="more_fast"){
hane_flag=3;
cnt=0;
}
}
timer(){
cnt++;
if(hane_flag==1){
if(cnt>=12){//概ね15度回転
cnt=0;
}
hane_slow(cnt);
}else if(hane_flag==2){
if(cnt>=4){//概ね15度回転
cnt=0;
}
hane_fast(cnt);
}else if(hane_flag==3){
if(cnt>=2){//概ね15度回転
cnt=0;
}
hane_more_fast(cnt);
}else{//stop
cnt=0;
}
}//timer
}
この記事へのトラックバックURL
近くに同じものを装備している人がいると、一緒に動いてしまいませんか?








