设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 116|回复: 0

[制作教程] Using RGSS3 with RPG Maker XP

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    前天 04:10
  • 签到天数: 209 天

    连续签到: 2 天

    [LV.7]常住居民III

    4472

    主题

    864

    回帖

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    22951
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    28317

    灌水之王

    发表于 2026-7-6 20:16:47 | 显示全部楼层 |阅读模式
    Before I begin, I'd have to say Dargor deserves the credit for a lot of this. I used his tutorial and applied most of it in the process of giving RMXP the capabilities of RGSS3.

    Introduction

    We will be going through the steps on how to implement RGSS3 into RPG Maker XP. Implementing it of course will give you access to a lot of RGSS3's cool features. Let us begin.

    In order to do this, you will need to have RPG Maker VX Ace in hand. Here, we will use RPG Maker VX Ace's RGSS301.dll and Game.exe.

    Steps

    Step 1: RTP

    If you are using the default RTP, export all of it into your Game's Project folder. If you don't, this will come back to bite you later on in this tutorial.

    Step 2: RGSS Library and Game.exe


    • Copy and paste RGSS301.dll to your Game's Project folder and rename it RGSS104E.dll (or whatever your DLL file might be. Look in Game.ini if you aren't sure.)
    • Replace the Game.exe in your project's folder with RPG Maker VX Ace's Game.exe

    Step 3: Scripts


    • RPG Objects
      Open RPG Maker XP
    • Open the Help Manual (F1)
    • Open the Script Editor (F11)
    • Copy all RPG objects from the Help Manual into the Script Editor. Make sure to put all of these scripts ABOVE everything else.
      Note that RPG::MoveCommand has an error.
      Here's how it looks in the manual:

            class MoveCommand(code = 0, parameters = [])
              def initialize
                @code = code
                @parameters = parameters
              end
              attr_accessor :code
              attr_accessor
      arameters
            end
          end

                      Code:        
      module RPG

      Here's how it should look:

            class MoveCommand
              def initialize(code = 0, parameters = [])
                @code = code
                @parameters = parameters
              end
              attr_accessor :code
              attr_accessor
      arameters
            end
          end

                      Code:        
      module RPG

    • Other Scripts
      Some hidden classes such as Tilemap and Window have changed significantly to the point where it might not work anymore.
      The most important thing to update is the Tilemap. Like Dargor, I'll also recommend Poccil's Tilemap script. It still works pretty well. Since I was only able to come across a text file of it on 4shared, I will share it here.   Spoilerattr_accessor :changed
        def initialize
         @changed=true
         @tiles=[nil,nil,nil,nil,nil,nil,nil]
        end
        def []=(i,value)
         @tiles=value
         @changed=true
        end
        def [](i)
         return @tiles
        end
      end

      class Tilemap
        Animated_Autotiles_Frames = 15
        Autotiles = [
          [ [27, 28, 33, 34], [ 5, 28, 33, 34], [27,  6, 33, 34], [ 5,  6, 33, 34],
            [27, 28, 33, 12], [ 5, 28, 33, 12], [27,  6, 33, 12], [ 5,  6, 33, 12] ],
          [ [27, 28, 11, 34], [ 5, 28, 11, 34], [27,  6, 11, 34], [ 5,  6, 11, 34],
            [27, 28, 11, 12], [ 5, 28, 11, 12], [27,  6, 11, 12], [ 5,  6, 11, 12] ],
          [ [25, 26, 31, 32], [25,  6, 31, 32], [25, 26, 31, 12], [25,  6, 31, 12],
            [15, 16, 21, 22], [15, 16, 21, 12], [15, 16, 11, 22], [15, 16, 11, 12] ],
          [ [29, 30, 35, 36], [29, 30, 11, 36], [ 5, 30, 35, 36], [ 5, 30, 11, 36],
            [39, 40, 45, 46], [ 5, 40, 45, 46], [39,  6, 45, 46], [ 5,  6, 45, 46] ],
          [ [25, 30, 31, 36], [15, 16, 45, 46], [13, 14, 19, 20], [13, 14, 19, 12],
            [17, 18, 23, 24], [17, 18, 11, 24], [41, 42, 47, 48], [ 5, 42, 47, 48] ],
          [ [37, 38, 43, 44], [37,  6, 43, 44], [13, 18, 19, 24], [13, 14, 43, 44],
            [37, 42, 43, 48], [17, 18, 47, 48], [13, 18, 43, 48], [ 1,  2,  7,  8] ]
        ]
        FlashOpacity=[100,90,80,70,80,90]
        attr_reader :tileset
        attr_reader :autotiles
        attr_reader :map_data
        attr_accessor :flash_data
        attr_accessor
      riorities
        attr_reader :visible
        attr_accessor
      x
        attr_accessor
      y
        attr_reader :viewport
        def initialize(viewport)
          @tileset    = nil  # Refers to Map Tileset Name
          @autotiles  = CustomTilemapAutotiles.new
          @map_data   = nil  # Refers to 3D Array Of Tile Settings
          @flash_data = nil  # Refers to 3D Array of Tile Flashdata
          @priorities = nil  # Refers to Tileset Priorities
          @visible    = true # Refers to Tileset Visibleness
          @ox         = 0    # Bitmap Offsets
          @oy         = 0    # bitmap Offsets
          @plane       = false
          @selfviewport=Viewport.new(0,0,640,480)
          @viewport=viewport ? viewport : @selfviewport
          @tiles=[]
          @autotileInfo=[]
          @regularTileInfo=[]
          @oldOx=0
          @oldOy=0
          @layer0=Sprite.new(viewport)
          @layer0.visible=true
          @nowshown=false
          @layer0.bitmap=Bitmap.new(@viewport.rect.width*2,@viewport.rect.height*2)
          @flash=nil
          @layer0.ox=0
          @layer0.oy=0
          @oxLayer0=0
          @oyLayer0=0
          @oxFlash=0
          @oyFlash=0
          @layer0.z=0
          @priotiles=[]
          @prioautotiles=[]
          @autosprites=[]
          @framecount=[]
          @tilesetChanged=true
          @flashChanged=false
          @firsttime=true
          @disposed=false
          @usedsprites=false
          @layer0clip=true
          @firsttimeflash=true
          @fullyrefreshed=false
          @fullyrefreshedautos=false
        end
        def disposed?
         return @disposed
        end
        def flash_data=(value)
         @flash_data=value
         @flashChanged=true   
        end
        def update
          if @autotiles.changed
            refresh_autotiles
            repaintAutotiles
          end
          if @flashChanged
            refresh_flash
          end
          if @tilesetChanged
            refresh_tileset
          end
          if @flash
           @flash.opacity=FlashOpacity[(Graphics.frame_count/2) % 6]
          end
          if !(@oldOx==@ox && @oldOy==@oy &&
                 !@tilesetChanged &&
                 !@autotiles.changed)
            refresh
          end
          if (Graphics.frame_count % Animated_Autotiles_Frames == 0) || @nowshown
            repaintAutotiles
            refresh(true)
          end
          @nowshown=false
          @autotiles.changed=false
          @tilesetChanged=false
        end
      def priorities=(value)
        @priorities=value
        @tilesetChanged=true
      end
      def tileset=(value)
        @tileset=value
        @tilesetChanged=true
      end
      def shown?
         return false if !@visible
         ysize=@map_data.ysize
         xsize=@map_data.xsize
         xStart=(@ox/32)-1
         xEnd=((@ox+@viewport.rect.width)/32)+1
         yStart=(@oy/32)-1
         yEnd=((@oy+@viewport.rect.height)/32)+1
         xStart=0 if xStart<0
         xStart=xsize-1 if xStart>=xsize
         xEnd=0 if xEnd<0
         xEnd=xsize-1 if xEnd>=xsize
         yStart=0 if yStart<0
         yStart=ysize-1 if yStart>=ysize
         yEnd=0 if yEnd<0
         yEnd=ysize-1 if yEnd>=ysize
         return (xStart<xEnd && yStart<yEnd)
      end
      def dispose
      return if disposed?
      @help.dispose if @help
      @help=nil
      i=0;len=@autotileInfo.length;while i<len
        if @autotileInfo
           @autotileInfo.dispose
           @autotileInfo=nil
        end
        i+=1
      end
      i=0;len=@regularTileInfo.length;while i<len
        if @regularTileInfo
           @regularTileInfo.dispose
           @regularTileInfo=nil
        end
        i+=1
      end
      i=0;len=@tiles.length;while i<len
        @tiles.dispose
        @tiles=nil
        i+=2
      end
      i=0;len=@autosprites.length;while i<len
        @autosprites.dispose
        @autosprites=nil
        i+=2
      end
      if @layer0
        @layer0.bitmap.dispose if !@layer0.disposed?
        @layer0.bitmap=nil if !@layer0.disposed?
        @layer0.dispose
        @layer0=nil
      end
      if @flash
        @flash.bitmap.dispose if !@flash.disposed?
        @flash.bitmap=nil if !@flash.disposed?
        @flash.dispose
        @flash=nil
      end
      for i in 0...7
        self.autotiles=nil
      end
      @tiles.clear
      @autosprites.clear
      @autotileInfo.clear
      @regularTileInfo.clear
      @tilemap=nil
      @tileset=nil
      @priorities=nil
      @selfviewport.dispose
      @selfviewport=nil
      @disposed=true
      end

      def bltAutotile(bitmap,x,y,id,frame)
        return if frame<0
        autotile=@autotiles[id/48-1]
        return if !autotile
        if autotile.height==32
          anim=frame*32
          src_rect=Rect.new(anim,0,32,32)
          bitmap.blt(x,y,autotile,src_rect)
        else
          anim=frame*96
          id%=48
          tiles = Autotiles[id>>3][id&7]
          src=Rect.new(0,0,0,0)
          for i in 0...4
            tile_position = tiles - 1
            src.set(tile_position % 6 * 16 + anim,
             tile_position / 6 * 16, 16, 16)
            bitmap.blt(i%2*16+x,i/2*16+y, autotile, src)
          end
        end
      end

      def autotileNumFrames(id)
        autotile=@autotiles[id/48-1]
        return 0 if !autotile || autotile.disposed?
        frames=1
        if autotile.height==32
         frames=autotile.width/32
        else
         frames=autotile.width/96
        end
        return frames
      end

      def autotileFrame(id)
        autotile=@autotiles[id/48-1]
        return -1 if !autotile || autotile.disposed?
        frames=1
        if autotile.height==32
         frames=autotile.width/32
        else
         frames=autotile.width/96
        end
        return (Graphics.frame_count/Animated_Autotiles_Frames)%frames
      end

      def repaintAutotiles
      for i in 0...@autotileInfo.length
        next if !@autotileInfo
        frame=autotileFrame(i)
        bltAutotile(@autotileInfo,0,0,i,frame)
      end
      end

      def getAutotile(sprite,id)
        anim=autotileFrame(id)
        return if anim<0
        bitmap=@autotileInfo[id]
        if !bitmap
          bitmap=Bitmap.new(32,32)
          bltAutotile(bitmap,0,0,id,anim)
          @autotileInfo[id]=bitmap
        end
        sprite.bitmap=bitmap if !sprite.equal?(bitmap) || sprite.bitmap!=bitmap
      end

      def getRegularTile(sprite,id)
      if false
        sprite.bitmap=@tileset if !sprite.equal?(@tileset) || sprite.bitmap!=@tileset
        sprite.src_rect.set((id - 384) % 8 * 32, (id - 384) / 8 * 32,32,32)
      else
        bitmap=@regularTileInfo[id]
        if !bitmap
         bitmap=Bitmap.new(32,32)
         rect=Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32,32,32)
         bitmap.blt(0,0,@tileset,rect)
         @regularTileInfo[id]=bitmap
        end
        sprite.bitmap=bitmap if !sprite.equal?(bitmap) || sprite.bitmap!=bitmap
      end
      end

      def addTile(tiles,count,xpos,ypos,id)
         if id>=384
           if count>=tiles.length
            sprite=Sprite.new(@viewport)
            tiles.push(sprite,0)
           else
            sprite=tiles[count]
            tiles[count+1]=0
           end
           sprite.visible=@visible
           sprite.x=xpos
           sprite.y=ypos
           getRegularTile(sprite,id)
           spriteZ=(@priorities[id]==0||!@priorities[id]) ? 0 : ypos+@priorities[id]*32+32
           sprite.z=spriteZ
           count+=2
         else
           if count>=tiles.length
            sprite=Sprite.new(@viewport)
            tiles.push(sprite,1)
           else
            sprite=tiles[count]
            tiles[count+1]=1
           end
           sprite.visible=@visible
           sprite.x=xpos
           sprite.y=ypos
           getAutotile(sprite,id)
           spriteZ=(@priorities[id]==0||!@priorities[id]) ? 0 : ypos+@priorities[id]*32+32
           sprite.z=spriteZ
           count+=2
         end
         return count
      end

      def refresh_tileset
      i=0;len=@regularTileInfo.length;while i<len
        if @regularTileInfo
           @regularTileInfo.dispose
           @regularTileInfo=nil
        end
        i+=1
      end
      @regularTileInfo.clear
      @priotiles.clear
      ysize=@map_data.ysize
      xsize=@map_data.xsize
      zsize=@map_data.zsize
      if xsize>100 || ysize>100
        @fullyrefreshed=false
      else
        for z in 0...zsize
         for y in 0...ysize
          for x in 0...xsize
           id = @map_data[x, y, z]
           next if id==0 || !@priorities[id]
           next if @priorities[id]==0
           @priotiles.push([x,y,z,id])
          end
         end
        end
        @fullyrefreshed=true
      end
      end

      def refresh_flash
      if @flash_data && !@flash
        @flash=Sprite.new(viewport)
        @flash.visible=true
        @flash.z=1
        @flash.blend_type=1
        @flash.bitmap=Bitmap.new(@viewport.rect.width*2,@viewport.rect.height*2)
        @firsttimeflash=true
      elsif !@flash_data && @flash
        @flash.bitmap.dispose if @flash.bitmap
        @flash.dispose
        @flash=nil
        @firsttimeflash=false
      end
      end

      def refresh_autotiles
      i=0;len=@autotileInfo.length;while i<len
        if @autotileInfo
           @autotileInfo.dispose
           @autotileInfo=nil
        end
        i+=1
      end
      i=0;len=@autosprites.length;while i<len
        if @autosprites
           @autosprites.dispose
           @autosprites=nil
        end
        i+=2
      end
      @autosprites.clear
      @autotileInfo.clear
      @prioautotiles.clear
      hasanimated=false
      for i in 0...7
        numframes=autotileNumFrames(48*(i+1))
        hasanimated=true if numframes>=2
        @framecount=numframes
      end
      if hasanimated
        ysize=@map_data.ysize
        xsize=@map_data.xsize
        zsize=@map_data.zsize
        if xsize>100 || ysize>100
          @fullyrefreshedautos=false
        else
          for y in 0...ysize
           for x in 0...xsize
            haveautotile=false
            for z in 0...zsize
             id = @map_data[x, y, z]
             next if id==0 || id>=384 || @priorities[id]!=0 || !@priorities[id]
             next if @framecount[id/48-1]<2
             haveautotile=true
             break
            end
            @prioautotiles.push([x,y]) if haveautotile
           end
          end
          @fullyrefreshedautos=true
        end
      else
        @fullyrefreshedautos=true
      end
      end

      def map_data=(value)
      @map_data=value
      @tilesetChanged=true
      end

      def refreshFlashSprite
      return if !@flash || @flash_data.nil?
      ptX=@ox-@oxFlash
      ptY=@oy-@oyFlash
      if !@firsttimeflash && !@usedsprites &&
          ptX>=0 && ptX+@viewport.rect.width<=@flash.bitmap.width &&
          ptY>=0 && ptY+@viewport.rect.height<=@flash.bitmap.height
        @flash.ox=0
        @flash.oy=0
        @flash.src_rect.set(ptX.round,ptY.round,
           @viewport.rect.width,@viewport.rect.height)
        return
      end
      width=@flash.bitmap.width
      height=@flash.bitmap.height
      bitmap=@flash.bitmap
      ysize=@map_data.ysize
      xsize=@map_data.xsize
      zsize=@map_data.zsize
      @firsttimeflash=false
      @oxFlash=@ox-(width>>2)
      @oyFlash=@oy-(height>>2)
      @flash.ox=0
      @flash.oy=0
      @flash.src_rect.set(width>>2,height>>2,
           @viewport.rect.width,@viewport.rect.height)
      @flash.bitmap.clear
      @oxFlash=@oxFlash.floor
      @oyFlash=@oyFlash.floor
      xStart=(@oxFlash>>5)
      xStart=0 if xStart<0
      yStart=(@oyFlash>>5)
      yStart=0 if yStart<0
      xEnd=xStart+(width>>5)+1
      yEnd=yStart+(height>>5)+1
      xEnd=xsize if xEnd>=xsize
      yEnd=ysize if yEnd>=ysize
      if xStart<xEnd && yStart<yEnd
        yrange=yStart...yEnd
        xrange=xStart...xEnd
        tmpcolor=Color.new(0,0,0,0)
        for y in yrange
         ypos=(y<<5)-@oyFlash
         for x in xrange
           xpos=(x<<5)-@oxFlash
           id = @flash_data[x, y, 0]
           r=(id>>8)&15
           g=(id>>4)&15
           b=(id)&15
           tmpcolor.set(r*16,g*16,b*16)
           bitmap.fill_rect(xpos,ypos,32,32,tmpcolor)
         end
        end
      end
      end


      def refreshLayer0(autotiles=false)
      ptX=@ox-@oxLayer0
      ptY=@oy-@oyLayer0
      if !autotiles && !@firsttime && !@usedsprites &&
          ptX>=0 && ptX+@viewport.rect.width<=@layer0.bitmap.width &&
          ptY>=0 && ptY+@viewport.rect.height<=@layer0.bitmap.height
        if @layer0clip
         @layer0.ox=0
         @layer0.oy=0
         @layer0.src_rect.set(ptX.round,ptY.round,
           @viewport.rect.width,@viewport.rect.height)
        else
         @layer0.ox=ptX.round
         @layer0.oy=ptY.round
         @layer0.src_rect.set(0,0,@layer0.bitmap.width,@layer0.bitmap.height)
        end
        return true
      end
      width=@layer0.bitmap.width
      height=@layer0.bitmap.height
      bitmap=@layer0.bitmap
      ysize=@map_data.ysize
      xsize=@map_data.xsize
      zsize=@map_data.zsize
      if autotiles
        return true if @fullyrefreshedautos && @prioautotiles.length==0
        return true if !shown?
        xStart=(@oxLayer0>>5)
        xStart=0 if xStart<0
        yStart=(@oyLayer0>>5)
        yStart=0 if yStart<0
        xEnd=xStart+(width>>5)+1
        yEnd=yStart+(height>>5)+1
        xEnd=xsize if xEnd>xsize
        yEnd=ysize if yEnd>ysize
        return true if xStart>=xEnd || yStart>=yEnd
        trans=Color.new(0,0,0,0)
        temprect=Rect.new(0,0,0,0)
        tilerect=Rect.new(0,0,32,32)
        range=0...zsize
        overallcount=0
        count=0
        if !@fullyrefreshedautos
         for y in yStart..yEnd
          for x in xStart..xEnd
           haveautotile=false
           for z in range
            id = @map_data[x, y, z]
            next if id<48 || id>=384 || @priorities[id]!=0 || !@priorities[id]
            next if @framecount[id/48-1]<2
            haveautotile=true
            break
           end
           next if !haveautotile
           overallcount+=1
           xpos=(x<<5)-@oxLayer0
           ypos=(y<<5)-@oyLayer0
           bitmap.fill_rect(xpos,ypos,0,0,trans) if overallcount<=2000
           for z in range
            id = @map_data[x,y,z]
            next if id<48 || @priorities[id]!=0 || !@priorities[id]
            if overallcount>2000
             count=addTile(@autosprites,count,xpos,ypos,id)
             next
            elsif id>=384
             temprect.set((id - 384) % 8 * 32, (id - 384) / 8 * 32,32,32)
             bitmap.blt(xpos,ypos,@tileset,temprect)
            else
             tilebitmap=@autotileInfo[id]
             if !tilebitmap
              anim=autotileFrame(id)
              next if anim<0
              tilebitmap=Bitmap.new(32,32)
              bltAutotile(tilebitmap,0,0,id,anim)
              @autotileInfo[id]=tilebitmap
             end
             bitmap.blt(xpos,ypos,tilebitmap,tilerect)
            end
           end
          end
         end
        else
         for tile in @prioautotiles
          x=tile[0]
          y=tile[1]
          next if x<xStart||x>xEnd
          next if y<yStart||y>yEnd
          overallcount+=1
          xpos=(x<<5)-@oxLayer0
          ypos=(y<<5)-@oyLayer0
          bitmap.fill_rect(xpos,ypos,0,0,trans) if overallcount<=2000
          for z in range
           id = @map_data[x,y,z]
           next if id<48 || @priorities[id]!=0 || !@priorities[id]
           if overallcount>2000
            count=addTile(@autosprites,count,xpos,ypos,id)
            next
           elsif id>=384
            temprect.set((id - 384) % 8 * 32, (id - 384) / 8 * 32,32,32)
            bitmap.blt(xpos,ypos,@tileset,temprect)
           else
            tilebitmap=@autotileInfo[id]
            if !tilebitmap
              anim=autotileFrame(id)
              next if anim<0
              tilebitmap=Bitmap.new(32,32)
              bltAutotile(tilebitmap,0,0,id,anim)
              @autotileInfo[id]=tilebitmap
            end
            bitmap.blt(xpos,ypos,tilebitmap,tilerect)
           end
          end
         end
        end
        Graphics.frame_reset if overallcount>2000
        @usedsprites=false
        return true
      end
      return false if @usedsprites
      @firsttime=false
      @oxLayer0=@ox-(width>>2)
      @oyLayer0=@oy-(height>>2)
      if @layer0clip
        @layer0.ox=0
        @layer0.oy=0
        @layer0.src_rect.set(width>>2,height>>2,
           @viewport.rect.width,@viewport.rect.height)
      else
        @layer0.ox=(width>>2)
        @layer0.oy=(height>>2)
      end
      @layer0.bitmap.clear
      @oxLayer0=@oxLayer0.floor
      @oyLayer0=@oyLayer0.floor
      xStart=(@oxLayer0>>5)
      xStart=0 if xStart<0
      yStart=(@oyLayer0>>5)
      yStart=0 if yStart<0
      xEnd=xStart+(width>>5)+1
      yEnd=yStart+(height>>5)+1
      xEnd=xsize if xEnd>=xsize
      yEnd=ysize if yEnd>=ysize
      if xStart<xEnd && yStart<yEnd
        tmprect=Rect.new(0,0,0,0)
        yrange=yStart...yEnd
        xrange=xStart...xEnd
        for z in 0...zsize
         for y in yrange
          ypos=(y<<5)-@oyLayer0
          for x in xrange
           xpos=(x<<5)-@oxLayer0
           id = @map_data[x, y, z]
           next if id==0 || @priorities[id]!=0 || !@priorities[id]
           if id>=384
             tmprect.set((id - 384) % 8 * 32, (id - 384) / 8 * 32,32,32)
             bitmap.blt(xpos,ypos,@tileset,tmprect)
           else
             frame=autotileFrame(id)
             bltAutotile(bitmap,xpos,ypos,id,frame)
           end
          end
         end
        end
        Graphics.frame_reset
      end
      return true
      end
      def getResizeFactor
        return $ResizeFactor ? $ResizeFactor : 1.0
      end
      def ox=(val)
         val=(val*getResizeFactor).to_i
         val=(val/getResizeFactor).to_i
         wasshown=self.shown?
         @ox=val.floor
         @nowshown=(!wasshown && self.shown?)
      end
      def oy=(val)
         val=(val*getResizeFactor).to_i
         val=(val/getResizeFactor).to_i
         wasshown=self.shown?
         @oy=val.floor
         @nowshown=(!wasshown && self.shown?)
      end
      def visible=(val)
         wasshown=@visible
         @visible=val
         @nowshown=(!wasshown && val)
      end
      def refresh(autotiles=false)
      @oldOx=@ox
      @oldOy=@oy
      usesprites=false
      if @layer0
        @layer0.visible=@visible
        usesprites=!refreshLayer0(autotiles)
        if autotiles && !usesprites
         return
        end
      else
        usesprites=true
      end
      refreshFlashSprite
      vpx=@viewport.rect.x
      vpy=@viewport.rect.y
      vpr=@viewport.rect.width+vpx
      vpb=@viewport.rect.height+vpy
      xsize=@map_data.xsize
      ysize=@map_data.ysize
      minX=(@ox/32)-1
      maxX=((@ox+@viewport.rect.width)/32)+1
      minY=(@oy/32)-1
      maxY=((@oy+@viewport.rect.height)/32)+1
      minX=0 if minX<0
      minX=xsize-1 if minX>=xsize
      maxX=0 if maxX<0
      maxX=xsize-1 if maxX>=xsize
      minY=0 if minY<0
      minY=ysize-1 if minY>=ysize
      maxY=0 if maxY<0
      maxY=ysize-1 if maxY>=ysize
      count=0
      if minX<maxX && minY<maxY
        @usedsprites=usesprites || @usedsprites
        if @layer0
         @layer0.visible=false if usesprites
        end
        if @fullyrefreshed
         for prio in @priotiles
          next if prio[0]<minX||prio[0]>maxX
          next if prio[1]<minY||prio[1]>maxY
          id=prio[3]
          xpos=(prio[0]<<5)-@ox
          ypos=(prio[1]<<5)-@oy
          count=addTile(@tiles,count,xpos,ypos,id)
         end
        else
         for z in 0...@map_data.zsize
          for y in minY..maxY
           for x in minX..maxX
            id = @map_data[x, y, z]
            next if id==0 || !@priorities[id]
            next if @priorities[id]==0
            xpos=(x<<5)-@ox
            ypos=(y<<5)-@oy
            count=addTile(@tiles,count,xpos,ypos,id)
           end
          end
         end
        end
      end
      if count<@tiles.length
        bigchange=(count<=(@tiles.length*2/3)) && (@tiles.length*2/3)>25
        j=count;len=@tiles.length;while j<len
         sprite=@tiles[j]
         @tiles[j+1]=-1
         if bigchange
          sprite.dispose
          @tiles[j]=nil
          @tiles[j+1]=nil
         elsif !@tiles[j].disposed?
          sprite.visible=false if sprite.visible
         end
         j+=2
        end
        @tiles.compact! if bigchange
      end
      end

      end

                      Code:        
      class CustomTilemapAutotiles






    • As for the Window/Windowskin, there's two steps you'll have to do here.

    • Because of the changed libraries, you're now going to need a windowskin that can work with RPG Maker VX. You could either use an RPG Maker VX windowskin or if you'd prefer to keep your RMXP Windowskin, you could use my RMXP to RMVX (Ace) windowskin converter script and add that above main.

    • Because RGSS3 now has a padding property, windows will start to appear slightly awkward, like so:



      Because of this, you'll need to copy this snippet and paste it above main as well:

      # ** Window_Base
      #------------------------------------------------------------------------------
      #  This class is for all in-game windows.
      #==============================================================================

      class Window_Base
        alias_method
      rmxptorgss3_initialize, :initialize)
        def initialize(*args)
          rmxptorgss3_initialize(*args)
          self.padding = 16
        end
      end

                      Code:        
      #==============================================================================




    • Next up, we're going to have to do a complete rewrite of main. Why? Because Game.exe shuts itself down now, that's why. Copy and paste this code onto main.

      # ** Main
      #------------------------------------------------------------------------------
      #  After defining each class, actual processing begins here.
      #==============================================================================

      rgss_main {
        $DEBUG = $TEST = true            # Remove this when your project is finished.
        Graphics.resize_screen(640, 480) # Resizes the screen.
        # Prepare for transition
        Graphics.freeze
        $scene = Scene_Title.new
        # Call main method as long as $scene is effective
        $scene.main while $scene != nil
        Graphics.transition(20)
      }

                      Code:        
      #==============================================================================

    • Bringing back print
      This is optional, but for those who liked print... here's a quick snippet to bring that back.

      # ** Kernel
      #------------------------------------------------------------------------------
      #  A module defining the methods that can be referred to by all classes.
      #  Object classes are included in this module
      #==============================================================================

      module Kernel
        def print(*args)
          msgbox(*args)
        end
      end

                      Code:        
      #==============================================================================




      Step 4: Fonts
      Because it's now using the RGSS3 Library and VX Ace's Game.exe, your project will now look for a font named VL Gothic.
      You should find the Fonts folder in C:\Program Files (x86)\Common Files\Enterbrain\RGSS3\RPGVXAce.
    • Copy the folder and paste it into your project's folder.

    FAQ / Issues


    • Q: I'm getting a Failed to Load Scripts error.
      A: Rename Game.rgssad to Game.rgss3a
    • Q: I'm getting a Failed to Load Archive error when trying to run an encrypted game.
      A: I hate to not have any good news, but I'm clueless as to how to fix it.

    Demo

    Coming soon.



    本贴来自国际rpgmaker官方论坛作者:PK8处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/using-rgss3-with-rpg-maker-xp.2936/

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-7-14 18:02 , Processed in 0.098697 second(s), 52 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表