注册会员 登录
Project1 返回首页

QQEat https://rpg.blue/?326184 [收藏] [复制] [分享] [RSS] 这个人很懒,什么也没留下。

日志

【RM】Log_提示消息v1.1

热度 1已有 330 次阅读2018-10-9 19:57 |个人分类:脚本

#encoding:utf-8
#==============================================================================
# ■ Log信息提示v1.1 By_QQEat
#
#   说明:提示信息使用。
#   依赖:此脚本需依赖 【Timer_定时器】脚本。
#   地址:http://rpg.blue/home.php?mod=space&uid=326184&do=blog&id=16491
#
#   [创建/更新/释放]
#
#     @log = Log.new
#     @log.update
#     @log.dispose
#
#   [使用]
#     
#     @log.add({
#       text: 'message',        # 提示信息
#       font: '黑体',           # 字体名称
#       size: 24,               # 字体大小
#       color: color,           # 字体颜色
#       background: color,      # 背景颜色
#       lineColor: color,       # 边缘颜色
#       clear: 180,             # 消失帧数
#       format: 0,              # 格式(0普通, 1支持字符格式)
#       viewport: viewport,     # 显示端口
#       location: 1,            # 显示位置(0:左下, 1右下)
#       moveType: 'in-bounce',  # 弹出方式('in-/out-/in-out-/out-in-' + 'quad/cubic/quart/quint/sine/expo/circ/back/bounce/elastic')
#       moveSpeed: 40,          # 弹出速度
#     })
#
#   [内容字符支持格式]
#      \n      换行
#      \\c[x]  更改颜色
#      \\i[x]  绘制图标
#      \\{     字体增大 8 号
#      \\}     字体缩小 8 号
#
#   [范例]
#
#     @log.add({text: '提示信息'})
#
#   [全局使用]
#
#     $log.add({text: '全局提示信息'})
#
#==============================================================================

class Log
  attr_accessor :logs
  def initialize
    @logs = []
  end
  def update
    @logs.each do |log|
      log.update
      if log.dead
        log.dispose
        @logs.delete(log)
      end
    end
  end
  def dispose
    @logs.each(&:dispose)
  end
  def add(set={})
    # 默认参数,在这里修改
    text = set[:text] || ''
    font = set[:font]
    size = set[:size] || 24
    color = set[:color] || Color.new(255,255,255)
    background = set[:background] || Color.new(0,0,0,125)
    lineColor = set[:lineColor] || Color.new(255,255,255)
    clear = set[:clear] || 180
    format = set[:format] || 0
    viewport = set[:viewport]
    location = set[:location] || 1
    moveType = set[:moveType] || 'in-bounce'
    moveSpeed = set[:moveSpeed] || 40
    @logs.push LogText.new(text, font, size, color, background, lineColor, clear, format, viewport, location, moveType, moveSpeed)
    @logs.each{|l| l.move_up(@logs[-1]) if l.viewport == viewport }
  end
end

class LogText < Sprite_Base
  attr_accessor :dead
  def initialize(text, font, size, color, background, lineColor, clear, format, viewport, location, moveType, moveSpeed)
    super(viewport)
    # 属性设置
    tmpBitmap = (Bitmap.new(1,1).tap do |b| b.font.size = size end)
    if format = 1 # 字符处理
      arrStr,arrWid = text.dup.split("\n"),[]
      # 计算每行宽度,取最大宽度的那行
      arrStr.each_with_index{|s,i|
        arrWid[i] = 0
        s.gsub!(/\\(.)(\[(\d)+\])?/){arrWid[i]+=$1.upcase=='I'?24:0;''}
        arrWid[i] += tmpBitmap.text_size(s).width
      }
      rect = Rect.new(0,0, arrWid.max, arrStr.size*(size||24))
    else
      tmpBitmap.text_size(text)
    end
    self.bitmap = Bitmap.new(rect.width + 24, rect.height + 24)
    self.bitmap.font.name = font if font
    self.bitmap.font.size = size if size
    self.bitmap.fill_rect(self.bitmap.rect, background) if background
    if lineColor
      self.bitmap.fill_rect(0,0,1,self.bitmap.height, lineColor)
      self.bitmap.fill_rect(self.bitmap.width-1,0,1,self.bitmap.height, lineColor)
    end
    self.bitmap.font.color = color if color
    
    # 文字绘制
    case format
    when 0
      self.bitmap.draw_text(self.bitmap.rect, text, 1)
    when 1
      temp = Sprite.new
      temp.bitmap = self.bitmap.dup
      temp.bitmap.clear
      temp.draw_text_ex_drawLog(self.bitmap.rect, text.dup)
      self.bitmap.blt((self.width-rect.width)/2, (self.height-rect.height)/2, temp.bitmap, temp.bitmap.rect)
      temp.dispose
    end
    
    # 显示位置
    self.x = case location
    when 0; (viewport.nil? ? 0 : viewport.rect.x) + 10
    when 1; (viewport.nil? ? Graphics.width : viewport.rect.width) - (self.width + 5)
    end
    self.y = (viewport.nil? ? Graphics.height : viewport.rect.height)
    self.z = 99999999
    
    # 滑动
    @timer = Timer.new
    @clear, @moveType, @moveSpeed = clear, moveType, moveSpeed
  end
  def update
    super
    @timer.update
    self.dead = true if self.y + self.height < 0
  end
  def dispose
    super
    @timer.dispose
  end
  def move_up(obj)
    @timer.tween(@moveSpeed || 30, self, {y: self.y - (obj.height + 5)}, @moveType)
    @timer.after(@clear, proc{
        @timer.tween(30, self, {opacity: 0}, 'linear', proc{ self.dead = true })
    })
  end
end

class Sprite
  #--------------------------------------------------------------------------
  # ● 绘制带有控制符的文本内容
  #--------------------------------------------------------------------------
  def draw_text_ex_drawLog(*args)
    case args.size
    when 2
      x, y, w, h, text = args[0].x,args[0].y,args[0].width,args[0].height,args[1]
    when 5
      x, y, w, h, text = *args
    else
      p '信息框内容格式 1 绘制参数传递错误'
      return
    end
    text.gsub!(/\\/)            { "\e" }
    text.gsub!(/\e\e/)          { "\\" }
    pos = {:x => x, :y => y, :new_x => x, :height => [24, self.bitmap.font.size].max}
    until text.empty?
      process_new_line = Proc.new{
        pos[:x] = pos[:new_x]
        pos[:y] += pos[:height]
        pos[:height] = [24, self.bitmap.font.size].max
      }
      c = text.slice!(0, 1)
      case c
      when "\r"   # 回车
        return
      when "\n"   # 换行
        process_new_line.call
      when "\e"   # 控制符
        code = text.slice!(/^[\$\.\|\^!><\{\}\\]|^[A-Z]+/i)
        param = Proc.new{|s| s.slice!(/^\[\d+\]/)[/\d+/].to_i rescue 0 }
        case code.upcase
        when 'C'
          n = param.call text
          self.bitmap.font.color = Cache.system("Window").get_pixel(64 + (n % 8) * 8, 96 + (n / 8) * 8)
        when 'I'
          icon_index = param.call text
          icon_bitmap = Cache.system("Iconset")
          rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
          process_new_line.call if pos[:x] + rect.width >= w
          self.bitmap.blt(pos[:x], pos[:y], icon_bitmap, rect, 255)
          pos[:x] += rect.width
        when '{'
          self.bitmap.font.size += 8 if self.bitmap.font.size <= 64
          pos[:height] = [24, self.bitmap.font.size].max
        when '}'
          self.bitmap.font.size -= 8 if self.bitmap.font.size >= 16
          pos[:height] = [24, self.bitmap.font.size].max
        end
      else        # 普通文字
        text_width = self.bitmap.text_size(c).width
        process_new_line.call if pos[:x] + text_width >= w
        self.bitmap.draw_text(pos[:x], pos[:y], text_width * 2, pos[:height], c)
        pos[:x] += text_width
      end
    end
    return pos[:x],pos[:y] + pos[:height]
  end
end

class << Input
  alias :qqeat_log_input_update :update unless $@
  def update
    $log ||= Log.new
    $log.update
    qqeat_log_input_update
  end
end

鸡蛋
1

鲜花

刚表态过的朋友 (1 人)

评论 (0 个评论)

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-24 21:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部