2011-11-11 10 views
1

私はClojureでSwingを使ってゲームをしています。コントロールを処理するKeyListenerがありますが、refを更新していません。他のスレッドは私のREF更新をなぜ見ないのですか?

(def move (ref :drop)) 

(defn get-move 
    [block state x y moves] 
    (do (println @move) 
     (if (check-move @move x y block state) @move 
     :nothing))) 



(defn listener 
    [keyevent] 
    (let [c (.getKeyChar keyevent)] 
    (do (println c) 
     (cond (= c "j") (dosync (ref-set move :left)) 
      (= c "l") (dosync (ref-set move :right)) 
      (= c "i") (dosync (ref-set move :rotate)) 
      (= c "k") (dosync (ref-set move :drop)))))) 



(defn make-keylistener 
    [] 
(proxy [KeyAdapter] [] 
    (keyPressed [event] 
      (listener event)))) 

ここでは、guiを更新するmain関数がget-moveを呼び出すという考えがあります。移動リファレンスがゲーム内で有効であるかどうかを確認し、そうであればそれを返します。リスナーはJPanelに付属しており、キー押下に基づいてリファクタを変更します。リスナーはうまく動作します。ボタンを押すたびにキーの文字が出力されます。私はそれが基準を変更していると仮定することができます。しかし、get-moveは常に同じ値を返します。それは@moveの変更を見ることはありません。私はClojureの並行性と状態に関する基本的なことを誤解しているように感じます。私は間違って何をしていますか?これを処理するより機能的な方法がありますか?

ありがとうございます!

EDIT:原子を使用すると同じ問題が発生します。

答えて

1

これは並行性の問題ではありません。 .getKeyCharは文字列と比較していたcharを返します。条件を(=(str c) "j")に書き換えると、それが機能します。

+3

もしあなたがcharと比較しているならば、 '(= c \ j)' – Scott

+0

はcharを表しますか?知っておいて、私はまだそれを見つけていません。 – Joel

関連する問題