001 package components;
002
003 import java.util.HashSet;
004 import java.util.Map;
005 import java.util.Set;
006 import java.util.concurrent.ConcurrentHashMap;
007
008 /** KeyRegistry is a mutable object that stores the key triggers that the game should respond to.
009 * @author ruthdhan
010 * @specfield keyTriggers : set of <keyCode, keyDirection, gameObject> triples
011 */
012 public class KeyRegistry {
013 private Map<Integer, Set<GameObject>> downs;
014 private Map<Integer, Set<GameObject>> ups;
015
016 public KeyRegistry() {
017 downs = new ConcurrentHashMap<Integer, Set<GameObject>>();
018 ups = new ConcurrentHashMap<Integer, Set<GameObject>>();
019 }
020
021 public boolean registerDown(int key, GameObject tgt) {
022 if (downs.containsKey(key)) {
023 return downs.get(key).add(tgt);
024 } else {
025 downs.put(key, new HashSet<GameObject>());
026 return downs.get(key).add(tgt);
027 }
028 }
029 public boolean registerUp(int key, GameObject tgt) {
030 if (ups.containsKey(key)) {
031 return ups.get(key).add(tgt);
032 } else {
033 ups.put(key, new HashSet<GameObject>());
034 return ups.get(key).add(tgt);
035 }
036 }
037
038 public Set<GameObject> getDown(int key) {
039 return downs.get(key);
040 }
041 public Set<GameObject> getUp(int key) {
042 return ups.get(key);
043 }
044
045 /** @return all keys whose downpresses trigger obj **/
046 public Set<Integer> getDowns(GameObject obj) {
047 Set<Integer> output = new HashSet<Integer>();
048 for (Integer key : downs.keySet()) {
049 if (downs.get(key).contains(obj))
050 output.add(key);
051 }
052 return output;
053 }
054
055 /** @return all keys whose upreleases trigger obj **/
056 public Set<Integer> getUps(GameObject obj) {
057 Set<Integer> output = new HashSet<Integer>();
058 for (Integer key : ups.keySet()) {
059 if (ups.get(key).contains(obj))
060 output.add(key);
061 }
062 return output;
063 }
064
065 /** clear all key down triggers assoc with this object **/
066 public void clearDowns(GameObject obj) {
067 for (Integer key : downs.keySet()) {
068 downs.get(key).remove(obj);
069 }
070 }
071
072 /** clear all key up triggers assoc with this object **/
073 public void clearUps(GameObject obj) {
074 for (Integer key : ups.keySet()) {
075 ups.get(key).remove(obj);
076 }
077 }
078
079 /** get all down key presses that are listened for **/
080 public Set<Integer> getAllDownKeys() {
081 return downs.keySet();
082 }
083
084 /** get all up key presses that are listened for **/
085 public Set<Integer> getAllUpKeys() {
086 return ups.keySet();
087 }
088
089 /** remove the specified key press from the registry */
090 public boolean remove(int key, boolean down, GameObject tgt) {
091 if (down)
092 return downs.get(key).remove(tgt);
093 else
094 return ups.get(key).remove(tgt);
095 }
096 }