https://linen.dev logo
カスタムボタンについて
# forum
l
カスタムボタンでの不動の面の描画切り替えは 上手く行っているのですが、 空調や、ワイパーなどの回転するものオンオフ切り替えがうまく行きません。 自分でも考えてみたのですが、未熟なため詳しく分かりませんでした。どなたかご教授頂けたら幸いです。
p
カスタムボタンの変更の感知よりも、動きのあるもののスクリプトの組み方が分からないって感じですかね、 ともあれ、どういうスクリプトを書いているのか分からないとなんとも言えないので、見せて欲しいです。
l
返信ありがとうございます。 当方これから事情があり、対応が不可能なので、また後に送付させて頂きます。 申し訳ありません。
p
分かりました。話は変わりますがdataMapはご存知ですか?
l
聞いたことはありますが、分かりません。すみません。
p
基本的に動きを作るには変数を設定して値を増減させるのですが、描画毎に変数はリセットされるので保存という作業をし、次の描画時に内容を引き継ぐ必要があります。
そしてRTMにおいて内容を引き継ぐ時にdataMapを使う、といった理解でとりあえずはいいと思います。
l
位置が一回ずれるごとにdatamapを使うということですか?
p
一番直感的な方法はそうです。 ①dataMap取得 ②保存された関数の値取得 ③値に応じた動作 ④値を加減して保存 という流れを、カスタムボタンの変更を感知した時に一定時間行います。
この方法は値が変わるたびに値を保存しないといけないので、負荷が増加してしまうことに弱点があります。また、動作速度の調整が難しいです。
そこで、Date.now()というある時間からの経過時間をミリ秒で表した関数を利用します。これを書き始めた時点でのミリ秒は1703024548860です。 今ここを書き終えた時点でのミリ秒は1703024692646です。
これを引き算します。143786ミリ秒でした。これはミリ秒ですので適度な計算を加えることで秒や分などにできます。1000で割ると143なので、つまり上の文章を書き終えるまで143秒かかっていることがわかります。始めに出した数字を固定し、その時毎の今の数字から引くことで、常に変化する数字を生み出すことができるため、保存という作業を大幅に減らすことができます。
しかも簡単に秒などに変換できるため、時間を測って動作することができます。弱点は変化の度合いを変えるのが難しいことです。
動作を繰り返し行うには、増加する関数に対して割った余りを出す必要があります。たとえば360で割った余りを出した場合、余りは0〜359をループし、それをファンの角度に当てはめると回転してくれるというわけです。
ファンの回転については以前投稿したこちらに、カスタムボタンの変更の感知をつけることで実装可能です。しかし簡単な実装では動き出しが不自然に見えるかもしれません。 https://discord.com/channels/799152792518393917/799153421738967070/1060953481613168661
l
datamapに関してはどういう仕組みなのかと原理が理解ができたのですが、カスタムボタン変更を回転の切り替えへにつなげるやり方が分かりません、すみません。
p
Copy code
javascript
if(entity.getResourceState().getDataMap().getInt("Button0")) == 1){//任意のボタン(0:オフ、1:オン)
 ...(動作処理)
  fan.render(renderer);
}else{
  fan.render(renderer);
}
これが簡単な実装でおそらく動き出しが不自然になるやつです。
Copy code
javascript
var dataMap = entity.getResourceState().getDataMap();
var count = Date.now() - dataMap.getInt("setTime")
if(dataMap.getInt("Button0")) == 0){
 var par = 0;
 if(!dataMap.getBoolean("hasBeenChanged")){
  dataMap.setBoolean("hasBeenChanged", true, 0);
 }
}else{
 if(dataMap.getBoolean("hasBeenChanged"){
  dataMap.setInt("setTime", Date.now(), 0);
  dataMap.setBoolean("hasBeenChanged", false, 0);
  var par = 0
 }else{
 if(count > 100){
  var par = 1;
 }else{
  var par = count/100;
 }
 }
}
動作に関わる変数にparをかけることによって動き初めを自然にできます。
l
回転の切り替えだけでなく、違和感なく非常に綺麗に動作しました。 本当にありがとうございました。
2 Views