1# 2# Input.py 3 4import k 5 6from Krank import * 7from Sprite import * 8 9#----------------------------------------------------------------------------------------------- 10#----------------------------------------------------------------------------------------------- 11 12class Input: 13 14 #------------------------------------------------------------------------------------------- 15 def __init__(self): 16 17 k.input = self 18 19 pygame.mouse.set_cursor(*pygame.cursors.diamond) 20 21 self.exit = False 22 self.pause = False 23 24 # target pos 25 self.targetpos = k.world.rect.center 26 27 # joystick 28 29 pygame.joystick.init() 30 31 self.joystick = None # the first joystick if present 32 self.joyaxes = [] # current axes values 33 self.relaxes = [] # joystick delta 34 self.numaxes = 0 # number of joystick axes 35 self.minaxes = 0.2 # joystick delta threshold 36 37 if pygame.joystick.get_init() and pygame.joystick.get_count(): 38 self.joystick = pygame.joystick.Joystick(0) 39 if self.joystick: 40 self.joystick.init() 41 if self.joystick.get_init(): 42 self.numaxes = min(2, self.joystick.get_numaxes()) 43 self.joyaxes = [0.0] * self.numaxes 44 self.relaxes = [0.0] * self.numaxes 45 #self.handleMouse() 46 else: 47 log("joystick init failed") 48 self.joystick = None 49 50 #------------------------------------------------------------------------------------------- 51 def onExit (self): 52 self.exit = True 53 54 #------------------------------------------------------------------------------------------- 55 def onFrame (self, delta): 56 57 self.handleEvents () 58 self.handleMouse () 59 60 #------------------------------------------------------------------------------------------- 61 def handleEvents (self): 62 63 for event in pygame.event.get(): 64 if event.type == pygame.QUIT: sys.exit() 65 # ---------------------------------------------------------------------- KEYS 66 elif event.type == pygame.KEYDOWN: 67 # ------------------------------------------------------------------ pause 68 if event.key == 32: 69 self.pause = not self.pause 70 else: 71 if self.pause: self.pause = False 72 # ------------------------------------------------------------------ exit 73 if event.key == 113 and event.mod == pygame.KMOD_LMETA: 74 self.onExit() 75 return 76 # ------------------------------------------------------------------ menu 77 elif event.key == 27: 78 if event.mod == pygame.KMOD_LSHIFT: 79 log('quick exit (shift escape)', event, log='input') 80 self.onExit() 81 return 82 log('menu exit (escape)', event, log='input') 83 if k.level.name <> "menu": 84 k.level.menuExit("menu") 85 else: 86 self.onExit() 87 return 88 # ------------------------------------------------------------------ levels 89 elif event.key == 275: # right 90 pygame.event.clear() 91 if k.debug and event.mod == pygame.KMOD_LMETA: 92 k.score, k.level.time = sys.maxint, sys.maxint 93 k.config.score(k.level.number) 94 else: 95 k.config.abort() 96 k.level.next() 97 elif event.key == 276: # left 98 pygame.event.clear() 99 k.config.abort() 100 k.level.previous() 101 elif event.key == 105: # i 102 if k.debug: 103 k.level.saveIcon() 104 elif event.key == 114: # r 105 k.config.abort() 106 k.level.restart() 107 elif event.key == 115: # s 108 k.level.saveScreenshot() 109 elif event.key in [49, 50, 51]: 110 if k.debug: 111 k.config.stage = event.key-48 112 k.score, k.level.time = sys.maxint, sys.maxint 113 k.config.score(k.level.number) 114 k.level.restart() 115 # ------------------------------------------------------------------ volume 116 elif event.key == 280 or event.key == 281: # page up/page down 117 delta = event.key == 280 and 1 or -1 118 if event.mod & pygame.KMOD_ALT: 119 k.sound.setSoundVolume(k.sound.getSoundVolume() + delta*0.1) 120 else: 121 k.sound.setMusicVolume(k.sound.getMusicVolume() + delta*0.1) 122 k.config.save() 123 # ------------------------------------------------------------------ misc 124 else: 125 log(event, log='input') 126 pass 127 # ---------------------------------------------------------------------- JOYSTICK 128 elif event.type == pygame.JOYBUTTONUP: 129 # ------------------------------------------------------------------ exit 130 if event.button == 0: 131 # bug in pygame? get's triggered sometimes on OS X 132# log("JOY BUTTON UP", log='input') 133# if k.level.name <> "menu": 134# log('menu exit (joy button)', log='input') 135# k.level.menuExit("menu") 136 pass 137 # ------------------------------------------------------------------ volume 138 elif event.button >= 4 and event.button <= 7: # shoulder buttons 139 delta = event.button <= 5 and -1 or 1 140 if event.button % 2: 141 k.sound.setSoundVolumeIndex(k.sound.getSoundVolumeIndex() + delta) 142 if k.level.name == "menu_sound": 143 k.particles.parts[k.player.tailnum+2:][k.sound.getSoundVolumeIndex()].collision_action() 144 else: 145 k.sound.setMusicVolumeIndex(k.sound.getMusicVolumeIndex() + delta) 146 if k.level.name == "menu_sound": 147 k.particles.parts[k.player.tailnum+8:][k.sound.getMusicVolumeIndex()].collision_action() 148 k.config.save() 149 else: 150 log(event) 151 elif event.type == pygame.JOYBUTTONDOWN: 152 log(event, event.button, log='input') 153 # ---------------------------------------------------------------------- USER 154 elif event.type == kNEXT_LEVEL: 155 k.sound.removeEndEvent(kNEXT_LEVEL) 156 pygame.time.set_timer(kNEXT_LEVEL, 0) 157 k.level.next() 158 elif event.type == kLOAD_LEVEL: 159 k.sound.removeEndEvent(kLOAD_LEVEL) 160 pygame.time.set_timer(kLOAD_LEVEL, 0) 161 k.level.load() 162 elif event.type == kMENU_LEVEL: 163 k.sound.removeEndEvent(kMENU_LEVEL) 164 pygame.time.set_timer(kMENU_LEVEL, 0) 165 k.level.menu() 166 else: 167# log(event, log='input') 168 pass 169 170 #------------------------------------------------------------------------------------------- 171 def handleMouse (self): 172 173 mousepos = vector(pygame.mouse.get_pos()) 174 playerpos = vector(k.player.part.pos) 175 176 joymoved = 0 177 if self.joystick: 178 for i in range(self.numaxes): 179 axis = self.joystick.get_axis(i) 180 self.relaxes[i] = axis - self.joyaxes[i] 181 self.joyaxes[i] = axis 182 if abs(self.joyaxes[i]) > self.minaxes: 183 joymoved = 1 184 185 if joymoved: 186 targetDistance = max(abs(self.joyaxes[0]), abs(self.joyaxes[1])) * k.player.maxTargetDistance 187 self.targetpos = playerpos + vector(self.joyaxes).norm() * targetDistance 188 self.targetpos.x = min(max(self.targetpos.x, 0), k.world.rect.width) 189 self.targetpos.y = min(max(self.targetpos.y, 0), k.world.rect.height) 190 pygame.mouse.set_pos(self.targetpos) 191 else: 192 playerToMouse = playerpos.to(mousepos) 193# log(playerToMouse) 194 playerToMouseDistance = playerToMouse.length() 195 playerToMouseFactor = min(playerToMouseDistance/1, k.player.maxTargetDistance) 196 targetDistance = min(playerToMouseDistance, playerToMouseFactor) 197 self.targetpos = playerpos + playerToMouse.norm() * targetDistance 198 199 200