Partagez
Aller en bas
avatar
johnseed
Membre

Nombre de messages : 71
Age : 35
Distinction : aucune
Date d'inscription : 03/03/2013
http://seedsoft.moe/

Résolu changement des face/character/Battler en fonction de la classe

le Lun 11 Avr 2016 - 10:49
bonjour
toujours dans l'optique d'avancer mon projet,
je voudrai faire un système qui permet de gérer automatiquement les image des acteur (face/character/Battler)
en fonction de leur classe.
par exemple l'acteur est Guerrier
...\img\faces\Guerrier.png
...\img\characters\Guerrier.png
..\img\sv_actors\Guerrier.png
si il est Mage
...\img\faces\Mage.png
...\img\characters\Mage.png
..\img\sv_actors\Mage.png
j'ai fait ceci mais cela n'a pas l'air de fonctionner

Code:

/*:
@plugindesc change les sprite selon la classe des acteur
Version: Alpha 00.1
@author Johnseed(SeedSoft)
@help
==================================================
Info
==================================================
Classvisual.js
==================================================
Note Tag
==================================================
actor note:
<Class Visual>
change les images des acteur en fonction de la classe

==================================================
Mise a jour
==================================================

==================================================
Plugin Params
==================================================

*/
var Imported = Imported || {};
SeedSoft.ClassVisual = true;
var SeedSoft = SeedSoft || {};
SeedSoft.ClassVisual = SeedSoft.ClassVisual || {};
(function(){

//=============================================================================
// DataManager
//=============================================================================

SeedSoft.ClassVisual.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
    this.processClassVisualNote($dataActors);
return true;
};

DataManager.processClassVisualNote = function(actor) {
if (line.match(/<(?:CLASS VISUAL)>/i)) {
   var actor = $gameActors.actor();
    actor.setCharacterImage(actor.currentClass().name, 1);
    actor.setFaceImage(actor.currentClass().name, 1);
    actor.setBattlerImage(actor.currentClass().name);
}
};
})(SeedSoft.ClassVisual)


je sais pas ou j'ai fauté


Dernière édition par johnseed le Lun 11 Avr 2016 - 22:19, édité 1 fois
avatar
tonyryu
Membre

Nombre de messages : 895
Age : 38
Localisation : Près de Nantes
Distinction : aucune
Date d'inscription : 27/05/2010
http://www.tonyryudev.com

Résolu Re: changement des face/character/Battler en fonction de la classe

le Lun 11 Avr 2016 - 11:40
Peux-tu ajouter des captures d'images de la base de données des classes pour que l'on puisse comprendre le cheminement de la modification. Et également peux-tu ajouter, comment fonctionnellement le système doit agir du point de vue du joueur.

attention, dans ton code, tu redéfini la fonction DataManager.isDatabaseLoader, mais tu n'appels pas l'ancienne, et ça c'est mal :

Code:
SeedSoft.ClassVisual.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
    SeedSoft.ClassVisual.DataManager_isDatabaseLoaded.call(this); // a ne pas oublier!!
    this.processClassVisualNote($dataActors);
return true;
};
avatar
johnseed
Membre

Nombre de messages : 71
Age : 35
Distinction : aucune
Date d'inscription : 03/03/2013
http://seedsoft.moe/

Résolu Re: changement des face/character/Battler en fonction de la classe

le Lun 11 Avr 2016 - 11:59
voicie une partie de ma bdd

merci pour mon oublis

et bien dans la bdd des acteur ceux avec la note

auront les image de face/character/batflers
portant le nom de la classe
par exemple pour celui qui a la classe 003
le filname des image seron Sapic.png
...\img\faces\Sapic.png
...\img\characters\Sapic.png
..\img\sv_actors\Sapic.png
avatar
tonyryu
Membre

Nombre de messages : 895
Age : 38
Localisation : Près de Nantes
Distinction : aucune
Date d'inscription : 27/05/2010
http://www.tonyryudev.com

Résolu Re: changement des face/character/Battler en fonction de la classe

le Lun 11 Avr 2016 - 12:22
peut-on avoir également une capture de la bdd d'un actor, histoire de pouvoir reproduire ton cas de test. Sachant que je ne vais plus avoir de dispo d'ici quelque minute, il faudra que quelqu'un d'autre regarde le soucis.
avatar
johnseed
Membre

Nombre de messages : 71
Age : 35
Distinction : aucune
Date d'inscription : 03/03/2013
http://seedsoft.moe/

Résolu Re: changement des face/character/Battler en fonction de la classe

le Lun 11 Avr 2016 - 12:37
voila
avatar
Azuma-01
Membre

Nombre de messages : 94
Age : 26
Localisation : Amos
Distinction : aucune
Date d'inscription : 22/09/2009

Résolu Re: changement des face/character/Battler en fonction de la classe

le Lun 11 Avr 2016 - 17:12
@JOHNSEED a écrit:j'ai fait ceci mais cela n'a pas l'air de fonctionner [...] je sais pas ou j'ai fauté
À plusieurs endroits en fait... alors allons y dans l'ordre:

1. "SeedSoft.ClassVisual = true; // => ReferenceError: "SeedSoft" n'est pas définie.
Je crois que vous vouliez écrire : Imported.ClassVisual = true;
Note> personnellement, ici je préfère la forme: Imported.ClassVisual = "alpha 00.1";
pour 2 raisons. primo dans une condition, ça a le même effet, et deuzio, les autres plugins peuvent utiliser cette chaine pour vérifier si la version présentement installer est compatible avec leurs modifications.

2. Comme Tonyryu la si bien dit:
@Tonyryu a écrit:tu redéfini la fonction DataManager.isDatabaseLoader, mais tu n'appels pas l'ancienne, et ça c'est mal
Bien que son exemple soit valide 99% du temps, elle est incorrecte pour DataManager.isDatabaseLoader
cette fonction peut, et EST, appelée à plusieurs reprise. Soit tant que la BD n'est pas complètement téléchargé. la forme "correcte" pour DataManager.isDatabaseLoader serait plutôt:
Code:
SeedSoft.ClassVisual.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
    if(result = SeedSoft.ClassVisual.DataManager_isDatabaseLoaded.call(this)) {
        this.processClassVisualNote($dataActors);
    }
    return result;
};

3. Ce n'est pas une erreur en soit, mais un conseil que je vous recommande fortement:
Définissez vos fonctions dans votre "namespace". Cela permet que les fonctions de votre plugin soient regroupées au même endroit et cela offre une meilleur compatibilité (d'autre pourrait définir une même fonction). Donc on ne "pollue" pas les autres objets. Ainsi, la fonction "processClassVisualNote" deverait être définie dans "SeedSoft.ClassVisual" pas dans "DataManager".

4. "if (line.match(/<(?:CLASS VISUAL)>/i)) {" // => ReferenceError: "line" n'est pas définie.
Sans trop m’avancer, je peut dire que vous avez fait du copier/coller... Twisted Evil
Avant de vérifier si une "ligne" correspond à "" il faut définir cette dite ligne.
Pour ce faire il faut faire un boucle pour chaque ligne de la boite de note.
Pour pouvoir faire cette boucle, il faut savoir de quelle boite.
Pour avoir cette boite, on doit faire une boucle pour chaque acteur.
Il manque donc deux boucles imbriquées et deux variables. vous donnée déjà la liste d'acteurs à la fonction, alors renommons la et  utilisons la.
Code:
DataManager.processClassVisualNote = function(actors) {//avec un "s"
    for(var a=1;a<actors.length;a++) {//on commence la boucle à 1 car actors[0] == rien
        var actor = actors[a]; // récupère l'acteur
        var allLines = actor.note.split(/[\r\n]+/); //récupère toutes les lignes de la boite de note de l'acteur
        for(var i=0; i<allLines.length; i++){
            var line = allLines[i]; //récupère la ligne
            if (line.match(/<(?:CLASS VISUAL)>/i)) {
                actor.useClassVisual = true // ajoute une propriété à l'acteur. élément magique! (voir 11.)
                // ... le reste, on y vient ...
            }
        }
    }
};

5. actor.currentClass().name
actor n'est pas un Game_Actor mais un Objet de la BD. Il faut utiliser la propriété "classId"
Code:
$dataClasses[actor.classId].name

6. actor.setCharacterImage(actor.currentClass().name,1);
6.1 actor n'est pas un Game_Actor mais un Objet de la BD. Il faut utiliser les propriété "characterName" et "characterIndex"
6.2 Il faut respecté la convention des noms de fichiers: quand une image entière représente 1 seul personnage, le nom de fichier DOIT commencé par un "$".
6.3 L'index de la première position n'est pas "1" mais "0".

7. actor.setFaceImage(actor.currentClass().name, 1);
7.1 actor n'est pas un Game_Actor mais un Objet de la BD. Il faut utiliser les propriété "faceName" et "faceIndex"
7.2 L'index de la première position n'est pas "1" mais "0".

8. actor.setBattlerImage(actor.currentClass().name);
8.1 actor n'est pas un Game_Actor mais un Objet de la BD. Il faut utiliser la propriété "battlerName"

9. une autre recommandation:
placez votre code à faire quand une une ligne est trouver dans une autre fonction. Ainsi, si un autre plugin devait modifier cette section, comme un patch, il ne sera pas obligé de réécrite toute la fonction "overwrite", mais simplement faire un alias. Cela permet aussi de réutiliser ce code.
Code:
SeedSoft.ClassVisual.setRPGActorClassVisual = function(actor) {
    var name = $dataClasses[actor.classId].name;
    actor.characterName = '$' + name;
    actor.characterIndex = 0;
    actor.faceName = name;
    actor.faceIndex = 0;
    actor.battlerName = name;
};

10. Vous donnez un paramètre à votre fonction d'exécution alors qu'elle en utilise aucun...
Code:
(function(){...})(SeedSoft.ClassVisual)
cette méthode est utiliser pour éviter de réécrite "SeedSoft.ClassVisual" à plusieurs reprise dans la fonction. Le nom de paramètre utiliser dans cette forme est souvent "$"
Code:
(function($){...})(SeedSoft.ClassVisual)
Ainsi, au lieux d'écrite "SeedSoft.ClassVisual.UnePropriété" on peut écrite "$.UnePropriété"

11. Un petit manque... ET SI l'acteur change de classe?
Il faut donc aussi modifier "Game_Actor.prototype.changeClass"!
Mais avant, souvenez vous de "l'élément magique" que j'ai ajouter au point 4? la nouvelle propriété "useClassVisual"?
C'est ici qu'elle sera utile: Elle nous permet de ne pas devoir relire la boite de note.
Code:
SeedSoft.ClassVisual.Game_Actor_changeClass = Game_Actor.prototype.changeClass;
Game_Actor.prototype.changeClass = function(classId, keepExp) {
    SeedSoft.ClassVisual.Game_Actor_changeClass.call(this, classId, keepExp);
    if(this.actor().useClassVisual) // élément magique!
        SeedSoft.ClassVisual.setGActorClassVisual(this);
};

SeedSoft.ClassVisual.setGActorClassVisual = function(actor){
    var name = actor.currentClass().name;
    actor.setCharacterImage('$' + name, 0);
    actor.setFaceImage(name, 0);
    actor.setBattlerImage(name);
};

En effectuent tous ces changements, votre plugin devrait ressembler à ceci
Code:
/*:
        @plugindesc change les sprite selon la classe des acteur
        Version: Alpha 00.1
        @author Johnseed(SeedSoft)
        @help
        ==================================================
        Info
        ==================================================
        Classvisual.js
        ==================================================
        Note Tag
        ==================================================
        actor note:
        <Class Visual>
        change les images des acteur en fonction de la classe

        ==================================================
        Mise a jour
        ==================================================

        ==================================================
        Plugin Params
        ==================================================

        */
        var Imported = Imported || {};
        Imported.ClassVisual = true; // ou "alpha 00.1"
        var SeedSoft = SeedSoft || {};
        SeedSoft.ClassVisual = SeedSoft.ClassVisual || {};
       
        (function($){
        //=============================================================================
        // DataManager
        //=============================================================================

        $.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
        DataManager.isDatabaseLoaded = function() {
            if(result = $.DataManager_isDatabaseLoaded.call(this)) {
                $.processClassVisualNote.call(this, $dataActors);
            }
            return result;
        };
       
        $.processClassVisualNote = function(actors) {//avec un "s"
            for(var a=1;a<actors.length;a++) {//on commence la boucle à 1 car actors[0] == rien
                var actor = actors[a]; //récupère l'acteur
                var allLines = actor.note.split(/[\r\n]+/); //récupère toutes les lignes de la boite de note de l'acteur
                for(var i=0; i<allLines.length; i++){
                    var line = allLines[i]; //récupère la ligne
                    if (line.match(/<(?:CLASS VISUAL)>/i)) {
                        actor.useClassVisual = true // ajoute une propriété à l'acteur. élément magique!
                        $.setRPGActorClassVisual(actor)
                    }
                }//chaque lignes
            }//chaque acteurs
        };
       
        $.setRPGActorClassVisual = function(actor) {
            var name = $dataClasses[actor.classId].name;
            actor.characterName = '$' + name;
            actor.characterIndex = 0;
            actor.faceName = name;
            actor.faceIndex = 0;
            actor.battlerName = name;
        };
      
        $.setGActorClassVisual = function(actor){
            var name = actor.currentClass().name;
            actor.setCharacterImage('$' + name, 0);
            actor.setFaceImage(name, 0);
            actor.setBattlerImage(name);
        };
       
        $.Game_Actor_changeClass = Game_Actor.prototype.changeClass;
        Game_Actor.prototype.changeClass = function(classId, keepExp) {
            $.Game_Actor_changeClass.call(this, classId, keepExp);
            if(this.actor().useClassVisual) // élément magique!
                $.setGActorClassVisual(this);
        };
       
    })(SeedSoft.ClassVisual)
avatar
johnseed
Membre

Nombre de messages : 71
Age : 35
Distinction : aucune
Date d'inscription : 03/03/2013
http://seedsoft.moe/

Résolu Re: changement des face/character/Battler en fonction de la classe

le Lun 11 Avr 2016 - 19:26
merci @Azuma-01 je regarde tout cela et je voie si j'y arrive il y as plein de morceau que je connaissais pas , et tes explication m'aide bien merci.

édit: dans la partie 9 du tuto a:

Code:

SeedSoft.ClassVisual.setRPGActorClassVisual = function(actor) {
    var name = $dataClasses[actor.classId].name;
    actor.characterName = '$' + name;
    actor.characterIndex = 0;
    actor.faceName = name;
    actor.faceIndex = 0;
    actor.battlerName = name;
};
a quoi correspond  '$' je voie souvent ce symbole  devans les image depuis vx mais je me demande bien
pourquoi? sans conté que moi il me demande les image /%24Name.png
avatar
tonyryu
Membre

Nombre de messages : 895
Age : 38
Localisation : Près de Nantes
Distinction : aucune
Date d'inscription : 27/05/2010
http://www.tonyryudev.com

Résolu Re: changement des face/character/Battler en fonction de la classe

le Lun 11 Avr 2016 - 22:04
Je prend bonne note de toutes tes remarques Azuma, cela va me permettre de penser autrement mon code JS pour mes plugins. En effet, même si ceux ci sont fonctionnels la gestion relationelle entre d'autre script est impossible, ce qui n'est pas le cas avec ta méthode.
avatar
johnseed
Membre

Nombre de messages : 71
Age : 35
Distinction : aucune
Date d'inscription : 03/03/2013
http://seedsoft.moe/

Résolu Re: changement des face/character/Battler en fonction de la classe

le Lun 11 Avr 2016 - 22:19
@tonyryu a écrit:Je prend bonne note de toutes tes remarques Azuma, cela va me permettre de penser autrement mon code JS pour mes plugins. En effet, même si ceux ci sont fonctionnels la gestion relationelle entre d'autre script est impossible, ce qui n'est pas le cas avec ta méthode.
oui très bonne méthode cela fonctionne super bien , et j'ai appris pas mal de truc que je vais réutiliser pour réécrire mon script genders, biento toute les plugin de gestion de personnage et ennemis seront finis ;-)
avatar
Azuma-01
Membre

Nombre de messages : 94
Age : 26
Localisation : Amos
Distinction : aucune
Date d'inscription : 22/09/2009

Résolu Re: changement des face/character/Battler en fonction de la classe

le Lun 11 Avr 2016 - 23:26
@johnseed a écrit:a quoi correspond  '$' je voie souvent ce symbole  devans les image

c'est l'un des deux symbole que VX utiliser pour déterminer comment gérer l'image. Puisque qu'un personnage peut être de toutes tailles, Vx ne peut se fier à la taille d'une image. Sans aucun symbole VX considère que l'image contient 8 sprites (8 personnages). Dans ce cas si, la largeur d'un personnage est le 1/12 de la largeur total de l'image, et la hauteur d'un personnage est le 1/8 de la hauteur du fichier.

Le signe de dollar ($) au début du nom indique que le fichier contient qu'un seul sprite (un seul personnage). Ainsi, la largeur d'un personnage est le 1/3 de la largeur total de l'image, et la hauteur d'un personnage est le 1/4 de la hauteur du fichier.

Il faut aussi savoir que VX place les presonnages avec un décalage de 4 pixels pour un effet plus "naturel".

Lorsque que l'on ajoute le point d'exclamation (!) au début du nom, on annule ce décalage de 4 pixels ET l'effet de transparence quand le personnage marche dans des herbes (ou autres tiles avec cette attribue). C'est majoritairement utiliser pour les "personnages-objets" comme les portes et les coffres.
NOTE : le point d'exclamation (!) peut être utiliser conjointement avec le signe de dollar ($).

Note2 : Affin d'alléger le texte je fait mention que de VX, mais ça s'applique aussi a VX Ace et MV.
Contenu sponsorisé

Résolu Re: changement des face/character/Battler en fonction de la classe

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum