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 }