[résolu] Afficher le curseur de la souris en plein écran
Mar 15 Fév 2011 - 17:28
Bonjour tout le monde,
Mon problème paraît très simple, et pourtant je n'ai rien trouvé sur le forum, même en faisant une recherche.
Voilà : j'utilise un script pour diriger le héros avec la souris, mais quand je lance le jeu en plein écran, il n'y a pas de curseur visible.
La souris fonctionne pourtant en plein écran, puisque le héros se déplace quand je clique. Auriez-vous un script permettant d'afficher un curseur ?
Je me doute bien que je devrais avoir un fichier graphique parce que je ne pense pas qu'on utilise dans ce cas le curseur de Windows, mais de ce côté, pas de souci.
Pour info, le script souris que j'utilise, c'est celui de SephirothSpawn.
Je ne connais pas encore bien le code Ruby, mais je me débrouille pour placer et modifier les codes.
Merci merci merci
Mon problème paraît très simple, et pourtant je n'ai rien trouvé sur le forum, même en faisant une recherche.
Voilà : j'utilise un script pour diriger le héros avec la souris, mais quand je lance le jeu en plein écran, il n'y a pas de curseur visible.
La souris fonctionne pourtant en plein écran, puisque le héros se déplace quand je clique. Auriez-vous un script permettant d'afficher un curseur ?
Je me doute bien que je devrais avoir un fichier graphique parce que je ne pense pas qu'on utilise dans ce cas le curseur de Windows, mais de ce côté, pas de souci.
Pour info, le script souris que j'utilise, c'est celui de SephirothSpawn.
Je ne connais pas encore bien le code Ruby, mais je me débrouille pour placer et modifier les codes.
Merci merci merci
Re: [résolu] Afficher le curseur de la souris en plein écran
Mar 15 Fév 2011 - 19:29
Peux-tu poster ici le script de souris que tu utilises ?
Re: [résolu] Afficher le curseur de la souris en plein écran
Mar 15 Fév 2011 - 19:56
Voir ci-dessous - c'est un script trouvé sur ce forum je suppose - je ne pense pas en avoir trouvé ailleurs.
Il y a une partie de toi je crois, mais j'ai enlevé une partie pour obtenir le gameplay que je recherchais.
Je pense que c'est possible de faire afficher le curseur non ? Merci d'avance.
Il y a une partie de toi je crois, mais j'ai enlevé une partie pour obtenir le gameplay que je recherchais.
Je pense que c'est possible de faire afficher le curseur non ? Merci d'avance.
- Spoiler:
- #===========================================
# Module Keyboard/Mouse
# par SephirothSpawn
#===========================================
module Keyboard
@keys = []
@pressed = []
Mouse_Left = 1
Mouse_Right = 2
State = Win32API.new("user32","GetKeyState",['i'],'i')
Key = Win32API.new("user32","GetAsyncKeyState",['i'],'i')
def Keyboard.getstate(key)
return true unless State.call(key).between?(0, 1)
return false
end
def Keyboard.testkey(key)
Key.call(key) & 0x01 == 1
end
def Keyboard.update
@keys = []
@keys.push(Keyboard::Mouse_Left) if Keyboard.testkey(Keyboard::Mouse_Left)
@keys.push(Keyboard::Mouse_Right) if Keyboard.testkey(Keyboard::Mouse_Right)
@pressed = []
@pressed.push(Keyboard::Mouse_Left) if Keyboard.getstate(Keyboard::Mouse_Left)
@pressed.push(Keyboard::Mouse_Right) if Keyboard.getstate(Keyboard::Mouse_Right)
end
def Keyboard.trigger?(key)
return true if @keys.include?(key)
return false
end
def Keyboard.pressed?(key)
return true if @pressed.include?(key)
return false
end
end
class Mouse
@mouse_menu = 0
def click?(button)
return true if @keys.include?(button)
return false
end
def press?(button)
return true if @press.include?(button)
return false
end
def area?(x, y, width=32, height=32)
return false if @pos == nil
return true if @pos[0] >= x and @pos[0] <= (x+width) and @pos[1] >= y and @pos[1] <= (y+height)
return false
end
def pixels
return @pos == nil ? [0, 0] : @pos
end
def tiles
return nil if @pos == nil
x = @pos[0] / 32
y = @pos[1] / 32
return [x, y]
end
def set_pos(x_pos=0, y_pos=0)
width, height = client_size
if (x_pos.between?(0, width) && y_pos.between?(0, height))
x = $mouse.client_pos[0] + x_pos; y = $mouse.client_pos[1] + y_pos
Win32API.new('user32', 'SetCursorPos', 'NN', 'N').call(x, y)
end
end
def update
@pos = $mouse.pos
@keys, @press = [], []
@keys.push(1) if Win32API.new("user32","GetAsyncKeyState",['i'],'i').call(1) & 0X01 == 1
@keys.push(2) if Win32API.new("user32","GetAsyncKeyState",['i'],'i').call(2) & 0X01 == 1
@keys.push(3) if Win32API.new("user32","GetAsyncKeyState",['i'],'i').call(4) & 0X01 == 1
@press.push(1) if Win32API.new("user32","GetKeyState",['i'],'i').call(1) & 0X01 == 1
@press.push(2) if Win32API.new("user32","GetKeyState",['i'],'i').call(2) & 0X01 == 1
@press.push(3) if Win32API.new("user32","GetKeyState",['i'],'i').call(4) & 0X01 == 1
end
def global_pos
pos = [0, 0].pack('ll')
if Win32API.new('user32', 'GetCursorPos', 'p', 'i').call(pos) != 0
return pos.unpack('ll')
else
return nil
end
end
def pos
@x, @y = screen_to_client(*global_pos)
width, height = @width,@height
if @x ==nil or @y== nil
return 0,0
end
if (@x >= 0 and @y >= 0)
@x = @x==nil ? 0 : @x
@y = @y==nil ? 0 : @y
return @x, @y
else
return 0,0
end
end
def screen_to_client(x, y)
return nil unless x and y
pos = [x, y].pack('ll')
if Win32API.new('user32', 'ScreenToClient', %w(l p), 'i').call(hwnd, pos) != 0
return pos.unpack('ll')
else
return nil
end
end
def hwnd
game_name = "\0" * 256
Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l').call('Game','Title','',game_name,255,".\\Game.ini")
game_name.delete!("\0")
return Win32API.new('user32', 'FindWindowA', %w(p p), 'l').call('RGSS Player',game_name)
end
def client_size
rect = [0, 0, 0, 0].pack('l4')
Win32API.new('user32', 'GetClientRect', %w(l p), 'i').call(hwnd, rect)
right, bottom = rect.unpack('l4')[2..3]
return right, bottom
end
def client_pos
rect = [0, 0, 0, 0].pack('l4')
Win32API.new('user32', 'GetWindowRect', %w(l p), 'i').call(hwnd, rect)
left, upper = rect.unpack('l4')[0..1]
return left+4, upper+30
end
def grid
return nil if @pos == nil
offsetx = $game_map.display_x / 8
offsety = $game_map.display_y / 8
x = (@pos[0] + offsetx) / 32
y = (@pos[1] + offsety) / 32
return [x, y]
end
end
#===========================================
# Pathfinding
# par SephirothSpawn
#===========================================
class Game_Character
alias nf_pf_game_character_initialize initialize
alias nf_pf_game_character_update update
attr_accessor :map
attr_accessor :runpath
def initialize
nf_pf_game_character_initialize
@map = nil
@runpath = false
end
def update
run_path if @runpath == true
nf_pf_game_character_update
end
def run_path
return if moving?
step = @map[@x,@y]
if step == 1
@map = nil
@runpath = false
return
end
dir = rand(2)
case dir
when 0
move_right and break_pose if @map[@x+1,@y] == step - 1 and step != 0
move_down and break_pose if @map[@x,@y+1] == step - 1 and step != 0
move_left and break_pose if @map[@x-1,@y] == step -1 and step != 0
move_up and break_pose if @map[@x,@y-1] == step - 1 and step != 0
when 1
move_up and break_pose if @map[@x,@y-1] == step - 1 and step != 0
move_left and break_pose if @map[@x-1,@y] == step -1 and step != 0
move_down and break_pose if @map[@x,@y+1] == step - 1 and step != 0
move_right and break_pose if @map[@x+1,@y] == step - 1 and step != 0
end
end
def find_path(x,y)
sx, sy = @x, @y
result = setup_map(sx,sy,x,y)
@runpath = result[0]
@map = result[1]
@map[sx,sy] = result[2] if result[2] != nil
end
def clear_path
@map = nil
@runpath = false
end
def setup_map(sx,sy,ex,ey)
map = Table.new($game_map.width, $game_map.height)
map[ex,ey] = 1
old_positions = []
new_positions = []
old_positions.push([ex, ey])
depth = 2
depth.upto(100){|step|
loop do
break if old_positions[0] == nil
x,y = old_positions.shift
return [true, map, step] if x == sx and y+1 == sy
if $game_player.passable?(x, y) and map[x,y + 1] == 0
map[x,y + 1] = step
new_positions.push([x,y + 1])
end
return [true, map, step] if x-1 == sx and y == sy
if $game_player.passable?(x, y) and map[x - 1,y] == 0
map[x - 1,y] = step
new_positions.push([x - 1,y])
end
return [true, map, step] if x+1 == sx and y == sy
if $game_player.passable?(x, y) and map[x + 1,y] == 0
map[x + 1,y] = step
new_positions.push([x + 1,y])
end
return [true, map, step] if x == sx and y-1 == sy
if $game_player.passable?(x, y) and map[x,y - 1] == 0
map[x,y - 1] = step
new_positions.push([x,y - 1])
end
end
old_positions = new_positions
new_positions = []
}
return [false, nil, nil]
end
end
class Game_Map
alias pf_game_map_setup setup
def setup(map_id)
pf_game_map_setup(map_id)
$game_player.clear_path
end
end
#===========================================
# Mouvement par souris
# par berka
#===========================================
# modifié:
# clic gauche: definir le point d'arrivée + scrolling automatique
#===========================================
$mouse = Mouse.new
class Scene_Map
alias scroll_update update
def update
Keyboard.update
$mouse.update
if Keyboard.trigger?(Keyboard::Mouse_Left)
$game_player.find_path($mouse.grid[0], $mouse.grid[1])
end
scroll_update
end
end
Re: [résolu] Afficher le curseur de la souris en plein écran
Mar 15 Fév 2011 - 20:44
Essaye avec cela. A copier au dessus de main
- Code:
#----------------------------------------
# Curseur par Berka
# rgss2
# nécessite le script Mouse
# changement du curseur
# Curseur.set(fichier)
#----------------------------------------
module Berka
module Curseur_Mod
Bmp_Curs='Graphics/System/Curseur.png'
Scroll_Actif=true
end
end
class Sprite_Curseur < RPG::Sprite
def initialize
super
Win32API.new('user32','ShowCursor','i','i').call(0)
self.z=5000
set(Berka::Curseur_Mod::Bmp_Curs)
update
end
def set(curseur="")
(self.bitmap=Bitmap.new(curseur);return)rescue nil
self.bitmap=Bitmap.new(24,24)
bitmap=RPG::Cache.icon("001-Weapon01")
rect=Rect.new(0,0,24,24)
self.bitmap.blt(0,0,bitmap,rect)
end
def update;super;self.x,self.y=Mouse.pos;end
def dispose;super;end
end
Curseur=Sprite_Curseur.new
module Graphics
class<<self
alias :graphics_update :update unless Graphics.methods.include?('graphics_update')
def update
graphics_update
Curseur.update
end
end
end
Re: [résolu] Afficher le curseur de la souris en plein écran
Mar 15 Fév 2011 - 21:53
Merci pour cette réponse rapide Berka !
J'ai donc, fabriqué un curseur au format png et l'ai nommé comme dans ton code, mais il y a un message d'erreur malgré tout : TypeError occured, undefined superclass 'sprite'.
à la ligne :
Ou bien est-ce une question de version de RM ? J'ai la version VX.
J'ai donc, fabriqué un curseur au format png et l'ai nommé comme dans ton code, mais il y a un message d'erreur malgré tout : TypeError occured, undefined superclass 'sprite'.
à la ligne :
- Code:
class Sprite_Curseur < RPG::Sprite
Ou bien est-ce une question de version de RM ? J'ai la version VX.
Re: [résolu] Afficher le curseur de la souris en plein écran
Mar 15 Fév 2011 - 22:01
Essaye avec :
- Code:
class Sprite_Curseur < Sprite
Re: [résolu] Afficher le curseur de la souris en plein écran
Mar 15 Fév 2011 - 22:07
Maintenant, il me dit " undefined method 'pos' for Mouse:Class ".
Re: [résolu] Afficher le curseur de la souris en plein écran
Mar 15 Fév 2011 - 22:10
En effet, le script a été légèrement modifié dans ta version:
Voici le script correct
Voici le script correct
- Code:
#----------------------------------------
# Curseur par Berka
# rgss2
# nécessite le script Mouse
# changement du curseur
# Curseur.set(fichier)
#----------------------------------------
module Berka
module Curseur_Mod
Bmp_Curs='Graphics/System/Curseur.png'
Scroll_Actif=true
end
end
class Sprite_Curseur < Sprite
def initialize
super
Win32API.new('user32','ShowCursor','i','i').call(0)
self.z=5000
set(Berka::Curseur_Mod::Bmp_Curs)
update
end
def set(curseur="")
(self.bitmap=Bitmap.new(curseur);return)rescue nil
self.bitmap=Bitmap.new(24,24)
bitmap=RPG::Cache.icon("001-Weapon01")
rect=Rect.new(0,0,24,24)
self.bitmap.blt(0,0,bitmap,rect)
end
def update;super;self.x,self.y=$mouse.pos;end
def dispose;super;end
end
Curseur=Sprite_Curseur.new
module Graphics
class<<self
alias :graphics_update :update unless Graphics.methods.include?('graphics_update')
def update
graphics_update
Curseur.update
end
end
end
Re: [résolu] Afficher le curseur de la souris en plein écran
Mar 15 Fév 2011 - 22:26
Oui, en effet, j'espère que tu n'y as pas trouvé trop d'aberrations, en tous cas, je n'avais pas de bug.
Ton code fonctionne impeccable, merci beaucoup.
Je mets donc "résolu" dans mon titre, et je pense qu'il faudrait l'ajouter au listing des scripts, non ?
Merci encore , et bonne nuit.
Ton code fonctionne impeccable, merci beaucoup.
Je mets donc "résolu" dans mon titre, et je pense qu'il faudrait l'ajouter au listing des scripts, non ?
Merci encore , et bonne nuit.
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|