Menu Smooth Movement Bug Fix
Hi guys, sorry for another script request topic but I promise this should be very easy to do XD But since my scripter friend is in middle of midterm exams so I don't know who else to turn to \(>o<)/
Description:Anyway, there are only a very few numbers of working scripts that add a Cursor into the Menu, and except for this one the rest is pretty buggy and has some compatibility issues. However, this script does not show the cursor in the Save and Load screen. It would be very nice if someone would help me to fix this, the script itself is very short so I guess it won't take more than a couple of minutes to get it done. Thank you so much.
What other script are you using?I don't think any of my other script would affect this little scripts, as I'm using default save/load menu. I have another script which shows a Cursor when selecting monster inside the battle, but as far as I'm aware these two cursor script should not clash at all:
Did you search? And where?Yes, all to my searching capability: here, rmvx.net, hbgames, rpgrevolution, rpgcrisis, google, etc.
Search terms:strcat, strcat smooth menu movement, strcat cursor, strcat save, etc.
And I've seen a few people asking for this fix but to no avail, sadly >_<
And the script itself:#==============================================================================
# Cursor Sprite + Smooth Movement Script
#==============================================================================
# Author : strcat (with edits by S. F. LaValle)
# Version : 1.2
# Date : 29 / 01 / 2008
#------------------------------------------------------------------------------
# This script will create a new cursor sprite,and add a smooth movement to
# the cursor,thus making your game look better happy.gif
#------------------------------------------------------------------------------
#==============================================================================
# ** STRRGSS2
#==============================================================================
module STRRGSS2
# Cursor graphic file name
WCURSOR_FN = "Window_Cursor"
# position of the cursor(x, y)
WCURSOR_X = 8
WCURSOR_Y = 5
end
class Sprite_WindowCursor < Sprite
WAIT = 20 # numbers of frame for cursor update delay
CW = 29 # cursor width
CH = 30 # cursor height
end
#==============================================================================
# ** Window_Selectable
#==============================================================================
class Window_Selectable < Window_Base
#--------------------------------------------------------------------------
# * Update Cursor
#--------------------------------------------------------------------------
def update_se_cursor
cr = self.cursor_rect
r = Rect.new(0, 0, 0, 0)
y = (self.cursor_rect.height - WLH) / 2
v = nil
v = self.viewport if self.viewport != nil
@strcursor.viewport = v
@strcursor.x = self.x + 16 + cr.x - WLH + STRRGSS2::WCURSOR_X
@strcursor.y = self.y + 16 + cr.y + y + STRRGSS2::WCURSOR_Y
@strcursor.z = self.z + 16
@strcursor.opacity += 64
@strcursor.opacity = self.opacity if @strcursor.opacity > self.opacity
@strcursor.visible = ((cr != r) and self.openness == 255)
@strcursor.visible = false unless self.visible
@strcursor.blink = (not self.active)
@strcursor.update
end
def update_cursor_str(r,rect)
self.cursor_rect = r
rect = Rect.new(0, 0, 0, 0) if @index < 0
mx = self.cursor_rect.x - rect.x
if mx >= -1 and mx <= 1
self.cursor_rect.x = rect.x
elsif mx != 0
x = self.cursor_rect.x - (mx/2.0)
self.cursor_rect.x = x
end
my = self.cursor_rect.y - rect.y
if my >= -1 and my <= 1
self.cursor_rect.y = rect.y
elsif my != 0
y = self.cursor_rect.y - (my/2.0)
self.cursor_rect.y = y
end
self.cursor_rect.width = rect.width
self.cursor_rect.height = rect.height
end
def visible=(v)
super
@strcursor.visible = v
end
def active=(v)
super
@strcursor.visible = false
end
def dispose
@strcursor.dispose
super
end
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
alias initialize_str05m initialize
def initialize(x, y, width, height, spacing = 32)
initialize_str05m(x, y, width, height, spacing)
file = STRRGSS2::WCURSOR_FN
v = nil
v = self.viewport if self.viewport != nil
@strcursor = Sprite_WindowCursor.new(file, v)
@f_set = false
end
alias update_str05m update
def update
update_se_cursor unless @opening
update_str05m
end
alias update_cursor_str05m update_cursor
def update_cursor
r = self.cursor_rect.clone unless @f_set
update_cursor_str05m
update_cursor_str(r, self.cursor_rect.clone) unless @f_set
@f_set = false
end
#--------------------------------------------------------------------------
# * Get Index
#--------------------------------------------------------------------------
def index=(index)
@f_set = true
@index = index
update_cursor
call_update_help
end
end
#==============================================================================
# ** Sprite_WindowCursor
#==============================================================================
class Sprite_WindowCursor < Sprite
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :blink
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(name,viewport)
super(viewport)
self.bitmap = Cache.system(name)
self.src_rect.set(0, 0, CW, CH)
self.opacity = 0
@xx = -8
@wait = 0
@count = 0
@blink = false
end
#--------------------------------------------------------------------------
# * Dispose
#--------------------------------------------------------------------------
def dispose
super
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
@xx += 1 if @xx != 0
self.x += @xx
@count += 1
self.opacity = (@count % 32) * 8 if @blink
@wait -= 0
return if @wait > 0
@wait = 0
self.src_rect.x += CW
self.src_rect.x = 0 if (self.bitmap.width <= self.src_rect.x)
end
endThank you for your time :)
Well it's not the script request template, but it's an attempt.
The problem is actually very simple.
The windows used in the save file scene do not inherit from the window selectable class which holds the properties of the cursor.
#==============================================================================
# ** Window_SaveFile
#------------------------------------------------------------------------------
# This window displays save files on the save and load screens.
#==============================================================================
class Window_SaveFile < Window_Selectable
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :filename # filename
attr_reader :file_exist # file existence flag
attr_reader :time_stamp # timestamp
attr_reader :selected # selected
#--------------------------------------------------------------------------
# * Object Initialization
# file_index : save file index (0-3)
# filename : filename
#--------------------------------------------------------------------------
def initialize(file_index, filename)
super(0, 56 + file_index % 4 * 90, 544, 90)
@file_index = file_index
@filename = filename
load_gamedata
refresh
@selected = false
end
#--------------------------------------------------------------------------
# * Load Partial Game Data
# By default, switches and variables are not used (for expansion use,
# such as displaying place names)
#--------------------------------------------------------------------------
def load_gamedata
@time_stamp = Time.at(0)
@file_exist = FileTest.exist?(@filename)
if @file_exist
file = File.open(@filename, "r")
@time_stamp = file.mtime
begin
@characters = Marshal.load(file)
@frame_count = Marshal.load(file)
@last_bgm = Marshal.load(file)
@last_bgs = Marshal.load(file)
@game_system = Marshal.load(file)
@game_message = Marshal.load(file)
@game_switches = Marshal.load(file)
@game_variables = Marshal.load(file)
@total_sec = @frame_count / Graphics.frame_rate
rescue
@file_exist = false
ensure
file.close
end
end
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = normal_color
name = Vocab::File + " #{@file_index + 1}"
self.contents.draw_text(4, 0, 200, WLH, name)
@name_width = contents.text_size(name).width
if @file_exist
draw_party_characters(152, 58)
draw_playtime(0, 34, contents.width - 4, 2)
end
end
#--------------------------------------------------------------------------
# * Draw Party Characters
# x : Draw spot X coordinate
# y : Draw spot Y coordinate
#--------------------------------------------------------------------------
def draw_party_characters(x, y)
for i in 0...@characters.size
name = @characters[i][0]
index = @characters[i][1]
draw_character(name, index, x + i * 48, y)
end
end
#--------------------------------------------------------------------------
# * Draw Play Time
# x : Draw spot X coordinate
# y : Draw spot Y coordinate
# width : Width
# align : Alignment
#--------------------------------------------------------------------------
def draw_playtime(x, y, width, align)
hour = @total_sec / 60 / 60
min = @total_sec / 60 % 60
sec = @total_sec % 60
time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
self.contents.font.color = normal_color
self.contents.draw_text(x, y, width, WLH, time_string, 2)
end
#--------------------------------------------------------------------------
# * Set Selected
# selected : new selected (true = selected, false = unselected)
#--------------------------------------------------------------------------
def selected=(selected)
@selected = selected
update_cursor
end
#--------------------------------------------------------------------------
# * Update cursor
#--------------------------------------------------------------------------
def update_cursor
if @selected
self.cursor_rect.set(0, 0, @name_width + 8, WLH)
else
self.cursor_rect.empty
end
end
end
I have not tested this but it should work.
I only changed the inheritance from Window_Base to Window_Selectable.
Let me know if it works out for you.
Have a nice day.
Well the template is to base on, not necessarily 100% copy as long as enough information is provided I believe :)
I've tested it and it works just great :) Thanks so much TDS XD
Quote from: Aurelia on April 25, 2011, 07:20:42 AM
Well the template is to base on, not necessarily 100% copy as long as enough information is provided I believe :)
I've tested it and it works just great :) Thanks so much TDS XD
I have a personal rule about taking on requests, if someone puts the effort to use the script request template I put the effort to try and make their scripts. It's not a forum rule to use the script request template, it's just something I look for when taking requests.
Sadly not a lot of people use it, even though it would improve their chances at having their script request fulfilled.
Oh it makes perfect sense. That's a pretty neat personal rule actually :P Hope that everyone else who browses this section will keep in mind once again how to get into your and other scripters' good side.
Anw thanks again :D