Sujet n°10346
Posté par
Sphinx le
3 Sep - 01:43 (2011)Titre :
[Boite à outils] Interface tactile[Boite à outils] Interface tactile
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)
Comme pour tout système aussi complexe que le tactile, l'installation est extrêmement ardue... Ou pas =')
Hey ! Restez ! Je plaisantais !
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 |
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.
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) :
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éé.
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.
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
Posté par
Sphinx le
3 Sep - 12:54 (2011) 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
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
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
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 |
Une classe s'écrit Class
End
Une méthode s'écrit def_methode
End
Y a toujours un End à la fin
Après je dit pas que sa résout le truc, mais bon sait-on jamais (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
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 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
Donc tu as dut mal définir ta méthode, ou pas bien placé
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) 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 67Voici la ligne en question
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:
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 (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.)