分类: RGSS

HexColor:在RGSS中使用16进制颜色表示法(2017.06.12更新)

此脚本使Color类支持十六进制颜色表示法。使用形如”#FFFFFF”的字符串(#号可省略)替代形如(255,255,255)的RGB颜色数值表示。
可使用缩略形式,如”#112233″可写作”#123″,”#000000″可写作”#0″
示例:

FireBrick = Color.new("#B22222",222)
p FireBrick #=> (178.000000,34.000000,34.000000,222.000000)

(更多…)

更多

在RGSS中读取/写入ini文件(2016.10.14更新)

使用这段脚本可以在RGSS中比较快捷地读取、写入ini文件中的值。需要转码模块才能正常处理中文等字符。

INI = IniFile.new(".\\Game.ini")
p INI[:Game][:Title] #获取游戏标题,缓冲区大小默认为128
p INI[:Game][:Title2] #读取一个不存在的键,则返回空字符串
INI.default = "NONE" #若读取的键不存在则返回"NONE"
INI.buffer_size = 256 #指定缓冲区大小为256
INI[:Game][:Title] = "测试工程" #写入键值

(更多…)

更多

EasyConv : 字符串转码模块

在RGSS中使用Win32API时,如果涉及中文及其他特殊字符,就必须在系统代码页及UTF-8间进行必要的转换,否则就会出现乱码。在许许多多的脚本中都可以见到类似的转码脚本,其中大多数年代久远,作者已不可考。我的这个版本只是选取一个常见的版本,简单地进行了些许优化。

#==============================================================================
# ■ EasyConv
#------------------------------------------------------------------------------
#  转码模块。原作者不明,由失落的乐章优化。
#==============================================================================

module EasyConv
  #--------------------------------------------------------------------------
  # ● 常量定义
  #--------------------------------------------------------------------------
  CP_ACP = 0
  CP_UTF8 = 65001
  M2W = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  W2M = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  #--------------------------------------------------------------------------
  # ● 转码
  #--------------------------------------------------------------------------
  def s2u
    len = M2W.call(CP_ACP, 0, self, -1, nil, 0)
    buf = "\0" * (len*2)
    M2W.call(CP_ACP, 0, self, -1, buf, buf.size/2)
    len = W2M.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil)
    ret = "\0" * len
    W2M.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil)
    ret[-1] = ""
    return ret
  end
  #--------------------------------------------------------------------------
  # ● 转码
  #--------------------------------------------------------------------------
  def u2s
    len = M2W.call(CP_UTF8, 0, self, -1, nil, 0)
    buf = "\0" * (len*2)
    M2W.call(CP_UTF8, 0, self, -1, buf, buf.size/2)
    len = W2M.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
    ret = "\0" * len
    W2M.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
    return ret
  end
end

class String
  include EasyConv
end
更多

Win32API应用:窗口篇

1.禁用窗口最小化、关闭按钮:

MF_GRAYED = 0x01
SC_MINIMIZE = 0xF020  #最小化
SC_CLOSE = 0xF060 #关闭
HWND = Win32API.new('user32.dll','GetActiveWindow',nil,'l').call
GSM  = Win32API.new('user32.dll','GetSystemMenu','ll','l').call(HWND,0)
Win32API.new('user32.dll','RemoveMenu','lll','l').call(GSM,SC_MINIMIZE,MF_GRAYED) #禁用最小化
Win32API.new('user32.dll','RemoveMenu','lll','l').call(GSM,SC_CLOSE,MF_GRAYED) #禁用关闭

由于不明原因,最小化按钮无法变灰,只会失效;关闭按钮可以正常变灰。

 

2.半透明窗口:

#设置不透明度(有效范围0~255)
OPACITY = 150
#获取窗口句柄
HWND = Win32API.new('user32','GetActiveWindow',nil,'l').call
#设置窗口风格WS_EX_LAYERED (0x00080000)
Win32API.new('user32','SetWindowLong','lil','l').call(HWND,-20,0x00080000)
Win32API.new('user32','SetLayeredWindowAttributes','llil','l').call(HWND,0,OPACITY,2)

 

(更多…)

更多

判断RM窗口是否处于全屏状态

module Graphics
  #取得窗口句柄
  HWND = Win32API.new('user32','GetActiveWindow',nil,'l').call
  def self.fullscreen?
    #取得窗口范围矩形
    window_rect = "\0" * 16
    Win32API.new('user32','GetWindowRect',['l','p'],'i').call(HWND,window_rect)
    wl,wt,wr,wb = window_rect.unpack('llll')
    #取得客户区矩形
    client_rect = "\0" * 16
    Win32API.new('user32','GetClientRect',['l','p'],'i').call(HWND,client_rect)
    cl,ct,cr,cb = client_rect.unpack('llll')
    wr - wl == cr
  end
end

使用时:

Graphics.fullscreen?    #当游戏处于全屏状态时返回true, 否则返回false

原理:使用GetWindowRect 和GetClientRect 分别取得游戏窗口的整个范围矩形和客户区矩形。游戏全屏后,由于不再存在边框,这两个矩形就是相等的。而在窗口模式下,客户区矩形会小一些。

更多