(投稿前に、内容をプレビューして確認できます)

動作メソッドについて

  • mugen
  • 2017/02/18 (Sat) 21:07:57
複数のボタンを作り、どのボタンにも同じ動作を定義したいのですが、下記のプログラムでは最後のボタンしか動作しません。全てのボタンに動作が及ぶようにするにはどのような書き方をすれば可能でしょうか?


map=[|v s1 e1 s2 e2| s2+(e2-s2)*((v-s1)/(e1-s1))].
w=screen!width?. h=screen!height?.
xn=5. yn=5.
ws=ceil(w/xn). hs=ceil(h/yn).
i=0. j=0.
[i=i+1.
 [j=j+1.
  x=!(j)(1)(xn+1)(w/-2)(w/2) map. y=!(i)(1)(yn+1)(h/2)(h/-2) map.
  bt=button! create (ws)(hs) size (x)(y) position.
  bt:action=[bt! (red) paint].
 ]! (xn) repeat.
 j=0.
]! (yn) repeat.

Re: 動作メソッドについて

  • kanemune
  • 2017/02/19 (Sun) 09:31:43
失礼しました。こちらでいかがでしょう。BitArrow版と、もしかしたらJavaの最新版に入っているかもしれません。

ボタン!作る「自分!(赤)塗る」動作設定。

もし使えない場合は、次のような定義をプログラムの前のほうに入れてください。よろしくお願いします。

ボタン:動作設定=「|b| 自分:動作=b」。

Re: 動作メソッドについて

  • mugen
  • 2017/02/19 (Sun) 09:24:16
説明不足の質問でお手数をおかけします。
名前のないボタンで、動作が自分(ボタン)の色を塗り替えるという場合です。

//ボタン:動作=「ラベル!”a”作る」。
ボタン:動作=「ボタン!(赤)塗る」。
ボタン!作る。
ボタン!作る。


こんな感じで名前を付ければ可能なのですが。

ボタン1=ボタン!作る。
ボタン1:動作=「ボタン1!(赤)塗る」。

Re: 動作メソッドについて

  • kanemune
  • 2017/02/19 (Sun) 06:49:02
名前のないボタンでしたか。たとえばこのようなものでしょうか?

ボタン:動作=「ラベル!”a”作る」。
ボタン!作る。
ボタン!作る。

Re: 動作メソッドについて

  • mugen
  • 2017/02/19 (Sun) 06:03:54
説明が不十分で申し訳ありません。各々のボタンに名前を付ければ大丈夫なことは解っていたのですが、名前を付けなくても良い方法がないか教えていただきたかったのでした。

Re: 動作メソッドについて

  • kanemune
  • 2017/02/18 (Sat) 21:11:27
ご質問をありがとうございました。
よかったら、下記のように、その機能だけのプログラムを示していただけるとたいへん助かります。
Java版では動作しました。

ボタン:動作=「ラベル!”a”作る」。
b1=ボタン!作る。
b2=ボタン!作る。

画面クリアボタンについて

  • mugen
  • 2017/02/17 (Fri) 10:53:57
V3の実行画面に[画面クリア]ボタンがあるのですが、私のWindows環境(Win7)ではボタンを押しても画面がそのままです。これは私のWindows環境に問題があるからでしょうか?
MAC版では動作する(画面がクリアされる)ことを確認しました。

Re: 画面クリアボタンについて

  • mugen
  • 2017/02/18 (Sat) 07:39:36
「dolittle.bat」の方で実行したらクリアされました。dolittle.batの内容を見て納得しました。ありがとうございました。

Re: 画面クリアボタンについて

  • きつね
  • 2017/02/17 (Fri) 15:34:10
少し試したところ、windows版では
「dolittle.jar」ファイルを直接実行していると、私の環境でも同じ問題が発生しました。
なお、「dolittle.bat」の方でドリトルを起動している場合は、きちんと画面がクリアされています。


まずは「dolittle.bat」で実行して、同じ問題が発現するかを
確認してみてはいかがでしょうか。

Re: 画面クリアボタンについて

  • きつね
  • 2017/02/17 (Fri) 14:32:42
私のPC(Windows7 (64bit)とwindows10)では
ボタンを押したら画面がクリアされていました。
書いたプログラムや環境によるのかなぁ。。。

なお、ドリトルV3.00α1(dolittle300a1win.zip)です。
試したのは、以下のプログラムです。
・ch3paint.dtlのプログラム
・「カメ太=タートル!作る 100 歩く 図形を作る。」


情報提供まで〜。

マウスイベントの取得について

  • mugen
  • 2017/02/17 (Fri) 06:38:51
タートルとボタンではマウスのクリックイベントを取得できるようなのですが、画面とかでクリック等のイベントを検知する方法はありますでしょうか?

Re: マウスイベントの取得について

  • honda
  • 2017/02/17 (Fri) 14:05:05
タートルやボタンの無い場所でのクリックを検知することはできません。

マウスポインタに追従するようにしたタートルオブジェクトを生成し、
そのタートルにクリック時の動作を定義する、
といったことであれば、可能です。

かめた=タートル!作る ペンなし。
タッチ回数=ラベル!0 作る。
かめた:動作=「タッチ回数!増やす」。
タイマー!作る 0.05 間隔 60 時間「
かめた!(マウス!横の位置?)(マウス!縦の位置?)位置。
」実行。

タートルオブジェクトの手前に表示について

  • mugen
  • 2017/02/16 (Thu) 14:20:37
マニュアルを見ると下記のプログラムではタートルがラベルの手前に表示されるように思われるのですが、ラベルの背面に隠れてしまいます。それと「BitArrow」版では「手前に表示」が未定義になってしまいます。
ラベルの手前に表示するにはどうしたら可能でしょうか?

label! create (-100)(100) position (200)(200) size (red) paint.
turtle! create front.

Re: タートルオブジェクトの手前に表示について

  • mugen
  • 2017/02/16 (Thu) 16:28:07
> これはボタンなどがタートルや図形に隠れてしまい・・・
なるほど、そうですよね。了解しました。

Re: タートルオブジェクトの手前に表示について

  • honda
  • 2017/02/16 (Thu) 16:16:08
Bit Arrow版のドリトルでは、「手前に表示」は未実装です。
実装に関しては、検討してみます。

Re: タートルオブジェクトの手前に表示について

  • kanemune
  • 2017/02/16 (Thu) 16:10:24
マニュアルの説明が不足していたようですみません。
タートルの「手前に表示」はマニュアルに書かれているように「他のタートルや図形よりも手前に表示」になりますが、GUIオブジェクトより前に表示することはできません。
これはボタンなどがタートルや図形に隠れてしまい押せない事態を防ぐために、グラフィック関係とGUI関係のレイヤーを分けているためです。

BitArrow版については調べてみます。

timer! wait について

  • mugen
  • 2017/02/10 (Fri) 07:18:43
BitArrowでは 「時間!待つ」 が使えないのですが、下記のプログラムのようにタイマーの終了を待ってループさせたい場合、どのような書き方をすれば可能しょうか。

screen! (black) paint.
map=[|v s1 e1 s2 e2| s2+(e2-s2)*((v-s1)/(e1-s1))].

w=screen!width?. h=screen!height?.
[
xn=random(8). yn=random(8).
ws=ceil(w/xn). hs=ceil(h/yn).
s=0.7.
tile=array! create. b=array! create. m=array! create. d=array! create.
i=0. j=0.
[i=i+1.
 [j=j+1.
  x=!(j)(1)(xn+1)(w/-2)(w/2) map. y=!(i)(1)(yn+1)(h/2)(h/-2) map.
  b! (random(255)) add. m! (1) add.
  tile! (label! create (ws*s)(hs*s) size (x+(ws*(1-s)/2))(y-(hs*(1-s)/2)) position
  (white) fontcolor (12) fontsize) add.
 ]! (xn) repeat.
 j=0.
]! (yn) repeat.

t1=timer! create (0.1) interval (10) duration [

[|i|
 d! (i) (random(5)) set.
 [(b! (i) get)>=256]! then [m! (i)(-1) set] execute.
 [(b! (i) get)<=0]! then [m! (i) (+1) set] execute.
 c=((b! (i) get)+(d! (i) get)*(m! (i) get)).
 b! (i) (c) set.
 (tile! (i) get)! (color! (c)(0)(0) create) paint.
]! (xn*yn) repeat.

] execute.

t1! wait. [|i| (tile! (i) get)! hide]! (xn*yn) repeat.

]! (100) repeat.

Re: timer! wait について

  • mugen
  • 2017/02/11 (Sat) 09:15:27
動作を確認しました。ありがとうございます。

BitArrow版のほうも label!hide の実装をぜひお願いいたします。別件ですが、GUI の html のほうも実装していただけると色々と楽しいプログラムが書けます。

Re: timer! wait について

  • honda
  • 2017/02/10 (Fri) 20:01:28
動作するように調整しました。
末尾にプログラムを記載しますので、ご確認ください。

変更した点は以下の通りです。
(1)
100回の繰り返しを行っていたメインのループを、mainというブロックに変更しました。
これに伴い、main中のafter_executeの中でmainを再度実行するという再帰処理に変更しました。

(2)
確認してみたところ、label!hideはBitArrow版では未実装でした。
マニュアルには記載されていますが、誤植です。
失礼いたしました。

---------------------------------------------------------------
screen! (black) paint.
map=[|v s1 e1 s2 e2| s2+(e2-s2)*((v-s1)/(e1-s1))].

w=screen!width?. h=screen!height?.
main=[ // ..... (1)
xn=random(8). yn=random(8).
ws=ceil(w/xn). hs=ceil(h/yn).
s=0.7.
tile=array! create. b=array! create. m=array! create. d=array! create.
i=0. j=0.
[i=i+1.
[j=j+1.
x=!(j)(1)(xn+1)(w/-2)(w/2) map. y=!(i)(1)(yn+1)(h/2)(h/-2) map.
b! (random(255)) add. m! (1) add.
tile! (label! create (ws*s)(hs*s) size (x+(ws*(1-s)/2))(y-(hs*(1-s)/2)) position
(white) fontcolor (12) fontsize) add.
]! (xn) repeat.
j=0.
]! (yn) repeat.

t1=timer! create (0.1) interval (10) duration [

[|i|
d! (i) (random(5)) set.
[(b! (i) get)>=256]! then [m! (i)(-1) set] execute.
[(b! (i) get)<=0]! then [m! (i) (+1) set] execute.
c=((b! (i) get)+(d! (i) get)*(m! (i) get)).
b! (i) (c) set.
(tile! (i) get)! (color! (c)(0)(0) create) paint.
]! (xn*yn) repeat.

] execute.
t1![
[|i|(tile! (i) get)!(black)paint]! (xn*yn) repeat. // ...... (2)
main!execute.
]after_execute.
]. // ..... (1)
main!execute.// ..... (1)
---------------------------------------------------------------

Re: timer! wait について

  • mugen
  • 2017/02/10 (Fri) 17:31:24
私もこの方法を試してみたのですが、waitせず、上手く動作しませんでした。

Re: timer! wait について

  • kanemune
  • 2017/02/10 (Fri) 08:20:57
タイマーの「最後に実行」を使ってみてはいかがでしょう。
BitArrow版と、Java版(V3)からの機能です。

時計=タイマー!作る。
時計!「A」実行。 // Aを繰り返し実行
時計!「B」実行。 // Aの繰り返し実行が終わったらBを繰り返し実行
時計!「C」最後に実行。 // Bの繰り返し実行が終わったらCを1回だけ実行


(修正前)
t1! wait. [|i| (tile! (i) get)! hide]! (xn*yn) repeat.

(修正後)
t1![ [|i| (tile! (i) get)! hide]! (xn*yn) repeat. ] after_execute.

GUI部品のhtml利用について(BitArrow版)

  • mugen
  • 2017/02/08 (Wed) 09:53:40
BitArrow版で下記を実行すると文字列そのものが表示されてしまいます。

ラベル!"<html><body>あいうえおかきくけこさしすせそ<br></body></html>" 作る。

マニュアルを見ると、BitArrow版でもhtmlを記述できるようです。V3では正しくhtml表示になります。

Re: GUI部品のhtml利用について(BitArrow版)

  • mugen
  • 2017/02/10 (Fri) 07:45:01
よろしくお願いいたします。

Re: GUI部品のhtml利用について(BitArrow版)

  • kanemune
  • 2017/02/10 (Fri) 01:02:40
ご質問ありがとうございます。
マニュアルの誤植かもしれませんね。実現する方法があるか確認してみます。

無題

  • mw
  • 2017/02/08 (Wed) 12:51:36
入力した回数分だけ、亀が(0,0)を中心に円を描くフィールドの作成方法を教えてください

Re: 無題

  • kanemune
  • 2017/02/10 (Fri) 01:04:08
ご質問ありがとうございます。
タートルのいる位置を中心に半径rの円を描く「中心円」というプログラムは以下のようになります。ご参考になれば幸いです。

かめた=タートル!作る。
かめた:中心円=「|r| 自分!ペンなし 90 右回り (r)歩く 90 左回り ペンあり。「自分!(0.01745*r)歩く 1 左回り」!360 繰り返す。自分!ペンなし 90 左回り (r)歩く 90 右回り ペンあり」。
かめた!100 中心円。

無題

  • ゆうき
  • 2017/01/23 (Mon) 13:48:25
作っていただいたサンプルプログラムを参考に
kinex!(システム:ipaddress)connect。
タイマー!作る 1 回数 「」実行 待つ。
システム!"arduino"使う。
a=arduino!作る。
a!(システム!シリアルポート選択)ひらけごま。
sw11=a!8 デジタル出力。
sw12=a!6 デジタル出力。
sw13=a!10 デジタル出力。
sw14=a!5 デジタル出力。


 ret=kinex !get。
 「ret!=undef」!なら「 
  「((ret:wristleft_y)-(ret:wristright_y))>20」!なら「
    sw11! 1 書く。
    sw13! 0 書く。
  」そうでなければ「((ret:wristright_y)-(ret:wristleft_y))>20」なら「
    sw11! 0 書く。
    sw13! 1 書く。
  」そうでなければ「((ret:wristright_y)>(ret:head))」なら「
    sw11! 0 書く。
    sw13! 0 書く。
」そうでなければ「((ret:wristleft_y)>(ret:head))」なら「
sw11! 1 書く。
sw13! 1 書く。
」そうでなければ「((ret:wristleft_y)<(ret:hipcenter))」なら「
sw12! 1 書く。
sw14! 1 書く。
  」実行。
 」実行。  
 arduino! 1 待つ。
 
」! 1000 繰り返す。

a! とじろごま。
というプログラムを作ったのですがモーターが動きませんでした。
また、サンプルプログラムを実行してみたところ前進し続けてしまいました。

Re: 無題

  • ゆうき
  • 2017/01/26 (Thu) 23:19:14
無事、動きました!

Re: 無題

  • honda
  • 2017/01/25 (Wed) 20:00:42
こちら側で実際にプログラムを動かして試してみました。
Arduinoの環境は再現できないので、テスト用のラベルを作って、Kinect単体でのテストを行っています。

書き込み内容の末尾に2種類のプログラム(AとB)を載せています。
プログラムBの方はそちらの環境で実際にArduinoと接続して試してみていただけますか?
開発の際にはプログラムAのように、ラベル等を用いて正しく条件式にマッチできているかをテストしてみると良いと思います。
(Arduinoと組み合わせる前に、Kinect単体でテストを行う)

認識できていなければ、出力用ラベルに”認識できませんでした”と出力されるようにしました。
また、繰り返し処理が終わり次第、出力用ラベルに”実行が終了しました”と出力されるようにしました。

条件式の変更点としては、以下の4点です。
・ret:headを、ret:head_yにしました
・ret:hipcenterを、ret:hipcenter_yにしました
・((ret:wristleft_y)-(ret:wristright_y))>20という条件式を
 ((ret:wristleft_sy)-(ret:wristright_sy))>30に変更しました
・((ret:wristright_y)-(ret:wristleft_y))>20という条件式を
 ((ret:wristright_sy)-(ret:wristleft_sy))>30に変更しました
最後の2点ですが、ラベルを用いてret:wristright_yやret:wristleft_yの値を確認してみたところ、取れる値が−1〜1.5程度と非常に少ない値でした。そのため、ret:wristright_sy、ret:wristleft_syに変更しました。syにした場合は、端的に言うと取得できる値が大きくなると思って下さい。

A) テスト用プログラム-------------------
kinex!(システム:ipaddress)connect。
タイマー!作る 1 回数 「」実行 待つ。
出力=ラベル!”出力用”作る。


ret=kinex !get。
「ret!=undef」!なら「
「((ret:wristleft_sy)-(ret:wristright_sy))>30」!なら「
出力!”モードA”書く。
」そうでなければ「((ret:wristright_sy)-(ret:wristleft_sy))>30」なら「
出力!”モードB”書く。
」そうでなければ「((ret:wristright_y)>(ret:head_y))」なら「
出力!”モードC”書く。
」そうでなければ「((ret:wristleft_y)>(ret:head_y))」なら「
出力!”モードD”書く。
」そうでなければ「((ret:wristleft_y)<(ret:hipcenter_y))」なら「
出力!”モードE”書く。
」実行。
」そうでなければ「
出力!”認識できていません”書く。
」実行。
//arduino!1 待つ。の代わりです
タイマー!作る 1 回数 0.01 間隔 「」 実行 待つ。
」! 100000 繰り返す。
-----------------------------------------

B) Arduinoと組み合わせたプログラム-----
kinex!(システム:ipaddress)connect。
タイマー!作る 1 回数 「」実行 待つ。
システム!"arduino"使う。
a=arduino!作る。
a!(システム!シリアルポート選択)ひらけごま。
sw11=a!8 デジタル出力。
sw12=a!6 デジタル出力。
sw13=a!10 デジタル出力。
sw14=a!5 デジタル出力。
出力=ラベル!”出力用”作る。


ret=kinex !get。
「ret!=undef」!なら「
「((ret:wristleft_sy)-(ret:wristright_sy))>30」!なら「
出力!”モードA”書く。
sw11! 1 書く。
     sw13! 0 書く。
」そうでなければ「((ret:wristright_sy)-(ret:wristleft_sy))>30」なら「
出力!”モードB”書く。
sw11! 0 書く。
     sw13! 1 書く。
」そうでなければ「((ret:wristright_y)>(ret:head_y))」なら「
出力!”モードC”書く。
sw11! 0 書く。
    sw13! 0 書く。
」そうでなければ「((ret:wristleft_y)>(ret:head_y))」なら「
出力!”モードD”書く。
sw11! 1 書く。
sw13! 1 書く。
」そうでなければ「((ret:wristleft_y)<(ret:hipcenter_y))」なら「
出力!”モードE”書く。
sw12! 1 書く。
sw14! 1 書く。
」実行。
」そうでなければ「
出力!”認識できていません”書く。
」実行。
arduino! 1 待つ。
」! 100000 繰り返す。

a! とじろごま。
-----------------------------------------

Re: 無題

  • ゆうき
  • 2017/01/24 (Tue) 15:32:34
前進をさせているところを右回りの命令に変えてみたところ右回りの動きをしたのでKinectからのデータを読み取れていないのではないかと思ったのですが改善策はありませんか。

音楽機能で出力されるMIDIメッセージについて

  • mugen
  • 2017/01/22 (Sun) 16:35:48
メロディ!演奏。で出力されるMIDIメッセージをモニタリングしてみると、NoteOnメッセージの後にCC#127(Poly Operation)というコントロールチェンジメッセージが出力されているのですが、これは機能上必要な実装でしょうか?

Re: 音楽機能で出力されるMIDIメッセージについて

  • mugen
  • 2017/01/26 (Thu) 17:36:43
CC#127が出力されているため正しく動作しないMIDI音源があります。可能であれば次のバージョンで外していただくことは可能でしょうか?

Re: 音楽機能で出力されるMIDIメッセージについて

  • kanemune
  • 2017/01/23 (Mon) 14:37:13
以前のことで詳細は不明ですが、おそらく意図して出しているものではないと思います。

Bit Arrow の "文字列"! 実行 について

  • mugen
  • 2017/01/20 (Fri) 09:35:23
"かめた=タートル!作る 100歩 歩く。" ! 実行。

上記のような記述が「実行 is not a function」というエラーになります。
Bit Arrow では "文字列"!実行 の構文は使えませんか?

Re: Bit Arrow の

  • honda
  • 2017/01/23 (Mon) 02:19:02
ご意見をいただき、ありがとうございます。
検討させていただきます。

Re: Bit Arrow の

  • mugen
  • 2017/01/22 (Sun) 16:10:38
マニュアル(BitArrow版)の文字列のろころを見ると使用できそうに思えるので、修正等をお願いします。
"文字列"!実行。はとても便利な機能なので、可能であれば是非とも実装してください。

Re: Bit Arrow の

  • honda
  • 2017/01/20 (Fri) 17:22:07
申し訳ありません。
現在Bit Arrow版ドリトルでは、
"文字列"!実行。というプログラムは使用できません。