Mercurial > parpg-source
view gamesceneview.py @ 183:7b6aba7839ea
getGameEnvironment of GameState now returns a locals dictionary that is empty at the beginning of the game and will be saved in save games. The vals and funcs are now both in the globals dictionary.
This WILL break old saves.
author | Beliar <KarstenBock@gmx.net> |
---|---|
date | Thu, 15 Mar 2012 16:24:05 +0100 |
parents | 3dfd26b1c7ef |
children |
line wrap: on
line source
# 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.getObjectById("PlayerCharacter").fifeagent.behaviour.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.getObjectById("PlayerCharacter").fifeagent.\ 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.description.view_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)