Exemple #1
0
class Middle:
    """It handles the input, keeps track of time and draws objects to
    the screen.
    """

    @staticmethod
    def restore():
        """things to before shutdown"""
        System.restorescreen()


            
    def draw_minions(self):
        """Draws minions to screen."""
        for minion in self.logic.minions:
            self.system.draw_at(minion.pos.to_int(), 'o', 
                self.system.COLOR_BLACK, self.system.COLOR_YELLOW)

    def draw_bullets(self):
        """Draws bullets to screen."""
        for bullet in self.logic.bullets:
            if self.logic.current_level.tiles[int(bullet.pos.x), int(bullet.pos.y)] == 0:
                self.system.draw_at(bullet.pos.to_int(), '*', 
                    self.system.COLOR_BLACK, self.system.COLOR_GREEN)
            else:
                self.system.draw_at(bullet.pos.to_int(), '*', 
                    self.system.COLOR_BLACK, self.system.COLOR_YELLOW)

    def draw_towers(self):
        """Draws towers to screen."""
        for tower in self.logic.towers:
            self.system.draw_at(tower.pos.to_int(), '#', 
                self.system.COLOR_BLACK, self.system.COLOR_GREEN)

    def draw_map(self):
        """Draws map to screen."""
        for x in range(1, self.logic.current_level.max_x + 1):
            for y in range(1, self.logic.current_level.max_y + 1):
                if self.logic.current_level.tiles[x, y] == 0:
                    self.system.draw_at(Vector(x, y), ' ', 
                        self.system.COLOR_GREEN, self.system.COLOR_GREEN)
                else:
                    self.system.draw_at(Vector(x, y), ' ', 
                        self.system.COLOR_YELLOW, self.system.COLOR_YELLOW)
                        
    def draw_hud(self):
        """draws hud to screen"""
        self.windows['lives'].label = "lives:  %03d" % self.logic.lives
        self.windows['points'].label = "points: %03d" % self.logic.points
        self.windows['money'].label = "money:  %03d" % self.logic.money

    def load_map(self, file_name):
        """Loads map from xml file"""
        map_xml = minidom.parse(file_name)

        map_tag = map_xml.getElementsByTagName('map')[0]

        def get_data(elem, tag):
            return elem.getElementsByTagName(tag)[0].firstChild.data

        level = Level()
        level.max_y = int(get_data(map_tag, 'rows'))
        level.max_x = int(get_data(map_tag,'columns'))

        row_tag = map_xml.getElementsByTagName('row')

        for row in row_tag:
            row_data = row.firstChild.data
            y = int(row.attributes['pos'].value)
            for x in range(1, len(row_data)+1):
                level.tiles[x, y] = int(row_data[x-1])

        for waypoint in map_xml.getElementsByTagName('waypoint'):    
            number = int( waypoint.attributes['nr'].value )
            x = int( get_data(waypoint,'x'))
            y = int( get_data(waypoint,'y'))

            level.waypoints[number] = Vector(x, y)

        for wave in map_xml.getElementsByTagName('wave'):    
            w = Wave()
            w.offset_wave = int( get_data(wave, 'offset_wave'))
            w.offset_minion = int( get_data(wave, 'offset_minion'))
            w.hp_minion = int( get_data(wave, 'hp_minion'))
            w.nr_minion = int( get_data(wave, 'nr_minion'))

            level.waves.append(w)
            
        level.next_wave = level.waves[0]
        level.waves.remove(level.next_wave)        

        self.logic.current_level = level

    def Notify(self, event):
        if isinstance( event, KeyPressEvent ):
            if event.key == 'q': 
                self.evm.Post(QuitEvent())
            if event.key == 'a':
                self.logic.add_minion()
            if event.key == ' ':
                self.logic.current_level.send_next_wave()
                
        elif isinstance( event, MouseClickEvent ):
            self.logic.add_tower(event.pos.x, event.pos.y)
        elif isinstance( event, TickEvent ):
            self.evm.Send(ClearScreenEvent())
            self.draw_map()
            self.draw_minions()
            self.draw_towers()
            self.draw_bullets()
            self.draw_hud()
            
            self.wc.draw_widgets(self.main_window)

            if self.logic.current_level.next_wave and len(self.logic.current_level.active_waves) < len(self.wave_windows):
                self.wave_windows[len(self.logic.current_level.active_waves)].set_time(self.logic.current_level.next_wave.offset_wave)


        elif isinstance( event, WaveChangeEvent ):
            wavelist = []
            wavelist.extend(self.logic.current_level.active_waves)
            if self.logic.current_level.next_wave:
                wavelist.append(self.logic.current_level.next_wave)
            wavelist.extend(self.logic.current_level.waves)
            
            for i in range(0, min(len(self.wave_windows), len(wavelist))):
                wave = wavelist[i]
                window = self.wave_windows[i]
                window.set_nr(wave.nr_minion)
                window.border_bold = False
                window.show_time(False)

            for i in range(min(len(self.wave_windows), len(wavelist)),len(self.wave_windows)):
                self.wave_windows[i].show = False
                
            if self.logic.current_level.next_wave and len(self.logic.current_level.active_waves) < len(self.wave_windows):
                self.wave_windows[len(self.logic.current_level.active_waves)].border_bold = True
                self.wave_windows[len(self.logic.current_level.active_waves)].show_time(True)

    def __init__(self):

        from optparse import OptionParser
        parser = OptionParser(version="%prog 0.1.1")
        parser.add_option('-r', '--replay', 
                            dest='infile',
                            help='uses the recorded input instead of the user input')
        parser.add_option('-d', '--dump', 
                            dest='outfile',
                            help='writes the user input into a file')
        (options, args) = parser.parse_args()
        
        self.evm = EventManager()
        
        self.evm.RegisterListener(self)

        if options.infile:
            self.te = InputPlayer(self.evm, options.infile)
        else:
            self.te = TickEmitter(self.evm)
        
        self.system = System(self.evm)
        self.logic = Logic(self.evm)
        
        if options.outfile:
            self.input_recorder = InputRecorder(self.evm, options.outfile)
        
        self.load_map('map2.xml')
        
        #########################################
        ## create windows
        #########################################
        
        self.main_window = Widget(0,0,110,27)
        self.window = Widget(84,1,25,25)

        self.windows = {}

        self.windows['lives'] = Widget(1,1,23,3)
        self.windows['money'] = Widget(1,4,23,3)
        self.windows['points'] = Widget(1,7,23,3)

        for w in self.windows.values():
            self.window.add_child(w)
            
        self.main_window.add_child(self.window)

        self.wave_window = Widget(58,1,25,25)
        self.main_window.add_child(self.wave_window)
        
        wave_label = Widget(1,1,23,1)
        wave_label.label = 'Waves'
        wave_label.border = False
        self.wave_window.add_child(wave_label)

        self.wave_windows = []
        for i in range(0,4):
            w = WaveWidget(1,2 + i * 5, 23, 5)
            self.wave_windows.append(w)
            self.wave_window.add_child(w)
            
        self.wc = WidgetController(self.evm,self.system)
        
        help_window = Widget(1,22,56,4)

        help_window1 = Widget(0,1,56,1)
        help_window1.label = "Press space to send next wave. Hit q to quit the game."
        help_window1.border = False
        help_window.add_child(help_window1)

        help_window2 = Widget(0,2,56,1)
        help_window2.label = "Click anywhere on the map to place a tower."
        help_window2.border = False
        help_window.add_child(help_window2)
        
        self.main_window.add_child(help_window)

    def run(self):
        """The main game loop"""
        self.te.Run()

        # restore original settings
        self.system.restorescreen()