Mercurial > parpg-core
diff src/parpg/gamesceneview.py @ 0:1fd2201f5c36
Initial commit of parpg-core.
author | M. George Hansen <technopolitica@gmail.com> |
---|---|
date | Sat, 14 May 2011 01:12:35 -0700 |
parents | |
children | ad75fa042b99 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parpg/gamesceneview.py Sat May 14 01:12:35 2011 -0700 @@ -0,0 +1,159 @@ +# This file is part of PARPG. + +# PARPG is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# PARPG is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with PARPG. If not, see <http://www.gnu.org/licenses/>. + +from sounds import SoundEngine +from viewbase import ViewBase +from fife import fife + +class GameSceneView(ViewBase): + """GameSceneView is responsible for drawing the scene""" + def __init__(self, engine, model): + """Constructor for GameSceneView + @param engine: A fife.Engine instance + @type engine: fife.Engine + @param model: a script.GameModel instance + @type model: script.GameModel + """ + super(GameSceneView, self).__init__(engine, model) + + # init the sound + self.sounds = SoundEngine(engine) + + self.hud = None + + # The current highlighted object + self.highlight_obj = None + + # faded objects in top layer + self.faded_objects = set() + + def displayObjectText(self, obj_id, text, time=1000): + """Display on screen the text of the object over the object. + @type obj_id: id of fife.instance + @param obj: id of object to draw over + @type text: String + @param text: text to display over object + @return: None""" + try: + if obj_id: + obj = self.model.active_map.agent_layer.getInstance(obj_id) + else: + obj = None + except RuntimeError as error: + if error.args[0].split(',')[0].strip() == "_[NotFound]_": + obj = None + else: + raise + if obj: + obj.say(str(text), time) + + def onWalk(self, click): + """Callback sample for the context menu.""" + self.hud.hideContainer() + self.model.game_state.player_character.run(click) + + def refreshTopLayerTransparencies(self): + """Fade or unfade TopLayer instances if the PlayerCharacter + is under them.""" + if not self.model.active_map: + return + + # get the PlayerCharacter's screen coordinates + camera = self.model.active_map.cameras[self.model.active_map.my_cam_id] + point = self.model.game_state.player_character.\ + behaviour.agent.getLocation() + scr_coords = camera.toScreenCoordinates(point.getMapCoordinates()) + + # find all instances on TopLayer that fall on those coordinates + instances = camera.getMatchingInstances(scr_coords, + self.model.active_map.top_layer) + instance_ids = [ instance.getId() for instance in instances ] + faded_objects = self.faded_objects + + # fade instances + for instance_id in instance_ids: + if instance_id not in faded_objects: + faded_objects.add(instance_id) + self.model.active_map.top_layer.getInstance(instance_id).\ + get2dGfxVisual().setTransparency(128) + + # unfade previously faded instances + for instance_id in faded_objects.copy(): + if instance_id not in instance_ids: + faded_objects.remove(instance_id) + self.model.active_map.top_layer.getInstance(instance_id).\ + get2dGfxVisual().setTransparency(0) + + + #def removeHighlight(self): + + + def highlightFrontObject(self, mouse_coords): + """Highlights the object that is at the + current mouse coordinates""" + if not self.model.active_map: + return + if mouse_coords: + front_obj = self.model.getObjectAtCoords(mouse_coords) + if front_obj != None: + if self.highlight_obj == None \ + or front_obj.getId() != \ + self.highlight_obj: + if self.model.game_state.hasObject(front_obj.getId()): + self.displayObjectText(self.highlight_obj, "") + self.model.active_map.outline_renderer.removeAllOutlines() + self.highlight_obj = front_obj.getId() + self.model.active_map.outline_renderer.addOutlined( + front_obj, + 0, + 137, 255, 2) + # get the text + item = self.model.objectActive(self.highlight_obj) + if item is not None: + self.displayObjectText(self.highlight_obj, + item.name) + else: + self.model.active_map.outline_renderer.removeAllOutlines() + self.highlight_obj = None + + + def moveCamera(self, direction): + """Move the camera in the given direction. + @type direction: list of two integers + @param direction: the two integers can be 1, -1, or 0 + @return: None """ + + if 'cameras' in dir(self.model.active_map): + cam = self.model.active_map.cameras[self.model.active_map.my_cam_id] + location = cam.getLocation() + position = location.getMapCoordinates() + + #how many pixls to move by each call + move_by = 1 + #create a new DoublePoint3D and add it to position DoublePoint3D + new_x, new_y = move_by * direction[0], move_by * direction[1] + + position_offset = fife.DoublePoint3D(int(new_x), int(new_y)) + position += position_offset + + #give location the new position + location.setMapCoordinates(position) + + #detach the camera from any objects + cam.detach() + #move the camera to the new location + cam.setLocation(location) + +