Bienvenue visiteur !
|
Statistiques
Liste des membres
Contact
Mentions légales
397 connectés actuellement
30679209 visiteurs depuis l'ouverture
1506 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
mikapoil -
posté le 28/08/2017 à 19:15:57 (43 messages postés)
| | Domaine concerné: . Logiciel utilisé: RPG MAKER MV 1.5 Bon, c'est peut etre la 3e fois que je fais ce post mais je ne retrouve jamais les traces du post d'origine...
J'aimerai pouvoir stocker des nombres décimaux
Or les varibale sont des INTEGER (enfin des entiers)
Une solution contre ça ?
|
François Berhn -
posté le 28/08/2017 à 20:22:20 (5402 messages postés)
| Tonton Hellper |
1
| $gameVariables.setValue(id, value) |
À noter que pour que RM considère une valeur comme un float (aka un decimal, il faut toujours mettre un . pour représenter la virgule sinon ce sera un integer.
|
La liste des raisons pour lesquelles le making se meurt, la cinquième va vous étoner | Des projets abandonnés, source d'inspiration :D | Mes jeux |
mikapoil -
posté le 29/08/2017 à 12:30:24 (43 messages postés)
| | AH !
Génial
Merci pour l'info
|
mikapoil -
posté le 02/09/2017 à 17:01:26 (43 messages postés)
| | euh...j'ai quand même une problème
voici ce que je lui donne $gameVariables.setValue(200, 3.14)
et quand je lui fait afficher il m'affiche 3
alors du coup, je reprend ma question :
Comment affecter un décimal puis comment l'afficher ?
|
HuLijin -
posté le 04/09/2017 à 15:08:15 (1004 messages postés)
| Yeoun, mage-archère-louve | Le pourquoi du comment de l'écrasement des virgules, il est là :
1
2
3
4
5
6
7
8
9
| Game_Variables.prototype.setValue = function(variableId, value) {
if (variableId > 0 && variableId < $dataSystem.variables.length) {
if (typeof value === 'number') {
value = Math.floor(value);
}
this._data[variableId] = value;
this.onChange();
}
}; |
Le fameux "Math.floor" empêche d'avoir des décimaux.
Du coup si c'est juste un truc que tu veux afficher quelque part, t'en fais un string (tu mets des "" autour).
Sinon, si tu fais des calculs, faut ruser, il faut que tu fasses tous tes calculs en décalant la virgule vers la droite (ex, en multipliant ton 3.14 par 100), puis à la fin tu stockes ça :
1
| $gameVariables.setValue(ID1, ($gameVariables.value(ID2)/100).toString()) |
ID1 et ID2 peuvent être égaux.
ID2 c'est al variable que tu utilises pour tes calculs, et ID1 celle que tu utilises pour ton affichage.
Sinon tu te crées un plugin et tu réécris la fonction setValue. À toi de voir. Faudra juste te souvenir que X/Y ne renverra plus un entier comme sur les vieilles versions de RM.
|
M.V. |
mikapoil -
posté le 05/09/2017 à 14:20:44 (43 messages postés)
| | ok...
je vais essayer le ToString mais par contre comme je voulais générer des nombres aléatoires ayant parfois 1, parfois 2, parfois 3 chiffres après la virgule. Ca me parait pas simple...
écrire un plugin me parait un peu au delà de ce que je peux faire
d'autant plus que dans le reste du jeu, c’était appréciable d'avoir des nombres entiers...
D'autres idées ?
ou encore un endroit ou je peux trouver un plugin pour des nombres décimaux ?
(et qui si possible ne désactiverait pas les nombres entiers...)
|
HuLijin -
posté le 05/09/2017 à 21:24:18 (1004 messages postés)
| Yeoun, mage-archère-louve | Ben c'est pas un problème ça, pour des nombres à 1, 2 ou 3 chiffres après la virgule. Tu prends ton maximum (3 chiffres), donc tu dois faire tous tes calculs en multipliant par 10^3 au début, puis en divisant par 10^3 quand tu veux afficher le résultat final.
Faire un plugin, ici, ça revient plus ou moins à créer un fichier JS, à formater un peu l'entête comme ce que tu vois dans les autres plugins et à réécrire la fonction en virant le Math.floor.
Un truc dans ce style :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| //=============================================================================
// nom_du_plugin.js
//=============================================================================
/*:
* @plugindesc Plugin pour manipuler des décimaux
* @author ton_pseudo
*
* @help /!\ Il ne sera plus possible d'obtenir un résultat entier
* pour une division. /!\
*
(function() {
Game_Variables.prototype.setValue = function(variableId, value) {
if (variableId > 0 && variableId < $dataSystem.variables.length) {
this._data[variableId] = value;
this.onChange();
}
};
})(); |
Si quelqu'un de plus calé que moi trouve d'autres alternatives, ne pas hésiter !
Regarde par ici si tu trouves ton bonheur avec une alternative (toFixed au lieu de toString)
|
M.V. |
mikapoil -
posté le 06/09/2017 à 20:01:31 (43 messages postés)
| | Comme dans le reste du jeu j'ai besoin de division avec un résultats entier
est-il possible de créer un plugin activable pour juste une séquence de jeu ?
|
HuLijin -
posté le 06/09/2017 à 20:34:29 (1004 messages postés)
| Yeoun, mage-archère-louve | Techniquement, oui c'est possible de faire ça. Après, je te le déconseille, c'est horriblement casse-gueule.
Imagine que tu oublies ce système d'interrupteur pour activer/désactiver ton plugin, que tu codes un event parallèle qui calcule une division en même temps que ton système de chiffres aléatoires. Cet event parallèle ne te retournera aps un résultat entier. Et tu ne sauras probablement pas pourquoi.
Techniquement, je sais faire un tel plugin (et toi aussi, c'est pas compliqué à faire en soi, il suffit de rajouter une condition et de faire appel à la variable $gameSwitches). Mais je ne le ferai pas parce que c'est vraiment la porte ouverte à des effets de bord monstrueux.
Tu choisis quel mode tu souhaites utiliser : division euclidienne (type RM) ou division habituelle (type calculatrice) et tu adaptes le reste :
- en division euclidienne : tu utilises ce que j'ai dit avec les décalages de virgule et une fonction de conversion
- en division habituelle : tu installes le plugin et à chaque fois que tu veux calculer une division euclidienne, tu passes en script et tu rajoutes Math.floor.
Ou alors t'es du genre très maniaque et t'es sûr que tu n'auras jamais d'effets de bord gênants : tu étends le plugin pour qu'il s'active à l'aide d'un interrupteur géré in game.
Edit du lendemain. J'ai pris conseil auprès de Hellper et je peux te proposer ceci comme plugin :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| //=============================================================================
// HL_VarIsDecimal.js
//=============================================================================
/*:
* @plugindesc Plugin pour manipuler des décimaux
* @author Hu Lijin
*
* @help Commande pour stocker un nombre décimal
* Plugin command : stockDecimal variableID valeur
*
* Par exemple, pour stocker 0.5 dans la variable 0003:
* stockDecimal 3 0.5
*
*/
(function() {
Game_Variables.prototype.HL_setDecimalValue = function(variableId, value) {
if (variableId > 0 && variableId < $dataSystem.variables.length) {
this._data[variableId] = value;
this.onChange();
}
};
var HLold_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
HLold_pluginCommand.apply(this);
if (command === 'stockDecimal') {
$gameVariables.HL_setDecimalValue(parseInt(args[0]),eval(args[1]));
}
};
})(); |
ATTENTION : dès que tu utiliseras les commandes habituelles de RM, tu te retrouveras avec des entiers.
Je ne suis pas très familière avec la fonction eval, donc ne m'en veux pas si ça fait des trucs pas attendus. Elle te permet de ne pas mettre seulement une valeur, mais carrément une formule de calcul. Ça, c'est pour pallier le fait que tu ne puisses plus utiliser les commandes RM. ATTENTION cependant : aucun espace n'est toléré dans ta formule de calcul (c'est prévu pour s'arrêter au premier espace rencontré).
Si tu aimes faire des appels de script, c'est ceci qu'il faut écrire :
1
| $gameVariables.HL_setDecimalValue(ID,formule_de_calcul); |
Pas d'eval, donc pas les restrictions et le comportement parfois bizarre qui vont avec !
|
M.V. |
mikapoil -
posté le 09/09/2017 à 09:01:52 (43 messages postés)
| | OK
finalement je crois que je vais opter pour un plugin simple qui transforme toute les divisions en décimales et faire un Math.Floor sur tous les résultats.
Du coup, c'est bien ça qu'il faut que je mette dans mon dossier plugin ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| //=============================================================================
// nom_du_plugin.js
//=============================================================================
/*:
* @plugindesc Plugin pour manipuler des décimaux
* @author ton_pseudo
*
* @help /!\ Il ne sera plus possible d'obtenir un résultat entier
* pour une division. /!\
*
(function() {
Game_Variables.prototype.setValue = function(variableId, value) {
if (variableId > 0 && variableId < $dataSystem.variables.length) {
this._data[variableId] = value;
this.onChange();
}
};
})(); |
|
HuLijin -
posté le 09/09/2017 à 10:26:31 (1004 messages postés)
| Yeoun, mage-archère-louve | Oui, c'est celui-ci.
J'avais oublié de refermer mon commentaire, donc la bonne version c'est ceci :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| //=============================================================================
// nom_du_plugin.js
//=============================================================================
/*:
* @plugindesc Plugin pour manipuler des décimaux
* @author ton_pseudo
*
* @help /!\ Il ne sera plus possible d'obtenir un résultat entier
* pour une division. /!\
*/
(function() {
Game_Variables.prototype.setValue = function(variableId, value) {
if (variableId > 0 && variableId < $dataSystem.variables.length) {
this._data[variableId] = value;
this.onChange();
}
};
})(); |
(il faut rajouter un / à la ligne 11)
|
M.V. |
mikapoil -
posté le 09/09/2017 à 10:40:04 (43 messages postés)
| | OK
Merci pour toutes ces informations,
je garde tout ça sous le coude histoire de voir quelle solution sera la mieux.
- un petit edit quand même pour ma culture général :
Que faut-il ajouter à un script pour qu'il soit activable via un interrupteur in-game ?
- deuxième edit (mais sans cresson) :
Voici ce que j'entre quand j'appelle le script (en l'ayant activé)
Game_Variables.prototype.setValue(199,7/2)
histoire de mettre 3,5 dans la variable 199
sauf que ça me renvoie une erreur : "cannot set property '199' of undefined"
...euh quoi ça ?
- Troisième edit (sans être à Nantes) :
Noob inside j'ai trouvé il faut marquer : $gameVariables.setValue(199,7/2);
- Quatrième edit (en règle général celui de Diana) :
maintenant que mes divisions renvoient forcement un nombre décimal,
je me suis dis je vais juste faire un Math.floor
mais ça :
$gameVariables.setvalue(200,Math.floor($gameVariables.Value(200)));
ça ne marche pas ...
comment dois je le modifier ?
|
HuLijin -
posté le 09/09/2017 à 17:46:18 (1004 messages postés)
| Yeoun, mage-archère-louve | Pour la culture générale, pour qu'un script soit activé via un interrupteur, il faut écrire ceci :
1
2
3
| if $gameSwitches.value(ID_de_ton_interrupteur) {
// Morceau de code à faire
} |
Pour ton quatrième édit, la majuscule à "Value". Elle ne doit pas exister cette méthode.
Tu peux écrire tout en une fois si tu veux : $gameVariables.setValue(199,Math.floor(7/2));
Tu peux aussi faire l'opération 7/2 avec les commandes d'event habituelles, c'est le but du plugin, de ne pas avoir à écrire de ligne de code dans tes events.
Et ensuite, pour récupérer la valeur entière, là il faudra passer par la ligne de code : $gameVariables.setValue(X,Math.floor($gameVariables.value(X)));
Edit : j'ai ptet oublié de mettre des parenthèses après le if, je me rappelle plus si ça passe écrit comme ça en JS.
|
M.V. |
SquonK -
posté le 09/09/2017 à 17:47:38 (51 messages postés)
| | javascript est sensible à la casse (aux majsucules / minuscules)
$gameVariables.setValue(200, Math.floor($gameVariables.value(200)));
|
mikapoil -
posté le 09/09/2017 à 19:20:16 (43 messages postés)
| | J'ai bidouillé un truc dont voici le code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| //=============================================================================
// valuedeciswitch.js
//=============================================================================
/*:
* @plugindesc Plugin pour manipuler des décimaux avec un switch
* @author Hujilin
*
* @help /!\ Il ne sera plus possible d'obtenir un résultat entier
* pour une division. /!\
*/
if $gameSwitches.value(65) {
(function() {
Game_Variables.prototype.setValue = function(variableId, value) {
if (variableId > 0 && variableId < $dataSystem.variables.length) {
this._data[variableId] = value;
this.onChange();
}
};
})();
} |
mais visiblement que l'interrupteur 65 soit ON ou OFF ça ne change rien...
edit :
et même avec des parenthèses ça ne change rien...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| //=============================================================================
// valuedeciswitch.js
//=============================================================================
/*:
* @plugindesc Plugin pour manipuler des décimaux avec un switch
* @author hujilin
*
* @help /!\ Il ne sera plus possible d'obtenir un résultat entier
* pour une division. /!\
*/
if ($gameSwitches.value(65)) {
function() {
Game_Variables.prototype.setValue = function(variableId, value) {
if (variableId > 0 && variableId < $dataSystem.variables.length) {
this._data[variableId] = value;
this.onChange();
}
};
})();
} |
et comme ça non plus
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| //=============================================================================
// valuedeciswitch.js
//=============================================================================
/*:
* @plugindesc Plugin pour manipuler des décimaux avec un switch
* @author hujilin
*
* @help /!\ Il ne sera plus possible d'obtenir un résultat entier
* pour une division. /!\
*/
if ($gameSwitches.value(65)) {
(function() {
Game_Variables.prototype.setValue = function(variableId, value) {
if (variableId > 0 && variableId < $dataSystem.variables.length) {
this._data[variableId] = value;
this.onChange();
}
};
})();
} |
|
HuLijin -
posté le 09/09/2017 à 19:32:10 (1004 messages postés)
| Yeoun, mage-archère-louve | Je m'en doutais que tu l'utiliserais pour ça. C'est vraiment une mauvaise idée.
J'ai beaucoup de fièvre et beaucoup de mal à réfléchir. Je regarderai ça plus tard. Désolée.
Edit : merci SquonK
|
M.V. |
SquonK -
posté le 09/09/2017 à 21:15:17 (51 messages postés)
| |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
var MemoFonc = MemoFonc || ();
MemoFonc.GameVariablessetValue = Game_Variables.prototype.setValue;
Game_Variables.prototype.setValue = function(variableId, value) {
if ($gameSwitches.value(65)) {
if (variableId > 0 && variableId < $dataSystem.variables.length) {
this._data[variableId] = value;
this.onChange();
}
} else {
MemoFonc.GameVariablessetValue.call(this, variableId, value);
}
};
|
|
mikapoil -
posté le 10/09/2017 à 11:15:34 (43 messages postés)
| | OK
autant j'ai des bases de programmation
mais rien en javascript
donc la plupart du temps je le lis, je le comprend mais je ne sais pas l'écrire...
(d'ailleurs j’étais à mille lieux d'en etre la...)
Merci à SquonK pour le code.
et au passage, encore merci à Hujilin, je pense utiliser le code de Hellper
qui m'a l'air d'avoir beaucoup d'avantages pour moi
mais je ferai des tests pour etre sur que eval ne fasse pas des trucs bizarres.
| Index du forum > Entraide > [RESOLU] [RPG MAKER MV 1.5] Avoir des nombres décimaux
|
|
|