質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

661閲覧

テキストの描画が更新されるのを止めたい。

Kokku

総合スコア39

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2022/10/23 17:28

編集2022/10/24 15:48

前提

processingでノベルゲーム風の画面遷移のするプログラムを書いています。

実現したいこと

  • scene == "start"の時、右クリックでscene = "scene1"に
  • scene == "scene1"の時、pythonからosc通信で受け取った値によってscene == "sceneP1"もしくはscene == "sceneP2"に
  • [ ]float型 max_v_list、String型emotion_listに値を格納していき、最新の値を取得しそれにより条件分岐
  • その後scene == "scene2 →scene == "clear_scene"へ
  • scene == "sceneP1"もしくはscene == "sceneP2"の時、スペースキーを一度押すと、四角の中文章を上書きし、エンターキーを押すと画面遷移

発生している問題・エラーメッセージ

スペースキーを押し続けないと次の文章が表示されない。
一度押すと上書き更新するようにしたい。

該当のソースコード

processing

1import netP5.*; 2import oscP5.*; 3//OSCP5クラスのインスタンス 4OscP5 osc; 5String s1; 6String s2; 7String s3; 8String s4; 9String s5; 10String s6; 11String emotion; 12String scene = "start"; 13float max_v; 14ArrayList emotion_list = new ArrayList(); 15ArrayList max_v_list = new ArrayList(); 16 17 18void oscEvent(OscMessage msg){ 19 //python側から推定結果を受信して描画 20 if (msg.checkAddrPattern("/Emotion")==true){ 21 //10回繰り返す 22 for (int x = 0; x > 11; x += 1){ 23 String emo = msg.get(0).stringValue(); 24 emotion = emo; 25 emotion_list.add(emotion); 26 System.out.println(emotion_list.get(emotion_list.size() -1)); 27 float mv= msg.get(1).floatValue(); 28 max_v = mv; 29 max_v_list.add(max_v); 30 System.out.println(max_v_list.get(max_v_list.size() -1)); 31 } 32 } 33} 34 35void setup(){ 36 size(1500,1500); 37 //fullScreen(); 38 PFont font = createFont("NSimSun-48",40); 39 textFont(font); 40 //OSCの初期化 41 osc = new OscP5(this, 8000); 42} 43 44void draw(){ 45 common(); 46 //シーン遷移 47 if(scene == "start") start_scene(); 48 else if(scene == "scene1") scene_1(); 49 else if(scene == "sceneP1") Pattern1_scene(); 50 else if(scene == "sceneP2") Pattern2_scene(); 51 else if(scene == "scene2") scene2(); 52 else if(scene == "clear_scene") clear_scene(); 53} 54 55void common(){ 56 background(119,136,153); 57} 58 59void start_scene(){ 60 //スタートシーンの処理 61 fill(0); 62 text(" aaaaaaaaaaaaaaaaaaaaaaaaa", width/6, height/2); 63} 64 65void scene_1(){ 66 //遷移後(条件分岐前)の処理 67 fill(255); 68 rect(150,500,2000,900); 69 fill(0); 70 s1 = 71 "私ね、お金さえもらえるなら基本的になんでもするんだけど・・・・、\n"+ 72 "いくら積まれても二度とやりたくないって仕事がいくつかあってね。\n"+ 73 "曰く付き物件での生活。後にも先にも結局この一件だけだったんだけど・・・・、\n"+ 74 "お化け屋敷って言われてる館で一か月生活して、\n"+ 75 "それがただの噂だって事を証明してほしいっていう依頼。\n"+ 76 "そりゃあもう、凄かったよ。\n"+ 77 "外観も中身も、都会のど真ん中にあるとは到底思えなかった。\n"+ 78 "一か月とはいえこんなところに住めるんだーってわくわくしたもん。\n"+ 79 "でね。その曰く付きの内容。\n"+ 80 "その館で一家惨殺事件があって、その惨殺された一家の怨念が・・・みたいな。\n"+ 81 "まあ、よくある話。一日目はひたすら探索して回ったんだ。楽しかったよ。すっごく。\n"+ 82 "・・・・・夜までは、ね。"; 83 textAlign(LEFT,TOP);//行揃え 84 textLeading(60);//行送り(ピクセルで設定) 85 textSize(45); 86 text(s1,150,500,2000,900); 87} 88 89void emotion_branch(){ 90 //osc通信で受け取った値によっての分岐処理 91 if(scene == "scene1"){ 92 if(emotion_list.get(-1) == "Happy"){ 93 scene = "sceneP2"; 94 } 95 else if(emotion_list.get(-1) == "Neutral"){ 96 scene = "sceneP2"; 97 } 98 else if(emotion_list.get(-1) == "Surprise"){ 99 scene = "sceneP2"; 100 } 101 else if(emotion_list.get(-1) == "Sad"){ 102 scene = "sceneP2"; 103 } 104 else if(emotion_list.get(-1) == "Angry"){ 105 scene = "sceneP2"; 106 } 107 else if(emotion_list.get(-1) == "Fear"){ 108 scene ="sceneP1"; 109 } 110 else if(emotion_list.get(-1) == "Disgust"){ 111 scene = "sceneP2"; 112 } 113 } 114} 115 116void Pattern1_scene(){ 117 //条件分岐パターン1の処理 118 fill(255); 119 rect(150,500,2000,900); 120 fill(0); 121 s2 = 122 //テキストボックスに適切に表示されるか未検証 123 "寝る前に風呂に入って、鏡の前で髪を乾かしている時に、鏡を何かが横切ったんだ。\n"+ 124 "見間違いかな、って思ったんだけど、ちらちらちらちら通るんだよね。\n"+ 125 "虫か何かかなーって思って振り返っても何も居ないの。変だあって思った。\n"+ 126 "明らかに女の子の部屋だったからちょっと気が引けてたんだけど、いざ寝るときにはどうでもよくなってた。\n"+ 127 "何が起きるかなーって思ってたんだけど、その時は、嫌な夢を見ただけだったよ。\n"+ 128 "夢の中でね、今寝ているのと同じ部屋の同じベッドの上で、男に襲われてたんだ。\n"+ 129 "体が思うように動かなくて、もがいても暴れても殴られるだけで・・・・。\n"+ 130 "痛い、苦しいって、それで頭が一杯になって・・・・。"+ 131 "起きたときはいやーな汗かいてたよ。\n"+ 132 "それから一週間くらい、同じ夢を見続けた。それで、八日目くらい。\n"+ 133 "その日はご飯は食べてから帰ったんだけど、喉が渇いちゃたから帰ってすぐに台所に行ったんだよね。\n"+ 134 "そしたら、皿が全部割れてた。びっくりしたのと同時に、なんか怒りが込み上げて来てさ。\n"+ 135 "だって、もう曰くつきとか言うレベルじゃないじゃん。\n"+ 136 "ここまでのポルターガイストが起きるなら、事前に言っといてくれないと。\n"+ 137 "まあ、皿は私物でもなんでもなかったけどさ。で、怒りに任せて依頼主さんに電話したんだよ。\n"; 138 textAlign(LEFT,TOP);//行揃え 139 textLeading(60);//行送り(ピクセルで設定) 140 textSize(40); 141 text(s2,150,500,2000,900); 142} 143 144void Pattern2_scene(){ 145 //条件分岐パターン2の処理 146 fill(255); 147 rect(150,500,2000,900); 148 fill(0); 149 s4 = 150 //テキストボックスに適切に表示されるか未検証 151 "寝る前に風呂に入って、鏡の前で髪を乾かしている時に、鏡を何かが横切ったんだ。\n"+ 152 "見間違いかな、って思ったんだけど、ちらちらちらちら通るんだよね。\n"+ 153 "虫か何かかなーって思って振り返っても何も居ないの。\n"+ 154 "変だあって思ってたんだけど、いざ寝るときにはどうでもよくなってた。\n"+ 155 "何が起きるかなーって思ってたんだけど、その時は、嫌な夢を見ただけだったよ。\n"+ 156 "夢の中でね、今寝ているのと同じ部屋の同じベッドの上で、男に襲われてたんだ。\n"+ 157 "それから一週間くらい、同じ夢を見続けた。それで、八日目くらい。\n"+ 158 "その日はご飯は食べてから帰ったんだけど、喉が渇いちゃたから帰ってすぐに台所に行ったんだよね。\n"+ 159 "そしたら、皿が全部割れてた。びっくりしたのと同時に、なんか怒りが込み上げて来てさ。\n"+ 160 "だって、もう曰くつきとか言うレベルじゃないじゃん。\n"+ 161 "ここまでのポルターガイストが起きるなら、事前に言っといてくれないと。\n"+ 162 "で、怒りに任せて依頼主さんに電話したんだよ。"; 163 textAlign(LEFT,TOP);//行揃え 164 textLeading(60);//行送り(ピクセルで設定) 165 textSize(40); 166 text(s4,150,500,2000,900); 167} 168 169void scene2(){ 170 //シーン2の処理 171 fill(255); 172 rect(150,500,2000,900); 173 fill(0); 174 s6 = 175 //テキストボックスに適切に表示されるか未検証 176 "・・・と、いうわけで、私の話はこれで終わり。え?その後?\n"+ 177 "さあ・・・・。どうなったんだろうねえ。\n"+ 178 "だって、これ伝聞だし。仕事仲間から聞いた、都市伝説。怒んないでよー。\n"+ 179 "仕方ないじゃん、オカルトは好きだけど体験談なんかないんだもん。\n"+ 180 "体験談だってだましたのは悪かったけどさ。そのほうがドキドキするかなーって。\n"+ 181 "・・・・でも、さ。これがもし実話だったら・・・・、確実にどちらかは死んでいるよね。"+ 182 "私はおじいさんが真だと思うな。狂気ならいっぱい落ちてるんだし、\n"+ 183 "喉抉られたりとかしてさ。そして、殺した奴はそれを鋸とか出刃包丁とか、\n"+ 184 "そういうので刻んでコンクリートに混ぜてゴミ捨て場にうめたんじゃない?\n"+ 185 "一人じゃ出来ないから、口の堅いお友達を呼んで。証拠隠滅もお手伝いしてもらって・・・・。\n"+ 186 "ごめん、ごめん。ちょっと冗談きつかったね。"; 187 textAlign(LEFT,TOP);//行揃え 188 textLeading(60);//行送り(ピクセルで設定) 189 textSize(45); 190 text(s6,150,500,2000,900); 191} 192 193void clear_scene(){ 194 common(); 195 //終了画面の処理 196 fill(0); 197 text("aaaaaaaaaaaaaaaaaaaaaaaaa", width/3, height/2);// 表示するテキスト, x座標, y座標 198} 199 200void mousePressed(){ 201 //マウスが押されたときの処理 202 if(scene == "start")scene = "scene1"; 203} 204 205void keyPressed(){ 206 if(scene == "sceneP1"){ 207 if(key == ' '){ 208 fill(255); 209 rect(150,500,2000,900); 210 fill(0); 211 s3 = 212 //テキストボックスに適切に表示されるか未検証 213 "でも、何もっ聞き取れなかった。ノイズが煩くて。\n"+ 214 "しかも、そのノイズってただのノイズじゃなかったんだよね。\n"+ 215 "がたん、ごとん、って音がして、それから悲鳴が聞こえて。\n"+ 216 "そして一通り静かになると、依頼主さんが私を呼ぶ声がやっと聴こえてさ。\n"+ 217 "正直ほっとしたよ。おじいさんの声ってこんなに安心するものだっけ、なんて思いながらさ、\n"+ 218 "まずは謝ってから事情を説明することにしたんだ。\n"+ 219 "夢のこともポルターガイストのことも、洗いざらい全部。\n"+ 220 "そしたら・・・・、「わかった、そこでおとなしくしてるんだよ・・・・」って。\n"+ 221 "ねっとりした、凄く嫌な声だった。\n"+ 222 "息使いが気持ち悪くて、思わず携帯投げ出して尻餅ついちゃった。\n" + 223 "皿の破片の上に。でも、そんなの気になんなかった。\n"+ 224 "それよりも早く逃げなきゃって。嫌な予感っていうのかな。\n"+ 225 "でも、体が動かなかった。\n"+ 226 "しばらくすると、依頼主のおじいさんが来た。\n"+ 227 "凄く、いやな笑みを浮かべながら、手には鋭い刃物を持って。\n"+ 228 "・・・・その笑い方には見覚えがあったよ。\n"+ 229 "夢の中で、さんざん見たもの。"; 230 textAlign(LEFT,TOP);//行揃え 231 textLeading(60);//行送り(ピクセルで設定) 232 textSize(40); 233 text(s3,150,500,2000,900); 234 } 235 else if(key == ENTER){ 236 scene = "scene2"; 237 } 238 } 239 else if(scene =="sceneP2"){ 240 if(key == ' '){ 241 fill(255); 242 rect(150,500,2000,900); 243 fill(0); 244 s5 = 245 //テキストボックスに適切に表示されるか未検証 246 "でも、何もっ聞き取れなかった。ノイズが煩くて。\n"+ 247 "がたん、ごとん、って音がして。\n"+ 248 "そして一通り静かになると、依頼主さんが私を呼ぶ声がやっと聴こえてさ。\n"+ 249 "正直ほっとしたよ。おじいさんの声ってこんなに安心するものだっけ、なんて思いながらさ、\n"+ 250 "まずは謝ってから事情を説明することにしたんだ。\n"+ 251 "夢のこともポルターガイストのことも、洗いざらい全部。\n"+ 252 "そしたら・・・・、「わかった、そこでおとなしくしてるんだよ・・・・」って。\n"+ 253 "しばらくすると、依頼主のおじいさんが来た。\n"+ 254 "凄く、いやな笑みを浮かべながら、手には鋭い刃物を持って。\n"+ 255 "・・・・その笑い方には見覚えがあったよ。\n"+ 256 "夢の中で、さんざん見たもの。"; 257 textAlign(LEFT,TOP);//行揃え 258 textLeading(60);//行送り(ピクセルで設定) 259 textSize(40); 260 text(s5,150,500,2000,900); 261 } 262 else if(key == ENTER){ 263 scene = "scene2"; 264 } 265 } 266 else if(scene == "scene2"){ 267 if(key == ENTER){ 268 scene = "clear_scene"; 269 } 270 } 271} 272 273

void keyPressedの処理で文章が変わってからも更新が続けられてるため、スペースキーを押しても文章が表示されないのではないかと考えて調べてみたのですが、中々解決せず投稿させていただきました。
素人質問なのかもしれませんが何か解決方法があれば教えていただきたいです。

送信側pythonコード

python

1from deepface import DeepFace 2import cv2 3import datetime 4import schedule 5import time 6import os 7from threading import Thread 8import argparse 9from pythonosc import osc_message_builder 10from pythonosc import udp_client 11from pythonosc import osc_message 12 13 14#カメラ起動 15deviceid = 0 16capture = cv2.VideoCapture(deviceid) 17#感情推定の結果をリストに格納 18dominant_emotion = [] 19max_v = [] 20def job(): 21 #OSC通信処理 22 parser = argparse.ArgumentParser() 23 parser.add_argument("--ip", default="192.11.1.1", 24 help="The ip of the OSC server") 25 parser.add_argument("--port", type=int, default=8000, 26 help="The port the OSC server is listening on") 27 args = parser.parse_args() 28 client = udp_client.SimpleUDPClient(args.ip, args.port) 29 #カメラ起動して画像を保存 30 ret,frame = capture.read() 31 strdate = datetime.datetime.now().strftime('%Y%m%dT%H%M%S') 32 fname = f'C:/Users/shota/anaconda3/envs/shota1/images/' + strdate + ".jpg" 33 cv2.imwrite(fname,frame) 34 # 表情推定処理 and 例外処理 35 try: 36 face_analysis = DeepFace.analyze(img_path=fname) 37 dominant_emotion.append(face_analysis['dominant_emotion']) 38 max_v.append(max(face_analysis['emotion'].values())) 39 #OSC通信でfloat型の値を送信 40 msg = osc_message_builder.OscMessageBuilder(address="/Emotion") 41 #順に左側にデータが入っていくため、一番左の値を送信 42 msg.add_arg(dominant_emotion[-1]) 43 msg.add_arg(max_v[-1]) 44 msg = msg.build() 45 client.send(msg) 46 except ValueError: 47 print('ValueError') 48 pass 49 50# do job every 10 seconds 51schedule.every(1/12).minutes.do(job) 52cond = True 53 54def f(): 55 global cond 56 time.sleep(600) 57 cond = False 58 59thread = Thread(target=f) 60thread.start() 61 62while cond: 63 schedule.run_pending() 64 time.sleep(1) 65 66


良い終了方法がわからなかったので600秒で強制終了するようにしています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

scene == "start"の時、右クリックでscene = "scene1"に

mouseButtonで左右が区別できます。
mouseButton / Reference / Processing.org

scene == "scene1"の時、pythonからosc通信で受け取った値によってscene == "sceneP1"もしくはscene == "sceneP2"に

emotion_branchがどこからも呼ばれていないようですが...

scene == "sceneP1"もしくはscene == "sceneP2"の時、スペースキーを一度押すと、四角の中文章を上書きし、エンターキーを押すと画面遷移

drawは1秒間に60回呼ばれています。
シーンが変わっていない以上、sceneP1の時はPattern1_sceneの処理が走ります。
keyPressedは押したときしか走りません(押しっぱなしならオートリピートで連打状態になるとは思いますが)

キーを押したら、s2の内容自体を入れ替えるようにします。
keyPressed等のイベントでは状態の変化(sceneを変える等)だけにして、描画(recttext)はしないようにするのがおすすめです。


ほか注意点

  • ArrayList
    できればジェネリクスにしてください。
  • for (int x = 0; x > 11; x += 1) {
    符号が逆のため1回も回っていません。
  • System.out.println
    printlnだけでいいです。
  • if (scene == "start")
    文字列の比較はequalsを使用してください。
  • if(emotion_list.get(-1) == "Happy"){
    -1だとエラーになるはずですが...

単に疑問に思った点

  • //10回繰り返す
    どういう意味があるんでしょう??
    常に最後の値しか見ていませんし、増える一方な気がしますが。
  • Java
    Pythonのほうがお得意ならPythonモードもございます。

追記(雑な送信側付き)

受信側

Processing

1import oscP5.*; 2 3OscP5 osc; 4ArrayList<String> emotion_list = new ArrayList<String>(); 5String scene = "start"; 6String tmp_scene; 7 8void setup() { 9 size(1600, 900); 10 textFont(createFont("NSimSun-48", 40)); 11 osc = new OscP5(this, 8000); 12} 13 14void draw() { 15 background(119, 136, 153); 16 17 if (scene.equals("start")) start_scene(); 18 else if (scene.equals("scene1")) scene_1(); 19 else if (scene.equals("sceneP1")) Pattern1_scene(); 20 else if (scene.equals("sceneP2")) Pattern2_scene(); 21 else if (scene.equals("scene2")) scene2(); 22 else if (scene.equals("clear_scene")) clear_scene(); 23} 24 25void oscEvent(OscMessage msg) { 26 if (msg.checkAddrPattern("/Emotion")) { 27 String emotion = msg.get(0).stringValue(); 28 println(emotion); 29 30 emotion_list.add(emotion); 31 if (10 == emotion_list.size()) { 32 emotion_branch(emotion); 33 osc.stop(); // oscを止める 34 } 35 } 36} 37 38void emotion_branch(String emotion) { 39 if (scene.equals("scene1")) { 40 switch(emotion) { 41 case "Happy": 42 case "Neutral": 43 case "Surprise": 44 case "Sad": 45 case "Angry": 46 case "Disgust": 47 tmp_scene = "sceneP2"; 48 break; 49 case "Fear": 50 tmp_scene = "sceneP1"; 51 break; 52 } 53 } 54} 55 56void mouseClicked() { 57 if (scene.equals("start") && mouseButton == RIGHT) { 58 scene = "scene1"; 59 } 60} 61 62void keyPressed() { 63 if (scene.equals("scene1")) { 64 if (key == ENTER && tmp_scene != null) { 65 scene = tmp_scene; 66 } 67 } else if (scene.equals("sceneP1")) { 68 if (key == ' ') { 69 sceneP1_text = sceneP1_next_text; // テキスト入れ替え 70 } else if (key == ENTER) { 71 scene = "scene2"; 72 } 73 } else if (scene.equals("sceneP2")) { 74 if (key == ' ') { 75 sceneP2_text = sceneP2_next_text; // テキスト入れ替え 76 } else if (key == ENTER) { 77 scene = "scene2"; 78 } 79 } else if (scene.equals("scene2")) { 80 if (key == ENTER) { 81 scene = "clear_scene"; 82 } 83 } 84} 85 86 87void start_scene() { 88 fill(0); 89 textSize(40); 90 textAlign(CENTER, CENTER); 91 text("right mouse click", 0, 0, width, height); 92} 93 94void scene_1() { 95 draw_text(scene1_text); 96} 97 98void Pattern1_scene() { 99 draw_text(sceneP1_text); 100} 101 102void Pattern2_scene() { 103 draw_text(sceneP2_text); 104} 105 106void scene2() { 107 draw_text(scene2_text); 108} 109 110void clear_scene() { 111 fill(0); 112 textSize(40); 113 textAlign(CENTER, CENTER); 114 text("end", 0, 0, width, height); 115} 116 117void draw_text(String text) { 118 //fill(255); 119 //rect(150, 500, 2000, 900); 120 //fill(0); 121 //textAlign(LEFT, TOP); 122 //textLeading(60); 123 //textSize(45); 124 //text(text, 150,500, 2000, 900); 125 126 fill(0); 127 textAlign(LEFT, CENTER); 128 textSize(35); 129 text(text, 0, 0, width, height); 130} 131 132 133String scene1_text = 134 "私ね、お金さえもらえるなら基本的になんでもするんだけど・・・・、\n" + 135 "いくら積まれても二度とやりたくないって仕事がいくつかあってね。\n" + 136 "曰く付き物件での生活。後にも先にも結局この一件だけだったんだけど・・・・、\n" + 137 "お化け屋敷って言われてる館で一か月生活して、\n" + 138 "それがただの噂だって事を証明してほしいっていう依頼。\n" + 139 "そりゃあもう、凄かったよ。\n" + 140 "外観も中身も、都会のど真ん中にあるとは到底思えなかった。\n" + 141 "一か月とはいえこんなところに住めるんだーってわくわくしたもん。\n" + 142 "でね。その曰く付きの内容。\n" + 143 "その館で一家惨殺事件があって、その惨殺された一家の怨念が・・・みたいな。\n" + 144 "まあ、よくある話。一日目はひたすら探索して回ったんだ。楽しかったよ。すっごく。\n" + 145 "・・・・・夜までは、ね。"; 146 147String sceneP1_text = 148 "寝る前に風呂に入って、鏡の前で髪を乾かしている時に、鏡を何かが横切ったんだ。\n" + 149 "見間違いかな、って思ったんだけど、ちらちらちらちら通るんだよね。\n" + 150 "虫か何かかなーって思って振り返っても何も居ないの。変だあって思った。\n" + 151 "明らかに女の子の部屋だったからちょっと気が引けてたんだけど、いざ寝るときにはどうでもよくなってた。\n" + 152 "何が起きるかなーって思ってたんだけど、その時は、嫌な夢を見ただけだったよ。\n" + 153 "夢の中でね、今寝ているのと同じ部屋の同じベッドの上で、男に襲われてたんだ。\n" + 154 "体が思うように動かなくて、もがいても暴れても殴られるだけで・・・・。\n" + 155 "痛い、苦しいって、それで頭が一杯になって・・・・。" + 156 "起きたときはいやーな汗かいてたよ。\n" + 157 "それから一週間くらい、同じ夢を見続けた。それで、八日目くらい。\n" + 158 "その日はご飯は食べてから帰ったんだけど、喉が渇いちゃたから帰ってすぐに台所に行ったんだよね。\n" + 159 "そしたら、皿が全部割れてた。びっくりしたのと同時に、なんか怒りが込み上げて来てさ。\n" + 160 "だって、もう曰くつきとか言うレベルじゃないじゃん。\n" + 161 "ここまでのポルターガイストが起きるなら、事前に言っといてくれないと。\n" + 162 "まあ、皿は私物でもなんでもなかったけどさ。で、怒りに任せて依頼主さんに電話したんだよ。\n"; 163String sceneP1_next_text = 164 "でも、何もっ聞き取れなかった。ノイズが煩くて。\n" + 165 "しかも、そのノイズってただのノイズじゃなかったんだよね。\n" + 166 "がたん、ごとん、って音がして、それから悲鳴が聞こえて。\n" + 167 "そして一通り静かになると、依頼主さんが私を呼ぶ声がやっと聴こえてさ。\n" + 168 "正直ほっとしたよ。おじいさんの声ってこんなに安心するものだっけ、なんて思いながらさ、\n" + 169 "まずは謝ってから事情を説明することにしたんだ。\n" + 170 "夢のこともポルターガイストのことも、洗いざらい全部。\n" + 171 "そしたら・・・・、「わかった、そこでおとなしくしてるんだよ・・・・」って。\n" + 172 "ねっとりした、凄く嫌な声だった。\n" + 173 "息使いが気持ち悪くて、思わず携帯投げ出して尻餅ついちゃった。\n" + 174 "皿の破片の上に。でも、そんなの気になんなかった。\n" + 175 "それよりも早く逃げなきゃって。嫌な予感っていうのかな。\n" + 176 "でも、体が動かなかった。\n" + 177 "しばらくすると、依頼主のおじいさんが来た。\n" + 178 "凄く、いやな笑みを浮かべながら、手には鋭い刃物を持って。\n" + 179 "・・・・その笑い方には見覚えがあったよ。\n" + 180 "夢の中で、さんざん見たもの。"; 181 182String sceneP2_text = 183 "寝る前に風呂に入って、鏡の前で髪を乾かしている時に、鏡を何かが横切ったんだ。\n" + 184 "見間違いかな、って思ったんだけど、ちらちらちらちら通るんだよね。\n" + 185 "虫か何かかなーって思って振り返っても何も居ないの。\n" + 186 "変だあって思ってたんだけど、いざ寝るときにはどうでもよくなってた。\n" + 187 "何が起きるかなーって思ってたんだけど、その時は、嫌な夢を見ただけだったよ。\n" + 188 "夢の中でね、今寝ているのと同じ部屋の同じベッドの上で、男に襲われてたんだ。\n" + 189 "それから一週間くらい、同じ夢を見続けた。それで、八日目くらい。\n" + 190 "その日はご飯は食べてから帰ったんだけど、喉が渇いちゃたから帰ってすぐに台所に行ったんだよね。\n" + 191 "そしたら、皿が全部割れてた。びっくりしたのと同時に、なんか怒りが込み上げて来てさ。\n" + 192 "だって、もう曰くつきとか言うレベルじゃないじゃん。\n" + 193 "ここまでのポルターガイストが起きるなら、事前に言っといてくれないと。\n" + 194 "で、怒りに任せて依頼主さんに電話したんだよ。"; 195String sceneP2_next_text = 196 "でも、何もっ聞き取れなかった。ノイズが煩くて。\n" + 197 "がたん、ごとん、って音がして。\n" + 198 "そして一通り静かになると、依頼主さんが私を呼ぶ声がやっと聴こえてさ。\n" + 199 "正直ほっとしたよ。おじいさんの声ってこんなに安心するものだっけ、なんて思いながらさ、\n" + 200 "まずは謝ってから事情を説明することにしたんだ。\n" + 201 "夢のこともポルターガイストのことも、洗いざらい全部。\n" + 202 "そしたら・・・・、「わかった、そこでおとなしくしてるんだよ・・・・」って。\n" + 203 "しばらくすると、依頼主のおじいさんが来た。\n" + 204 "凄く、いやな笑みを浮かべながら、手には鋭い刃物を持って。\n" + 205 "・・・・その笑い方には見覚えがあったよ。\n" + 206 "夢の中で、さんざん見たもの。"; 207 208String scene2_text = 209 "・・・と、いうわけで、私の話はこれで終わり。え?その後?\n" + 210 "さあ・・・・。どうなったんだろうねえ。\n" + 211 "だって、これ伝聞だし。仕事仲間から聞いた、都市伝説。怒んないでよー。\n" + 212 "仕方ないじゃん、オカルトは好きだけど体験談なんかないんだもん。\n" + 213 "体験談だってだましたのは悪かったけどさ。そのほうがドキドキするかなーって。\n" + 214 "・・・・でも、さ。これがもし実話だったら・・・・、確実にどちらかは死んでいるよね。" + 215 "私はおじいさんが真だと思うな。狂気ならいっぱい落ちてるんだし、\n" + 216 "喉抉られたりとかしてさ。そして、殺した奴はそれを鋸とか出刃包丁とか、\n" + 217 "そういうので刻んでコンクリートに混ぜてゴミ捨て場にうめたんじゃない?\n" + 218 "一人じゃ出来ないから、口の堅いお友達を呼んで。証拠隠滅もお手伝いしてもらって・・・・。\n" + 219 "ごめん、ごめん。ちょっと冗談きつかったね。";

送信側(1秒ごとにランダムでEmotionを送信)

Processing

1import oscP5.*; 2import netP5.*; 3 4OscP5 oscP5; 5NetAddress myRemoteLocation; 6 7void setup() { 8 size(300, 200); 9 frameRate(1); // 1秒ごと 10 textAlign(CENTER, CENTER); 11 textSize(40); 12 13 oscP5 = new OscP5(this, 8000); 14 myRemoteLocation = new NetAddress("127.0.0.1", 8000); 15} 16 17void draw() { 18 background(255); 19 fill(0); 20 21 String[] emotions = { "Happy", "Neutral", "Surprise", "Sad", "Angry", "Disgust", "Fear" }; 22 float v = random(emotions.length); 23 String emotion = emotions[int(v)]; 24 text(emotion, 0, 0, width, height); 25 26 OscMessage msg = new OscMessage("/Emotion"); 27 msg.add(emotion); 28 msg.add(v); 29 oscP5.send(msg, myRemoteLocation); 30 31 //exit(); // 終了 32}

PDEを2つ開いて、受信側-送信側の順で実行する。

投稿2022/10/23 22:55

編集2022/10/30 12:17
TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2022/10/23 22:57 編集

動作確認してません(というかできません)ので、何か間違いがあるかもしれません^^;
Kokku

2022/10/24 04:07

回答ありがとうございます。ジェネリクスにしたほうが良い理由、==とequalsの違いについて知るきっかけになりました。 >>10回繰り返す scene1に居るときの受け取った値を取得して、条件分岐したいと考えていたのですが、10回程度でscene1を読み終えるだろうと考え10回としました。(scene1の時だけこの処理を行うという書き方をがわからなかっただけです(-_-;)) >>Java ありがとうございます。今回はJavaモードでやろうと思います。 emotion_branchなのですが、書き忘れておりました。 scene1の時に受け取った値によって、パターン1もしくはパターン2に分岐するという処理をしたいので >emotion_branch(); // ここ? の場所でいいのかなと思っています。
TN8001

2022/10/24 05:22

> 10回程度でscene1を読み終えるだろうと考え10回としました。 ?? emotion_list には oscEvent が呼ばれた瞬間に、例えば "Happy" が一気に10個入ります。 emotion_branch を for の中で呼ぼうが外で呼ぼうが、人間には一瞬のことで「10秒待つ」のようなことにはなりません。 他と同じようにキーで遷移でいいんじゃないですかね? それとも oscEvent が10回呼ばれた程度でって意味ですかね?? 送信側(Python側)のコードもあると、どういうつもりなのかがわかりやすいのですが... スペースキーの扱いについては、ご理解いただけましたでしょうか?
TN8001

2022/10/24 05:35

> 送信側(Python側)のコードもあると コードがあってもわからないかな?w 「どういうタイミングでどういうデータが来るのか」のほうがいいですかね。 顔認識のようなものでしょうか。
Kokku

2022/10/24 15:46

scene1の状態にあるとき、pythonで文章を読んでいる人の顔画像をカメラを起動し10秒おきに撮影、感情推定しその情報をosc通信でprocessingに送信、それをemotion_listやmax_v_listに格納していき、適当なタイミング(scene1の文章を読み終える前に)でその値によって条件分岐し、pattern1もしくはpattern2に分岐をすることが目標です。 scene1以外ではosc通信をする必要はないです。
Kokku

2022/10/24 15:49

pythonコード追加しました。
TN8001

2022/10/24 21:35

> 適当なタイミング(scene1の文章を読み終える前に)でその値によって条件分岐 でしたらそのタイミングの Emotion が取得できればいい話で、とくにリストにためる意味はないのではありませんか? 読んでいる最中に「何のアクションも必要とせず突然遷移する」ことが重要なんでしょうか? テスト用に雑な送信側を作りました。 起動や右クリックのタイミングによって、最悪遷移に20秒かかることがあります^^;
Kokku

2022/10/26 08:01

たしかにリストに入れていくやり方にする必要はなかったですね。 読んでいる人が意図せずにシーン遷移を行うことは重要視しています。
TN8001

2022/10/26 09:22

えっと、あとの問題点は何でしょうか... 疑問点や不明点があれば、その内容をコメントしてください。 > 読んでいる人が意図せずにシーン遷移を行うことは重要視しています。 ここですかね?? **右クリックした後**10秒程度で、確実に遷移したいとなると 案1 ProcessingからPythonを起動する(起動にかかる時間も織り込んでタイミング調整) 案2 ProcessingからPythonに、「今から10秒後に(あるいは今)送ってね」とoscする 案3 Pythonを高頻度(例えば1秒ごと)にして、10回目を採用する(最悪11秒ですむ) あたりがすぐ思いつきますが、どうするのがいいでしょうかね?
Kokku

2022/10/29 10:17 編集

返信が遅れてしまい申し訳ありません。 案3が一番理想に近づけるのではないかと考えています。 scene1の時、適当なタイミングでosc通信で受け取った値によって先に分岐先を指定し(分岐処理をして)、エンターキーを押されたタイミングでemotion_branch内で指定したシーンへ遷移するという処理を書く場合どうすればよいのかが今の不明点です
TN8001

2022/10/30 12:17

> 返信が遅れてしまい申し訳ありません。 いえいえ、私も遅れました^^; 通知が全然来ないんですよねぇ... > 案3が一番理想に近づけるのではないかと考えています。 高頻度に呼んでも問題ないわけですね?(Pythonの処理は1秒以内で終わるし、負荷もそんなに高くない) > scene1の時、適当なタイミングでosc通信で受け取った値によって先に分岐先を指定し(分岐処理をして)、エンターキーを押されたタイミングでemotion_branch内で指定したシーンへ遷移する うん? >> 読んでいる最中に「何のアクションも必要とせず突然遷移する」こと > 読んでいる人が意図せずにシーン遷移を行うことは重要視しています。 この話と変わってきてます? scene1 から sceneP1 or sceneP2 への遷移にもエンターキーなんですか? 遷移自体はアクション(キー操作等)があってもいいが、emotion の取得は気が付かれたくない(読んでる最中のできるだけ正確な感情分析を使いたい)ということでしょうか。 > どうすればよいのかが今の不明点です scene とは別の tmp_scene 変数を用意するのが手っ取り早いでしょうか。 10回目の判定はカウント用の変数を作ってもいいですが、せっかく?なので ArrayList に戻しましょうか。 回答を編集しました。
Kokku

2022/10/30 15:02 編集

scene1の文章を読み終えても、シーン遷移が行われないことを防ぐため、高頻度で呼び出したほうが良いのではないかと考えております。 > scene1の時、適当なタイミングでosc通信で受け取った値によって先に分岐先を指定し(分岐処理をして)、エンターキーを押されたタイミングでemotion_branch内で指定したシーンへ遷移する 読者がシーン1を読み終えるタイミングで遷移を行いたいので(読み終えてるのに遷移しない、読んでいる途中なのに遷移してしまうことを防ぐため)という意図です。 >> 読んでいる最中に「何のアクションも必要とせず突然遷移する」こと > 読んでいる人が意図せずにシーン遷移を行うことは重要視しています。 これはあるシーンにいるとき読んでいる人が意図しないタイミングで遷移するという意味ではなく、 読んでいる人にパターン1、パターン2のシーンの遷移する権利があるのではなくプログラム内で勝手にやってしまうよって意味でした。
TN8001

2022/10/31 13:23

> scene1の文章を読み終えても、シーン遷移が行われないことを防ぐため、高頻度で呼び出したほうが良いのではないかと考えております。 はい。私もそう思います(さすがに20秒もあると読み終わってしまいそう) > 読者がシーン1を読み終えるタイミングで遷移を行いたいので(読み終えてるのに遷移しない、読んでいる途中なのに遷移してしまうことを防ぐため)という意図です。 すべての遷移には何らかのアクション(マウスやキー操作)があるということですね。 > これはあるシーンにいるとき読んでいる人が意図しないタイミングで遷移するという意味ではなく、 > 読んでいる人にパターン1、パターン2のシーンの遷移する権利があるのではなくプログラム内で勝手にやってしまうよって意味でした。 なるほど。日本語は難しいですね。 えっと、それであと何が解決すればこの質問は終わるんでしょうか? 上記の話は先の回答の編集で織り込み済みという認識なのですが、確認していただけてるんでしょうか? 困っている当事者(Kokkuさん)がまず主体的に動いていただかないと、どうにもならないのですよ。 例えば↓のような * 回答を参考にこう変更してみた(質問に追記)がコンパイルエラー * 回答のココの文法の意味が分からない(から自分のコードに落とし込めない)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問