查看: 2454|回复: 2

[已经过期] 怎么让选择项的光标不闪呢?

[复制链接]
梦石
0
星屑
1146
在线时间
452 小时
注册时间
2010-5-29
回帖
11
发表于 2022-9-5 00:20:19 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

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

×
怎么让选择项的光标不闪来闪去呢?
梦石
0
星屑
2821
在线时间
585 小时
注册时间
2022-7-13
回帖
81
发表于 2022-9-5 11:52:46 | 显示全部楼层
本帖最后由 我为鱼肉 于 2022-9-5 13:33 编辑

原创脚本,插入main前会有立竿见影的效果。如果新建了窗口,需要照猫画虎在脚本尾处继续添加
思路就是,隐藏默认光标,用新生成的sprite代替。

[pre lang="ruby"]#==============================
#系统cursor。不再闪烁
#==============================

#多了一个Window_SaveFile另类,只好Window_Base,不然可以把内容全放在Window_Selectable
#==============================
#通用窗口
#未重定义update_cursor_rect
#==============================
class Window_Base < Window
  alias rgss1_init_for_cursor initialize unless method_defined? :rgss1_init_for_cursor
  def initialize(*args)
    rgss1_init_for_cursor(*args)
    @cursor_sprite = Sprite.new(self.viewport)
    @cursor_sprite.visible = false
    @cursor_sprite.x = 16 + self.x
    @cursor_sprite.y = 16 + self.y
    @cursor_sprite.z = self.z + 1
  end
  alias rgss1_x_for_cursor x= unless method_defined? :rgss1_x_for_cursor
  def x=(x)
    rgss1_x_for_cursor(x)
    return if @cursor_sprite.nil?
    @cursor_sprite.x = 16 + x
  end
  alias rgss1_y_for_cursor y= unless method_defined? :rgss1_y_for_cursor
  def y=(y)
    rgss1_y_for_cursor(y)
    return if @cursor_sprite.nil?
    @cursor_sprite.y = 16 + y
  end
  alias rgss1_z_for_cursor z= unless method_defined? :rgss1_z_for_cursor
  def z=(z)
    rgss1_z_for_cursor(z)
    return if @cursor_sprite.nil?
    @cursor_sprite.z = 1 + z
  end
  alias rgss1_vis_for_cursor visible= unless method_defined? :rgss1_vis_for_cursor
  def visible=(visible)
    rgss1_vis_for_cursor(visible)
    return if @cursor_sprite.nil?
    @cursor_sprite.visible = false unless visible
  end
  alias rgss1_dis_for_cursor dispose unless method_defined? :rgss1_dis_for_cursor
  def dispose
    @cursor_sprite.dispose
    rgss1_dis_for_cursor
  end
  def update_cursor_sprite
    return if self.cursor_rect.width == 0 or self.cursor_rect.height == 0
    if @index.is_a?(Integer)
      if @index < 0 ; @cursor_sprite.visible = false ; return ; end
    else
      unless @selected ; @cursor_sprite.visible = false ; return ; end
    end
    cursor_x = self.cursor_rect.x
    cursor_y = self.cursor_rect.y
    cursor_width = self.cursor_rect.width
    cursor_height = self.cursor_rect.height
    self.cursor_rect.empty
    if @cursor_sprite.bitmap.nil? or @cursor_sprite.bitmap.width != cursor_width or @cursor_sprite.bitmap.height != cursor_height
      if @cursor_sprite.bitmap
        @cursor_sprite.bitmap.dispose
        @cursor_sprite.bitmap = nil
      end
      @cursor_sprite.bitmap = Bitmap.new(cursor_width, cursor_height)
      dest_rect = Rect.new(0, 0, cursor_width, 1)
      src_rect = Rect.new(128, 64, 32, 1)
      @cursor_sprite.bitmap.stretch_blt(dest_rect, self.windowskin, src_rect)
      dest_rect.set(0, cursor_height - 1, cursor_width, 1)
      src_rect.set(128, 64, 32, 1)
      @cursor_sprite.bitmap.stretch_blt(dest_rect, self.windowskin, src_rect)
      dest_rect.set(0, 0, 1, cursor_height)
      src_rect.set(128, 64, 1, 32)
      @cursor_sprite.bitmap.stretch_blt(dest_rect, self.windowskin, src_rect)
      dest_rect.set(cursor_width - 1, 0, 1, cursor_height)
      src_rect.set(128, 64, 1, 32)
      @cursor_sprite.bitmap.stretch_blt(dest_rect, self.windowskin, src_rect)
      dest_rect.set(0, 0, cursor_width, cursor_height)
      src_rect.set(130, 66, 28, 28)
      @cursor_sprite.bitmap.stretch_blt(dest_rect, self.windowskin, src_rect)
    end
    @cursor_sprite.x = 16 + self.x + cursor_x
    @cursor_sprite.y = 16 + self.y + cursor_y
    @cursor_sprite.visible = true
  end
end
class Window_Selectable < Window_Base
  alias rgss1_index_for_cursor index= unless method_defined? :rgss1_index_for_cursor
  def index=(index)
    rgss1_index_for_cursor(index)
    return if @cursor_sprite.nil?
    @cursor_sprite.visible = false if index < 0
  end
  alias rgss1_active_for_cursor active= unless method_defined? :rgss1_active_for_cursor
  def active=(active)
    rgss1_active_for_cursor(active)
    return if @cursor_sprite.nil?
    @cursor_sprite.visible = false unless active
  end
  alias rgss1_upcur_for_cursor update_cursor_rect unless method_defined? :rgss1_upcur_for_cursor
  def update_cursor_rect
    rgss1_upcur_for_cursor
    update_cursor_sprite if self.active
  end
end


#==============================
#一般窗口
#重定义了update_cursor_rect
#其他的窗口,照猫画虎就行了
#==============================
class Window_MenuStatus < Window_Selectable
  alias rgss1_upcur_for_cursor_subclass update_cursor_rect unless method_defined? :rgss1_upcur_for_cursor_subclass
  def update_cursor_rect
    rgss1_upcur_for_cursor_subclass
    update_cursor_sprite if self.active
  end
end
class Window_Target < Window_Selectable
  alias rgss1_upcur_for_cursor_subclass update_cursor_rect unless method_defined? :rgss1_upcur_for_cursor_subclass
  def update_cursor_rect
    rgss1_upcur_for_cursor_subclass
    update_cursor_sprite if self.active
  end
end
class Window_Message < Window_Selectable
  alias rgss1_upcur_for_cursor_subclass update_cursor_rect unless method_defined? :rgss1_upcur_for_cursor_subclass
  def update_cursor_rect
    rgss1_upcur_for_cursor_subclass
    update_cursor_sprite if self.active
  end
end
class Window_PartyCommand < Window_Selectable
  alias rgss1_upcur_for_cursor_subclass update_cursor_rect unless method_defined? :rgss1_upcur_for_cursor_subclass
  def update_cursor_rect
    rgss1_upcur_for_cursor_subclass
    update_cursor_sprite if self.active
  end
end
class Window_SaveFile < Window_Base
  alias rgss1_sele_for_cursor selected= unless method_defined? :rgss1_sele_for_cursor
  def selected=(selected)
    rgss1_sele_for_cursor(selected)
    @cursor_sprite.visible = false unless @selected
  end
  alias rgss1_upcur_for_cursor_subclass update_cursor_rect unless method_defined? :rgss1_upcur_for_cursor_subclass
  def update_cursor_rect
    rgss1_upcur_for_cursor_subclass
    update_cursor_sprite
  end
end[/pre]
回复

使用道具 举报

梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

发表于 2022-9-5 12:01:22 | 显示全部楼层
在main之前加上
class Window
  alias update_forbid update
  def update
    return
  end
end
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部