Mercurial > parpg-core
diff src/parpg/gamescenecontroller.py @ 25:aa3d837024a3
Scrolling by keyboard is now possible.
* Patch by DomtronVox.
* Added scrolling with the arrow keys.
* Added a slider bar in the settings menu to allow players to set the scrolling speed.
* Fixed an error that occurred when the ok button in settings was pressed.
* There is some kind of focus issue where opening the settings menu in-game causes scrolling to be disabled. Workaround is to change the scroll speed setting whenever you open the settings menu.
author | DomtronVox |
---|---|
date | Fri, 17 Jun 2011 14:49:48 -1000 |
parents | d60f1dab8469 |
children | 94cb5843dcbb |
line wrap: on
line diff
--- a/src/parpg/gamescenecontroller.py Thu Jun 16 15:14:10 2011 -1000 +++ b/src/parpg/gamescenecontroller.py Fri Jun 17 14:49:48 2011 -1000 @@ -82,11 +82,12 @@ self.has_mouse_focus = True self.last_mousecoords = None self.mouse_callback = None - self.original_cursor_id = self.engine.getCursor().getId() - self.scroll_direction = [0, 0] - self.scroll_timer = extensions.fife_timer.Timer(100, - lambda: self.view.moveCamera \ - (self.scroll_direction)) + self.original_cursor_id = self.engine.getCursor().getId() + self.scroll_data = {"mouse":[], "kb":[], "offset":[0,0]} + self.scroll_timer = extensions.fife_timer.Timer( + 100, + lambda: self.view.moveCamera(self.scroll_data["offset"]), + ) #this is temporary until we can set the native cursor self.resetMouseCursor() @@ -180,8 +181,50 @@ self.model.togglePause() self.pause(False) if(key_val == key.SPACE): - self.model.active_map.centerCameraOnPlayer() + self.model.active_map.centerCameraOnPlayer() + + #alter scroll data if a directional key is hit + if(key_val == key.UP): + if not "up" in self.scroll_data["kb"]: + self.scroll_data["kb"].append("up") + + if(key_val == key.RIGHT): + if not "right" in self.scroll_data["kb"]: + self.scroll_data["kb"].append("right") + + if(key_val == key.DOWN): + if not "down" in self.scroll_data["kb"]: + self.scroll_data["kb"].append("down") + + if(key_val == key.LEFT): + if not "left" in self.scroll_data["kb"]: + self.scroll_data["kb"].append("left") + def keyReleased(self, evt): + """Whenever a key is pressed, fife calls this routine. + @type evt: fife.event + @param evt: The event that fife caught + @return: None""" + key = evt.getKey() + key_val = key.getValue() + + #alter scroll data if a directional key is released + if(key_val == key.UP): + if "up" in self.scroll_data["kb"]: + self.scroll_data["kb"].remove("up") + + if(key_val == key.RIGHT): + if "right" in self.scroll_data["kb"]: + self.scroll_data["kb"].remove("right") + + if(key_val == key.DOWN): + if "down" in self.scroll_data["kb"]: + self.scroll_data["kb"].remove("down") + + if(key_val == key.LEFT): + if "left" in self.scroll_data["kb"]: + self.scroll_data["kb"].remove("left") + def mouseReleased(self, evt): """If a mouse button is released, fife calls this routine. We want to wait until the button is released, because otherwise @@ -235,9 +278,8 @@ #this can be helpful for IDEs code analysis if False: assert(isinstance(cursor, fife.Cursor)) - self.last_mousecoords = fife.ScreenPoint(cursor.getX(), - cursor.getY()) - self.view.highlightFrontObject(self.last_mousecoords) + self.last_mousecoords = fife.ScreenPoint(cursor.getX(), cursor.getY()) + self.view.highlightFrontObject(self.last_mousecoords) #set the trigger area in pixles pixle_edge = 20 @@ -252,33 +294,29 @@ #edge logic - self.scroll_direction = [0, 0] if self.has_mouse_focus: - direction = self.scroll_direction + direction = self.scroll_data["mouse"] = [] + #up - if mouse_y <= pixle_edge: - direction[0] += 1 - direction[1] -= 1 + if mouse_y <= pixle_edge: + direction.append("up") image = '/'.join(['gui/cursors', settings.parpg.CursorUp]) #right if mouse_x >= screen_width - pixle_edge: - direction[0] += 1 - direction[1] += 1 + direction.append("right") image = '/'.join(['gui/cursors', settings.parpg.CursorRight]) #down if mouse_y >= screen_height - pixle_edge: - direction[0] -= 1 - direction[1] += 1 + direction.append("down") image = '/'.join(['gui/cursors', settings.parpg.CursorDown]) #left if mouse_x <= pixle_edge: - direction[0] -= 1 - direction[1] -= 1 + direction.append("left") image = '/'.join(['gui/cursors', settings.parpg.CursorLeft]) - + if image is not None and not data_drag.dragging: self.setMouseCursor(image, image) @@ -318,6 +356,50 @@ self.view.hud.initializeInventory() self.pause(False) + def handleScrolling(self): + """ + Merge kb and mouse related scroll data, limit the speed and + move the camera. + """ + #this is how many pxls the camera is moved in one time frame + scroll_offset = self.scroll_data["offset"] = [0,0] + + mouse = self.scroll_data["mouse"] + keyboard = self.scroll_data["kb"] + speed = self.model.settings.parpg.ScrollSpeed + + #adds a value to the offset depending on the contents of each + # of the controllers: set() removes doubles + scroll_direction = set(mouse+keyboard) + for direction in scroll_direction: + if direction == "up": + scroll_offset[0] +=1 + scroll_offset[1] -=1 + elif direction == "right": + scroll_offset[0] +=1 + scroll_offset[1] +=1 + elif direction == "down": + scroll_offset[0] -=1 + scroll_offset[1] +=1 + elif direction == "left": + scroll_offset[0] -=1 + scroll_offset[1] -=1 + + #keep the speed within bounds + if scroll_offset[0] > 0: scroll_offset[0] = speed + if scroll_offset[0] < 0: scroll_offset[0] = -speed + + if scroll_offset[1] > 0: scroll_offset[1] = speed + if scroll_offset[1] < 0: scroll_offset[1] = -speed + + #de/activate scrolling + if scroll_offset != [0, 0]: + self.scroll_timer.start() + else: + self.scroll_timer.stop() + if not data_drag.dragging: + self.resetMouseCursor() + def nullFunc(self, userdata): """Sample callback for the context menus.""" logger.info(userdata) @@ -433,7 +515,7 @@ self.has_mouse_focus = True elif(command.getCommandType() == fife.CMD_MOUSE_FOCUS_LOST): self.has_mouse_focus = False - + def pump(self): """Routine called during each frame. Our main loop is in ./run.py""" # uncomment to instrument @@ -444,12 +526,6 @@ if self.model.active_map: self.view.highlightFrontObject(self.last_mousecoords) self.view.refreshTopLayerTransparencies() - if self.scroll_direction != [0, 0]: - self.scroll_timer.start() - else: - self.scroll_timer.stop() - if not data_drag.dragging: - self.resetMouseCursor() - + self.handleScrolling() self.handleCommands() # print "%05f" % (time.time()-t0,)