j'en ai eu marre de devoir recreer constamment mes apis avant de les utiliser... j'ai donc fait ce script, permettant (voir l'entete) de recupérer facilement des apis/fonctions pour scripter... certains ont du apercevoir ce script autre part ^^
ce script s'adresse donc aux rubystes...
Code:
#=========================================== # Win32API v1.0 # par berka # # Torturons la fenetre de jeu... #-------------------------------------------------------- # commandes: # Win32API.handle > renvoie le handle du player # Win32API.dim_player > renvoie les dimensions du player # Win32API.dim_ecran > renvoie les dimensions de l'écran # Win32API.barre_trans(128) > fixe l'opacité de la barre de titre a 128 # Win32API.sup_cadre > supprime le cadre bleu et la barre de titre # Win32API.bouton_agrandir > autorise la maximisation du player # Win32API.position(x,y,w,h) > fixe les dimensions, positions du player # Win32API.ouvrir > effectue une ouverture de la fenetre de jeu # Win32API.fermer > effectue une fermeture de la fenetre de jeu # Win32API.update > met a jour la fenetre du player # Win32API.rm_version > renvoie 'rmvx' ou 'rmxp' selon votre version # Win32API.screenshot('nom')> capture d'ecran, sauvée sous ./nomX.png # Win32API.avert('texte', 48) > boite de message avec icone (voir fin du script) #===========================================
class Win32API < Object def self.handle title = "\0" * 256 self.new('kernel32', 'GetPrivateProfileString',%w(p p p p l p), 'l').call("Game", "Title", "", title, 256, ".//Game.ini") title.delete!("\0") return self.new('user32', 'FindWindow', "p, p", 'i').call("RGSS Player", title) end def self.dim_player rect = [0, 0, 0, 0].pack('l4') self.new('user32', 'GetClientRect', %w(l p), 'i').call(self.handle, rect) larg, haut = rect.unpack('l4')[2..3] return larg, haut end def self.dim_ecran l = self.new('user32', 'GetSystemMetrics', 'i', 'i').call(0) h = self.new('user32', 'GetSystemMetrics', 'i', 'i').call(1) return l, h end def self.barre_trans(trans = 100) self.new("user32.dll", "SetWindowLong",['N','N','N'], 'N').call(handle,-20, self.new("user32.dll", "GetWindowLong",['N','N'], 'N').call(self.handle,-20) | 0x80000 ) self.new("user32.dll",'SetLayeredWindowAttributes','IIII','I').call(self.handle, 0xFF000000, trans, 3) end def self.sup_cadre self.new("user32.dll", "SetWindowLong",['N','N','N'], 'N').call(self.handle,-16,0x00800000|0x10000000|0x00080000| 0x00040000) end def self.bouton_agrandir self.new("user32.dll", "SetWindowLong",['N','N','N'], 'N').call(self.handle,-16,0x10000000 | 0x00C00000 | 0x00080000 | 0x00040000 | 0x00020000 | 0x00010000) self.update end def self.position(x, y, w=544, h=416) self.new('user32', 'SetWindowPos', %(l, l, i, i, i, i, i), 'i').call(handle, 0,x, y, w + 6, h + 32, 0) end def self.ouvrir w = self.dim_player[0] for i in 0...w self.new("user32", "SetWindowRgn", "ILI", "I").call(self.handle, self.new("gdi32","CreateRectRgn","IIII","L").call(0,0,i+8,i+8), 1) end end def self.fermer w, h = self.dim_player for i in 0...w; self.new("user32", "SetWindowRgn", "ILI", "I").call(self.handle,self.new("gdi32","CreateRectRgn","IIII","L").call(0,0,w-i-8,h-i-8),1);end exit end def self.update self.new("user32.dll", "SendMessage",['N','N','N','P'], 'N').call(self.handle,0x0047,0,"") end def self.screenshot(nom = 'screen') # requiert la dll screenshot.dll a placer dans votre projet id = 1; id += 1 while FileTest.exist?(nom + id.to_s + '.png'); nom += id.to_s self.new('screenshot', 'Screenshot', %w(l l l l p l l), '').call(0,0,self.dim_player[0], self.dim_player[1],".\\#{nom}.png",handle,2) rescue self.avert("Librairie 'screenshot.dll' a placer dans votre projet \n Echec du screenshot", 48) end def self.rm_version #assez inutile... if FileTest.exist?('./Data/scripts.rvdata'); return 'rmvx' ; end if FileTest.exist?('./Data/scripts.rxdata'); return 'rmxp' ; end end def self.avert(texte, type = 48) # voir fin du script self.new('user32','MessageBox',['L', 'P', 'P', 'L'],'I').call(0,texte,'Attention:',type) end end
Sujet: Re: Classe Win32API Jeu 16 Oct 2008 - 20:50
Salut Berka,
Juste pour être sur, le "player" c'est bien la fenêtre de jeu?
Jebbou
berka
Maire Lv.9
Age : 34 Inscrit le : 15/10/2008 Messages : 351
Sujet: Re: Classe Win32API Jeu 16 Oct 2008 - 20:55
ouais, le rgss player
MirainoHikari
Ex-Admin-Script
Age : 42 Inscrit le : 26/05/2008 Messages : 2360
Sujet: Re: Classe Win32API Jeu 16 Oct 2008 - 23:47
Salut berka. En effet, cette classe évite de devoir recreer un API chaque fois. bonne idée. Je vais adapter pour mon nouveau module. Merci beaucoup du partage. Je te donne les points.
berka
Maire Lv.9
Age : 34 Inscrit le : 15/10/2008 Messages : 351
Sujet: Re: Classe Win32API Ven 17 Oct 2008 - 15:15
pas de recreer une api, mais de ne pas chercher pendant des heures des fonctions a mettre en arguments ^^
Si t'as des rajouts et idées a faire, n'hesite pas !
ps: merci pour les points !
MirainoHikari
Ex-Admin-Script
Age : 42 Inscrit le : 26/05/2008 Messages : 2360
Sujet: Re: Classe Win32API Ven 17 Oct 2008 - 17:26
Par recréer, je parlais plus de devoir faire un WIN32API.new systématiquement. Pour les points, c'est naturel. Disons que certain de tes scripts ont été très instructifs .
Pour ce qui est des ajouts, je verrai bien au fur et à mesure que j'aurai besoin d'API particulier. Je ne vois pas encore ce que j'aurai potentiellement besoin, mais t'inquiète, je te tiendrai au courrant. Disons que pour le moment, c'est plutôt complet. Il ne manquerait qu'un prompt box et on aurait la total. (par prompt box, j'entends text edit, menu déroulant, slider bar et autre qui permettent de donner des valeurs à une variable.) Je travaille actuellement sur une prompt box, mais les résultats sont, hmmm comment dire poliement, limité . Enfin. Avec un peu de persévérance, je devrais finir par y ariver.
berka
Maire Lv.9
Age : 34 Inscrit le : 15/10/2008 Messages : 351
Sujet: Re: Classe Win32API Ven 17 Oct 2008 - 17:59
je m'etais intéressé à une api -- je ne me rappelle plus du nom de la dll, ni de sa fonction -- qui permettait l'apparition d'une fenetre ouvrir un fichier... mais c'etait pas vraiment utile ^^ Ce qui serait bien c'est de trouver le moyen de faire une barre de menu en haut du player ^^
MirainoHikari
Ex-Admin-Script
Age : 42 Inscrit le : 26/05/2008 Messages : 2360
Sujet: Re: Classe Win32API Sam 18 Oct 2008 - 12:21
Quand tu dis en haut du player, tu parle vraiment du sprite du joueur ou en haut de la fenêtre de jeu? Autre question, un menu en permanance ou seulement à l'appel du menu. Personnellement, j'opterais d'avantage pour la 2e pour 2 raison. Premièrement, on aurait pas besoin de surcharger ou modifier le script des menus pour ce qui est du "moment" d'apparission, et deuxièmement, pour ne pas faire bruler les écran ACL (car une image fixe peut endommager l'écran). À ce moment, il me semble que la tâche deviens assez simple. L'utilisation de la scene menu devient ton menu et tu crée des selectable window pour chaque sous menu que tu affiche sur l'exécution et tu gère le gauche droite pour changer de fenêtre au lieu de changer d'élément de menu. L'autre possibilité serait de gerrer plutot une matrice de fenêtre de sélection en faisant une gestion de clavier plus complète. À toi de voir ce qui est plus avantageux ou plus simple à réaliser.
berka
Maire Lv.9
Age : 34 Inscrit le : 15/10/2008 Messages : 351
Sujet: Re: Classe Win32API Sam 18 Oct 2008 - 12:45
- je parle du rgss player - non, une image fixe n'endommage que les ecrans cathodiques - Je pensais utiliser une api permettant d'afficher un menu comme le sdk windows: Fichier editer outils...
MirainoHikari
Ex-Admin-Script
Age : 42 Inscrit le : 26/05/2008 Messages : 2360
Sujet: Re: Classe Win32API Lun 20 Oct 2008 - 14:14
Non, pas que les écran cathodique. Les écrans plasma brulent et les écrans à diodes change de couleur. Les écrans cathodique crée des images fantôme. Bref, c'est mauvais pour toutes les écrans. Je l'ai vu en pratique. Un ordi avec un écran ACL (diode) qui a pris un teint rose verdâtre à cause de l'affichage trop prolonger du bureau sans écran de veille ni de mode «éteindre l'écran après X min». J'avais un collègue qui avait une télé plasma et que l'endroit où son HUD s'affichait (mais là, il devait jouer vraiment beaucoup trop à son jeu) était devenu très sombre ce qui parraissait d'avantage quand il ne jouait pas. Et pour les écran à canon cathodique, ben je crois que vu que tu étais au courrant, tu as dû déjà le vérifier. Une image fixe s'impreigne dans l'écran. Je tiens également à te rappeler que même si en france vous ne voyez pas des trucs régulièrement, il existe d'autre pays dans le monde. Les écrans à cathode existe encore un peu partout. La longueur d'onde utiliser pour l'affichage est différente d'un pays à l'autre, de même que la tension électrique. (110-120V/60Hz par défaut en amérique du nord).
Pour ce qui est du menu, je viens de comprendre ce que tu veux. Mais je pense que toi et moi, on se frotte au même problème. Les API ne sont pas une GUI mais des utilisateurs de GUI. Va falloir que tu te rabbatte comme moi à QTRuby pour faire quelque chose qui a de l'allure. Sinon, va falloir faire du reverse ingeneering et décompiler le truc pour ajouter un menu puis le recompiler.
berka
Maire Lv.9
Age : 34 Inscrit le : 15/10/2008 Messages : 351
Sujet: Re: Classe Win32API Lun 20 Oct 2008 - 17:12
compris, mais pas franchement convaincu pour les ecrans ^^
pour ce qui est du menu, il existe toute un gamme d'apis permettant son affichage/creation
Pour ce qui est de qtruby... inutile, etant donné que l'on ne peut pas importer des libs en c via la methode require de rmvx, meme avec un fichier rb en // Pour toute compilation... c'est mort, etant donné qu'on a pas le code source du log... et que l'assembleur.... c'est pô bien
MirainoHikari
Ex-Admin-Script
Age : 42 Inscrit le : 26/05/2008 Messages : 2360
Sujet: Re: Classe Win32API Mar 21 Oct 2008 - 13:40
Ah pour le require, c'est vrai que j'avais pas tester... hmm domage... Pour les menu de user32, je crois bien que ce sont les même paramètres que la librairie .Net de windows. À vérifier... Je prévois un grand switch/case (ou plutot un When en ruby) étant donné que le connect des API ne sont pas disponible. Tes menus vont te renvoyer probablement une matrice pour identifier quel élément a été cliqué. Bon courrage.
berka
Maire Lv.9
Age : 34 Inscrit le : 15/10/2008 Messages : 351
Sujet: Re: Classe Win32API Mar 21 Oct 2008 - 16:18
pas besoin de matrice... je pense, vu que la fonction GetSubMenu doit renvoyer une valeur... En effet, etant donné qu'il n'y a qu'une seule dll user32, il y a des chances que ce soit la meme fonction que pour .net