Почему другие темы не видят мое обновление? - PullRequest
1 голос
/ 12 ноября 2011

Я работаю над игрой в Clojure, используя Swing.У меня есть KeyListener, чтобы позаботиться об элементах управления, но он не обновляет ссылку.

(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))))

Теперь идея состоит в том, что основная функция, которая обновляет графический интерфейс, вызывает get-move.Он проверяет, действителен ли в игре ход ref, и если да, то возвращает его.Слушатель присоединяется к JPanel и изменяет ссылку на основе нажатия клавиши.Слушатель работает нормально - каждый раз, когда нажимается кнопка, он печатает символ клавиши.Я могу только предположить, что это меняет ссылку.Однако get-move всегда возвращает одно и то же значение - он никогда не видит изменения @move.Мне кажется, что я неправильно понимаю нечто фундаментальное в параллелизме и состоянии в Clojure.Что я делаю не так, и есть ли более функциональный способ справиться с этим?

Спасибо!

РЕДАКТИРОВАТЬ: та же проблема возникает, если я использую атомы.

1 Ответ

1 голос
/ 12 ноября 2011

Это не проблема параллелизма. .getKeyChar возвращает символ, который я сравнивал со строкой. Переписывание условий (= (str c) "j") заставляет его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...