Sujet n°12441
Posté par Nuri Yuri le 2 Mar - 22:49 (2013)
Titre : Nyuky's Input
Salut à tous, aujourd'hui je poste mon script de détection des inputs, il prend en charge la souris, les touches du clavier et gère partiellement les joysticks. Sachez que Zeus a déjà fait un script plus performant et entièrement en ruby pour gérer les inputs : http://www.rpg-maker.fr/scripts-324-input-ultimate-2.html j'ai juste codé cette version il y a longtemps car je préfère utiliser mon travail plutôt que celui des autres, ça me permet de coder et de rencontrer divers problèmes (instructifs généralement).

Le script est dépendant de plusieurs autres scripts, par ailleurs il est optimisé pour RMVX.Ace mais j'ai mis en commentaire pour éviter les problèmes. Par ailleurs, il est fortement conseillé d'installer les scripts dans l'ordre donné sur ce sujet.

I - Kernel


Ce script comprend le chargement de plusieurs APIs et la récupération sécurisé du HWND de la fenêtre de jeu RGSS.
Code:
#===
#¤Patch du module Kernel
#---
#+29/12/12 : Nyagato Nyuky
#===
module Kernel
  #alias p msgbox_p
  #alias print msgbox
  GetPrivateProfileString=Win32API.new("Kernel32", "GetPrivateProfileString", "pppplp", "l");
  FindWindowA=Win32API.new("User32", "FindWindowA", "pp", "l");
  GetCursorPos=Win32API.new("User32", "GetCursorPos", "p", "i");
  ScreenToClient=Win32API.new("User32", "ScreenToClient", "lp", "i");
  GetKeyboardState=Win32API.new("User32","GetKeyboardState",'p','i');
  GetForegroundWindow=Win32API.new("User32","GetForegroundWindow",'','i');
  GetWindowThreadProcessId=Win32API.new("User32","GetWindowThreadProcessId",'ip','i');
  RegisterRawInputDevices=Win32API.new("User32","RegisterRawInputDevices","pii","i");
  RtlMoveMemory_ipi=Win32API.new("kernel32","RtlMoveMemory","ipi","");
  ResetRGSSWinProc=Win32API.new("NyukyAPI","ResetRGSSWinProc","ip","");
  CountJoy=Win32API.new("NyukyAPI","countJoy","","i");
  CopyJoyHdev=Win32API.new("NyukyAPI","copyJoyhdev","p","i");
  SizeJoyData=Win32API.new("NyukyAPI","sizeJoydata","i","i");
  CopyJoyData=Win32API.new("NyukyAPI","copyJoydata","ip","i");
  #===
  #>Récupération du HWND de la fenêtre
  #===
  module_function
  def get_handle()
    unless($HWND)
      hwnd=FindWindowA.call("RGSS Player",nil);
      spid="\x00\x00\x00\x00";
      GetWindowThreadProcessId.call(hwnd,spid);
      gpid=spid.unpack('i')[0];
      pid=Process::pid();
      if(gpid==pid)
        $HWND=hwnd;
      else
        hwnd=GetForegroundWindow.call();
        GetWindowThreadProcessId.call(hwnd,spid);
        gpid=spid.unpack('i')[0];
        if(gpid==pid)
          $HWND=hwnd;
        else
          GetPrivateProfileString.call("Game","Title","",title="\x00"*256,256,".//Game.ini");
          hwnd=FindWindowA.call("RGSS Player",title.delete("\x00"));
          GetWindowThreadProcessId.call(hwnd,spid);
          gpid=spid.unpack('i')[0];
          if(gpid==pid)
            $HWND=hwnd;
          else
            $HWND=0;
            msgbox("Impossible d'obtenir l'handle de la fenêtre de jeu...");
          end
        end
      end
      ResetRGSSWinProc.call($HWND,".//Game.ini");
    end
    return $HWND
  end
  get_handle();
end


Note : Supprimez la ligne 55 si vous ne souhaitez pas utiliser les joystick et garder le WndProc originel du RGSS (provocant la pause du jeu lors que la fenêtre n'est pas active).

II - StructGenerator


Ce script permet de générer des structures compatible avec les programme en C/C++/Asm.
Code:
#===
#¤Nyuky's StructGenerator Module
#---
#+01/01/13 : Nyagato Nyuky
#===
module StructGenerator
  Char=:char
  Uchar=:uchar
  Byte=:byte
  Word=:word
  Uword=:uword
  Dword=:dword
  Udword=:udword
  Int=:int
  Uint=:uint
  Float=:float
  Qword=:qword
  Uqword=:uqword
  Double=:double
  Ptr=:ptr
  TypesOffsets={Char=>1,Uchar=>1,Byte=>1,Word=>2,Uword=>2,
  Dword=>4,Udword=>4,Int=>4,Uint=>4,Float=>4,
  Qword=>8,Uqword=>8,Double=>8,Ptr=>4}
  TypesNames={Char=>"Sc",Uchar=>"SC",Byte=>"SC",Word=>"Ss",Uword=>"SS",
  Dword=>"Sl",Udword=>"SL",Int=>"Sl",Uint=>"SL",Float=>"Sf",
  Qword=>"Sq",Uqword=>"SQ",Double=>"Sd",Ptr=>"SL"}
  module_function
  def run(name,mod,members)
    if(mod.const_defined?(name))
      warn("La classe #{name} existe déjà !\n")
      return false
    end
    v=Class.new(String)
    sinitialize="def initialize(*args);"
    stos="def to_s();\"#<#{name}:\#{(self.object_id*2).to_s(16)} "
    index=0
    offset=0
    members.each_key do |m|
      ot=members[m]
      os=TypesOffsets[ot]
      oc=TypesNames[ot]
      sinitialize<<"self.#{m}=args[#{index}] ? args[#{index}] : 0;"
      stos<<"#{ot} #{m}=\#{#{m}()};"
      v.class_eval("def #{m}() return self[#{offset},#{os}].unpack(#{oc})[0] end;def #{m}=(v) self[#{offset},#{os}]=[v].pack(#{oc}) end")
      index+=1
      offset+=os
    end
    sinitialize<<"end;"
    stos<<"\"end"
    v.class_eval(sinitialize)
    v.class_eval(stos)
    v.class_eval("def self_ptr() return [self].pack(Sp).unpack(SL)[0] end")
    mod.const_set(name,v)
    sinitialize=nil
    stos=nil
    name=nil
    members=nil
    GC.start
    return true
  end
end
#===
#>Définition de constantes dans la classe String pour les structure
#===
class String
  Sc='c';SC='C';Ss='s';SS='S';Sl='l';SL='L';Sq='q';SQ='Q';Sf='f';Sd='d';Sp='p'
end


III - WinAPIStructs


Module contenant les diverses structures utilisés par Input.
Code:
#===
#¤WinAPIStructs
#---
#+01/01/13 : Nyagato Nyuky
#===
module WinAPI
  g=StructGenerator
  g.run("Point",self,:x=>:int,:y=>:int)
  g.run("MSG",self,"hwnd"=>:int,"message"=>:uint,"wParam"=>:uint,"lParam"=>:int,"time"=>:int,"x"=>:int,"y"=>:int)
  g.run("RAWINPUTDEVICE",self,"usUsagePage"=>:uword,"usUsage"=>:uword,"dwFlags"=>:dword,"hwndTarget"=>:int);
end


IV - Input


Le fameux module contenant toute les fonctions.
Code:
#===
#¤Nyuky's Input Module
#---
#+29/12/12 : Nyagato Nyuky
#===
#>Patch...
#===
class << Input
  alias :ori_press? :press?
  alias :ori_trigger? :trigger?
  alias :ori_update :update
  attr_reader :mx, :my, :press, :opress,:joypad_enabled,:joys_data,:joys_dato
end
module Input
  MPos=WinAPI::Point.new();#"\x00\x00\x00\x00\x00\x00\x00\x00";
  Upck="ll";
  @mx=0;
  @my=0;
  @press="\x00"*256;
  @opress=@press.clone();
  @KeyParam=Hash.new();
  @joypad_enabled=false
  @joys_data=Array.new
  @joys_dato=Array.new
  @joys_hdev=Array.new
  #===
  #>Enregistrement des devices
  #===
  d=WinAPI::RAWINPUTDEVICE.new(0x01,0x04);
  d2=WinAPI::RAWINPUTDEVICE.new(0x01,0x05);
  RegisterRawInputDevices.call(d+d2,2,d.bytesize);
  module_function
  def update()
    @press,@opress=@opress,@press;
    GetKeyboardState.call(@press);
    ori_update();
    GetCursorPos.call(MPos);
    ScreenToClient.call($HWND,MPos);
    @mx,@my=*MPos.unpack(Upck)
    if @joypad_enabled
      need=false
      @joys_hdev.size.times do |i|
        @joys_dato[i],@joys_data[i]=@joys_data[i],@joys_dato[i]
        size=SizeJoyData.call(@joys_hdev[i])
        if size<0
          @joys_hdev[i]=nil
          need=true
          next
        end
        size2=@joys_data[i].size
        @joys_data[i]="\x00"*size if(size!=size2)
        CopyJoyData.call(@joys_hdev[i],@joys_data[i])
      end
      update_joys() if need
    end
  end
  #===
  #>Méthodes en rapport avec le clavier
  #===
  def kpress?(v) return (@press.getbyte(v)&0x80 != 0) end
  def ktrigger?(v)
    return ((@opress.getbyte(v)&0x80 != 0) and (@press.getbyte(v)&0x80 == 0));
  end
  def ktrigger2?(v)
    return ((@opress.getbyte(v)&0x80 == 0) and (@press.getbyte(v)&0x80 != 0));
  end
  def get_KeyParam() return @KeyParam end
  def ppress?(k) return press?(@KeyParam[k].to_i) end
  def ptrigger?(k) return trigger?(@KeyParam[k].to_i) end
  def ptrigger2?(k) return trigger2?(@KeyParam[k].to_i) end
  #===
  #>Méthodes en rapport avec le joypad
  #===
  def enable_joy()
    @joypad_enabled=true;
    update_joys();
  end
  def disable_joy()
    @joypad_enabled=false;
  end
  def update_joys()
    nb_joy=CountJoy.call();
    if(nb_joy>0 and nb_joy<256)
      hdevs="\x00\x00\x00\x00"*nb_joy
      unless(CopyJoyHdev.call(hdevs)==1);
        print("Erreur, impossible de récupérer les identifiants de joypad.");
        return;
      end
      hdevs=hdevs.unpack("i*")
      (hdevs-@joys_hdev).each do |i|
        next if @joys_hdev.index(i);
        pos=@joys_hdev.index(nil);
        pos=@joys_hdev.size unless pos;
        @joys_hdev[pos]=i;
        @joys_data[pos]=String.new();
        @joys_dato[pos]=String.new();
      end
    end
  end
  def rx(id)
    str=@joys_data[id];
    return 0 unless str and str.size>0;
    return str.getbyte(str.size-4).to_i-128;
  end
  def ry(id)
    str=@joys_data[id];
    return 0 unless str and str.size>0;
    return str.getbyte(str.size-3).to_i-128;
  end
  def lx(id)
    str=@joys_data[id];
    return 0 unless str and str.size>0;
    return str.getbyte(str.size-6).to_i-128;
  end
  def ly(id)
    str=@joys_data[id];
    return 0 unless str and str.size>0;
    return str.getbyte(str.size-5).to_i-128;
  end
  def jpress?(id,key)
    str=@joys_data[id]
    return false if str.size<2
    return (str.getbyte(str.size-2)&(1<<key))!=0 if(key<8);
    key-=8;
    return (str.getbyte(str.size-1)&(1<<key))!=0
  end
  def jtrigger?(id,key)
    str=@joys_dato[id]
    str2=@joys_data[id]
    return false if str.size<2 or str2.size<2
    return ((str.getbyte(str.size-2)&(1<<key))==0 and
    (str2.getbyte(str.size-2)&(1<<key))!=0) if(key<8);
    key-=8;
    return ((str.getbyte(str.size-1)&(1<<key))==0 and
    (str2.getbyte(str.size-1)&(1<<key))!=0)
  end
  #===
  #>Méthodes en rapport avec la souris
  #===
  #>Detection de la souris dans rectangle
  #===
   def m_here?(x,y,width,height)
      xm=x+width
      ym=y+height
      (@mx >= x and @mx <= xm and @my >= y and @my <= ym)
   end
  #===
  #>Detection dans un objet de cette classe
  #===
   def m_in_rect?(rect)
      m_here?(rect.x,rect.y,rect.width,rect.height)
   end
  #===
  #>Detections dans un viewport
  #===
   def m_in_viewport?(viewport)
      m_here?(viewport.rect.x,viewport.rect.y,viewport.rect.width,viewport.rect.height)
   end
  #===
  #>Detection de la souris dans un sprite
  #% Il doit être visible et doit avoir une boite de dessin (bitmap)
  #===
  def m_in_sprite?(sprite)
      return false unless sprite.visible
      return false unless sprite.src_rect
      if sprite.viewport
         vx,vy=sprite.viewport.rect.x,sprite.viewport.rect.y
         vw,vh=sprite.viewport.rect.width,sprite.viewport.rect.height
      else
         vx=vy=0
         vw=vh=1024
      end
      sx=sprite.x-sprite.ox
      sy=sprite.y-sprite.oy
      sw=sprite.src_rect.width
      sh=sprite.src_rect.height
      if sx >= 0
         @lsp_x=x=sx+vx
      else
         x=vx  #Si sx < 0 il est donc visible au début du viewport
         sw+=sx #On ajoute donc la position x du sprite pour avoir la taille visible
         @lsp_x=sx+vx  #Utile pour in_sprite_plus?
      end
      if sy >= 0
         @lsp_y=y=sy+vy
      else
         y=vy
         @lsp_y=sy+vy
         sh+=sy
      end
      xs=vx+sx+sw
      xv=vx+vw
      ys=vy+sy+sh
      yv=vy+vh
      width=(xs > xv ? sw-(xs-xv) : sw )
      height=(ys > yv ? sh-(ys-yv) : sh)
      m_here?(x,y,width,height)
   end
  #===
  #>Detection avancée : Detecte si la souris pointe sur un pixel non transparent
  #===
   def m_in_sprite_plus?(sprite)
      b=m_in_sprite?(sprite)
      if b
         x=@mx-@lsp_x
         y=@my-@lsp_y
         px=sprite.bitmap.get_pixel(x,y).alpha
         return (px != 0)
      end
      false
   end
  #===
  #>Detection prennant en compte les zoom_x et le déplacement du viewport
  #===
  def m_in_sprite_plus2?(sprite,al=false)
      return false unless sprite.visible
      return false unless sprite.src_rect
      if sprite.viewport
         vx,vy=sprite.viewport.rect.x,sprite.viewport.rect.y
         vw,vh=sprite.viewport.rect.width,sprite.viewport.rect.height
      vox,voy=sprite.viewport.ox,sprite.viewport.oy
      else
         vx=vy=0
         vw=vh=1024
      vox=voy=0
      end
      sx=sprite.x-sprite.ox*sprite.zoom_x-vox
      sy=sprite.y-sprite.oy*sprite.zoom_y-voy
      sw=sprite.src_rect.width*sprite.zoom_x
      sh=sprite.src_rect.height*sprite.zoom_y
      if sx >= 0
         @lsp_x=x=sx+vx
      else
         x=vx  #Si sx < 0 il est donc visible au début du viewport
         sw+=sx #On ajoute donc la position x du sprite pour avoir la taille visible
         @lsp_x=sx+vx  #Utile pour in_sprite_plus?
      end
      if sy >= 0
         @lsp_y=y=sy+vy
      else
         y=vy
         @lsp_y=sy+vy
         sh+=sy
      end
      xs=vx+sx+sw
      xv=vx+vw
      ys=vy+sy+sh
      yv=vy+vh
      width=(xs > xv ? sw-(xs-xv) : sw )
      height=(ys > yv ? sh-(ys-yv) : sh)
      b=m_here?(x,y,width,height)
    if(al and b)
      x=@mx-@lsp_x
         y=@my-@lsp_y
         px=sprite.bitmap.get_pixel(x,y).alpha
         return (px != 0)
    else
      return b
    end
   end
  #===
  #>Detection completement useless mais bon...
  #===
   def m_in_window?(window)
      return false unless window.visible
      m_here?(window.x-window.ox,window.y-window.oy,window.height,window.width)
   end
end


V - Explication de certaines fonctions


kpress?(val) : Vérifie si la touche du clavier identifié par val (13 pour entrée par exemple) est pressée.
ktrigger?(val) : Vérifie si la touche du clavier identifié par val enregistre un front descendant.
ktrigger2?(val) : Vérifie si la touche du clavier identifié par val enregistre un front montant.
get_KeyParam() : Récupère l'Hash contenant les paramètre de touche permet l'utilisation des fonctions suivantes.
ppress?(key), ptrigger?(key) et ptrigger2?(key) : Même fonction que kpress?,ktrigger? ktrigger2? et mais en recherchant la valeur dans KeyParam.
enable_joy() : Active la gestion des joypads, cette gestion est désactivée par défauts.
disable_joy() : Désactive la gestion des joypads.
rx(id) : Retourne la position x du stick principal de la manette n°id, 127 position extrême droite, -128 position extrême gauche, 0 position de repos.
ry(id) : Retourne la position y du stick principal de la manette n°id, 127 position extrême bas, -128 position extrême haut, 0 position de repos.
lx(id),ly(id) : Même fonctions que rx et ry mais avec l'autre stick, attention, si la manette ne contient pas deux stick le retour pourrait être instable.
jpress?(id,key) : Vérifie si la touche key de la manette n°id est pressée, attention un joypad classique contient jusqu'à 16 touches. (Et n'en a pas toujours 16)
jtrigger?(id,key) : Vérifie si la touche key de la manette n°id enregistre un front montant.
mx : Position x de la souris sur l'écran.
my : Position y de la souris sur l'écran.
m_here?(x,y,width,height) : Vérifie si la souris se trouve dans un rectangle commençant à la position x,y et finissant à la position x+width,y+height.
m_in_rect?(rect) : Vérifie si la souris se trouve dans un Rect, même fonction que m_here mais en prenant un objet du type Rect.
m_in_viewport?(viewport) : Vérifie si la souris se trouve dans un viewport, prend en argument le Viewport.
m_in_sprite?(sprite) : Vérifie si la souris se trouve dans un Sprite. Attention, cette fonction ne gère pas les rotation.
m_in_sprite_plus?(sprite) : Vérifie si la souris se trouve dans un Sprite et est dans un pixel non transparent de celui-ci.
m_in_sprite_plus2?(sprite,al) : Vérifie si la souris se trouve dans un Sprite, si al=true alors ça vérifiera si la souris ne se trouve pas dans un pixel transparent. Cette fonction prend en compte le zoom du sprite.
m_in_window?(window) : Fonction inutile à ne jamais utiliser.

VI - Recommandations


Il est conseillé d'exécuter ces scripts qu'une seul fois, ceci ayant été prévu pour RMVX.Ace ne possèdent pas de protection évitant les bugs lors d'un appuis sur F12. Pour ce fait il faut soit coder un module chargeant les scripts à la place du RGSS_Player, soit mettre une condition dans tous les scripts (unless $RGSS_Loaded;script;end; avec $RGSS_Loaded=true au début du script Main).

Il est nécessaire d'avoir une version de NyukyAPI.dll pour obtenir la gestion des joysticks.
Si vous ne désirez pas l'utiliser, supprimez toute les lignes contenant NyukyAPI dans Kernel et supprimez la ligne 55.
Lien de téléchargement : http://www.mediafire.com/?sc3teylrxrlzcvd

VII - Crédits

Nyagato Nyuky : Codage des scripts et de la DLL.
Microsoft : APIs utilisés et VisualStudio 2012 ayant permis le codage/debug de la DLL.

Posté par Astox le 2 Mar - 23:27 (2013)
A le voilà Imbécile heureux, enfin les voilà plutôt ^^
Du coup, c'est juste quelques questions :
Tes instructions retourne la plupart des positions ou sont des observateurs. Cependant à qui doit t-on envoyer les éléments retourné dans le cas d'un clic? Car j'ai lu
Code:
alias :ori_press? :press? 
 alias :ori_trigger? :trigger?
et cela m'intrigue.


Une petite question de compréhension du code aussi : le script qui permet de crée des structures compatibles est la pour permettre l'utilisation d'API win32 c'est bien ça?

On avait discuté de la structure POINT qui est un des éléments fondamentaux du détecteur de position de souris. Peux tu détailler son fonctionnement? Car tu m'avais parler de l'utilisation d'une structure en string en ruby, cependant il me semble que l'API elle ne reçoit que une structure binaire.

Et enfin, comme je me suis pas beaucoup renseigné sur le compilateur : ton morceau sur les recommandations sont une sorte d'équivalent au bloc #IFNDEF #DEFINE #ENDIF pour le compilateur dans des langages comme C ou C++ ou c'est encore autre chose?

J'ai du mal à comprendre ce que tu appelles manettes et joypad, peux-tu imager ? ( J'ai une iddé mais je suis pas sur a 100% ^^" )

Sinon très très bon boulo, je vais l'implanté demain et essayé de comprendre le code pour voir si je peux m'en inspirer ^^

Posté par Nuri Yuri le 2 Mar - 23:46 (2013)
Un joypad c'est un gamepad avec un ou plusieurs joystick, un manette c'est le terme générique français pour désigner le joypad ou le gamepad.
Un string ruby c'est avant tout une chaine de caractère binaire, surtout en ruby 1.8, c'est beaucoup moins vrai en 1.9... D'ailleurs j'ai oublié les spécification du ruby 1.8, si tu veux utiliser le script ajoute :
Code:
class String
  alias :getbyte :[]
  alias :setbyte :[]=
end

Et le code qui t'intrigue était un aliasing que j'avais mis car dans mon projet les méthodes kpress? et ktrigger? sont nomée press? et trigger?. Je n'ai pas pensé à retirer ces deux lignes de code :B

Pour les fonctions concernant la souris, il est mieux de les appeler lors qu'un clique est réalisé pour éviter de provoquer des lags, comme tu vois "m_in_sprite?()" contient un code assez lourd.
Code:
if Input.kpress?(1)
  if(Input.m_in_sprite_plus?(@bouton) #supposons que c'est un sprite avec un bitmap
    print("Vous avez appuyé sur le bouton")
  end
end


Les conditions que je demande de poser sont en effet un équivalent pour les compilateur c/c++. Ça évite la recompilation du code.

Posté par The_Doctor le 2 Mar - 23:52 (2013)
Je ne sais pas pourquoi j'ai rit quand j'ai lu Nyuky's Input

Sinon, je dit bravo Imbécile heureux , ça doit être vraiment beaucoup de boulot.

Posté par Astox le 3 Mar - 00:10 (2013)
D'accord, et pour la valeur de val dans ta condition , tu précise que pour la touche entrée : touche 13
Tu as une liste pour la correspondance avec d'autre valeur?
Et enfin, pourquoi à tu imbriqué une condition réagissant au clavier avec l'autre à la souris? Il faut le faire ou c'est juste une démonstration des appels ?

Posté par Nuri Yuri le 3 Mar - 00:39 (2013)
Oui, c'était si il y avait un clique gauche et si la souris était dans un sprite.
http://msdn.microsoft.com/en-us/library/ms927178.aspx

Posté par The_Doctor le 3 Mar - 07:26 (2013)
Petit truc : J'ai une erreur dans le script Kernel lorsque j'allume mon jeu , après les crédit :

Script 'Kernel' ligne 42: SyntaxError occured.

Posté par Nuri Yuri le 3 Mar - 12:58 (2013)
T'as copié les scripts en citant ou d'un autre manière. (Citer est la seule façon de copier les scripts sans que ça bug).

Posté par Astox le 3 Mar - 13:38 (2013)
Une coquille c'est glissé dans ton code il me semble Youri :
Ligne 136, script Imput :
Code:
(str2.getbyte(str.size-1)&(1<<key>Méthodes en rapport avec la souris   

Posté par The_Doctor le 3 Mar - 14:05 (2013)
J'ai toujours un petit problème , la ligne 265 de Input me bug Pleurnicheur

Le pire , c'est que c'est juste un end.

Posté par Nuri Yuri le 3 Mar - 14:32 (2013)
J'ai désactivé le HTML dans mon message (ça le formatais Regard lunaire).

Posté par Astox le 3 Mar - 15:24 (2013)
Moi il me dit qu'il ne trouve pas la methode bitesize dans la classe Imput a cette ligne :
Code:
RegisterRawInputDevices.call(d+d2,2,d.bytesize); 


Je n'ai jamais vu ce bug qui ne génère pas de log en plus

Posté par The_Doctor le 3 Mar - 15:27 (2013)
Et encore une erreur ( j'ai l'impression que le player le fait exprès  Gros matou qui ronronne ).Donc , nouveau problème :



Posté par Nuri Yuri le 3 Mar - 18:32 (2013)
Nyan, ruby 1.9 tu tourne sur ruby 1.8 :B
Il faut avoir un patch de la classe string :
Code:
class String
  alias :getbyte :[]
  alias :setbyte :[]=
  alias :bytesize :size
end

Posté par The_Doctor le 3 Mar - 20:04 (2013)
Question : On le met où le code ? ( Et oui , je suis un demeuré en script Gros matou qui ronronne )

Posté par Nuri Yuri le 3 Mar - 21:01 (2013)
Avant le module Input de préférence.

Posté par Astox le 4 Mar - 07:50 (2013)
Helas Pleurnicheur

---------- Erreur de script : Imput ----------
----- Type
NoMethodError

----- Message
- ARGS - []
undefined method `ori_update' for Input:Module

----- Position dans Imput
Ligne 40

----- Backtrace
Script : Imput | Ligne : 40 | Méthode : in `update'
Script : Scene_Title | Ligne : 109 | Méthode : in `wachunga_autofontinstall_st_main'
Script : Scene_Title | Ligne : 107 | Méthode : in `loop'
Script : Scene_Title | Ligne : 130 | Méthode : in `wachunga_autofontinstall_st_main'
Script : Autofont_Install* | Ligne : 115 | Méthode : in `main'
Script : Main | Ligne : 59

Le jeu fait un tour de boucle et puis paf ll plante

Posté par The_Doctor le 4 Mar - 10:07 (2013)
Moi je l'ai mit , et je n'ai plus d'erreur Interrogation man

Posté par Nuri Yuri le 4 Mar - 10:17 (2013)
Sachant que l'alias se trouve avant le module c'est théoriquement impossible d'avoir ce type d'erreur @_@
Ou alors t'as supprimé alias :ori_update :update de la partie injecté dans class...

Posté par Astox le 4 Mar - 11:30 (2013)
Autant pour moi j'avais supprimer ces alias quand j'ai enlevé tes alias personnelles.
Ca ne bug plus à la compilation mais quand je fait un test dans une classes Test avec le bloc de code que tu as mis ( la parenthèse en trop en moins ) et quand je touche mon event il ne trouve pas la méthode kpress dans le module Input. Et je le comprend car si je fait un cmd+f en entrant kpress dans la barre de recherche il ne trouve rien.
Tu n'as pas oublier quelque chose?

Posté par The_Doctor le 4 Mar - 11:34 (2013)
Petit truc : La touche espace , ou encore majuscule le marche plus. Pleurnicheur

Posté par Nuri Yuri le 4 Mar - 11:42 (2013)
T_T Grosse erreur de ma part, quand j'ai corrigé le bug du HTML j'ai oublié de renommer les méthodes press? trigger? et trigger2? en kpress? ktrigger? et ktrigger2?...
Désolé, normalement c'est corrigé, j'utilise ce script d'un manière totalement différente donc le poste de celui-ci pose beaucoup de problèmes...

Posté par Astox le 4 Mar - 12:01 (2013)
C'est bon ça marche juste nikel, zero lag avec la compilation unique ( vais même surement le mettre sur tout mes codes à appellation multiple genre menu ).
Bref, je l'ai déjà mis sur le menu intro, le "toucher pour continuer" prend enfin son sens ^^

Posté par Nuri Yuri le 4 Mar - 12:03 (2013)
Contente que ça fonctionne Gros matou qui ronronne

Posté par The_Doctor le 6 Mar - 20:12 (2013)
Excuse moi, mais j'ai toujours le problème, les touche secondaire ne marche plus.

En tout cas, plein de touches ne marchent pas, comme Maj , ou Espace Pleurnicheur

Posté par Nuri Yuri le 6 Mar - 20:44 (2013)
T'es bien sur la version avec "kpress?" & co ?
En théorie le fonctionnement normal des inputs ne devrait pas être bouleversé...

Posté par The_Doctor le 7 Mar - 08:49 (2013)
Tu as raison ( comme toujours Gros matou qui ronronne ), j'avais oublié de changer le script.

Posté par Laito' le 7 Mar - 21:35 (2013)
The_Doctor a écrit:
Tu as raison ( comme toujours Gros matou qui ronronne )


T'es vraiment un suce boules.

Apprends à faire attention.