- Joined
- Jun 4, 2017
- Messages
- 15
- Reaction score
- 5
- First Language
- English
- Primarily Uses
- RMVXA
Hello all! For sometime now, I've been reading and watching tutorials on scripting. I've been reading scripts and tweaking them so I can practice. I now can create Scenes with windows and make simple menus, you know with handlers and methods and stuff. However Im still a newbie to RGSS3 and there are many things that I want to give a try. This script being one:
Now, what I'm trying to find in this script is the part that decides if the mouse is hovering over a selectable window. Why? Because I've been experimenting with the scripts and found out that if you create two selectable windows and make the two of them activate, they show up on the screen but you can only interact with the first window created.
So I thought, what if I check if the mouse is hovering over one of the windows and only that window gets activated so I could interact with it while the other window waits inactive? Is such a thing is even possible? I've been inspecting the mouse script since then but I think I'm in over my head with this one.
To make it more clear: Here I'm trying to create a scene for travelling, but I don't want the choices to be on the same window.
Again, Im fairly new to ruby and if none of this makes any sense, sorry
Anyways, what do you think veteran scripters? Is such a thing feasible? Why? Why not? What would be a good alternative path for me (who wants to create his own custom scripts instead of using others') to choose?
Code:
#Basic Mouse System v2.7h
#----------#
#Features: Provides a series of functions to find the current x, y position of
# the mouse and whether it is being clicked or not (left or right click)
#
#Usage: Script calls:
# Mouse.pos? - returns the x, y position as an array
# Mouse.lclick?(repeat) - returns if left click is achieved
# repeat = true for repeated checks
# Mouse.rclick?(repeat) - same as above for right click
# Mouse.within?(rect) - passes a Rect through to check if cursor
# is within it, returns true if so
#
# Events:
# The following are placed in the name of an event:
# && - event can be triggered from afar by mouse click
# I:# - where # is the icon_index to change the cursor on hover
#
# Example: I:262
#
#----------#
#-- Script by: V.M of D.T
#
#- Questions or comments can be:
# posted on the thread for the script
# given by email: sumptuaryspade@live.ca
# provided on facebook: http://www.facebook.com/DaimoniousTailsGames
#
#--- Free to use in any project, commercial or non-commercial, with credit given
# - - Though a donation's always a nice way to say thank you~ (I also accept actual thank you's)
CPOS = Win32API.new 'user32', 'GetCursorPos', ['p'], 'v'
WINX = Win32API.new 'user32', 'FindWindowEx', ['l','l','p','p'], 'i'
ASKS = Win32API.new 'user32', 'GetAsyncKeyState', ['p'], 'i'
SMET = Win32API.new 'user32', 'GetSystemMetrics', ['i'], 'i'
WREC = Win32API.new 'user32', 'GetWindowRect', ['l','p'], 'v'
#MOUSE_ICON, set to the index of the icon to use as a cursor
$mouse_icon = 0
CURSOR_OFFSET_X = 0
CURSOR_OFFSET_Y = 0
#Keeps cursor sprite within the game window
MOUSE_KEEP_WINDOW = true
#Whether clicking requires cursor to be within window or not
MOUSE_CLICK_WITHIN = false
#Whether to use 8 directional movement or not
MOUSE_DIR8 = false
#Use the Mouse Button Overlay:
USE_MOUSE_BUTTONS = false
#And here is where you set up your buttons! Simple overlay:
#(Picture files are to be stored in System)
#
# [ x , y, "filename", "script call when left clicked" ]
MOUSE_BUTTONS = [
[0,416-32,"Shadow.png","SceneManager.call(Scene_Equip)"],
[32,416-32,"Shadow.png","SceneManager.call(Scene_Item)"], ]
SHOWMOUS = Win32API.new 'user32', 'ShowCursor', 'i', 'i'
SHOWMOUS.call(0)
#Switch option to enable/disable the script
USE_MOUSE_SWITCH = true
MOUSE_SWITCH = 1
#---------------------------------------------------------------------
# GALİBA BURDAN BAŞLIYOR
#---------------------------------------------------------------------
module Mouse
def self.setup
@enabled = true
@delay = 0
bwap = true if SMET.call(23) != 0
bwap ? @lmb = 0x02 : @lmb = 0x01
bwap ? @rmb = 0x01 : @rmb = 0x02
end
#----------------------------------------------------------------------
# SELFUPDATE
#----------------------------------------------------------------------
def self.update
return false unless @enabled
return false if USE_MOUSE_SWITCH && $game_switches[MOUSE_SWITCH]
self.setup if @lmb.nil?
@delay -= 1
@window_loc = WINX.call(0,0,"RGSS PLAYER",0)
if ASKS.call(@lmb) == 0 then @l_clicked = false end
if ASKS.call(@rmb) == 0 then @r_clicked = false end
rect = '0000000000000000'
cursor_pos = '00000000'
WREC.call(@window_loc, rect)
side, top = rect.unpack("ll")
CPOS.call(cursor_pos)
@m_x, @m_y = cursor_pos.unpack("ll")
w_x = side + SMET.call(5) + SMET.call(45)
w_y = top + SMET.call(6) + SMET.call(46) + SMET.call(4)
@m_x -= w_x; @m_y -= w_y
if MOUSE_KEEP_WINDOW
@m_x = [[@m_x, 0].max,Graphics.width-5].min
@m_y = [[@m_y, 0].max,Graphics.height-5].min
end
return true
end
#----------------------------------------------------------------------
# SELF POS
#----------------------------------------------------------------------
def self.pos?
return[-50,-50] unless self.update
return [@m_x, @m_y]
end
#----------------------------------------------------------------------
# SELF LCLICK
#----------------------------------------------------------------------
def self.lclick?(repeat = false)
return unless self.update
return false if @l_clicked
if ASKS.call(@lmb) != 0 then
@l_clicked = true if !repeat
return true end
end
#----------------------------------------------------------------------
# SELF RCLICK
#----------------------------------------------------------------------
def self.rclick?(repeat = false)
return unless self.update
return false if @r_clicked
if ASKS.call(@rmb) != 0 then
@r_clicked = true if !repeat
return true end
end
#----------------------------------------------------------------------
# SELF SLOWPEAT
#----------------------------------------------------------------------
def self.slowpeat
return unless self.update
return false if @delay > 0
@delay = 120
return true
end
#----------------------------------------------------------------------
# SELF WITHIN?
#----------------------------------------------------------------------
def self.within?(rect)
return unless self.update
return false if @m_x < rect.x or @m_y < rect.y
bound_x = rect.x + rect.width; bound_y = rect.y + rect.height
return true if @m_x < bound_x and @m_y < bound_y
return false
end
#----------------------------------------------------------------------
# SELF DISABLE
#----------------------------------------------------------------------
def self.disable
@enabled = false
SHOWMOUS.call(1)
end
#----------------------------------------------------------------------
# SELF ENABLE
#----------------------------------------------------------------------
def self.enable
@enabled = true
SHOWMOUS.call(0)
end
end
#----------------------------------------------------------------------
# MOUSE SETUP
#----------------------------------------------------------------------
Mouse.setup
#----------------------------------------------------------------------
# MODULE DATA MANAGER
#----------------------------------------------------------------------
module DataManager
class << self
alias mouse_init init
end
def self.init
mouse_init
$cursor = Mouse_Cursor.new
end
end
#----------------------------------------------------------------------
# SCENE_BASE
#----------------------------------------------------------------------
class Scene_Base
alias cursor_update update_basic
def update_basic
cursor_update
mouse_cursor
end
#----------------------------------------------------------------------
# MOUSE_CURSOR
#----------------------------------------------------------------------
def mouse_cursor
pos = Mouse.pos?
$cursor.x = pos[0] + CURSOR_OFFSET_X
$cursor.y = pos[1] + CURSOR_OFFSET_Y
end
end
class Mouse_Cursor < Sprite_Base
def initialize
super
@icon = $mouse_icon
self.bitmap = Bitmap.new(24,24)
draw_cursor
self.z = 255
end
def set_icon(icon)
return if @icon == icon
@icon = icon
draw_cursor
end
def draw_cursor
self.bitmap.clear
icon_bitmap = Cache.system("Iconset")
rect = Rect.new(@icon % 16 * 24, @icon / 16 * 24, 24, 24)
self.bitmap.blt(0, 0, icon_bitmap, rect)
end
end
#----------------------------------------------------------------------
# WINDOW SELECTABLE
#----------------------------------------------------------------------
class Window_Selectable
alias mouse_update update
alias mouse_init initialize
def initialize(x,y,w,h)
mouse_init(x,y,w,h)
@mouse_all_rects = []
@timer = 0
end
def update
mouse_update
update_mouse if self.active
end
def update_mouse
@timer -= 1
@mouse_all_rects = []
item_max.times {|i|
rect = item_rect(i)
rect.x += self.x + standard_padding - self.ox
rect.y += self.y + standard_padding - self.oy
if !self.viewport.nil?
rect.x += self.viewport.rect.x - self.viewport.ox
rect.y += self.viewport.rect.y - self.viewport.oy
end
@mouse_all_rects.push(rect) }
item_max.times {|i|
next if @timer > 0
next unless Mouse.within?(@mouse_all_rects[i])
@timer = 10 if i > top_row * 2 + page_item_max - 1
@timer = 10 if i < top_row * 2
self.index = i }
process_cancel if Mouse.rclick? && cancel_enabled?
return if MOUSE_CLICK_WITHIN && !within_index
process_ok if Mouse.lclick? && ok_enabled?
end
def within_index
item_max.times {|i|
return true if Mouse.within?(@mouse_all_rects[i]) }
return false
end
end
#----------------------------------------------------------------------
# WINDOW NAME IMPUT
#----------------------------------------------------------------------
class Window_NameInput
alias mouse_process_handling process_handling
def process_handling
mouse_process_handling
process_back if Mouse.rclick?
end
def item_max
return 90
end
end
#----------------------------------------------------------------------
# WINDOW MESSAGE
#----------------------------------------------------------------------
class Window_Message < Window_Base
def input_pause
self.pause = true
wait(10)
Fiber.yield until Input.trigger?(:B) || Input.trigger?(:C) || Mouse.lclick? #if !SceneManager.scene_is?(Scene_Map))
Input.update
self.pause = false
end
end
#----------------------------------------------------------------------
# SCENE FILE
#----------------------------------------------------------------------
class Scene_File < Scene_MenuBase
alias mouse_update update
def update
mouse_update
mouse_input
end
def mouse_input
xx = 0
yy = 56
width = Graphics.width
rectcm1 = Rect.new(xx, yy, width, savefile_height)
rectcm2 = Rect.new(xx, yy + rectcm1.height, width, savefile_height)
rectcm3 = Rect.new(xx, yy + rectcm1.height * 2, width, savefile_height)
rectcm4 = Rect.new(xx, yy + rectcm1.height * 3, width, savefile_height)
rectttl = Rect.new(xx, yy, width, rectcm1.height * 4)
rectcmA = Rect.new(0, yy - 12, Graphics.width, 24)
rectcmB = Rect.new(0, Graphics.height - 12, Graphics.width, 24)
@scroll = self.top_index
last_index = @index
@index = (0 + @scroll) if Mouse.within?(rectcm1)
@index = (1 + @scroll) if Mouse.within?(rectcm2)
@index = (2 + @scroll) if Mouse.within?(rectcm3)
@index = (3 + @scroll) if Mouse.within?(rectcm4)
cursor_down(false) if Mouse.within?(rectcmB) and Mouse.slowpeat
cursor_up(false) if Mouse.within?(rectcmA) and Mouse.slowpeat
if @index != last_index
Sound.play_cursor
@savefile_windows[last_index].selected = false
@savefile_windows[@index].selected = true
end
on_savefile_ok if Mouse.lclick? and Mouse.within?(rectttl)
on_savefile_cancel if Mouse.rclick? and Mouse.within?(rectttl)
end
end
#----------------------------------------------------------------------
# GAME OVER
#----------------------------------------------------------------------
class Scene_Gameover
alias mouse_update update
def update
mouse_update
goto_title if Mouse.lclick? or Mouse.rclick?
end
end
#----------------------------------------------------------------------
# GAME PLAYER
#----------------------------------------------------------------------
class Game_Player < Game_Character
alias mouse_move_update update
def update
mouse_move_update
mouse_input
end
def mouse_input
begin
return if USE_MOUSE_BUTTONS && SceneManager.scene.mouse_overlay.update
rescue
return
end
return if !movable? || $game_map.interpreter.running?
if !Mouse.lclick?(true) then return end
if moving? then return end
Graphics.width / 32 % 2 == 0 ? xxx = 16 : xxx = 0
Graphics.height / 32 % 2 == 0 ? yyy = 16 : yyy = 0
x = $game_map.display_x + (Mouse.pos?[0] + xxx) / 32
y = $game_map.display_y + (Mouse.pos?[1] + yyy) / 32
x -= 0.5 if Graphics.width / 32 % 2 == 0
y -= 0.5 if Graphics.height / 32 % 2 == 0
return if start_map_event_mouse(x, y, [0,1,2], false)
if MOUSE_DIR8
x = $game_map.display_x * 32 + Mouse.pos?[0]
y = $game_map.display_y * 32 + Mouse.pos?[1]
x -= @x * 32 + 16
y -= @y * 32 + 16
angle = Math.atan(x.abs/y.abs) * (180 / Math::PI)
angle = (90 - angle) + 90 if x > 0 && y > 0
angle += 180 if x < 0 && y > 0
angle = 90 - angle + 180 + 90 if x < 0 && y < 0
move_straight(8) if angle >= 337 || angle < 22
move_diagonal(6,8) if angle >= 22 && angle < 67
move_straight(6) if angle >= 67 && angle < 112
move_diagonal(6,2) if angle >= 112 && angle < 157
move_straight(2) if angle >= 157 && angle < 202
move_diagonal(4,2) if angle >= 202 && angle < 247
move_straight(4) if angle >= 247 && angle < 292
move_diagonal(4,8) if angle >= 292 && angle < 337
else
x = $game_map.display_x + Mouse.pos?[0] / 32
y = $game_map.display_y + Mouse.pos?[1] / 32
sx = distance_x_from(x)
sy = distance_y_from(y)
if sx.abs > sy.abs
move_straight(sx > 0 ? 4 : 6)
move_straight(sy > 0 ? 8 : 2) if !@move_succeed && sy != 0
elsif sy != 0
move_straight(sy > 0 ? 8 : 2)
move_straight(sx > 0 ? 4 : 6) if !@move_succeed && sx != 0
end
end
end
def start_map_event_mouse(x, y, triggers, normal)
return false if $game_map.interpreter.running?
$game_map.events_xy(x, y).each do |event|
next unless event.trigger_from_afar
if event.trigger_in?(triggers)
event.start
return true
end
end
return false
end
end
#----------------------------------------------------------------------
# GAME_EVENT
#----------------------------------------------------------------------
class Game_Event
def trigger_from_afar
return @event.name.include?("&&")
end
def mouse_icon?
@event.name =~ /I:(\d+)/ ? $1.to_i : false
end
end
#----------------------------------------------------------------------
# SCENE MAP
#----------------------------------------------------------------------
class Scene_Map
attr_accessor :mouse_overlay
alias mouse_update update
alias mouse_overlay_init start
alias mouse_pre_battle pre_battle_scene
def start(*args)
mouse_overlay_init(*args)
@mouse_overlay = Mouse_Overlay.new if USE_MOUSE_BUTTONS
@last_mouse_x = -1
@last_mouse_y = -1
end
def update
mouse_update
mouse_input_events
update_mouse_icon
end
def mouse_input_events
xx = $game_player.screen_x
yy = $game_player.screen_y
xx -= 16;
recttop = Rect.new(xx - 6, yy - 80, 44, 48)
rectrit = Rect.new(xx + 32, yy - 36, 48, 44)
rectbot = Rect.new(xx - 6, yy, 44, 48)
rectleft = Rect.new(xx - 48, yy - 38, 48, 44)
mouse_action(8) if Mouse.within?(recttop)
mouse_action(6) if Mouse.within?(rectrit)
mouse_action(2) if Mouse.within?(rectbot)
mouse_action(4) if Mouse.within?(rectleft)
call_menu if Mouse.rclick? and !$game_map.interpreter.running?
end
def update_mouse_icon
Graphics.width / 32 % 2 == 0 ? xxx = 16 : xxx = 0
Graphics.height / 32 % 2 == 0 ? yyy = 16 : yyy = 0
x = $game_map.display_x + (Mouse.pos?[0] + xxx) / 32
y = $game_map.display_y + (Mouse.pos?[1] + yyy) / 32
x -= 0.5 if Graphics.width / 32 % 2 == 0
y -= 0.5 if Graphics.height / 32 % 2 == 0
return if x == @last_mouse_x && y == @last_mouse_y
@last_mouse_x = x
@last_mouse_y = y
events = $game_map.events_xy(x,y)
icon = $mouse_icon
events.each do |event|
icon = event.mouse_icon? if event.mouse_icon?
end
$cursor.set_icon(icon)
end
def mouse_action(d)
return if !Mouse.rclick?(true) || $game_map.interpreter.running?
$game_player.set_direction(d)
$game_player.check_action_event
end
def pre_battle_scene
mouse_pre_battle
@mouse_overlay.dispose
end
end
#----------------------------------------------------------------------
# WINDOW NUMBER INPUT
#----------------------------------------------------------------------
class Window_NumberInput
OFS = 12
WLH = 24
alias mouse_update update
def update
mouse_update
mouse_input if SceneManager.scene_is?(Scene_Map) and self.active
end
def mouse_input
hold_rect = []
xx = self.x + OFS
yy = self.y + OFS
width = 20
rectttl = Rect.new(xx, yy, self.contents.width, WLH)
for i in Range.new(0, @digits_max - 1)
hold_rect.push(Rect.new(xx, yy, width, WLH))
xx += width
end
for i in Range.new(0, @digits_max - 1)
@index = i if Mouse.within?(hold_rect[i])
end
rectok = Rect.new(xx, yy, 34, 24)
rectnum = Rect.new(self.x + OFS, yy, @digits_max * 20, WLH)
self.process_ok if Mouse.within?(rectok) and Mouse.lclick?
process_mouse_change if Mouse.within?(rectnum)
end
def refresh
contents.clear
change_color(normal_color)
s = sprintf("%0*d", @digits_max, @number)
@digits_max.times do |i|
rect = item_rect(i)
rect.x += 1
draw_text(rect, s[i,1], 1)
end
draw_text(self.contents.width - 24, 0, 34, WLH, "OK")
end
def update_placement
self.width = @digits_max * 20 + padding * 2 + 34
self.height = fitting_height(1)
self.x = (Graphics.width - width) / 2
if @message_window.y >= Graphics.height / 2
self.y = @message_window.y - height - 8
else
self.y = @message_window.y + @message_window.height + 8
end
end
def process_mouse_change
return unless active
place = 10 ** (@digits_max - 1 - @index)
n = @number / place % 10
@number -= n * place
if Mouse.lclick?
n = (n + 1) % 10
Sound.play_cursor
end
if Mouse.rclick?
n = (n + 9) % 10
Sound.play_cursor
end
@number += n * place
refresh
end
end
#----------------------------------------------------------------------
# MOUSE_OVERLAY
#----------------------------------------------------------------------
class Mouse_Overlay
def initialize
@mouse_buttons = []
MOUSE_BUTTONS.size.times do |i|
@mouse_buttons[i] = Mouse_Button.new
@mouse_buttons[i].x = MOUSE_BUTTONS[i][0]
@mouse_buttons[i].y = MOUSE_BUTTONS[i][1]
@mouse_buttons[i].bitmap = Bitmap.new("Graphics/System/" + MOUSE_BUTTONS[i][2])
@mouse_buttons[i].on_lclick = MOUSE_BUTTONS[i][3]
end
end
def update
@mouse_buttons.size.times do |i| @mouse_buttons[i].update end
if Mouse.lclick?(true)
@mouse_buttons.size.times do |i|
if Mouse.within?(@mouse_buttons[i].current_rect?)
@mouse_buttons[i].on_lclick_eval
return true
end
end
end
return false
end
def dispose
@mouse_buttons.each do |sprite|
sprite.dispose
end
end
end
#----------------------------------------------------------------------
# MOUSE_BUTTON
#----------------------------------------------------------------------
class Mouse_Button < Sprite_Base
attr_accessor :on_lclick
def current_rect?
Rect.new(x,y,width,height)
end
def on_lclick_eval
eval(on_lclick)
end
end
#----------------------------------------------------------------------
# WINDOW_BASE
#----------------------------------------------------------------------
class Window_Base
def rect
Rect.new(self.x,self.y,self.width,self.height)
end
end
#----------------------------------------------------------------------
# SCENE_OPTIONS
#----------------------------------------------------------------------
class Scene_Options < Scene_MenuBase
alias mouse_update update
def update
mouse_update
update_mouse
end
def update_mouse
create_rects unless @rects
@rects.size.times do |i|
@index = i if Mouse.within?(@rects[i])
end
if Mouse.lclick?
if audio_index(@index)
x = Mouse.pos?[0]
return if x < 48+4
return if x > 48+4+400
value = (x - 48).to_f / 400
$game_options.preset_volume(:master, value) if @window_index[@index] == :master
$game_options.preset_volume(:bgm, value) if @window_index[@index] == :bgm
$game_options.preset_volume(:se, value) if @window_index[@index] == :se
@window_masterbar.refresh($game_options.master_volume)
@window_bgmbar.refresh($game_options.bgm_volume)
@window_sebar.refresh($game_options.se_volume)
Sound.play_cursor
$game_map.autoplay if $game_map && $game_map.map_id > 0
end
end
end
def create_rects
@rects = []
WINDOW_ORDER.each do |sym|
@rects.push(@window_masterbar.rect) if sym == :master
@rects.push(@window_bgmbar.rect) if sym == :bgm
@rects.push(@window_sebar.rect) if sym == :se
@rects.push(@window_resolution.rect) if sym == :resolution
@rects.push(@window_message.rect) if sym == :message_se
@rects.push(@window_switch.rect) if sym == :switch
end
@rects.push(@window_command.rect)
end
end
#----------------------------------------------------------------------
# WINDOW_RECIPECONFIRM
#----------------------------------------------------------------------
class Window_RecipeConfirm < Window_Selectable
alias mouse_rec_update update
def update
mouse_rec_update
update_mouse if self.active
end
def update_mouse
@timer -= 1
@mouse_all_rects = []
@mouse_all_rects.push(Rect.new(self.x,self.y,self.contents.width*0.85,self.height))
@mouse_all_rects.push(Rect.new(self.x + self.contents.width*0.85,self.y,self.contents.width*0.25,self.height))
if Mouse.rclick?
if Mouse.within?(@mouse_all_rects[1])
change_amount(-1)
else
process_cancel if cancel_enabled?
end
elsif Mouse.lclick?
process_ok if ok_enabled? && Mouse.within?(@mouse_all_rects[0])
change_amount(1) if Mouse.within?(@mouse_all_rects[1])
end
end
def within_index
item_max.times {|i|
return true if Mouse.within?(@mouse_all_rects[i]) }
return false
end
end
Now, what I'm trying to find in this script is the part that decides if the mouse is hovering over a selectable window. Why? Because I've been experimenting with the scripts and found out that if you create two selectable windows and make the two of them activate, they show up on the screen but you can only interact with the first window created.
So I thought, what if I check if the mouse is hovering over one of the windows and only that window gets activated so I could interact with it while the other window waits inactive? Is such a thing is even possible? I've been inspecting the mouse script since then but I think I'm in over my head with this one.
To make it more clear: Here I'm trying to create a scene for travelling, but I don't want the choices to be on the same window.
Again, Im fairly new to ruby and if none of this makes any sense, sorry
Anyways, what do you think veteran scripters? Is such a thing feasible? Why? Why not? What would be a good alternative path for me (who wants to create his own custom scripts instead of using others') to choose?


