Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Using_gif script?

papa

Member

I found this script:

Code:
=begin

  ??:????? - GIF?????
  
  ??:??????GIF?? ? ?????
  
  ??: ????:
  
        1??? @gs = GIFSprite.new([viewport,[x,[,y,[loop_counts]]]])
           ??GIF????;
           
        2????? @gs.bitmap = "gif_filename" ? ???????;
        
        3??? @gs.loop_counts = n   
           
           ??????,-1??????(???),0??????
           
        4?@gs.x = x,@gs.y = y,@gs.z = z ?????????
  
  ??:1??????????,???????????,????????????
  
        ??????????????,???? GIFSprite.TmpFileclear ????
        
        ???
        
        2?????GIFSprite.pre_load(filename_arr) ??????????        
        
  ??:v1.0
        
  ??:?????
  
=end


#==============================================================================
# ? System
#------------------------------------------------------------------------------
# ?????????? ?
#==============================================================================
module System
  
  #--------------------------------------------------------------------------
  # ? ????
  #--------------------------------------------------------------------------
  module_function
  
  #--------------------------------------------------------------------------
  # ? API????
  #--------------------------------------------------------------------------
  WinExec = Win32API.new("kernel32","WinExec",'pi','i')

  #--------------------------------------------------------------------------
  # ? ?????????????
  #  filename :????????
  #
  #  +a -a    :????? ?? ??
  #  +r -r    :????? ?? ??
  #  +s -s    :????? ?? ??
  #  +h -h    :????? ?? ??
  #--------------------------------------------------------------------------
  def attrib(filename,*args)
    if args.empty?
      astr = `attrib #{filename}`
      attri_arr = Array.new
      astr = astr.split(/:/)[0]
      astr = astr[0,astr.size - 1]
      astr.gsub!(/ /,"")
      return astr.split(//)
    else
      cmdline = ""
      for cmdchar in args
        cmdchar.downcase!
        next if cmdline.include? cmdchar
        if ["+a","-a","+r","-r","+s","-s","+h","-h"].include? cmdchar
          cmdline += " " + cmdchar
        end
      end
      cmdline += " "
      result = WinExec.call("attrib #{cmdline}#{filename}",0)
      if result < 31
        return
      end
    end
  end
  
end

#==============================================================================
# ? GIF
#------------------------------------------------------------------------------
# ?????GIF??????? ?
#==============================================================================
module GIF
  
  # ????
  SIZE_GIFH = 6
  
  SIZE_GIFS = 7
  
  SIZE_GIFI = 9
  
  SIZE_GIFC = 6
  
  SIZE_GIFP = 13
  
  SIZE_GIFA = 12
  
  CODE_MASK = [0x0000,
               0x0001,0x0003,0x0007,0x000f,
               0x001f,0x003f,0x007f,0x00ff,
               0x01ff,0x03ff,0x07ff,0x0fff]
  
  INC_TABLE = [8,8,4,2,0]
  
  BGN_TABLE = [0,4,2,1,0]
  
  # ?????
  Dir.mkdir("GIF") unless Dir["*"].include?("GIF")
  
  # ????
  module_function
  
  #--------------------------------------------------------------------------
  # ? ??gif??
  #--------------------------------------------------------------------------
  def analyze_gif
    @old_dir = Dir.pwd
    Dir.chdir("GIF")
    @total_gif = []
    for g in Dir["*"]
      suf = g.split(/\./)
      if suf[1].is_a?(String) and suf[1].downcase == "gif"
        @total_gif.push(g)
        Dir.mkdir(suf[0]) unless Dir["*"].include? suf[0]
      end
    end
    @total_gif.each{|file| self.readdata(file)}
    Dir.chdir(@old_dir)
    p '??????,??????'
    exit
  end
  
  #--------------------------------------------------------------------------
  # ? ??????:????@gif_infos,????nil
  #--------------------------------------------------------------------------
  def readdata(filename)
    # ???????????
    tmp_filename = File.basename(filename,".*")
    unless Dir["~TEMP/#{tmp_filename}_infos.fmd"].empty?
      begin
        giffr = open("~TEMP/#{tmp_filename}_infos.fmd","rb")
        tmp_infos = Marshal.load(giffr)
        giffr.close
        if Dir["~TEMP/#{tmp_filename}_*.png"].size == tmp_infos.total_frames
          return tmp_infos
        end
      rescue
      end
    end
    # ?????
    self.initial_var(filename)
    # ????
    begin
      @f = open(filename,"rb")
      # ?????
      self.read_gifh
      # ?????????
      self.read_gifs
      # ???????
      @temp = @f.read(1)[0]
      # ???????????
      while true
        if @temp == 0x2c
          # ???????
          self.read_gifi
        end
        if @temp == 0x21
          # ???????
          self.read_gife
        end
        if @temp == 0x3b
          break
        end
        # ???????
        @temp = @f.read(1)[0]
      end
      # ? ??????
      @gif_infos.total_frames = @frame_count
      # ? ????????
      giffw = open("~TEMP/#{@filename}_infos.fmd","wb")
      Marshal.dump(@gif_infos,giffw)
      giffw.close
    rescue
      return nil
    ensure
      @f.close
    end
    return @gif_infos
  end
  
  #--------------------------------------------------------------------------
  # ? ?????
  #--------------------------------------------------------------------------
  def initial_var(filename)
    # ? ????????
    @gif_infos = GIFSprite::Infos.new
    # ????
    @frame_count = 0
    @f = nil
    @temp = nil
    # ?????
    @filename = File.basename(filename,".*")
  end
  
  #--------------------------------------------------------------------------
  # ? ?????
  #--------------------------------------------------------------------------
  def read_gifh
    @gifh = @f.read(SIZE_GIFH)
    if @gifh[0,3] != "GIF"
      raise "??GIF??!"
    end
    if @gifh[3,3] != "87a" and @gifh[3,3] != "89a"
      raise "??????!"
    end
  end
  
  #--------------------------------------------------------------------------
  # ? ?????????
  #--------------------------------------------------------------------------
  def read_gifs
    @gifs = @f.read(SIZE_GIFS).unpack("S2C3")
    # ???????
    @_pal_bits = (@gifs[2] & 7) + 1
    # ? ??????
    @gif_infos.width = @gifs[0]
    # ? ??????
    @gif_infos.height = @gifs[1]
    # ????????
    if @gifs[2] >> 7 == 1
      # ???????
      @g_pal_size = 3 * (1 << @_pal_bits)
      # ?????????
      @g_pal = @f.read(@g_pal_size).unpack("C*")
    end
  end
  
  #--------------------------------------------------------------------------
  # ? ???????
  #--------------------------------------------------------------------------
  def read_gifi
    # ???????
    @gifi = @f.read(SIZE_GIFI).unpack("S4C")
    # ? ?????????
    @gif_fd = GIFSprite::Infos::FrameData.new if @gif_fd.nil?
    # ? ?????
    @gif_fd.offset_x = @gifi[0]
    @gif_fd.offset_y = @gifi[1]
    # ???????
    @_width = @gifi[2]
    @_height = @gifi[3]
    # ???????
    @l_pal = nil
    # ????????
    if @gifi[4] >> 7 == 1
      # ???????
      @_pal_bits = (@gifi[4] & 7) + 1
      # ???????
      @l_pal_size = 3 * (1 << @_pal_bits)
      # ?????????
      @l_pal = @f.read(@l_pal_size).unpack("C*")
    end
    # ??????
    @_lace = (@gifi[4] >> 6) & 1
    # ???????
    @_pal_bits = @_pal_bits == 1 ? 1 : (@_pal_bits <= 4 ? 4 : 8)
    # ??????
    @_width_bytes = (((@_width * @_pal_bits) + 31) >> 5) << 2
    # ????????
    self.read_lzw_data
    # ? ??GIF???
    @gif_infos.frame_data[@frame_count - 1] = @gif_fd
    # ? ?????
    @gif_fd = nil
  end
  
  #--------------------------------------------------------------------------
  # ? ????????
  #--------------------------------------------------------------------------
  def read_lzw_data
    # ???
    lzw_mincodelen = @f.read(1)[0]
    # ??? 1
    @frame_count += 1
    # ?????
    image_data = ""
    # ???
    blocksize = @f.read(1)[0]
    while blocksize > 0
      image_data += @f.read(blocksize)
      blocksize = @f.read(1)[0]
    end
    # ????
    self.dump_imgs(image_data,lzw_mincodelen)
  end
 
  #--------------------------------------------------------------------------
  # ? ?????
  #--------------------------------------------------------------------------
  def read_gife
    label = @f.read(1)[0]
    case label
    when 0xf9 # ???????
      @gifc = @f.read(SIZE_GIFC).unpack("C2SC2")
      # ? ???????
      @gif_fd = GIFSprite::Infos::FrameData.new   
      # ? ????? ????
      @gif_fd.delay_time = @gifc[2]
      # ? ??????????
      @gif_fd.disposal_method = (@gifc[1] & 28) >> 2
      # ??????
      @_trans_index = nil
      if @gifc[1] & 1 > 0
        @_trans_index = @gifc[3]
      end
    when 0x01 # ???????
      @gifp = @f.read(SIZE_GIFP).unpack("CS4C4")
      blocksize = @f.read(1)[0]
      while blocksize > 0
        @f.read(blocksize)
        blocksize = @f.read(1)[0]
      end 
    when 0xfe # ???????
      blocksize = @f.read(1)[0]
      while blocksize > 0
        @f.read(blocksize)
        blocksize = @f.read(1)[0]
      end
    when 0xff # ???????
      @gifa = @f.read(SIZE_GIFA).unpack("C*")
      blocksize = @f.read(1)[0]
      while blocksize > 0
        @f.read(blocksize)
        blocksize = @f.read(1)[0]
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ? ?????
  #--------------------------------------------------------------------------
  def set_pal
    @_pal = []
    if @l_pal != nil
      @_pal = @l_pal
    elsif @g_pal != nil
      @_pal = @g_pal
    else
      for i in 0...1 << @_pal_bits
        @_pal.push i,i,i
      end
    end 
  end
  
  #--------------------------------------------------------------------------
  # ? ??????
  #--------------------------------------------------------------------------
  def dump_imgs(image_data,lze_len)
    @image_data = image_data.unpack("C*")
    
    self.set_pal
    
    @png_data = []

    @stack = []
    @images = []
    
    @prefix = []
    @suffix = []
    
    @bitcount = @_pal_bits
    @widthcount = 0
    
    @left_bits = 0x00
    @current_bits = lze_len + 0x01
    
    @lzw_clear = 1 << lze_len
    @lzw_eoi = @lzw_clear + 1
    @nowtablendx = @lzw_clear + 2
    @toptablendx = 1 << @current_bits
    
    @wdata = 0
    @wcode = 0
    @oldcode = 0xffff
    @row_num = 0
    @tempchar = 0x00
    @pass = 0x00
    @firstchar = 0
    @tempndx = 0
    # ??????
    self.read_byte
    # ??@lzw_eoi???
    while @wcode != @lzw_eoi
      # @lzw_clear?
      if @wcode == @lzw_clear
        for i in 0...@lzw_clear
          @prefix[i] = 0xffff
          @suffix[i] = i
        end
        for i in @nowtablendx...4096
          @prefix[i] = 0xffff
          @suffix[i] = 0x00
        end
        @current_bits = lze_len + 0x01
        @nowtablendx = @lzw_clear + 2
        @toptablendx = 1 << @current_bits
        @oldcode = 0xffff
        # ??????
        self.read_byte
        if @wcode != @lzw_eoi
          while @prefix[@wcode] != 0xffff
            @stack.push(@suffix[@wcode])
            @wcode = @prefix[@wcode]
          end
          @stack.push(@suffix[@wcode])
          @firstchar = @stack[-1]
          # ??????
          self.output_data
        end
      else
        if @wcode < @nowtablendx
          @tempndx = @wcode
        else
          @tempndx = @oldcode
          @stack.push(@firstchar)
        end
        while @prefix[@tempndx] != 0xffff
          @stack.push(@suffix[@tempndx])
          @tempndx = @prefix[@tempndx]
        end
        @stack.push(@suffix[@tempndx])
        @firstchar = @stack[-1]
        @prefix[@nowtablendx] = @oldcode
        @suffix[@nowtablendx] = @firstchar
        @nowtablendx += 1
        if @nowtablendx == @toptablendx and @current_bits < 12
          @current_bits += 1
          @toptablendx = 1 << @current_bits
        end
        # ??????
        self.output_data
      end
      @oldcode = @wcode
      # ??????
      self.read_byte
    end
    Graphics.update
    # ??png?
    self.make_png
  end

  #--------------------------------------------------------------------------
  # ? ???????
  #--------------------------------------------------------------------------
  def read_byte
    while @left_bits < @current_bits
      @next_char = @image_data.shift
      @wdata |= (@next_char << @left_bits)
      @left_bits += 0x08
    end
    @wcode = @wdata & CODE_MASK[@current_bits]
    @wdata >>= @current_bits
    @left_bits -= @current_bits
  end
  
  #--------------------------------------------------------------------------
  # ? ??????
  #--------------------------------------------------------------------------
  def output_data
    while !@stack.empty?
      @tempchar |= (@stack.pop << (8 - @bitcount))
      if @bitcount == 8
        @images.push(@tempchar)
        @tempchar = 0x00
        @bitcount = @_pal_bits
      else
        @bitcount += @_pal_bits
      end
      @widthcount += 1
      if @widthcount == @_width
        if @bitcount != @_pal_bits
          @images.push(@tempchar)
          @tempchar = 0x00
          @bitcount = @_pal_bits
        end
        @png_data[@row_num] = @images.clone
        @images.clear
        if @_lace > 0
          @row_num += INC_TABLE[@pass]
          if @row_num >= @_height
            @pass += 1
            @row_num = BGN_TABLE[@pass]
          end
        else
          @row_num += 1
        end
        @widthcount = 0
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ? ??png??
  #--------------------------------------------------------------------------
  def make_png
    fp = open("~TEMP/#@filename" + sprintf("_%02d",@frame_count)+".png","wb")
    fp.write(self.make_png_header)
    fp.write(self.make_png_ihdr)
    fp.write(self.make_png_plte) if @_trans_index.nil?
    fp.write(self.make_png_idat)
    fp.write(self.make_png_iend)
    fp.close
  end
    
  #--------------------------------------------------------------------------
  # ? png???
  #--------------------------------------------------------------------------
  def make_png_header
    return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
  end
  
  #--------------------------------------------------------------------------
  # ? png????
  #--------------------------------------------------------------------------
  def make_png_ihdr
    ih_size = [13].pack("N")
    ih_sign = "IHDR"
    ih_width = [@_width].pack("N")
    ih_height = [@_height].pack("N")
    if @_trans_index != nil
      ih_bit_depth = [@_pal_bits > 8 ? 16 : 8].pack("C")
      ih_color_type = [6].pack("C")
    else
      ih_bit_depth = [@_pal_bits].pack("C")
      ih_color_type = [3].pack("C")
    end
    ih_compression_method = [0].pack("C")
    ih_filter_method = [0].pack("C")
    ih_interlace_method = [0].pack("C")
    string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
             ih_compression_method + ih_filter_method + ih_interlace_method
    ih_crc = [Zlib.crc32(string)].pack("N")
    return ih_size + string + ih_crc
  end
  
  #--------------------------------------------------------------------------
  # ? png????
  #--------------------------------------------------------------------------
  def make_png_plte
    pl_size = [@_pal.size].pack("N")
    pl_sign = "PLTE"
    pl_data = @_pal.pack("C*")
    pl_crc = [Zlib.crc32(pl_sign + pl_data)].pack("N")
    return pl_size + pl_sign + pl_data + pl_crc
  end
  
  #--------------------------------------------------------------------------
  # ? png???
  #--------------------------------------------------------------------------
  def make_png_idat
    lz_data = []
    if @_trans_index != nil
      for i in 0...@png_data.size
        lz_data.push 0
        for j in @png_data[i]
          if j == @_trans_index
            lz_data.push @_pal[j*3],@_pal[j*3+1],@_pal[j*3+2],0
          else
            lz_data.push @_pal[j*3],@_pal[j*3+1],@_pal[j*3+2],255
          end
        end
      end
    else
      for i in 0...@png_data.size
        lz_data.push 0
        lz_data += @png_data[i]
      end
    end
    id_data = Zlib::Deflate.deflate(lz_data.pack("C*"),9)
    id_size = [id_data.size].pack("N")
    id_sign = "IDAT"
    id_crc = [Zlib.crc32(id_sign + id_data)].pack("N")
    return id_size + id_sign + id_data + id_crc
  end
  
  #--------------------------------------------------------------------------
  # ? png ???
  #--------------------------------------------------------------------------
  def make_png_iend
    ie_size = [0].pack("N")
    ie_sign = "IEND"
    ie_crc = [Zlib.crc32(ie_sign)].pack("N")
    return ie_size + ie_sign + ie_crc
  end
  
end

#==============================================================================
# ? Graphics
#------------------------------------------------------------------------------
# ???????? ?
#==============================================================================
class << Graphics

  #--------------------------------------------------------------------------
  # ? ???????????
  #--------------------------------------------------------------------------
  unless method_defined? :origin_update
    alias origin_update update
    def update_critical
      Thread.critical = true
      origin_update
      Thread.critical = false
    end
    Thread.new{loop{Graphics.update_critical;sleep(9)}}
  end
  
  #--------------------------------------------------------------------------
  # ? ?????
  #--------------------------------------------------------------------------
  @@gif_sprites = Array.new
  
  #--------------------------------------------------------------------------
  # ? ??GIF????
  #--------------------------------------------------------------------------
  def add(gs)
    @@gif_sprites << gs
  end
  
  #--------------------------------------------------------------------------
  # ? ??GIF????
  #--------------------------------------------------------------------------
  def del(gs)
    @@gif_sprites.delete gs
  end

  #--------------------------------------------------------------------------
  # ? ????
  #--------------------------------------------------------------------------
  def update
    update_critical
    @@gif_sprites.each{|gs| gs.update}
  end
  
end

#==============================================================================
# ? GIFSprite
#------------------------------------------------------------------------------
# ?GIF?????? ?
#==============================================================================
class GIFSprite
  
  #============================================================================
  # ? GIFSprite::Infos
  #----------------------------------------------------------------------------
  # ?GIF????? ?
  #============================================================================
  class Infos
    
    #------------------------------------------------------------------------
    # ? ??????
    #------------------------------------------------------------------------
    attr_accessor :total_frames
    attr_accessor :width
    attr_accessor :height
    attr_accessor :frame_data
    
    #------------------------------------------------------------------------
    # ? ???
    #------------------------------------------------------------------------
    def initialize
      @total_frames = 0
      @width = 0
      @height = 0
      @frame_data = Array.new
    end
    
    #==========================================================================
    # ? GIFSprite::Infos::FrameData
    #--------------------------------------------------------------------------
    # ?GIF??????? ?
    #==========================================================================
    class FrameData
      
      #----------------------------------------------------------------------
      # ? ??????
      #----------------------------------------------------------------------
      attr_accessor :offset_x
      attr_accessor :offset_y
      attr_accessor :delay_time
      attr_accessor :disposal_method
      
      #----------------------------------------------------------------------
      # ? ???
      #----------------------------------------------------------------------
      def initialize
        @offset_x = 0
        @offset_y = 0
        @delay_time = 0
        @disposal_method = 0
      end
      
    end
    
  end
  
  #--------------------------------------------------------------------------
  # ? ???:???????
  #--------------------------------------------------------------------------
  unless Dir["*"].include?("~TEMP")
    Dir.mkdir("~TEMP")
    System.attrib("~TEMP","+h","+s")
  end
  
  #--------------------------------------------------------------------------
  # ? ?????
  #--------------------------------------------------------------------------
  def self.TmpFileclear
    begin
      Dir["~TEMP/*"].each{|filename| File.delete filename}
    rescue
    end
  end
  
  #--------------------------------------------------------------------------
  # ? ?????
  #--------------------------------------------------------------------------
  def self.pre_load(filename_arr)
    filename_arr.each{|fn| GIF.readdata(fn)}
  end
  
  #--------------------------------------------------------------------------
  # ? ??????
  #--------------------------------------------------------------------------
  attr_accessor :x
  attr_accessor :y
  attr_reader   :z
  attr_accessor :loop_counts
  attr_accessor :viewport
  
  #--------------------------------------------------------------------------
  # ? ????
  #--------------------------------------------------------------------------
  def self.new(viewport = nil,x = 0,y = 0,loop_counts = -1)
    obj = super()
    obj.viewport = viewport
    obj.x = x
    obj.y = y
    obj.loop_counts = loop_counts
    Graphics.add(obj)
    obj
  end
  
  #--------------------------------------------------------------------------
  # ? ??????
  #--------------------------------------------------------------------------
  def bitmap
    @gif_infos
  end
  
  #--------------------------------------------------------------------------
  # ? ???????
  #--------------------------------------------------------------------------
  def bitmap=(filename)
    @gif_infos = GIF.readdata(filename)
    if @gif_infos != nil
      @sp_arr = Array.new
      basename = File.basename(filename,".*")
      for i in 0...@gif_infos.total_frames
        sp   = Sprite.new(@viewport)
        sp.bitmap = Bitmap.new(sprintf("~TEMP/#{basename}_%02d.png",i + 1))
        sp.visible = i == 0
        sp.x = @gif_infos.frame_data[i].offset_x
        sp.y = @gif_infos.frame_data[i].offset_y
        @sp_arr << sp
      end
      @update_frame_count = 0
      @current_show_frame = 0
      @next_frame_counts = 
      (@gif_infos.frame_data[0].delay_time * Graphics.frame_rate / 100) 
    end
  end
  
  #--------------------------------------------------------------------------
  # ? ??x=
  #--------------------------------------------------------------------------
  def x=(x)
    if @gif_infos.nil?
      @x = 0
      return
    end
    @x = x
    for i in 0...@gif_infos.total_frames
      @sp_arr[i].x = @gif_infos.frame_data[i].offset_x + @x
    end
  end
  
  #--------------------------------------------------------------------------
  # ? ??y=
  #--------------------------------------------------------------------------
  def y=(y)
    if @gif_infos.nil?
      @y = 0
      return
    end
    @y = y
    for i in 0...@gif_infos.total_frames
      @sp_arr[i].y = @gif_infos.frame_data[i].offset_y + @y
    end
  end
  
  #--------------------------------------------------------------------------
  # ? ??z=
  #--------------------------------------------------------------------------
  def z=(z)
    if @gif_infos.nil?
      @z = 0
      return
    end
    @z = z
    for i in 0...@gif_infos.total_frames
      @sp_arr[i].z = @z
    end
  end
  
  #--------------------------------------------------------------------------
  # ? ????
  #--------------------------------------------------------------------------
  def width
    return @gif_infos.nil? ? 0 : @gif_infos.width
  end
  
  #--------------------------------------------------------------------------
  # ? ????
  #--------------------------------------------------------------------------
  def height
    return @gif_infos.nil? ? 0 : @gif_infos.height
  end
  
  #--------------------------------------------------------------------------
  # ? ????
  #--------------------------------------------------------------------------
  def dispose
    Graphics.del(self)
    @sp_arr.each{|sp|
      sp.bitmap.dispose
      sp.dispose
    }
    @sp_arr.clear
    @gif_infos = nil
  end
  
  #--------------------------------------------------------------------------
  # ? ????
  #--------------------------------------------------------------------------
  def update
    if @gif_infos.nil?
      return
    end
    @update_frame_count += 1
    if @update_frame_count >= @next_frame_counts
      @current_show_frame = (@current_show_frame + 1) % @gif_infos.total_frames
      case @gif_infos.frame_data[@current_show_frame - 1].disposal_method
      when 0 # ???
        
      when 1 # ???????
        
      when 2 # ??????
        @sp_arr[@current_show_frame - 1].visible = false
      when 3 # ??? = =
        
      end
      @sp_arr[@current_show_frame].visible = true
      if @current_show_frame == 0
        @loop_counts -= 1 if @loop_counts > 0
        if @loop_counts == 0
          self.dispose
          return
        end
        for i in 0...@sp_arr.size
          @sp_arr[i].visible = i == @current_show_frame
        end
      end
      @update_frame_count = 0
      @next_frame_counts = (@gif_infos.frame_data[@current_show_frame].\
      delay_time * Graphics.frame_rate / 100)
    end
  end
  
end

But I don't know how to use it. I put gif file in GIF folder but it didn't work! Help me, Please!
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top