Night.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV/MZ

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Sorties: "Dread Mac Farlane", (...) / Tutos: Checklist de la composition (...) / Sorties: Dread Mac Farlane - episode 8 / Sorties: Dread Mac Farlane - episode 7 / Jeux: Ce qui vit Dessous / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

615 connectés actuellement

29443696 visiteurs
depuis l'ouverture

9773 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Leo-Games

RPG Maker VX

Le Comptoir Du clickeur

Lunae - le bazar d'Emz0

Tous nos partenaires

Devenir
partenaire



forums

Index du forum > Entraide > [RMXP] Détecter le mouse_wheel


Widoo - posté le 13/06/2013 à 12:30:10 (86 messages postés)

❤ 0

I ♥ RMXP

Domaine concerné: SCRIPT
Logiciel utilisé: RMXP
Salut à tous!

Voilà, j'utilise une gestion de clavier avancée ainsi qu'une gestion de souris dans mon projet.

J'utilise l'API Win32API.new("user32","GetAsyncKeyState",['i'],'i')

pour gérer ma souris. En revanche, je n'arrive pas à trouver le moyen de detecter la rotation de la molette.

J'ai dans le module Keyboard

Portion de code : Tout sélectionner

1
KeyMouse = Win32API.new("user32","GetAsyncKeyState",['i'],'i')



plus bas j'essaye de faire un simple test:

Portion de code : Tout sélectionner

1
print("oo") if KeyMouse.call(4)&0x01==1 



mais je n'ai jamais de print... Si quelqu'un peut m'aider un peu ce serait sympa!


Cortez - posté le 13/06/2013 à 14:31:20 (523 messages postés)

❤ 0

Je ne sais pas comment il fait, mais sur ce sujet il est question
d'un script qui permet un tas de truc à la souris et notamment,
l'utilisation de la molette de souris pour bouger dans les listes du
menu.

Par contre c'est pour VX mais si il est possible de l'adapter ...

Sujet :
http://www.rpgmakervx.net/index.php?showtopic=47130

Et script :
http://pastebin.com/raw.php?i=JnpDKivi


Dyeel - posté le 13/06/2013 à 21:26:05 (200 messages postés)

❤ 0

Salut.

Je poste sans avoir la réponse à ta question mais pour te dire que j'ai longtemps (et sans succès) essayé de détecter ça. Néanmoins avec les tests que j'ai fait, que ce soit avec le GetKeyState ou le GetAsyncKeyState, cette commande ne sert qu'à détecter le clic sur la molette et pas la rotation. J'ai essayé pas mal de trucs mais sans succès et je pense pas avoir un niveau suffisant pour arriver à gérer la molette.

Bon ma réponse est pas vraiment pertinente mais c'était pour dire que tu tireras rien, je pense, de cette méthode.


Tasslehoff - posté le 13/06/2013 à 22:25:43 (5234 messages postés)

❤ 0

Disciple de Pythagolf

Apparemment le script que Cortez a partagé détecte bien la rotation de la molette, puisqu'il y a marqué :

Citation:

Scroll Selectable windows with a mouse's scroll wheel



~~


Zeus81 - posté le 13/06/2013 à 22:55:00 (11071 messages postés)

❤ 0

Faut utiliser PeekMessage ou GetMessage mais aucun des deux n'est parfait.
Avec PeekMessage ça marche une fois sur dix, avec GetMessage ça fait ramer violemment quand il n'y a aucun message.


Widoo - posté le 13/06/2013 à 23:02:37 (86 messages postés)

❤ 0

I ♥ RMXP

Merci à tous!! J'essaye ça demain, là je peux pas trop.

Arf mince alors, en tout cas merci Zeus, j'esseyerais les deux... Tu me conseilles quoi, y a pas un moyen pour éviter de faire tout laguer, genre utiliser un delegate avec le Peek message dans un autre thread, bref de faire de l'asynchrone?!

Je connais pas du tout après tout ce qui est d'API pour input, que ce soit souris et clavier. Y a un début à tout! La gestion de la molette est la dernière commande manquante, et ça pourrais m'apporter un plus pour une question ergonomique dans les menus.

Merci, bonne soirée!


Zeus81 - posté le 14/06/2013 à 00:20:00 (11071 messages postés)

❤ 0

Avec les thread de ruby ça marche pas vu que c'est pas des vrais threads, le mieux c'est de faire sans, tu te fais une scroll bar ou alors tu fais du drag n drop comme sur smartphones.


Widoo - posté le 14/06/2013 à 01:50:21 (86 messages postés)

❤ 0

I ♥ RMXP

Aoutch, des "pseudo threads" tu dis?! Arf, c'est plus chiant à coder une Scroll window mais faudra bien que j'y passe! C'est dommage ça aurais été sympa d'implémenter ça!


Berka - posté le 16/06/2013 à 21:11:07 (493 messages postés)

❤ 0

planchant sur un script

Tiens, j'avais exploré le truc dans ce script:

Portion de code : Tout sélectionner

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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
#          Scrolling de la map, avec la molette de la souris 
#  berka                    0.1                    Rgss1
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
#              http://www.rpgmakervx-fr.com 
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
# adaptation du script ruby de ˜aŠ�         un grand merci ! 
# 
# molette pour les ordonn�es 
# Ctrl+molette pour les abcisses 
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
module Berka 
  module Souris 
    ID_Int=1  #id de l'interrupteur a activer pour autoriser le scrolling 
    Vitesse=8 #vitesse du scrolling de la map 
  end 
end 
 
class Souris 
  Get_Message=Win32API.new('User32','GetMessage','plll','l') # reception d'un message 
  GetAsyncKeyState=Win32API.new("user32","GetAsyncKeyState",'i','i') # test d'une touche 
  GetKeyState=Win32API.new("user32","GetKeyState",'i','i') # etat d'une touche 
  SetCursorPos=Win32API.new('user32','SetCursorPos','nn','n') # positionnement du curseur 
  GetCursorPo=Win32API.new('user32','GetCursorPos','p','i') # position du curseur 
  ScreenToClient=Win32API.new('user32','ScreenToClient','lp','i') # coordonn�es du handle 
  GetPrivateProfileStringA=Win32API.new('kernel32','GetPrivateProfileStringA','pppplp','l') # lecture fichier 
  FindWindowA=Win32API.new('user32','FindWindowA','pp','l') # recuperation handle d'une fenetre 
  GetClientRect=Win32API.new('user32','GetClientRect','lp','i') # recuperations dimensions ecran 
  GetWindowRect=Win32API.new('user32','GetWindowRect','lp','i') #recuperation dimensions fenetre (handle) 
  Point=Struct.new(:x,:y) # cr�ation d'une structure de symboles: coord molette 
  Message=Struct.new(:message,:wparam,:lparam,:pt) # struct de symboles: message renvoy� par la molette 
  Param=Struct.new(:x,:y,:scroll) # parametres de la molette 
  Scroll=0x0000020A # pointeur de la molette 
  def handle # recuperation du handle du rgss player 
    game_name="\0"*256 
    GetPrivateProfileStringA.call('Game','Title','',game_name,255,".\\Game.ini") 
    game_name.delete!("\0") 
    return handle=FindWindowA.call('RGSS Player',game_name) 
  end 
  def unpack_dword(buffer,offset=0) # d�compactage d'integer 32bits 
    ret=buffer[offset+0]&0x000000ff 
    ret|=(buffer[offset+1] << (8*1))&0x0000ff00 
    ret|=(buffer[offset+2] << (8*2))&0x00ff0000 
    ret|=(buffer[offset+3] << (8*3))&0xff000000 
    return ret 
  end 
  def unpack_msg(buffer) # d�compactage du message de la molette 
    msg=Message.new;msg.pt=Point.new 
    msg.message=unpack_dword(buffer,4*1) 
    msg.wparam=unpack_dword(buffer,4*2) 
    msg.lparam=unpack_dword(buffer,4*3) 
    msg.pt.x=unpack_dword(buffer,4*5) 
    msg.pt.y=unpack_dword(buffer,4*6) 
    return msg 
  end 
  def wmcallback(msg) 
    return unless msg.message==Scroll 
    param=Param.new 
    param.x=word2signed_short(loword(msg.lparam)) 
    param.y=word2signed_short(hiword(msg.lparam)) 
    param.scroll=word2signed_short(hiword(msg.wparam)) 
    return [param.x,param.y,param.scroll] 
  end 
  def hiword(dword);return ((dword&0xffff0000)>>16)&0x0000ffff;end # 
  def loword(dword);return dword&0x0000ffff;end 
  def word2signed_short(value) 
    return value if (value&0x8000)==0 
    return -1*((~value&0x7fff)+1) 
  end 
  def click?(button);@keys.include?(button)?(return true):(return false);end  #si clic 
  def press?(button);@press.include?(button)?(return true):(return false);end # si appui 
  def pressed?(key);return true unless GetKeyState.call(key).between?(0,1);return false;end # test appui 
  def global_pos;pos=[0,0].pack('ll');GetCursorPo.call(pos)!=0 ? (return pos.unpack('ll')):(return nil);end # pos a l'ecran 
  def set_pos(x_pos=0,y_pos=0) # positionnement 
    width,height=client_size 
    if (x_pos.between?(0,width)&&y_pos.between?(0,height)) 
      SetCursorPos.call(client_pos[0]+x_pos,client_pos[1]+y_pos) 
    end 
  end 
  def update # maj des entrees 
    @pos,@keys,@press=pos,[],[] 
    @keys << 1 if GetAsyncKeyState.call(1)&0x01==1 
    @keys << 2 if GetAsyncKeyState.call(2)&0x01==1 
    @keys << 3 if GetAsyncKeyState.call(4)&0x01==1 
    @press << 1 if pressed?(1) 
    @press << 2 if pressed?(2) 
    @press << 3 if pressed?(4) 
  end  
  def pos # recuperation position dans player 
    x,y=screen_to_client(*global_pos) 
    width,height=client_size 
    begin 
      x=0 if x<=0;y=0 if y<=0 
      x=width if x>=width;y=height if y>=height 
      return x,y 
    end 
  end 
  def dans_player? # teste si curseur est dans player 
    return true if global_pos[0].between?(client_pos[0],client_pos[0]+client_size[0])&& 
    global_pos[1].between?(client_pos[1],client_pos[1]+client_size[1]) 
    return false 
  end 
  def screen_to_client(x,y) #pos player dans ecran 
    return nil unless x&&y 
    pos=[x,y].pack('ll') 
    ScreenToClient.call(handle,pos)!=0?(return pos.unpack('ll')):(return nil) 
  end 
  def client_size # dimensions player 
    rect=[0,0,0,0].pack('l4') 
    GetClientRect.call(handle,rect) 
    right,bottom=rect.unpack('l4')[2..3] 
    return right,bottom 
  end 
  def client_pos # position player 
    rect=[0,0,0,0].pack('l4') 
    GetWindowRect.call(handle,rect) 
    left,upper=rect.unpack('l4')[0..1] 
    return left+4,upper+30 
  end  
  def grid # convertit position en position carreaux 
    return nil if @pos.nil? 
    return [(@pos[0]+$game_map.display_x/8)/32,(@pos[1]+$game_map.display_y/8)/32] 
  end 
  def scroll # retourne l'etat de la molette 
    msg="\0"*32;Get_Message.call(msg,0,0,0);r=wmcallback(unpack_msg(msg)) 
    return r if !r.nil? 
  end 
end 
$souris=Souris.new # lancement de la classe souris 
module Input 
  class << self 
    alias :update_souris :update unless Input.methods.include?("update_souris") 
    def update 
      update_souris 
      $souris.update # maj souris 
    end 
  end 
end 
 
class Scene_Map 
  alias :souris_update :update 
  def update 
    souris_update 
    update_scroll if $souris.dans_player?&&$game_switches[Berka::Souris::ID_Int] 
  end 
  def update_scroll 
    s=$souris.scroll;return if s.nil? 
    s[2]<0 ? (Input.press?(Input::CTRL) ? d=6 : d=2) : (Input.press?(Input::CTRL) ? d=4 : d=8) 
    $game_map.start_scroll(d,1,Berka::Souris::Vitesse) # lance le scroll dans la direction d 
  end 
end



Bonne soirée,

Berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques


Widoo - posté le 16/06/2013 à 23:23:05 (86 messages postés)

❤ 0

I ♥ RMXP

Ce qui est marrant, c'est qu'à la base j'utilise ton script de curseur pour la souris, enfin une vieille vieille version à toi que j'ai modifié pour ajouter tous les controles (clicks, doubles clicks) listeners etc...


Je dévoe ce script dans une heure! Merci!!

Index du forum > Entraide > [RMXP] Détecter le mouse_wheel

repondre up

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers