1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
# Mouse Ultimate v1.2.2
# Il y a trois touches possibles : Mouse::LEFT, Mouse::RIGHT et Mouse::MIDDLE
# pour respectivement clic gauche, clic droit et clic milieu.
# Vous pouvez trouvez les fonctions trigger?, press? et repeat? comme dans Input
# Mais aussi Mouse.release?(key) pour voir si une touche est relachée
# et Mouse.double_trigger?(key) pour les double clics.
# On récupère les coordonnées du curseur avec Mouse.x et Mouse.y
# On peut aussi déplacer le curseur avec Mouse.x = new_x et Mouse.y = new_y
# Pour changer la visibilité du curseur : Mouse.visible = true ou false
# Ajouts v1.2 :
# Optimisation des performances.
# Vous pouvez sélectionner l'image du curseur ligne 35, attention à bien
# preciser le chemin complet (ex : 'Graphics/Pictures/MonCurseur.png').
# La souris est mise à jour automatiquement tant qu'elle est visible.
# Modifications v1.2.1 :
# Après test, il semblerait qu'il soit inutile de préciser le nom de la fenêtre
# dans FindWindow tant qu'on ne crée pas de fenêtre fille.
# En gros ça ne lit plus le fichier "Game.ini" pour avoir le nom du jeu ce qui
# prévient par ailleurs le changement de nom du fichier et donc des bugs.
# Modifications v1.2.2 :
# Réparation du bug quand on presse F12.
# Ajout du ClipCursor qui permet d'empêcher la souris de sortir de la fenêtre du
# jeu quand on est en mode fenêtré.
# Vous pouvez le configurer ligne 36.
# CursorClipMode = 0 # Désactivé, la souris est libre d'aller n'importe où.
# CursorClipMode = 1 # La souris ne peut pas sortir de la fenêtre de jeu.
# CursorClipMode = 2 # La souris ne peut pas sortir de la surface de jeu.
# La différence entre 1 et 2 c'est qu'en 2 on ne peut pas aller sur les boutons
# pour Réduire ou Fermer le jeu ou même déplacer la fenêtre.
# /!\ Attention : Si on utilise le raccourci Alt+Tab cela créera un bug, la
# souris ne pouvant toujours pas sortir de son cadre, il est conseillé
# d'utiliser le mode 1 pour pouvoir réduire la fenêtre en bonnet du forme.
module Mouse
CursorFileName = '' # ex : 'Graphics/Pictures/MonCurseur.png'
CursorClipMode = 0 # 0,1,2
ClipCursor = Win32API.new('user32', 'ClipCursor', 'p', 'i')
ShowCursor = Win32API.new('user32', 'ShowCursor', 'i', 'i')
FindWindow = Win32API.new('user32', 'FindWindow', 'pp', 'i')
GetKeyState = Win32API.new('user32', 'GetKeyState', 'i', 'i')
GetCursorPos = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
SetCursorPos = Win32API.new('user32', 'SetCursorPos', 'ii', 'i')
GetClientRect = Win32API.new('user32', 'GetClientRect', 'ip', 'i')
GetWindowRect = Win32API.new('user32', 'GetWindowRect', 'ip', 'i')
ClientToScreen = Win32API.new('user32', 'ClientToScreen', 'ip', 'i')
ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'ip', 'i')
GetDoubleClickTime = Win32API.new('user32', 'GetDoubleClickTime', '', 'i')
Cursor = Sprite.new
Cursor.z, Cursor.visible = 0xFFFF, false
if CursorFileName.empty?
Cursor.bitmap = Bitmap.new(8, 8)
Cursor.bitmap.fill_rect(0, 0, 3, 7, Color.new(0,0,0))
Cursor.bitmap.fill_rect(0, 0, 7, 3, Color.new(0,0,0))
Cursor.bitmap.fill_rect(5, 5, 3, 3, Color.new(0,0,0))
Cursor.bitmap.fill_rect(1, 1, 1, 5, Color.new(255,255,255))
Cursor.bitmap.fill_rect(1, 1, 5, 1, Color.new(255,255,255))
Cursor.bitmap.fill_rect(6, 6, 1, 1, Color.new(255,255,255))
else Cursor.bitmap = Bitmap.new(CursorFileName)
end
DCT = GetDoubleClickTime.call * Graphics.frame_rate / 1000
RA, RB = Graphics.frame_rate*4/10, Graphics.frame_rate/10
HWindow = FindWindow.call('RGSS Player', 0)
LEFT, RIGHT, MIDDLE = 1, 2, 4
@count = {LEFT=>[0, 0], RIGHT=>[0, 0], MIDDLE=>[0, 0]}
@pos, @clip = "\0"*8, "\0"*16
def self.update
case CursorClipMode
when 1
GetWindowRect.call(HWindow, @clip)
ClipCursor.call(@clip)
when 2
GetClientRect.call(HWindow, @clip)
ClientToScreen.call(HWindow, @clip)
r = @clip.unpack('llll')
@clip[8,8] = [r[0]+r[2], r[1]+r[3]].pack('ll')
ClipCursor.call(@clip)
end
GetCursorPos.call(@pos)
ScreenToClient.call(HWindow, @pos)
Cursor.x, Cursor.y = @pos.unpack('ll')
dct = (gfc=Graphics.frame_count) - DCT
for k,v in @count
v[0] = get_press(k) ? v[0]+1 : v[0]>0 ? -1 : 0
v[1] = v[1]>dct ? v[0]==1 ? -1 : v[1] : v[0]==1 ? gfc : 0
end
end
def self.press?(k) valid?(k) and @count[k][0] > 0 end
def self.trigger?(k) valid?(k) and @count[k][0] == 1 end
def self.double_trigger?(k) valid?(k) and @count[k][1] == -1 end
def self.release?(k) valid?(k) and @count[k][0] == -1 end
def self.repeat?(k) valid?(k) and ((c=@count[k][0])==1 or (c>RA and c%RB==0)) end
def self.x() Cursor.x end
def self.y() Cursor.y end
def self.visible() Cursor.visible end
def self.x=(x) set_pos(x, y) end
def self.y=(y) set_pos(x, y) end
def self.visible=(v)
loop {break if v ? ShowCursor.call(0)<0 : ShowCursor.call(1)>0}
Cursor.visible = v
end
def self.valid?(k) @count.include?(k) end
def self.get_press(k) GetKeyState.call(k)[15]==1 end
def self.set_pos(x, y)
ClientToScreen.call(HWindow, pos=[Cursor.x=x, Cursor.y=y].pack('ll'))
SetCursorPos.call(*pos.unpack('ll'))
end
end
class << Input
unless method_defined?(:zeus_mouse_update)
alias zeus_mouse_update update
end
def update
Mouse.update if Mouse.visible
zeus_mouse_update
end
end
Mouse.visible = true # true or false, activer ou desactive le curseur.
|