Oniromancie: Scripts - Déplacement à la souris v2.0


Comment ça marche?

Aëdemphia
Par Sylvanor

Fighting Robots Quest
Par Boulon

Forstale
Par Ødd Clock

Geex
Par roys

Inexistence
Par Falco

La Légende d'Ibabou
Par Zaitan

Lije
Par Gaetz

LoveMaster
Par Cuddlefox

Sarcia
Par Kaëlar

Super Mario RPG - Lost Souls
Par Omegabowser

Jeux: Monster World RPG / Jeux: Pif et Hercule / News: Mise à jour de RPG Maker 2003 / Tutos: Création de charset / Jeux: FAYLINAWA /

Chat  (66 connectés)

Bienvenue
visiteur !






publicité RPG Maker!

Statistiques

Liste des
membres


Contact

68 connectés actuellement

9257269 visiteurs
depuis l'ouverture

1396 visiteurs
aujourd'hui

Groupe Facebook

Barre de séparation

Partenaires




TOP
GAMEMAKING


Les 5 plus
visités

Lunae, le baz'arts d'Emz0

Le studio du chat vert

Pixelandgame

Tashiroworld

HeyMakeGames

Au hasard

Magic-mangas

RPG Maker Revolution

LUMEN - Le jeu

Les deux derniers

Lunae, le baz'arts d'Emz0

Le studio du chat vert

Nos autres partenaires

Devenir
partenaire


Barre de séparation

Un site du réseau
War Paradise

Annuaires référenceurs




Déplacement à la souris v2.0
Script pour RPG Maker VX
Ecrit par cari974

Bonjour à tous, ce script a déjà était proposer par Berka sur le forum mais il n'était pas dans la bonne section. je me permet donc de copier/coller son poste. Poste d'origine : http://www.rpg-maker.fr/scripts-245-deplacement-a-la-souris-v20.html


Pour conclure cette si belle année, voici une seconde mouture de mon script de déplacement à la souris.
J'ai eu beaucoup de demandes de mise à jour. Après pas mal de temps, j'ai pris mon courage à deux mains et j'ai entièrement recodé le systeme. Globalement il est plus stable, plus rapide, mais aussi beaucoup plus complexe. Le contraire serait beaucoup moins drole.

Quoi de neuf?
- Nouvelle gestion du drag and drop par multithreading. Pour ceux à qui ca ne dit rien, c'est une sorte d'exécution parallèle de bouts de code. Bref, le résultat est plus rapide, mais le jeu est poussé à fond. Mais vous commencez à avoir l'habitude, après le calcul du système de brouillard de guerre.
- Maintenant, tous les événements sélectionnés se déplacent. Sauf pour des sélections trop grandes: le script de pathfinding (le meilleur actuellement, de Modern Algebra) est ce qu'il est, il ne réfléchit pas trop longtemps. C'est peut être la seule ombre au script. Mais on ne peut rien y faire.
- Les événements sélectionnés changent de couleur.
- Les bordure de l'écran sont réactives, comme dans Age Of Empires, il suffit de mettre sa souris sur un coté, pour faire défiler la carte.
- Mise en mémoire de la sélection d'événements jusqu'à nouvelle selection ou déselection.
- Voila tout, je pense. Si vous avez des suggestions, n'hésitez pas.

Voici en tout 4 scripts. A coller dans l'ordre suivant:

Citation:


Clavier
Souris
... tous les scripts
PathFinding
Déplacement
... main




Clavier :

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
 
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#                                                                  Gestion du Clavier
# par TLN et Lordrik, revu par Berka                                                                    rgss2 (V<img src="smileys/sourirex.gif" alt="X)" />
#--------------------------------------------------------------------------------------------------------------------------------------
# A placer au début de la liste de scripts, complètement. Ne pas utiliser deux scripts de clavier !
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
module Win32API::APIS
  GAKS=Win32API.new("user32","GetAsyncKeyState",'i','i') 
  GKS=Win32API.new("user32","GetKeyState",'i','i') 
  KBDE=Win32API.new('user32','keybd_event','iii','')
end
include Win32API::APIS
module Input
  class<<self
    Inconnu="Cette touche est inconnue"
    TAB_KEY={'clic gauche'=>1,'clic droit'=>2,'clic milieu'=>4,
            'sm'=>4,'del'=>8,'tab'=>9,'enter'=>13,'shift'=>16,'ctrl'=>17,'alt'=>18,
            'pause'=>19,'caps lock'=>20,'esc'=>27,'space'=>32,'pg up'=>33,'pg down'=>34,
            'end'=>35,'home'=>36,'left'=>37,'up'=>38,'right'=>39,'down'=>40,'impr'=>44,
            'insert'=>45,'suppr'=>46,'à'=>48,'&'=>49,'é'=>50,'"'=>51,"'"=>52,'('=>53,
            '-'=>54,'è'=>55,'_'=>56,'ç'=>57,'a'=>65,'b'=>66,'c'=>67,'d'=>68,'e'=>69,
            'f'=>70,'g'=>71,'h'=>72,'i'=>73,'j'=>74,'k'=>75,'l'=>76,'m'=>77,'n'=>78,
            'o'=>79,'p'=>80,'q'=>81,'r'=>82,'s'=>83,'t'=>84,'u'=>85,'v'=>86,'w'=>87,
            'x'=>88,'y'=>89,'z'=>90,'lwin'=>91,'rwin'=>92,'fn'=>93,'altgr'=>95,'0'=>96,
            '1'=>97,'2'=>98,'3'=>99,'4'=>100,'5'=>101,'6'=>102,'7'=>103,'8'=>104,
            '9'=>105,'n*'=>106,'+'=>107,'num'=>108,'n-'=>109,'.'=>110,'/'=>111,
            'F1'=>112,'F2'=>113,'F3'=>114,'F4'=>115,'F5'=>116,'F6'=>117,'F7'=>118,
            'F8'=>119,'F9'=>120,'F10'=>121,'F11'=>122,'F12'=>123,'vernum'=>144,
            'verdefil'=>145,'lmaj'=>160,'rmaj'=>161,'lctrl'=>162,'rctrl'=>163,
            'lalt'=>164,'ralt'=>165,'$'=>186,'='=>187,','=>188,';'=>190,':'=>191,
            'ù'=>192,')'=>219,'*'=>220,'^'=>221,'²'=>222,'!'=>223,'<'=>226} 
    RS=TAB_KEY.clone
    RS.keys.each{|k|RS[k]=[false,false,10]}
    Dirs=['left','up','right','down']
    alias :in_upd :update 
    alias :in_trig? :trigger? # Berka: Compatibilité avec touches initiales
    alias :in_pres? :press?
    alias :in_rep? :repeat?
    def press?(n);n.is_a?(Integer)? in_pres?(n): RS[n][0];end 
    def trigger?(n);n.is_a?(Integer)? in_trig?(n): RS[n][1]==1;end 
    def dbtrigger?(n);RS[n][1]==2;end 
    def repeat?(n);n.is_a?(Integer) ? in_rep?(n) : (RS[k][2]%=4;RS[n][2]==0&&RS[n][0]);end 
    def hold?(n);((RS[n][2]%20)==0)&&RS[n][0];end 
    def release?(n);RS[k][1]==-1;end 
    def active?(n);GKS.call(TAB_KEY[k])&1==1;end 
    def update(*tab)
      in_upd()
      if !tab.empty?
        tab.each{|n|m=RS[n][0];pr=GAKS.call(TAB_KEY[n])!=0 
          tr=m==pr ? 0 : (pr ?(RS[n][2].between?(1,9)? 2 : 1) : -1) 
          count=tr>0 ? 0 : [R[n][2]+1,20].min 
          RS[n]=[pr,tr,count]}
      else 
        TAB_KEY.keys.each{|n| 
          m=RS[n][0];pr=GAKS.call(TAB_KEY[n])!=0 
          tr=m==pr ? 0 : (pr ?(RS[n][2].between?(1,9)? 2 : 1) : -1) 
          count=tr>0 ? 0 : [RS[n][2]+1,20].min 
          RS[n]=[pr,tr,count]}
      end 
    end 
  end
end
 



Souris :

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
 
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#                                                                  Gestion de la Souris
# par Cybersam et Nearfantastica, revu par Berka                                                                    rgss2 (V<img src="smileys/sourirex.gif" alt="X)" />
#--------------------------------------------------------------------------------------------------------------------------------------
# A placer au début de la liste de scripts, juste après le script de Clavier
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
module Win32API::APIS
  GPPS=Win32API.new('kernel32','GetPrivateProfileString','pppplp','l')
  GCPr=Win32API.new('kernel32','GetCurrentProcess','','i')
  FW=Win32API.new('user32','FindWindow','pp','i')
  SPC=Win32API.new('kernel32','SetPriorityClass','pi','i')
  STC=Win32API.new('user32','ScreenToClient','lp','i')
  GTR=Win32API.new('user32','GetClientRect','lp','i')
  GCP=Win32API.new('user32','GetCursorPos','p','i')
  SC=Win32API.new('user32','ShowCursor','l','l')
  module_function
  def getini(s)
    GPPS.call("Game",s,"",v="\0"*0xff,0xff,".//Game.ini")
    v.delete!("\0")
  end
  Handle=FW.call("RGSS Player",getini("Title"))
  SPC.call(GCPr.call,128)
end
include Win32API::APIS
class Souris
  attr_accessor :x,:y,:curseur
  def initialize
    @t||={};@curseur=Sprite.new;@curseur.z=9999
    show;update
  end
  def update
    @x,@y=client(*pos_glob)
    width,height=t_client
    @x=0 if @x<0;@y=0 if @y<0
    @x=width if x>width;@y=height if @y>height
    [@x,@y]
  end
  def show(b=false);@curseur.visible=!b;SC.call(b ? 1 : 0);end
  def in?(x,y,w,h);return false if @x.nil?||@y.nil?;@x.between?(x,x+w)&&@y.between?(y,y+h);end
  def pos_glob;p=[0,0].pack('ll');(GCP.call(p)!=0)? p.unpack('ll'): nil;end
  def client(x,y);return nil unless x&&y;p=[x,y].pack('ll');(STC.call(Handle,p)!=0)? p.unpack('ll'): nil;end
  def t_client;GTR.call(Handle,r=([0]*4).pack('l4'));r.unpack('l4')[2..3];end
  def grid;[(@x+$game_map.display_x/8)/32,(@y+$game_map.display_y/8)/32];end
  def drag(t,obj,&block) # Berka
    return if @t[t].alive? rescue nil
    @t[t]=Thread.new{ox,oy=@x,@y
      while Input.press?(t)
        ((nx=@x)-ox>0)?(x1=ox;x2=nx-x1):(x1=nx;x2=ox-x1)
        ((ny=@y)-oy>0)?(y1=oy;y2=ny-y1):(y1=ny;y2=oy-y1)
        obj.x,obj.y,obj.width,obj.height=x1,y1,x2,y2
        Graphics.update
        yield
      end
      obj.visible=false}
  end
  def drag_orig(t,x,y) # Berka
    @b_x||=@x-x;@b_y||=@y-y
    (@x-@b_x>0)?(x2=@x-@b_x):(x2=-(@b_x-@x))
    (@y-@b_y>0)?(y2=@y-@b_y):(y2=-(@b_y-@y))
    [x2,y2]
  end
  def shcurseur(*c) # Berka
    @curseur.bitmap=Cache.system(c.first)
    @curseur.ox,@curseur.oy=*c[1..2]
  rescue
    @curseur.bitmap=Bitmap.new(24,24)
    @curseur.bitmap.blt(0,0,Cache.system("Iconset"),Rect.new(24,0,24,24))
    @curseur.ox,@curseur.oy=8,8
  end
end
$souris||=Souris.new
module Graphics # Berka
  class<<self
    alias :cur_update :update unless $@
    def update
      ($souris.curseur.x,$souris.curseur.y=*$souris.update)if $souris
      cur_update
    end
  end
end
 



PathFinding :

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
152
153
154
155
 
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#                                                                    Pathfinding
# par Modern Algebra                                                                                            rgss2 (V<img src="smileys/sourirex.gif" alt="X)" />
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
class Game_System
  attr_accessor :pathfinding_diagonal,:pathfinding_iterations
  alias modalg_pathfinding_options_init_j5yt initialize
  def initialize
    modalg_pathfinding_options_init_j5yt
    @pathfinding_diagonal,@pathfinding_iterations=false,0
  end
end
class Game_Character
  def find_path(trgt_x,trgt_y,diagonal=$game_system.pathfinding_diagonal,
                    max_iterations=$game_system.pathfinding_iterations)
    path=$game_map.find_path(self.x,self.y,trgt_x,trgt_y,diagonal,
                    max_iterations,self)
    @move_route.list.delete_at(@move_route_index)
    path.each { |i| @move_route.list.insert(@move_route_index,i) }
    @move_route_index-=1
  end
  def force_path(trgt_x,trgt_y,diagonal=$game_system.pathfinding_diagonal,
                    max_iterations=$game_system.pathfinding_iterations)
    path=$game_map.find_path(self.x,self.y,trgt_x,trgt_y,diagonal,
                          max_iterations,self)
    path.reverse!
    path.push(RPG::MoveCommand.new(0))
    move_route=RPG::MoveRoute.new
    move_route.list,move_route.repeat=path,false
    force_move_route(move_route)
  end
end
class Game_Map
  def removefrom_binaryheap
    @open_nodes[1],v=@open_nodes[@listsize],1
    @listsize-=1
    loop do
      w=2*(u=v)
      if w+1<=@listsize 
        v=w if @total_cost[@open_nodes<u>]>=@total_cost[@open_nodes[w]]
        v=w+1 if @total_cost[@open_nodes[v]]>=@total_cost[@open_nodes[w+1]]
      elsif w<=@listsize 
        v=w if @total_cost[@open_nodes<u>]>=@total_cost[@open_nodes[w]]
      end
      if u==v;break;else
        temp=@open_nodes<u>
        @open_nodes<u>=@open_nodes[v]
        @open_nodes[v]=temp
      end
    end
  end
  def find_path(src_x,src_y,trgt_x,trgt_y,diagonal,max_iterations,char)
    path=[]
    return path if !char.passable?(trgt_x,trgt_y)
    max_elements=width*height+2
    openx=Table.new(max_elements)
    openy=Table.new(max_elements)
    @open_nodes=Table.new(max_elements)
    @total_cost=Table.new(max_elements)
    heuristic=Table.new(max_elements)
    step_cost=Table.new(width,height)
    parent_x=Table.new(width,height)
    parent_y=Table.new(width,height)
    actual_list=Table.new(width,height)
    new_openid,@open_nodes[1]=1,1
    openx[1],openy[1]=src_x,src_y
    dist=[(trgt_x-src_x).abs,(trgt_y-src_y).abs]
    heuristic[1]=diagonal ? (dist.max*14)+(dist.min*10):(dist[0]+dist[1])*10
    @total_cost[1]=heuristic[1]
    actual_list[src_x,src_y]=1
    @listsize,count=1,0
    loop do
      break if actual_list[trgt_x,trgt_y]!=0 
      count+=1
      Graphics.update if count%500==0
      return path if count==max_iterations
      return path if @listsize==0
      node=@open_nodes[1]
      parent_xval,parent_yval=openx[node],openy[node]
      actual_list[parent_xval,parent_yval]=2
      removefrom_binaryheap
      for i in 0...8
        break if i>3&&!diagonal
        x,y=case i
        when 0 then [parent_xval,parent_yval-1] # UP
        when 1 then [parent_xval,parent_yval+1] # DOWN 
        when 2 then [parent_xval-1,parent_yval] # LEFT 
        when 3 then [parent_xval+1,parent_yval] # RIGHT
        when 4 then [parent_xval-1,parent_yval-1] # UP LEFT
        when 5 then [parent_xval+1,parent_yval-1] # UP RIGHT
        when 6 then [parent_xval-1,parent_yval+1] # DOWN LEFT
        when 7 then [parent_xval+1,parent_yval+1] # DOWN RIGHT
        end
        next if actual_list[x,y] == 2
        next unless char.passable?(x,y) 
        if i > 3
          next unless case i
          when 4 then char.passable?(x+1,y)||char.passable?(x,y+1)
          when 5 then char.passable?(x-1,y)||char.passable?(x,y+1)
          when 6 then char.passable?(x+1,y)||char.passable?(x,y-1)
          when 7 then char.passable?(x-1,y)||char.passable?(x,y-1)
          end
        end
        plus_step_cost=((x-parent_xval).abs+(y-parent_yval).abs)>1 ? 14 : 10
        temp_step_cost=step_cost[parent_xval,parent_yval]+plus_step_cost
        if actual_list[x,y]==1
          if temp_step_cost<step_cost[x,y]
            parent_x[x,y]=parent_xval
            parent_y[x,y]=parent_yval
            step_cost[x,y]=temp_step_cost
            index=1
            while index<@listsize;index+=1
              break if openx[@open_nodes[index]]==x &&openy[@open_nodes[index]]==y
            end
            @total_cost[@open_nodes[index]]=temp_step_cost+heuristic[@open_nodes[index]]
          else
            next
          end
        else
          new_openid+=1;@listsize+=1 
          @open_nodes[@listsize]=new_openid
          step_cost[x,y]=temp_step_cost
          d=[(trgt_x-x).abs,(trgt_y-y).abs]
          heuristic[new_openid]=diagonal ? (d.max*14)+(d.min*10) : (d[0]+d[1])*10
          @total_cost[new_openid]=temp_step_cost+heuristic[new_openid]
          parent_x[x,y],parent_y[x,y]=parent_xval,parent_yval
          openx[new_openid],openy[new_openid]=x,y
          index,actual_list[x,y]=@listsize,1
        end
        while index!=1
          temp_node=@open_nodes[index]
          if @total_cost[temp_node]<=@total_cost[@open_nodes[index / 2]] 
            @open_nodes[index]=@open_nodes[index / 2]
            index/=2;@open_nodes[index]=temp_node
          else;break
          end
        end
      end
    end
    path_x,path_y=trgt_x,trgt_y
    while path_x!=src_x||path_y!=src_y
      prnt_x,prnt_y=parent_x[path_x,path_y],parent_y[path_x,path_y]
      if path_x<prnt_x;code=path_y<prnt_y ? 7 : path_y>prnt_y ? 5 : 2
      elsif path_x>prnt_x ;code=path_y<prnt_y ? 8 : path_y>prnt_y ? 6 : 3 
      else ;code=path_y<prnt_y ? 4 : 1
      end
      path.push(RPG::MoveCommand.new(code))
      path_x,path_y=prnt_x,prnt_y
    end
    return path
  end
end
 



Déplacement :

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
 
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#                                                  Déplacement à la souris II Reloaded
# par Berka                                                31/12/2009                                              rgss2 (V<img src="smileys/sourirex.gif" alt="X)" />
#--------------------------------------------------------------------------------------------------------------------------------------
# Ne pas publier sans autorisation expresse. <a href="http://www.rpgmakervx-fr.com" target="_blank">http://www.rpgmakervx-fr.com</a>
#--------------------------------------------------------------------------------------------------------------------------------------
# Selection de personnages à la souris avec rectangle de sélection
# Déplacement par clic droit
# Scroll de la carte lorsque la souris est placée sur le bord de la fenetre
# Déplacement du héro si rien n'est sélectionné
#--------------------------------------------------------------------------------------------------------------------------------------
# Nécessite les scripts, normalement fournis avec ce script
# - Clavier : crédits à TLN et Lordrik (script amélioré, support des touches de jeu par berka)
# - Souris : crédits à Cybersam et Nearfantastica (ajout de la fonction drag&drop par berka)
# - Pathfinding : crédits à Modern Algebra (tiré de l'algo A* expliqué par M.Lester)
#--------------------------------------------------------------------------------------------------------------------------------------
# Tous les Réglages se font dans le présent script.            
# Bien mettre le commentaire "mobile" dans chaque événement déplacable. Sinon ca ne marche pas !
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
module Berka
  module Selection
    T_Select          = "clic gauche"                        # Touche de Sélection
    T_Bouge          = "clic droit"                            # Touche de déplacement (cf. script Clavier)
    N_Curseur      = "normal.png"                      # Image du Curseur, placée dans ./System (Icone par défaut)
    Comment        = "mobile"                              # Commentaire à ajouter aux events déplacables
    C_Selbord        = Color.new(0,255,0,180)  # Couleur du bord du rectangle de selection
    C_Selfond        = Color.new(0,255,0,80)      # Couleur du fonds du rectangle de sélection
    TonSelect        = Tone.new(0,255,0,20)      # Couleur des events selectionnés
    MargeScroll      = 16                                          # Bordure de l'écran réactif au scroll
    VitesseScroll  = 7                                            # Vitesse du scroll de la carte 
  end
end
include Berka::Selection
$souris.shcurseur(N_Curseur,8,8)
$deplevents||={}
class Scene_Map<Scene_Base
  alias :select_start :start
  alias :select_update :update
  alias :select_terminate :terminate    
  def start
    @select,@events=Sprite_Select.new,[]
    select_start
  end
  def update
    select_update
    return if !$souris
    if Input.trigger?(T_Bouge)
      x,y=$souris.grid[0],$souris.grid[1]
      return $game_player.force_path(x,y)if @events.empty?
      Thread.new{@events.each{|e|e.force_path(x,y) if e.is_a?(Game_Event)}}
      sleep(0.01)
    end
    if Input.press?(T_Select) 
      clear
      @select.visible=true
      $souris.drag(T_Select,@select){@events=$deplevents.select{|e,c|@select.chk?(*c)}.flatten
      @events.each{|e|e.selection=true if e.is_a?(Game_Event)}
      @select.update}
      return
    end
    chk_scroll
  end
  def clear
    @events.each{|e|e.selection=false if e.is_a?(Game_Event)}
    @events.clear
  end
  def terminate
    @select.dispose
    select_terminate
  end
  def chk_scroll
    m=MargeScroll;x,y=$souris.update
    i=2 if x.between?(0,544-m)&&y.between?(416-m,416)
    i=4 if x.between?(0,m)&&y.between?(0,416-m)
    i=6 if x.between?(544-m,544)&&y.between?(m,416)
    i=8 if x.between?(m,544)&&y.between?(0,m)
    $game_map.start_scroll(i,1,VitesseScroll)if i
  end
end
class Sprite_Select<Sprite_Base
  attr_writer :width,:height,:rect
  def initialize
    super
    self.bitmap=Bitmap.new(544,416)
    @width,@height=0,0
  end
  def update
    super
    self.bitmap.clear
    self.bitmap.fill_rect(0,0,@width,@height,C_Selbord) 
    self.bitmap.fill_rect(1,1,@width-2,@height-2,C_Selfond) 
  end
  def chk?(x,y)
    x-=$game_map.display_x/8;y-=$game_map.display_y/8
    x.between?(self.x,self.x+@width)&&y.between?(self.y,self.y+@height)
  end
end
class Game_Character
  alias :select_cinit :initialize
  attr_accessor :tone
  def initialize
    @tone=Tone.new(0,0,0,0)
    select_cinit
  end
end
class Game_Event<Game_Character
  alias :select_init :initialize
  alias :select_upd :update
  attr_accessor :selection
  def initialize(*args)
    select_init(*args)
    @selection=false
    for i in 0...@list.size;@bouge=true if @list[i].parameters[0]==Comment;end
  end
  def update
    $deplevents[self]=[self.screen_x,self.screen_y]if @bouge
    @tone=(@selection ? TonSelect : Tone.new(0,0,0,0))
    select_upd
  end
end
class Sprite_Character<Sprite_Base
  alias :select_upd :update
  def update
    self.tone=@character.tone
    select_upd
  end
end
 





cari974 - posté le 09/08/2013 à 06:49:25. (38 messages postés)

Pour ceux qui souhaite simplement pouvoir se déplacer à la souris, et sans lag, vous pouvez utiliser script Déplacement à la sourirs V1.0 de Berka, aussi.
Il s'agit la aussi d'un simple copier coller du script qui a été classer dans RPG Maker XP, je ne sais pas pourquoi ...
Article original : http://www.rpg-maker.fr/scripts-149-mouvement-par-la-souris.html



Ce script permet de diriger le hero a l'aide de la souris

sur les bases de SephirothSpawn

# clic gauche: definir le point d'arrivée
# clic droit: suivre/ne pas suivre le héros
# touche directionnelles: deplacer la map

a placer au dessus de main, dans l'ordre:
Module Keyboard/Mouse

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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
 
 
#===========================================
 
#                      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
 
 
 
module Mouse
 
  @mouse_menu = 0
 
  def Mouse.click?(button)
 
    return true if @keys.include?(button)
 
    return false
 
  end  
 
  def Mouse.press?(button)
 
    return true if @press.include?(button)
 
    return false
 
  end
 
  def Mouse.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 Mouse.pixels
 
    return @pos == nil ? [0, 0] : @pos
 
  end
 
  def Mouse.tiles
 
    return nil if @pos == nil
 
    x = @pos[0] / 32
 
    y = @pos[1] / 32
 
    return [x, y]
 
  end
 
  def Mouse.set_pos(x_pos=0, y_pos=0)
 
    width, height = Mouse.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 Mouse.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 Mouse.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 Mouse.pos
 
    x, y = Mouse.screen_to_client(*Mouse.global_pos)
 
    width, height = Mouse.client_size
 
    begin
 
      if (x >= 0 and y >= 0 and x < width and y < height)
 
        return x, y
 
      else
 
        return nil
 
      end
 
    rescue
 
      return nil
 
    end
 
  end
 
  def Mouse.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(Mouse.hwnd, pos) != 0
 
      return pos.unpack('ll')
 
    else
 
      return nil
 
    end
 
  end
 
  def Mouse.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 Mouse.client_size
 
    rect = [0, 0, 0, 0].pack('l4')
 
    Win32API.new('user32', 'GetClientRect', %w(l p), 'i').call(Mouse.hwnd, rect)
 
    right, bottom = rect.unpack('l4')[2..3]
 
    return right, bottom
 
  end
 
  def Mouse.client_pos
 
    rect = [0, 0, 0, 0].pack('l4')
 
    Win32API.new('user32', 'GetWindowRect', %w(l p), 'i').call(Mouse.hwnd, rect)
 
    left, upper = rect.unpack('l4')[0..1]
 
    return left+4, upper+30
 
  end  
 
  def Mouse.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

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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
 
#===========================================
 
#                          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 if @map[@x+1,@y] == step - 1 and step != 0
 
      move_down if @map[@x,@y+1] == step - 1 and step != 0
 
      move_left if @map[@x-1,@y] == step -1 and step != 0
 
      move_up if @map[@x,@y-1] == step - 1 and step != 0
 
    when 1
 
      move_up if @map[@x,@y-1] == step - 1 and step != 0
 
      move_left if @map[@x-1,@y] == step -1 and step != 0
 
      move_down if @map[@x,@y+1] == step - 1 and step != 0
 
      move_right 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

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
 
#===========================================
 
#                      Mouvement par souris
 
#                            par berka
 
#===========================================
 
#
 
# clic gauche: definir le point d'arrivée
 
# clic droit: suivre/ne pas suivre le héros
 
# touche directionnelles: deplacer la map
 
#===========================================
 
 
 
 
 
Vitesse = 8  #vitesse du scroll de la map
 
 
 
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
 
class Game_Player < Game_Character
 
  alias scroll_init initialize
 
  def initialize
 
    scroll_init
 
    @scroll = false 
 
  end
 
  def update
 
    last_real_x = @real_x
 
    last_real_y = @real_y
 
    last_moving = moving?
 
    move_by_input
 
    super
 
    if Keyboard.trigger?(Keyboard::Mouse_Right)
 
      if @scroll == false
 
        $game_player.center($game_player.x, $game_player.y) 
 
        @scroll = true
 
      else
 
        @scroll = false
 
      end
 
    end
 
    @scroll = false if Input.dir4 != 0
 
    $game_player.update_scroll(last_real_x, last_real_y) if @scroll == true    
 
    update_vehicle
 
    update_nonmoving(last_moving)
 
  end
 
  def move_by_input
 
    return unless movable?
 
    return if $game_map.interpreter.running?
 
    case Input.dir4
 
    when 2; $game_map.start_scroll(2, 1, Vitesse)
 
    when 4; $game_map.start_scroll(4, 1, Vitesse)
 
    when 6; $game_map.start_scroll(6, 1, Vitesse)
 
    when 8; $game_map.start_scroll(8, 1, Vitesse)
 
    end
 
  end
 
end
 







Et sinon, pour un maximums d'options, voici le script "Mouse Système", qui permet d'avoir une gestion totale de la souris, avec moins de lag que le script "Déplacement à la souris V2.0" :
http://www.rpg-maker.fr/scripts-417-mouse-systeme.html


.

MMORPG : VX => http://www.rpg-maker.fr/scripts-342-net-gaming.html //\\ XP => http://www.rpg-maker.fr/scripts-425-netplay-master-script-mmorpg.html

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

Plan du site:

Activité: Accueil | News | Forum | Flash-news | Chat | Commentaires | Galerie | Screen de la semaine | Sorties | Articles perso | Livre d'or | Recherche
Jeux: Index jeux séparés | Top Classiques | Top Originaux | Les autres | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Jeux complets | Proposer
Rubriques: Le Wiki | Collection Oniro | Tutoriaux | Scripts | Guides | Gaming-Live | Tests | Making-of | Interviews | Articles perso | OST | L'Annuaire | Divers | Palmarès
Hébergés: Aëdemphia | Fighting Robots Quest | Forstale | Geex | Inexistence | La Légende d'Ibabou | Lije | LoveMaster | Sarcia | Super Mario RPG - Lost Souls
Ressources: Jeux | Programmes | Packs de ressources | Midis | Eléments séparés | Sprites
RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis