Sujet n°10346
Posté par Sphinx le 3 Sep - 01:43 (2011)
Titre : [Boite à outils] Interface tactile
[Boite à outils] Interface tactile



    I) Présentation

Bonjour à tous. Je suis parmi vous aujourd'hui pour présenter un petit outil qui pourrait servir aux développeurs d'interfaces : un script qui permettra de les rendre tactile ! En outre, je proposerai après un script qui vous permettra de tester le système.
Je précise que le système de tactile est compatible toutes versions, l'interface de test est compatible avec 0.7 & 4G+ (écran de jeu de 640*480)

    II) Installation

Comme pour tout système aussi complexe que le tactile, l'installation est extrêmement ardue... Ou pas =')
Hey ! Restez ! Je plaisantais !

Script Mouse
Code:
#=======================================================================
# Mouse par Zeus 81 - Amélioré par Sphinx
#
# Versions :
#   ¤ version 1.3 : 28 Août 2011
#
# Credits demandes :
#   ¤ Sphinx (Gestion des sprites et prise en compte de la transparence)
#   ¤ Zeus 81 (Gestion de la souris)
#
# Explication du script by Zeus 81, mises à jour par Sphinx pour les adapter à ses
# modifiactions :
#      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 afficher le curseur : Mouse.enable
#      Pour masquer le curseur : Mouse.disable
#      L'apparence du curseur peut être modifiée en mettant un fichier nommé
#      "curseur.png" dans "Graphics/Pictures/"
#      Enfin il ne faut pas oublier de faire un Mouse.update à chaque frame.
#=======================================================================
module Mouse
  LEFT = 1
  RIGHT = 2
  MIDDLE = 4
  open('Game.ini') {|file| file.read[/Title=(.+)\n/]}
  HWnd = Win32API.new('user32', 'FindWindow', 'PP', 'L').call('RGSS Player', $1) or nil
  GetDoubleClickTime = Win32API.new('user32', 'GetDoubleClickTime', '', 'I') or nil
  GetCursorPos = Win32API.new('user32', 'GetCursorPos', 'P', 'I') or nil
  SetCursorPos = Win32API.new('user32', 'SetCursorPos', 'ii', 'I') or nil
  ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'LP', 'I') or nil
  ShowCursor = Win32API.new('user32', 'ShowCursor', 'i', 'I' ) or nil
  GetKeyState = Win32API.new('user32', 'GetKeyState', 'I', 'I') or nil
  Cursor = Sprite.new
 
  # Initialise les données de la souris (dont le curseur)
  def self.init
    Cursor.visible = false
    Cursor.z = 0xFFFF
    begin
      Cursor.bitmap = RPG::Cache.picture('curseur')
    rescue Errno::ENOENT
      # Si le fichier curseur.png n'existe pas
      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))
    end
    @pos    = Array.new(2, 0)
    @pos_buffer = @pos.pack('i*')
    @states   = {LEFT=>[0, 0], RIGHT=>[0, 0], MIDDLE=>[0, 0]}
  end
 
  # Met à jour la souris (ainsi que les sprites interactifs)
  def self.update
    GetCursorPos.call(@pos_buffer)
    @pos = @pos_buffer.unpack('i*')
    ScreenToClient.call(HWnd, @pos_buffer)
    Cursor.x, Cursor.y = @pos_buffer.unpack('i*')
    time = Graphics.frame_count-GetDoubleClickTime.call*Graphics.frame_rate/1000
    for key in @states.keys
      if GetKeyState.call(key)[15] == 1
        @states[key][0] += 1
      elsif @states[key][0] > 0
        @states[key][0] = -1
      else
        @states[key][0] = 0
      end
      if @states[key][1] > time
        @states[key][1] = -1 if @states[key][0] == 1
      else
        @states[key][1] = (@states[key][0] == 1 ? Graphics.frame_count : 0)
      end
    end
   
    for is in ISprite.sprites
      next unless is.visible
      if is.onDrag
        is.endDrag if release?(LEFT)
      elsif is.estSurvole? and is.dragable?
        is.startDrag if press?(LEFT)
      end
      is.update
    end
  end
 
  # Fonctions identiques à celles du module Input
  def self.press?(key)
    return (@states[key][0] and @states[key][0] > 0)
  end
 
  def self.trigger?(key)
    return (@states[key][0] and @states[key][0] == 1)
  end
 
  def self.repeat?(key)
    case @states[key][0]
    when 1
      return true
    when nil
    when -1
    when 0
    when 2...Graphics.frame_rate / 10 * 4
      return false
    else
      return (@states[key][0] % (Graphics.frame_rate/10) == 0)
    end
  end
 
  # Retourne true en cas de double clic, false sinon
  def self.double_trigger?(key)
    return (@states[key][0] and @states[key][1] == -1)
  end
 
  # Retourne true si la souris est relachée
  def self.release?(key)
    return (@states[key][0] and @states[key][0] == -1)
  end
 
  # Retourne la coordonnée X du curseur
  def self.x
    return Cursor.x
  end
 
  # Définit la coordonnée X du curseur
  def self.x=(x)
    @pos[0] += x - Cursor.x
    Cursor.x = x
    SetCursorPos.call(*@pos)
  end
 
  # Retourne la coordonnée Y du curseur
  def self.y
    return Cursor.y
  end
 
  # Définit la coordonnée Y du curseur
  def self.y=(y)
    @pos[1] += y - Cursor.y
    Cursor.y = y
    SetCursorPos.call(*@pos)
  end
 
  # Active le curseur (l'affiche)
  def self.enable
    self.visible = true
  end
 
  # Désactive le curseur (le masque)
  def self.disable
    self.visible = false
  end
 
  # Retourne true si le curseur est visible, false sinon
  def self.visible
    return Cursor.visible
  end
 
  # Définit si le curseur doit être visible, ou non
  def self.visible=(visible)
    loop do
      if (visible and ShowCursor.call(0) < 0) or (not(visible) and ShowCursor.call(1) > 0)
        break
      end
    end
    Cursor.visible = visible
  end
end
Mouse.init

Script ISprite
Code:
#=======================================================================
# SpriteInteractif écrit par Sphinx
#   Permet de gérer très simplement les interactions entre la souris et le sprite (survol, clic,
#   double-clic) et inclut également la possibilité de rendre les sprites déplacables.
#   
#   Méthodes disponibles :
#     + ISprite.new          : Crée un sprite non déplacable
#     + ISprite.new(true) : Crée un sprite déplacable
#     
#     ¤ mouseOut = Bitmap     : Définit le bitmap affiché. A utiliser à la place de bitmap= !
#     ¤ mouseOver = Bitmap   : Définit le bitmap affiché uniquement en cas de survol
#     ¤ dispose                          : Détruit le sprite (ne bug pas si le sprite est déjà détruit)
#     ¤ estClique?                     : Retourne true si le joueur clique sur le sprite, false sinon
#     ¤ estDbClique?                : Retourne true si le joueur double-clique sur le sprite, false sinon
#     ¤ estSurvole?                   : Retourne true si le joueur a sa souris sur le sprite, false sinon
#     ¤ dragable?                      : Retourne true si le sprite peut être déplacé, false sinon
#     ¤ onDrag                           : Retourne true si le sprite est en déplacement, false sinon
#     
#     + Les autres méthodes déclarées dans cette classe servent à la gestion interne du sprite.
#        Il est donc fortement déconseillé de les utiliser sans savoir très précisément ce que
#        vous faites.
#   
# Versions :
#   ¤ version 1.0 : 29 Août 2011
#
# Credits demandes :
#   ¤ Sphinx (élaboration du système d'échange)
#=======================================================================
class ISprite < Sprite
  # Crée un sprite interactif
  def initialize(dragable = false, viewport = nil)
    @dragable = dragable
    super(viewport)
    @id = nil
    @mouseOut = nil
    @mouseOver = nil
    @drag = false
    @cursor = {"x" => 0, "y" => 0}
    @@SPRITES.push(self)
    @@SPRITES.sort! {|a, b| a.z <=> b.z}
    @@SPRITES.reverse!
  end
 
  # Définit le bitmap par défaut
  def mouseOut=(bitmap)
    @mouseOut = bitmap
    self.bitmap = @mouseOut
  end
 
  # Définit le bitmap au survol (si aucun bitmap particulier pour le survol n'est défini, c'est
  # le bitmap par défaut qui sera utilisé)
  def mouseOver=(bitmap)
    @mouseOver = bitmap
  end
 
  # Détruit le sprite interactif.
  def dispose
    return if disposed?
    @@SPRITES.delete(self)
    super
  end
 
  # Retourne true si le joueur a cliqué sur le sprite interactif. false sinon.
  # NB : les sprites déplacables NE SONT PAS CLIQUABLES !
  def estClique?
    if dragable?
      # Si le sprite est cliquable, retourne toujours false.
      return false
    end
   
    if Mouse.trigger?(Mouse::LEFT) and estSurvole?
      # Si le joueur fait un clic gauche sur le sprite, retourne true.
      return true
    else
      # Sinon, retourne false.
      return false
    end
  end
 
  # Retourne true si le joueur a double cliqué sur le sprite interactif. false sinon.
  # NB : Les sprites déplacables sont double cliquables
  def estDbClique?
    if Mouse.double_trigger?(Mouse::LEFT) and estSurvole?
      # Si le joueur fait un double clic gauche sur le sprite, retourne true.
      return true
    else
      # Sinon, retourne false.
      return false
    end
  end
 
  # Retourne true si le joueur passe sa souris sur le sprite interactif. false sinon.
  # Tient compte de la superposition des sprites (le survol ne concernera que le sprite du
  # dessus)
  def estSurvole?
    unless @@LOCK.nil?
      # Si un sprite est en déplacement, seul ce sprite est survolable et survolé.
      return @@LOCK == self
    end
   
    # Sinon, je parcours l'ensemble des sprites interactifs, triés par ordre décroissant de
    # superposition (z) :
    for iSprite in @@SPRITES
      # Si le sprite n'est pas visible, je passe au suivant.
      next unless iSprite.visible
     
      if iSprite == self
        # Si j'arrive au sprite courant, alors je sors de la boucle.
        break
      end
     
      if iSprite.mouseOver?
        # Si un sprite au dessus est survolé, je retourne false.
        return false
      end
    end
   
    if mouseOver?
      # Si aucun sprite au dessus du sprite courant n'est survolé, alors je teste si la souris
      # est au dessus, et si elle n'est pas sur un pixel transparent. Si toutes ces conditions
      # sont remplies, alors je retourne true.
      return true
    else
      # Sinon, je retourne false.
      return false
    end
  end
 
  # Retourne true si le sprite interactif est déplacable. false sinon.
  def dragable?
    return (@dragable and (@@LOCK.nil? or @@LOCK == self))
  end
 
  # Retourne true si le sprite interactif est en train d'être déplassé. false sinon.
  def onDrag
    return (dragable? and @drag)
  end
 
  #=====================================================================#
  #               GESTION INTERNE DU SPRITE INTERACTIF                  #
  #=====================================================================#
 
  # Utilisé par Mouse.update
  @@SPRITES = []
  @@LOCK = nil
  def self.sprites
    return @@SPRITES
  end
 
  def bitmap=(bitmap)
    @id = bitmap.id
    super(bitmap)
  end
 
  def startDrag
    @drag = true
    @cursor = {"x" => self.x - Mouse.x, "y" => self.y - Mouse.y}
    @@LOCK = self
  end
 
  def endDrag
    @drag = false
    @cursor = {"x" => 0, "y" => 0}
    @@LOCK = nil
  end
 
  def mouseOver?
      x = self.x - self.ox
      y = self.y - self.oy
      return ((Mouse.x).bornes(x, x + self.bitmap.width - 1) and
                  (Mouse.y).bornes(y, y + self.bitmap.height - 1) and
                  self.bitmap.get_pixel(Mouse.x - x, Mouse.y - y).alpha > 0)
  end
 
  def update
    if onDrag
      if @id != (@mouseOver.nil? ? @mouseOut : @mouseOver).id
        self.bitmap = (@mouseOver.nil? ? @mouseOut : @mouseOver)
      end
      self.x = Mouse.x + @cursor["x"]
      self.y = Mouse.y + @cursor["y"]
    end
    if estSurvole? and not @mouseOver.nil? and @id != @mouseOver.id
      self.bitmap = @mouseOver
    elsif (not estSurvole? or @mouseOver.nil?) and @id != @mouseOut.id
      self.bitmap = @mouseOut
    end
    super
  end
end


Voici deux scripts... Il suffit de les coller au dessus de Main. Le premier script, Mouse, a été écrit par Zeus81, et amélioré par mes soins. Le second, ISprite, est de moi. Les sprites interactifs gèrent automatiquement la souris.

    III) Interface d'exemple

Afin de pouvoir tester ce script, je vous propose une interface de test qui exploite les différentes options du tactile (sprite cliquable & dbcliquable, sprite déplacable) :
Script Interface Tactile
Code:
#=======================================================================
# Interface_Tactile par Sphinx
#
# Versions :
#   ¤ version 1.0 : 28 Août 2011
#
# Credits demandes :
#   ¤ Sphinx
#
# Interface de test du système de tactile
# Les boules de billard sont placées au hasard dans la fenêtre. Ces images font 75 pixels de
# large & 75 pixels de haut, donc je place le coin haut/gauche au hasard entre les
# coordonnées (0 ; 0) et (640 - 75 ; 380 - 75)
# NB : Les sprites déplacables ne sont pas cliquables
#=======================================================================
class Interface_Tactile
  def initialize
    # Un sprite classique, pour le fond de l'interface
    @fond = Sprite.new
    @fond.bitmap = RPG::Cache.picture("fond_interface_tactile.png")
    @fond.z = 500
   
    # Elément déplacable 1 : boule de billard n°2
    #   image normale : boule_2.png
    #   image au survol : boule_1.png
    @boule2 = ISprite.new(true)
    @boule2.mouseOut = RPG::Cache.picture("boule_2.png")
    @boule2.mouseOver = RPG::Cache.picture("boule_1.png")
    @boule2.x = rand(565)
    @boule2.y = rand(305)
    @boule2.z = 550
    # Elément déplacable 2 : boule de billard n°3
    #   image normale : boule_3.png
    #   image au survol : boule_1.png
    @boule3 = ISprite.new(true)
    @boule3.mouseOut = RPG::Cache.picture("boule_3.png")
    @boule3.mouseOver = RPG::Cache.picture("boule_1.png")
    @boule3.x = rand(565)
    @boule3.y = rand(305)
    @boule3.z = 600
    # Elément déplacable 3 : boule de billard n°5
    #   image normale : boule_5.png
    #   image au survol : aucune
    @boule5 = ISprite.new(true)
    @boule5.mouseOut = RPG::Cache.picture("boule_5.png")
    @boule5.x = rand(565)
    @boule5.y = rand(305)
    @boule5.z = 650
    # Elément déplacable 4 : boule de billard n°6
    #   image normale : boule_6.png
    #   image au survol : boule_1.png
    @boule6 = ISprite.new(true)
    @boule6.mouseOut = RPG::Cache.picture("boule_6.png")
    @boule6.mouseOver = RPG::Cache.picture("boule_1.png")
    @boule6.x = rand(565)
    @boule6.y = rand(305)
    @boule6.z = 700
    # Elément déplacable 5 : boule de billard n°8
    #   image normale : boule_8.png
    #   image au survol : aucune
    @boule8 = ISprite.new(true)
    @boule8.mouseOut = RPG::Cache.picture("boule_8.png")
    @boule8.x = rand(565)
    @boule8.y = rand(305)
    @boule8.z = 750
   
    # Elément non déplacable 1 : boulon Valider
    #   image normale : bouton_ok.png
    #   image au survol : bouton_ok_survol.png
    @bouton1 = ISprite.new
    @bouton1.mouseOut = RPG::Cache.picture("bouton_ok.png")
    @bouton1.mouseOver = RPG::Cache.picture("bouton_ok_survol.png")
    @bouton1.x = 110
    @bouton1.y = 396
    @bouton1.z = 800
    # Elément non déplacable 2 : boulon Annuler
    #   image normale : bouton_ko.png
    #   image au survol : bouton_ko_survol.png
    @bouton2 = ISprite.new
    @bouton2.mouseOut = RPG::Cache.picture("bouton_ko.png")
    @bouton2.mouseOver = RPG::Cache.picture("bouton_ko_survol.png")
    @bouton2.x = 430
    @bouton2.y = 396
    @bouton2.z = 800
   
    main
  end
 
  def main
    Mouse.enable
    loop do
      update
      tps = Time.now
      if @bouton1.estClique?
        print "Validation !"
      end
      if @bouton2.estClique?
        print "Annulation !"
      end
      break if Mouse.trigger?(Mouse::RIGHT)
    end
    Graphics.freeze
    @boule2.dispose
    @boule3.dispose
    @boule5.dispose
    @boule6.dispose
    @boule8.dispose
    @bouton1.dispose
    @bouton2.dispose
    @fond.dispose
    Mouse.disable
    Graphics.transition
  end
 
  def update
    Graphics.update
    Mouse.update
  end
end

Vous pourrez démarrer cette scène très simplement. Il vous suffira de placer cette commande dans un évent dans une insertion de script :
Code:
Interface_Tactile.new

Il vous faudra juste les images suivantes dans votre dossier Graphics/Pictures : images.zip
Pour sortir de la scène, il suffit de faire un clic droit n'importe où dans l'écran.

Dans cette archive, il y a entre autre l'image "curseur.png". C'est le nom de l'image que le script Mouse va rechercher dans le dossier Pictures. Si elle existe, c'est elle qui sera utilisée comme curseur. Sinon, un curseur par défaut sera créé.


    IV) Le mot de la fin

Voici la gestion du tactile que je propose. Elle est principalement à destination des scripteurs qui auront envie de créer des interfaces tactiles. C'est donc bien une boite à outils, avec un exemple de scripts pour aider ceux pour qui les explications en début de scripts ne suffiraient pas ^^

Posté par Pαlвσlѕку le 3 Sep - 08:56 (2011)
Bien joué Sphinx. Imbécile heureux

Simple d'utilisation.

Posté par Suicune31 le 3 Sep - 10:11 (2011)
J'ai un bug à la ligne 40 du script "ISprite" :s Peut être un bug d’incompatibilité.


Posté par Nuri Yuri le 3 Sep - 10:13 (2011)
Pas mal si ce n'est que j'ai vu un truc monstrueux dans ISprite.
Code:
class ISprite < Sprite 
  # Crée un sprite interactif 
  def initialize(dragable = false) 
    @dragable = dragable 
    super() 

super() Le viewport s'est fait mangé ? :(
Un viewport est essentiel pour un sprite dans un interface, ça permet d'éviter les débordements sur l'écran, de le limiter et de pouvoir mettre un supériorité qui le distingue des autres sprites dans l'interface plutôt que des autres sprites des autres interfaces.
Code:
class Interface1
  def initialize
    @viewport=Viewport.new(0,0,640,80)
    @viewport.z=1000
    @sp_1=Sprite.new(@viewport)
    @sp_1.z=1 #Le plus bas
    @sp_2=Sprite.new(@viewport)
    @sp_2.z=2 #Supérieur au 1
    #[...]
  end
end

class Interface2
  def initialize
    @viewport=Viewport.new(13,93,256,80)
    @viewport.z=1001
    @sp_bouton=Sprite.new(@viewport)
    @sp_bouton.z=1 #Le plus bas
    @sp_text=Sprite.new(@viewport)
    @sp_text.z=2 #Supérieur au 1
    #[...]
  end
end

Est plus agréable que des sprites avec des z du genre 6359 222563 3325 après c'est la foire aux supériorités et entre les interfaces qui tournent en même temps c'est compliqué.
De plus les petit nombres sont plus claire et explicites.

Sinon, pour les mouse_over, j'y avais pas pensé :B, faudrait que j'ajoute ça dans mes classes.
J'espère que ton script servira à beaucoup de monde Petit saligaud mal élevé

Posté par Sphinx le 3 Sep - 12:54 (2011)
Imbécile heureux En fait tu peux initialiser un Sprite sans Viewport. Et ne connaissant pas celui utilisé par défaut, j'ai préféré ne rien y mettre ^^

Perso je n'utilise jamais de viewport dans mes sprites, donc je n'ai qu'une connaissance très limitée à ce sujet x)

Posté par Nuri Yuri le 3 Sep - 13:05 (2011)
La valeur par défaut pour les viewport c'est nil, le Graphics considère qu'il n'y en as pas et affiche le sprite sans les calcules des coordonnées du viewport.
Je les utilise souvent car c'est plus pratique avec et que ça permet plus de choses que sans viewport.
Par exemple, faire un flash de tous les sprites dans un combat : viewport.flash(color, duration) plutot que de flasher tous les sprites les un après les autres.

Posté par Suicune31 le 3 Sep - 13:28 (2011)
je ne suis pas un fantôme que je sache x)
Personne n'a une solution ?

Posté par Sphinx le 3 Sep - 14:13 (2011)
^^" Euh, bah là je ne vois pas le soucis en fait... Tu pourrais me montrer le bout de code où tu utilises un ISprite ?


=> Nouvelle version mise en ligne. Identique à l'ancienne, mais intègre maintenant les viewports (:p pour ceux qui, comme Yuri, en seraient fans)
Pour utiliser un viewport, il faut appeler l'ISprite comme ca :
Code:
ISprite.new(false, viewport) # pour un élément non déplacable
ISprite.new(true, viewport) # pour un élément déplacable





edit : Nouvelle version : meilleure gestion au survol (plus rapide que la précédente).

Posté par og_loc-TATOO le 5 Sep - 16:28 (2011)
Sphinx tu as oublié un "end" pour ta Class Isprite Imbécile heureux

Suicune31 a écrit:
J'ai un bug à la ligne 40 du script "ISprite" :s Peut être un bug d’incompatibilité.



Rajoute un "end" après le "end" de la ligne 42 (sans les guillemet) et décale le pour qu'il soit dans le même alignement que la Class Isprite Imbécile heureux

Posté par Sphinx le 5 Sep - 18:30 (2011)
^^" Euh, quel rapport entre une NoMethodError & une SyntaxError ?

PS : ligne 42 il ne manque pas de end Clin d'œil foireux

Posté par og_loc-TATOO le 6 Sep - 12:23 (2011)
Sphinx a écrit:
^^" Euh, quel rapport entre une NoMethodError & une SyntaxError ?

PS : ligne 42 il ne manque pas de end Clin d'œil foireux


Une classe s'écrit Class
End

Une méthode s'écrit def_methode
End

Y a toujours un End à la fin 42

Après je dit pas que sa résout le truc, mais bon sait-on jamais 42
Spoiler
(chui k1 débutant dns le script)


EDIT: Après j'dit sa.... J'dit rien x)

Posté par Sphinx le 6 Sep - 17:44 (2011)
x) Euh, oui mais relis mieux, je déclare plusieurs méthodes Clin d'œil foireux Ca explique que le end de fin de la classe se trouve nettement plus loin

=> ^^ En outre, l'oubli d'un end provoquerait une erreur de syntaxe (SyntaxError) tandis que l'erreur présentée ici est une méthode appelée mais non déclarée (NoMethodError)

Posté par og_loc-TATOO le 6 Sep - 21:09 (2011)
Sphinx a écrit:
x) Euh, oui mais relis mieux, je déclare plusieurs méthodes Clin d'œil foireux Ca explique que le end de fin de la classe se trouve nettement plus loin

=> ^^ En outre, l'oubli d'un end provoquerait une erreur de syntaxe (SyntaxError) tandis que l'erreur présentée ici est une méthode appelée mais non déclarée (NoMethodError)


Très juste, faute à moi de pas avoir tout lu Résignation man

Donc tu as dut mal définir ta méthode, ou pas bien placé Imbécile heureux

Posté par Nuri Yuri le 6 Sep - 21:25 (2011)
Non, c'est pas un problème du à ça.
Le bug viens du forum, il censure les <=> donc il faut remplacer dans @@SPRITES.sort! {|a, b| a.z <= b.z} le <= par un <=>.

Posté par Sphinx le 7 Sep - 17:31 (2011)
J'ai ajouté des espaces entre <, = et >. Ca passe correctement sur le forum, du coup

En espérant que ca ne déclenchera pas une erreur de syntaxe. Vous pouvez reprendre le script du coup. Si ca passe, tant mieux, sinon il suffira de supprimer ces espaces :!

Posté par Nuri Yuri le 7 Sep - 18:12 (2011)
(eval):1: compile error
(eval):1: syntax error, unexpected '='

Faut enlever les espaces sinon c'est considéré comme value.<(= >value) avec un = et > qui ne sont pas censé être là.

Posté par Arc-Arceus le 24 Oct - 08:02 (2011)
Désolée pour le petit necropost, mais j'ai un problème lors du lancement de l'interface de test : dans le script ISprite, lignes 170 et 171, le jeu m'indique qu'il y a une incompatibilité entre la méthode "(Mouse.x).bornes" et la valeur entre parenthèses juste après, qui est du type Fixnum (erreur NoMethod)...
Je précise que j'utilise la version sans viewport.
Si quelqu'un a une idée sur le sujet... ><
Merci...

Posté par Rja le 24 Oct - 21:21 (2011)
Moi j'appelle pas ça un nécropost quand ça date d'1 mois :D

Posté par Kosuke Kyuu le 24 Oct - 21:27 (2011)
Hum, étant dans la même situation qu'Arc-Arceus, je me demande aussi la réponse au problème, l'auriez-vous ?
Merci.

Posté par Sphinx le 24 Oct - 21:53 (2011)
Imbécile heureux Pourrais je voir comment vous appelez le script ?

Posté par Kosuke Kyuu le 24 Oct - 21:56 (2011)
Pour ma part, je ne fais que le tester (sur un "nouveau projet" avec RPG Maker XP) : J'appelle l'interface tactile d'exemple (Interface_Tactile.new)dans un nouvel évênement et le message qui s'affiche n'est autre que l'exacte même de celui reçu par Arc-Arceus.

Posté par Nuri Yuri le 24 Oct - 22:54 (2011)
Je viens de tester. Ça plante effectivement mais c'est tout à fait normal, Mouse.x renvois dans 99.99999% des cas un Fixnum et la méthode bornes n'existe pas dans la classe Fixnum en ruby 1.8.1 ce qui amène ce bug, donc il faut l'ajouter mais je sais pas ce que ça fait je me suis pas encore intéressé de près à cette ligne. Sinon Sphinx, quel est le rapport entre l'appelle du script et le bug ?

Posté par Arc-Arceus le 25 Oct - 11:18 (2011)
En effet, le problème est que je ne trouve rien concernant cette méthode... J'ai d'abord cherché à savoir si elle était définie quelque par ailleurs, et n'ayant pas trouvé, me suis dit qu'elle devait faire partie des preset du RGSS. Il s'agit donc d'une méthode mathématiques ? Si c'est le cas, c'est pas étonnant que ça plante, on ne peux prendre les bornes que d'un intervalle (fermé?) et pas d'un nombre constant ! Ça n'a pas de sens ! XP
J'appelle le script sur une map de test avec un event en déclenchement par la touche action.

Posté par Nuri Yuri le 25 Oct - 12:03 (2011)
Ajoutez ce code :
Code:
module Precision
  def bornes(x,y)
    return (self >= x) & (self <= y)
  end
end

Je pense que c'était l'effet voulu.

Edit : J'ai pu testé la démo avec ce code, qu'est-ce que ça lag, je sais pas si ça proviens de ce code...

Posté par Kosuke Kyuu le 25 Oct - 12:18 (2011)
Merci pour ce code Yuri, pour moi cela fonctionne très bien, pas de lag. ^^'

Posté par Arc-Arceus le 25 Oct - 12:27 (2011)
C'est bon, ça marche ! Chez moi, ça lagge pour le premier lancement puis pour les suivants tout ce passe très bien...

Mais si l'effet de cette partie du script était : vérifier l'appartenance de x à l'intervalle [a ; b], pourquoi ne pas utiliser directement un objet de type intervalle avec une condition ? ( j'essaierai à l'occasion...)

Posté par Akito アート le 15 Jan - 11:37 (2012)
Désolé si je fais du nécropost, mais ou doit on mettre le bout de script qu'a ajouter Nagato Yuki ?

Posté par Nuri Yuri le 15 Jan - 11:47 (2012)
Bah essaie sans et vois ce que ça donne. Si ça plante c'est qu'il y en avais besoins.

Posté par Akito アート le 15 Jan - 11:51 (2012)
Sa plante quand je le mets pas alors je suppose qui faut le mettre mais ou dans le script ?

Posté par Nuri Yuri le 15 Jan - 12:03 (2012)
Tu le mets dans un script à part. (En dessous de Main Par exemple et tu le nomme Precision.)

Posté par Akito アート le 15 Jan - 12:36 (2012)
D'accord, j'essaye..... Ca marche, merci Nagato Yuki.

Posté par Frost le 15 Jan - 18:34 (2012)
Moi j'ai un bug avec Mouse ligne 67


Voici la ligne en question





Spoiler
time = Graphics.frame_count-GetDoubleClickTime.call<bstyle="color:#D0D1D1">Graphics[/b].frame_rate/1000  

Posté par Sphinx le 15 Jan - 20:50 (2012)
Quel est le bug ?

Posté par Nuri Yuri le 15 Jan - 21:55 (2012)
T'as du HTML qui s'est glissé dans ce que t'as copié vérifie bien la façons dont du copie.

Posté par Frost le 16 Jan - 15:56 (2012)
Oups effectivement...


voila la bonne:


[font=Verdana, Arial, Helvetica, sansserif]    time = <b style="color:#D0D1D1">Graphics</b>.frame_count-GetDoubleClickTime.call*<b style="color:#D0D1D1">Graphics</b>.frame_rate/1000  [/font]
[font=Verdana, Arial, Helvetica, sansserif]
[/font]
[font=Verdana, Arial, Helvetica, sansserif]
[/font]
[font=Verdana, Arial, Helvetica, sansserif]Et le bug fait que je ne peut plus démarer le jeu.[/font]

Posté par Sphinx le 16 Jan - 17:31 (2012)
je crois qu'il faudrait que tu mettes ca dans un fichier texte et que tu l'uplodes sur PSP ensuite, parce que là encore t'as des balises parasites qui se sont ajoutées x')

Joints également le rapport de Log (ou une copie du message d'erreur) qu'on puisse t'aider :p

Posté par Frost le 16 Jan - 17:42 (2012)
voici la ligne


http://www.sendspace.com/file/2o21u8 le fichier s'appele Erreur.



et le message d'erreur:


Spoiler





Et sphinx c'est pas un script de source donc le rapport ne dit rien.

Posté par Sphinx le 16 Jan - 18:28 (2012)
Attends, tu as les balises dans ton script sur RMXP ?

Si oui, remplace ta ligne par :
Code:
time = Graphics.frame_count-GetDoubleClickTime.call*Graphics.frame_rate/1000

Posté par Frost le 16 Jan - 19:53 (2012)
Balise? Qu'est ce que c'est?

Posté par Zohran le 29 Avr - 22:30 (2012)
Salut, ton script m'intéresse beaucoup et j'ai compris son fonctionnement, par contre j'ai une question. J'aimerais créer une scène qui fonctionnerait donc avec des touches tactiles mais (c'est là le problème) qui en même temps laisse toujours la possibilité de bouger sur la carte, c'est à dire laisser la map continuer à tourner, je ne sais pas si je m'exprime clairement...

Posté par Nuri Yuri le 30 Avr - 18:32 (2012)
Crée un scène qui se met à jour pendant l'exécution de Scene_Map au même titre que Window_Message ou Game_System.

Posté par Zohran le 30 Avr - 18:54 (2012)
Merci de la réponse Yuri ! Je te remercie car tes réponses contribuent beaucoup à mes progrès en script et à mon projet que j'ai enfin commencé ! Merci beaucoup !

Posté par Akito アート le 15 Nov - 17:21 (2013)
Bonjour, ce message est un C/C du topic du Support Technique.

Comme vous le savez, je suis très connu (oupas) pour être nul en script.
Je voulais tenter de bidouiller le script de la boîte à outils tactile de Sphinx.
Je vous rappelle que pour en sortir un simple clique droit devait suffir...
Je fais donc ce clique droit, cela fonctionne puis j'ai un bux de script dans le script ISprite, ligne 168 sans aucun log.
La ligne en question:

x = self.x - self.ox

Je suis vraiment perdu dans ce script et je ne trouve pas pourquoi ce bug.

Les scripts sont pourtant adaptés à PSP DS (que j'utilise pour mon bidouillage).

Merci aux codeurs ou non qui sauront m'aider dans mon problème !

P.S: Simple petite question, quelle est la commande ruby permettant de sortir d'une interface scripté (menu spécial ou autre personnalisation) ?

Bonne journée !

(Désolé d'avoir remonter le topic de plus de 2 ans.)

Posté par Zohran le 20 Juil - 09:07 (2014)
Bonjour Sphinx, j'aime énormément ton script, je le trouve très pratique à utiliser en plus !
Dis moi, serait-il possible de rajouter à ce script une fonction pour l'utilisation de la molette, par exemple pour des menus déroulants, etc?
Merci par avance !(ça serait gentil, parce que je ne maîtrise pas du tout les API.

Posté par Nuri Yuri le 20 Juil - 09:47 (2014)
Your project is totaly fucked.

Si tu veux utiliser la molette, tu peux pas faire ça sans redéfinir le WNDPROC de la fenêtre de jeu du RGSS. Le seul moyen de récupérer l'état de la molette de la souris sous Windows est de lire le message WM_MOUSEWHEEL (C'est le seul qui fonctionne sans problèmes.)
D'ailleurs, n'essaie pas d'utiliser PeakMessage pour le récupérer car ton jeu est inactif au moins 80% du temps (Graphics.update) du coup c'est le WNDPROC de la fenêtre du jeu qui va bouffer le message :d (Tu l'auras en gros 1 fois sur cent.)

Là faut coder en C++, tu pourras jamais faire ça en RGSS.

Posté par Zohran le 20 Juil - 09:52 (2014)
Yuri a écrit:
Your project is totaly fucked.

Si tu veux utiliser la molette, tu peux pas faire ça sans redéfinir le WNDPROC de la fenêtre de jeu du RGSS. Le seul moyen de récupérer l'état de la molette de la souris sous Windows est de lire le message WM_MOUSEWHEEL (C'est le seul qui fonctionne sans problèmes.)
D'ailleurs, n'essaie pas d'utiliser PeakMessage pour le récupérer car ton jeu est inactif au moins 80% du temps (Graphics.update) du coup c'est le WNDPROC de la fenêtre du jeu qui va bouffer le message :d (Tu l'auras en gros 1 fois sur cent.)

Là faut coder en C++, tu pourras jamais faire ça en RGSS.


Ah j'avoue, c'est mort là, pas grave, on s'en passera, c'est pas le plus important pour un Sk. Merci de ta réponse Yuri ! On a toujours besoin de tes lumières 42 (et à tous les étages x) )

Posté par Nuri Yuri le 20 Juil - 10:06 (2014)
Il suffit de le coder. Après, si c'est taper un peu dans du C++ qui te fais peur, on peut rien pour toi :d
(La molette c'est quand même assez utile dans certains jeux, surtout dans les livres que quêtes et les titres quand t'en a à foison.)