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

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

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

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

Q&A

解決済

1回答

1619閲覧

押されたキーの取得

yusuke.

総合スコア66

Ruby

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

0グッド

0クリップ

投稿2016/08/17 00:51

編集2016/08/29 07:56

いつもお世話になっております。
今回はクイズを作ろうと思っておりましてその答え合わせをするときに、キーボードから文字を読み込もうと思ったのですが、うまくいきません。
今回やろうとしていることを簡単に説明すると、SDL::Event2::KeyDownを使いどの数字が押されているかを調べて、そのキーをaにあてはめて答えと比較するというものです。
はじめはgetchでやっていたのですが、それだとコマンドプロンプトに入力しなければならなかったので、こちらに変えました

ruby

1 2class Gmen 3 WINDOW_YOKO = 830 4 WINDOW_TATE = 550 5 BITPIKUSERU = 0 6 7 8 def initialize 9 SDL.init(SDL::INIT_EVERYTHING) 10 @screen2 = SDL.set_video_mode(WINDOW_YOKO,WINDOW_TATE,BITPIKUSERU,SDL::SWSURFACE) 11 SDL::TTF.init 12 @font = SDL::Kanji.open("font/jiskan24.bdf",24) 13 @font.set_coding_system(SDL::Kanji::SJIS) 14 @font2 = SDL::TTF.open("C:/WINDOWS/Fonts/TAHOMA.TTF",30) 15 end 16 17 def drawBack 18 @screen2.fill_rect(0,0,WINDOW_YOKO,WINDOW_TATE,Color::WHITE) 19 end 20 21 def refresh 22 @screen2.update_rect(0,0,0,0) 23 end 24 25 def mondai 26 yomikomi 27 refresh 28 @font.put(@screen2,"#{$mondai}", 50,20,0,0,0) 29 @font.put(@screen2,"#{$sentakusi1}", 50,50,0,0,0) 30 @font.put(@screen2,"#{$sentakusi2}", 50,80,0,0,0) 31 @font.put(@screen2,"#{$sentakusi3}", 50,110,0,0,0) 32 @font.put(@screen2,"#{$sentakusi4}", 50,140,0,0,0) 33 @font.put(@screen2,"#{$sentakusi5}", 50,170,0,0,0) 34 @font2.draw_solid_utf8(@screen2," #{$tisiki}",100,500,0,0,0) 35 refresh 36 kotaeawase 37 end 38 39 40 def kotaeawase 41 @font.put(@screen2,"数字を入力してください",50,220,0,0,0) 42 refresh 43 event = SDL::Event2.poll 44 case event 45 when SDL::Event2::KeyDown 46 if event.sym == SDL::Key::one 47 return a = 1 48 end 49 if event.sym == SDL::Key::two 50 return a = 2 51 end 52 if event.sym == SDL::Key::three 53 return a = 3 54 end 55 if event.sym == SDL::Key::four 56 return a = 4 57 end 58 if event.sym == SDL::Key::five 59 return a = 5 60 end 61 end 62 @font.put(@screen2,"入力した数字",50,250,0,0,0) 63 @font2.draw_solid_utf8(@screen2," #{a}",190,242,0,0,0) 64 refresh 65 if a == $kotae 66 sleep 2 67 $tisiki = $tisiki.to_i + $score.to_i 68 @font.put(@screen2,"正解です",50,310,0,0,0) 69 sleep 0.5 70 @font.put(@screen2,"正解は です",50,280,0,0,0) 71 @font2.draw_solid_utf8(@screen2," #{$kotae}",130,274,0,0,0) 72 refresh 73 else 74 #sleep 2 75 @font.put(@screen2,"間違いです",50,280,0,0,0) 76 refresh 77 sleep 0.5 78 @font.put(@screen2,"正解は です",50,310,0,0,0) 79 @font2.draw_solid_utf8(@screen2," #{$kotae}",130,300,0,0,0) 80 refresh 81 end 82end 83 84 85 86 def start 87 @font.put(@screen2,"今から問題が出てきます。問題によって、スコアが異なります。",50,30,0,0,0) 88 @font.put(@screen2,"正解だと思う選択肢の番号のキーボードを押してください。",50,70,0,0,0) 89 @font.put(@screen2,"始めるにはスペースキーを押してください。",50,120,0,0,0) 90 refresh 91 keycount = 0 92 while true do 93 while event = SDL::Event2.poll do 94 case event 95 when SDL::Event2::Quit 96 exit 97 when SDL::Event2::KeyDown 98 if event.sym == SDL::Key::SPACE then 99 drawBack 100 mondai 101 end 102 end 103 end 104 end 105 end 106end 107 108 109 110 111def hajime 112 g = Gmen.new 113 g.drawBack 114 g.refresh 115 g.start 116end 117

一部省略させていただいています。

エラー文

ruby

1undefined method'one' for SDL::Key:Module (NoMethodError)

このSDL::Key:Moduleというのも調べましたがよくわかりませんでした。
お忙しいとは思いますが、回答お願いします。

---追記
調べてみるとキーを入力してもすべてaに代入されている数字が0となっているようでした。

ruby

1 if event.sym == SDL::Key::one 2 return a = 1 3 end 4 if event.sym == SDL::Key::two 5 return a = 2 6 end 7 if event.sym == SDL::Key::three 8 return a = 3 9 end 10 if event.sym == SDL::Key::four 11 return a = 4 12 end 13 if event.sym == SDL::Key::five 14 return a = 5 15 end 16 end

ここが間違えているというのを受けて

ruby

1 event = SDL::Event2.poll 2 case event 3 when SDL::Event2::KeyDown 4 if event.sym == SDL::Key::KP1 5 return a = 1 6 end 7 if event.sym == SDL::Key::KP2 8 return a = 2 9 end 10 if event.sym == SDL::Key::KP3 11 return a = 3 12 end 13 if event.sym == SDL::Key::KP4 14 return a = 4 15 end 16 if event.sym == SDL::Key::KP5 17 return a = 5 18 end 19 end

このように直したのですが、エラーが出ることは無くなりましたが、どのキーが押されているかを取得することができず、苦しんでいます。キーを押しているのに、受け取ってくれません。
すべてが0になってしまいます。そしてこの処理のところを飛ばすような感じでそのままどんどん進めていってしまいます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

SDL::Key::one という記述ができないと言うエラーです。

ここ
を見る限り、キーボードの1を押されたときは、SDL::Key::KP1を使う様です。

投稿2016/08/17 03:35

shanxia

総合スコア1038

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

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

yusuke.

2016/08/22 00:17

回答ありがとうございます。 event = SDL::Event2.poll case event when SDL::Event2::KeyDown if event.sym == SDL::Key::KP1 return a = 1 end if event.sym == SDL::Key::KP2 return a = 2 end if event.sym == SDL::Key::KP3 return a = 3 end if event.sym == SDL::Key::KP4 return a = 4 end if event.sym == SDL::Key::KP5 return a = 5 end このように直したのですが、エラーが出ることはなくなりましたが、文字を押しても取得することができていないようなのですが、なぜでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問