Q&A
前提
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秒で強制終了するようにしています
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/10/23 22:57 編集
2022/10/24 04:07
2022/10/24 05:22
2022/10/24 05:35
2022/10/24 15:46
2022/10/24 15:49
2022/10/24 21:35
2022/10/26 08:01
2022/10/26 09:22
2022/10/29 10:17 編集
2022/10/30 12:17
2022/10/30 15:02 編集
2022/10/31 13:23