Beispiel #1
0
class MonorailEditor:
    FLAT, NORTH_SLOPE, EAST_SLOPE, SOUTH_SLOPE, WEST_SLOPE, ENTERANCE,\
    ERASE, MAX = range( 8 )

    X_OFFSET, Y_OFFSET = 20, 300

    def __init__( self, level_nr ):
        self.level_nr = level_nr
        self.load_level()
        self.current_tile = MonorailEditor.FLAT
        self.update_edit_tiles()

    def load_level( self ):
        self.level = Level()
        if os.path.exists( Level.get_filename( self.level_nr ) ):
            self.level.load( Level.get_filename( self.level_nr ) )

    def save_all( self ):
        self.level.save( Level.get_filename( self.level_nr ) )

    def do_tick( self, indev ):
        self.update_tiles()
        self.update_edit_tiles()

        if pygame.mouse.get_pressed()[0]: # Left mouse button
            if self.current_tile in [MonorailEditor.FLAT, MonorailEditor.ENTERANCE]:
                self.level.set_tile( self.edit_tile1 )
            elif self.current_tile in [MonorailEditor.NORTH_SLOPE, MonorailEditor.EAST_SLOPE, MonorailEditor.SOUTH_SLOPE, MonorailEditor.WEST_SLOPE]:
                self.level.set_tile( self.edit_tile1 )
                self.level.set_tile( self.edit_tile2 )
            elif self.current_tile == MonorailEditor.ERASE:
                self.level.remove_tile( self.edit_tile1.pos.x, self.edit_tile1.pos.y )


        if indev.key.went_down( K_PAGEUP ):
            if self.level_nr > 0:
                self.save_all()
                self.level_nr -= 1
                self.load_level()
        elif indev.key.went_down( K_PAGEDOWN ):
            self.save_all()
            self.level_nr += 1
            self.load_level()

        if indev.key.went_down( K_UP ):
            for tile in self.level.tiles:
                tile.pos.y -= 1
        if indev.key.went_down( K_DOWN ):
            for tile in self.level.tiles:
                tile.pos.y += 1
        if indev.key.went_down( K_LEFT ):
            for tile in self.level.tiles:
                tile.pos.x -= 1
        if indev.key.went_down( K_RIGHT ):
            for tile in self.level.tiles:
                tile.pos.x += 1


    def draw( self, surface, interpol, time_sec ):
        surface.fill( (50,50,50) )

        #resman.get("game.hud_left_surf").draw( surface, Vec2D(0,0) )


        frame = Frame( surface, time_sec, interpol )
        frame.X_OFFSET = MonorailEditor.X_OFFSET
        frame.Y_OFFSET = MonorailEditor.Y_OFFSET
        frame.draw_z( [self.level] )

        if self.current_tile in [MonorailEditor.FLAT, MonorailEditor.ENTERANCE]:
            frame.draw( self.edit_tile1 )

        elif self.current_tile in [MonorailEditor.NORTH_SLOPE ,MonorailEditor.EAST_SLOPE, MonorailEditor.SOUTH_SLOPE, MonorailEditor.WEST_SLOPE]:
            frame.draw( self.edit_tile1 )
            frame.draw( self.edit_tile2 )

        elif self.current_tile == MonorailEditor.ERASE:
            pass

        # draw filename
        font = pygame.font.Font( None, 24 )
        render_text = font.render( Level.get_filename( self.level_nr ), 0, (255,255,255) )
        surface.blit( render_text, (100,10) )

    def draw_mouse( self, surface, interpol, time_sec ):
        x, y = pygame.mouse.get_pos()
        resman.get("gui_surf").draw( surface, Vec2D(x, y), (0,0,32,32) )


    def mouse_down( self, button ):
        if button == 4: # Wheel up
            self.current_tile = (self.current_tile+MonorailEditor.MAX-1) % MonorailEditor.MAX
        if button == 5: # Wheel down
            self.current_tile = (self.current_tile+1) % MonorailEditor.MAX

        self.update_edit_tiles()

    def update_edit_tiles( self ):
        mouse_x, mouse_y = pygame.mouse.get_pos()

        pos = Vec3D((-mouse_y + (mouse_x+32)/2 - MonorailEditor.X_OFFSET/2 + MonorailEditor.Y_OFFSET) / 32,
    	            (mouse_y + (mouse_x-32)/2 - MonorailEditor.X_OFFSET/2 - MonorailEditor.Y_OFFSET) / 32,
                     0)

        if self.current_tile == MonorailEditor.FLAT:
            self.edit_tile1 = Tile( pos, Tile.Type.FLAT )
        elif self.current_tile == MonorailEditor.NORTH_SLOPE:
            self.edit_tile1 = Tile( pos, Tile.Type.NORTH_SLOPE_TOP )
            pos += Vec3D(-1,0,0)
            self.edit_tile2 = Tile( pos, Tile.Type.NORTH_SLOPE_BOT )
        elif self.current_tile == MonorailEditor.EAST_SLOPE:
            self.edit_tile1 = Tile( pos, Tile.Type.EAST_SLOPE_TOP )
            pos += Vec3D(0,1,0)
            self.edit_tile2 = Tile( pos, Tile.Type.EAST_SLOPE_BOT )
        elif self.current_tile == MonorailEditor.SOUTH_SLOPE:
            self.edit_tile1 = Tile( pos, Tile.Type.SOUTH_SLOPE_TOP )
            pos += Vec3D(-1,2,0)
            self.edit_tile2 = Tile( pos, Tile.Type.SOUTH_SLOPE_BOT )
        elif self.current_tile == MonorailEditor.WEST_SLOPE:
            self.edit_tile1 = Tile( pos, Tile.Type.WEST_SLOPE_TOP )
            pos += Vec3D(-2,1,0)
            self.edit_tile2 = Tile( pos, Tile.Type.WEST_SLOPE_BOT )
        elif self.current_tile == MonorailEditor.ENTERANCE:
            self.edit_tile1 = Enterance( pos )
        #elif self.current_tile == MonorailEditor.RAILGATE:
        #    self.edit_tile1 = RailGate( pos )
        elif self.current_tile == MonorailEditor.ERASE:
            self.edit_tile1 = Tile( pos, Tile.Type.FLAT )
            pass

    def update_tiles( self ):
        for tile in self.level.tiles:
            tile.pickup = None
            tile.set_selected( tile.is_switch() )
Beispiel #2
0
class MonorailEditor:
    FLAT, NORTH_SLOPE, EAST_SLOPE, SOUTH_SLOPE, WEST_SLOPE, ENTERANCE,\
    ERASE, MAX = range( 8 )

    X_OFFSET, Y_OFFSET = 20, 300

    def __init__(self, level_nr):
        self.level_nr = level_nr
        self.load_level()
        self.current_tile = MonorailEditor.FLAT
        self.update_edit_tiles()

    def load_level(self):
        self.level = Level()
        if os.path.exists(Level.get_filename(self.level_nr)):
            self.level.load(Level.get_filename(self.level_nr))

    def save_all(self):
        self.level.save(Level.get_filename(self.level_nr))

    def do_tick(self, indev):
        self.update_tiles()
        self.update_edit_tiles()

        if pygame.mouse.get_pressed()[0]:  # Left mouse button
            if self.current_tile in [
                    MonorailEditor.FLAT, MonorailEditor.ENTERANCE
            ]:
                self.level.set_tile(self.edit_tile1)
            elif self.current_tile in [
                    MonorailEditor.NORTH_SLOPE, MonorailEditor.EAST_SLOPE,
                    MonorailEditor.SOUTH_SLOPE, MonorailEditor.WEST_SLOPE
            ]:
                self.level.set_tile(self.edit_tile1)
                self.level.set_tile(self.edit_tile2)
            elif self.current_tile == MonorailEditor.ERASE:
                self.level.remove_tile(self.edit_tile1.pos.x,
                                       self.edit_tile1.pos.y)

        if indev.key.went_down(K_PAGEUP):
            if self.level_nr > 0:
                self.save_all()
                self.level_nr -= 1
                self.load_level()
        elif indev.key.went_down(K_PAGEDOWN):
            self.save_all()
            self.level_nr += 1
            self.load_level()

        if indev.key.went_down(K_UP):
            for tile in self.level.tiles:
                tile.pos.y -= 1
        if indev.key.went_down(K_DOWN):
            for tile in self.level.tiles:
                tile.pos.y += 1
        if indev.key.went_down(K_LEFT):
            for tile in self.level.tiles:
                tile.pos.x -= 1
        if indev.key.went_down(K_RIGHT):
            for tile in self.level.tiles:
                tile.pos.x += 1

    def draw(self, surface, interpol, time_sec):
        surface.fill((50, 50, 50))

        #resman.get("game.hud_left_surf").draw( surface, Vec2D(0,0) )

        frame = Frame(surface, time_sec, interpol)
        frame.X_OFFSET = MonorailEditor.X_OFFSET
        frame.Y_OFFSET = MonorailEditor.Y_OFFSET
        frame.draw_z([self.level])

        if self.current_tile in [
                MonorailEditor.FLAT, MonorailEditor.ENTERANCE
        ]:
            frame.draw(self.edit_tile1)

        elif self.current_tile in [
                MonorailEditor.NORTH_SLOPE, MonorailEditor.EAST_SLOPE,
                MonorailEditor.SOUTH_SLOPE, MonorailEditor.WEST_SLOPE
        ]:
            frame.draw(self.edit_tile1)
            frame.draw(self.edit_tile2)

        elif self.current_tile == MonorailEditor.ERASE:
            pass

        # draw filename
        font = pygame.font.Font(None, 24)
        render_text = font.render(Level.get_filename(self.level_nr), 0,
                                  (255, 255, 255))
        surface.blit(render_text, (100, 10))

    def draw_mouse(self, surface, interpol, time_sec):
        x, y = pygame.mouse.get_pos()
        resman.get("gui_surf").draw(surface, Vec2D(x, y), (0, 0, 32, 32))

    def mouse_down(self, button):
        if button == 4:  # Wheel up
            self.current_tile = (self.current_tile + MonorailEditor.MAX -
                                 1) % MonorailEditor.MAX
        if button == 5:  # Wheel down
            self.current_tile = (self.current_tile + 1) % MonorailEditor.MAX

        self.update_edit_tiles()

    def update_edit_tiles(self):
        mouse_x, mouse_y = pygame.mouse.get_pos()

        pos = Vec3D(
            (-mouse_y + (mouse_x + 32) / 2 - MonorailEditor.X_OFFSET / 2 +
             MonorailEditor.Y_OFFSET) / 32,
            (mouse_y + (mouse_x - 32) / 2 - MonorailEditor.X_OFFSET / 2 -
             MonorailEditor.Y_OFFSET) / 32, 0)

        if self.current_tile == MonorailEditor.FLAT:
            self.edit_tile1 = Tile(pos, Tile.Type.FLAT)
        elif self.current_tile == MonorailEditor.NORTH_SLOPE:
            self.edit_tile1 = Tile(pos, Tile.Type.NORTH_SLOPE_TOP)
            pos += Vec3D(-1, 0, 0)
            self.edit_tile2 = Tile(pos, Tile.Type.NORTH_SLOPE_BOT)
        elif self.current_tile == MonorailEditor.EAST_SLOPE:
            self.edit_tile1 = Tile(pos, Tile.Type.EAST_SLOPE_TOP)
            pos += Vec3D(0, 1, 0)
            self.edit_tile2 = Tile(pos, Tile.Type.EAST_SLOPE_BOT)
        elif self.current_tile == MonorailEditor.SOUTH_SLOPE:
            self.edit_tile1 = Tile(pos, Tile.Type.SOUTH_SLOPE_TOP)
            pos += Vec3D(-1, 2, 0)
            self.edit_tile2 = Tile(pos, Tile.Type.SOUTH_SLOPE_BOT)
        elif self.current_tile == MonorailEditor.WEST_SLOPE:
            self.edit_tile1 = Tile(pos, Tile.Type.WEST_SLOPE_TOP)
            pos += Vec3D(-2, 1, 0)
            self.edit_tile2 = Tile(pos, Tile.Type.WEST_SLOPE_BOT)
        elif self.current_tile == MonorailEditor.ENTERANCE:
            self.edit_tile1 = Enterance(pos)
        #elif self.current_tile == MonorailEditor.RAILGATE:
        #    self.edit_tile1 = RailGate( pos )
        elif self.current_tile == MonorailEditor.ERASE:
            self.edit_tile1 = Tile(pos, Tile.Type.FLAT)
            pass

    def update_tiles(self):
        for tile in self.level.tiles:
            tile.pickup = None
            tile.set_selected(tile.is_switch())