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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SDL (Simple DirectMedia Layer)

SDL (Simple DirectMedia Layer)は、C言語で記述されたクロスプラットフォームのマルチメディアライブラリです。画像や音などを 統一してアクセスするためのAPIを提供。LinuxやWindows、各種MacOSなどを公式にサポートしています。

Q&A

解決済

1回答

1492閲覧

急いでいます。お願いします。 event.symの意味

yusuke.

総合スコア66

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SDL (Simple DirectMedia Layer)

SDL (Simple DirectMedia Layer)は、C言語で記述されたクロスプラットフォームのマルチメディアライブラリです。画像や音などを 統一してアクセスするためのAPIを提供。LinuxやWindows、各種MacOSなどを公式にサポートしています。

0グッド

0クリップ

投稿2016/09/01 08:31

編集2016/09/03 00:43

お世話になっております。ご覧悦ありがとうございます。

ruby

1loop do 2 while event = SDL::Event2.poll 3 case event 4 when SDL::Event2::Quit 5 exit 6 when SDL::Event2::KeyDown 7 if event.sym == SDL::Key::SPACE then 8 image_x += 10 9 end 10 end 11 end 12

イベント処理の文章だと思うのですが、このif event.sym というのはどういう意味なのでしょうか。

また、できればでいいのですが、

ruby

1 def kotaeawase 2 @font.put(@screen2,"数字を入力してください",50,220,0,0,0) 3 refresh 4 while event = SDL::Event2.poll 5 case event 6 when SDL::Event2::Quit 7 exit 8 when SDL::Event2::KeyDown 9 if event.sym == SDL::Key::K1 or SDL::Key::KP1 10 a = 1 11 end 12 if event.sym == SDL::Key::K2 or SDL::Key::KP2 13 a = 2 14 end 15 if event.sym == SDL::Key::K3 or SDL::Key::KP3 16 a = 3 17 end 18 if event.sym == SDL::Key::K4 or SDL::Key::KP4 19 a = 4 20 end 21 if event.sym == SDL::Key::K5 or SDL::Key::KP5 22 a = 5 23 end 24 end 25 end 26 @font.put(@screen2,"入力した数字",50,250,0,0,0) 27 @font2.draw_solid_utf8(@screen2," #{a.to_i}",190,242,0,0,0) 28 refresh 29 if a.to_i == $kotae.to_i 30 sleep 2 31 $tisiki = $tisiki.to_i + $score.to_i 32 @font.put(@screen2,"正解です",50,310,0,0,0) 33 sleep 0.5 34 @font.put(@screen2,"正解は です",50,280,0,0,0) 35 @font2.draw_solid_utf8(@screen2," #{$kotae}",130,274,0,0,0) 36 refresh 37 else 38 sleep 2 39 @font.put(@screen2,"間違いです",50,280,0,0,0) 40 refresh 41 sleep 0.5 42 @font.put(@screen2,"正解は です",50,310,0,0,0) 43 @font2.draw_solid_utf8(@screen2," #{$kotae}",130,300,0,0,0) 44 sleep 2 45 refresh 46 end 47end

このようなソースを作ったのですが、何度実行してもaの値が0となり、キーを押しても動きません。この問題が分かる方がおりましたら教えていただければ幸いです。
解決のヒントとなるような簡単なものでも大丈夫なのでお願いいたします。
---追記
もしかしたらこの部分よりほかのところでループさせているのですが、そこがおかしいかもしれません。

ruby

1 def start 2 @font.put(@screen2,"今から問題が出てきます。問題によって、スコアが異なります。",50,30,0,0,0) 3 @font.put(@screen2,"正解だと思う選択肢の番号のキーボードを押してください。",50,70,0,0,0) 4 @font.put(@screen2,"始めるにはスペースキーを押してください。",50,120,0,0,0) 5 refresh 6 while true do 7 while event = SDL::Event2.poll do 8 case event 9 when SDL::Event2::Quit 10 exit 11 when SDL::Event2::KeyDown 12 if event.sym == SDL::Key::SPACE then 13 kuizustart 14 break 15 end 16 end 17 end 18 end 19 end 20end 21 22 23def kuizustart 24keycount = 0 25 while true do 26 drawBack 27 mondai 28 kotaeawase 29 sleep 2 30 keycount = keycount + 1 31 if keycount == 10 32 gameOver 33 sleep 5 34 end 35 end 36end 37 38 39 40def kotaeawase 41 @font.put(@screen2,"数字を入力してください",50,220,0,0,0) 42 refresh 43 while event = SDL::Event2.poll do 44 SDL::Event2.wait 45 case event 46 when SDL::Event2::Quit 47 exit 48 when SDL::Event2::KeyDown 49 if event.sym == SDL::Key::K1 or event.sym == SDL::Key::KP1 50 a = 1 51 end 52 if event.sym == SDL::Key::K2 or event.sym ==SDL::Key::KP2 53 a = 2 54 end 55 if event.sym == SDL::Key::K3 or event.sym == SDL::Key::KP3 56 a = 3 57 end 58 if event.sym == SDL::Key::K4 or event.sym ==SDL::Key::KP4 59 a = 4 60 end 61 if event.sym == SDL::Key::K5 or event.sym == SDL::Key::KP5 62 a = 5 63 else 64 next 65 puts "0,1,2,3,4,5のどれかを入力してください。" 66 end 67 end 68 end 69 @font.put(@screen2,"入力した数字",50,250,0,0,0) 70 @font2.draw_solid_utf8(@screen2," #{a.to_i}",190,242,0,0,0) 71 refresh 72 if a.to_i == $kotae.to_i 73 sleep 2 74 $tisiki = $tisiki.to_i + $score.to_i 75 @font.put(@screen2,"正解です",50,310,0,0,0) 76 sleep 0.5 77 @font.put(@screen2,"正解は です",50,280,0,0,0) 78 @font2.draw_solid_utf8(@screen2," #{$kotae}",130,274,0,0,0) 79 refresh 80 else 81 sleep 2 82 @font.put(@screen2,"間違いです",50,280,0,0,0) 83 refresh 84 sleep 0.5 85 @font.put(@screen2,"正解は です",50,310,0,0,0) 86 @font2.draw_solid_utf8(@screen2," #{$kotae}",130,300,0,0,0) 87 sleep 2 88 refresh 89 end 90end

こんな感じで、whileを使いまくっているので、どこかバグを起こしているのかもしれません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby/sdlのリファレンスEventの項にあります。

SDL::Event2::KeyDown#sym -- 何のキーを押したかをキーシンボルで返します。

ということで、この場合は押されたキーがスペースキーなのかを判定しています。ちなみにキーシンボルについてもまとめられています。というか、これを踏まえて、後半の質問にあるコードを書いたのではないの?

後半については「できれば」とあるので、思ったことだけ。例えば、

if event.sym == SDL::Key::K1 or SDL::Key::KP1

フルキーの「1」かテンキーの「1」が押されたらというのを判定したいわけだよね?書き方的にこれで合ってるのかな?他の言語でもそうだけど、多分、

if event.sym == SDL::Key::K1 or event.sym == SDL::Key::KP1

こう書くんじゃないかと(まあ、Rubyはいくつかシンタックスシュガーがあるので、こういう書き方もあるかもしれないけど)。
キーを押しても動かないというのは、「数字を入力してください」というメッセージが表示されてからウンともスンとも言わない状況になるってことかな(キー入力待ちで無限ループの状態になってる感じ)?そうだとしたら、プログラムをデバッグモードで動かして、動きを追ってみたほうがいいかもしれないね(もしくはputsでメッセージを表示させるとか)。

投稿2016/09/02 14:23

archiver

総合スコア1557

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

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

yusuke.

2016/09/03 00:33

回答ありがとうございます。 キーを押しても動かないというよりは、多分while event = SDL::Event2.pollぐらいからの処理が飛ばされていて、aを表示するところでは0が代入されています。
yusuke.

2016/09/03 00:43

追記もしたので見ていただければ幸いです。
archiver

2016/09/03 00:51

後半の質問の方が深刻な話だよね。とりあえず、後半の問題についてはここから切り離して、別途質問しておきましょう。その際、「動かない」の状況を明確に書いておいてください。
yusuke.

2016/09/03 00:59

迅速な応答ありがとうございます。 では、また別の質問をして、そこで聞くようにしてみます。 たとえばどのような状況を書いたらいいでしょうか。
archiver

2016/09/03 01:08

追記してもらった内容を質問の主題にして、どこまでが期待している動作になっているか(例えば、最初のメッセージが出力された後にスペースキーを押したら問題が表示されるところまでは動作しています。とか)を明記した方がいいと思います。
yusuke.

2016/09/03 01:13

わかりました。詳しい解説ありがとうございました。
yusuke.

2016/09/03 01:26

質問を投稿したので、見ていただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問