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