Bienvenue visiteur !
|
Désactiver la neige
Statistiques
Liste des membres
Contact
Mentions légales
258 connectés actuellement
30834695 visiteurs depuis l'ouverture
1962 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
◂
| Jauge d'expérience (complétion de niveau)
Pour introduire une nouvelle jauge dans vos CMS: une jauge d'expérience pour visualiser l'avancement d'un niveau. | Ecrit par kmi81 le 28/09/2010 |
▸
|
❤ 0 Bonjour,
Un jour en voulant créer mon propre CMS, je me suis retrouvé bloqué alors que je voulais créer une jauge, qui au même titre qu'une jauge d'HP, représenterai l'accomplissement du niveau par le héros. Une jauge d'expérience!
C'est donc le but de ce tutoriel.
Ce tutoriel comporte une longue partie théorique, vous n'êtes pas obligé de la lire, mais il vaudrait mieux pour vous de la lire ne serait-ce que pour comprendre le code de l'événement commun.
J'ajoute que cette partie théorique se base sur des mathématiques de 1èreS, et notamment les « Suites »
Énoncé du problème et établissement d'un protocole
Lorsque j'ai voulu créer cette jauge, il m'a été malheureusement impossible de trouver une quelconque aide sur Oniro, et j'ai dut me débrouiller seul.
La jauge représente la complétion du niveau (plus elle est remplie, plus le héros est en passe de passer au niveau supérieur, et vice-versa). Ce nombre est en pourcentages.
Ainsi il faudra appliquer une formule (ou plutôt un protocole):
Pour connaître en pourcentage la valeur de l'achèvement du niveau, il faut:
Stocker l'expérience totale du héros au niveau 'n'
Y soustraire l'expérience cumulée nécessaire au héros pour être parvenu à son niveau actuel ('n')
Diviser par l'expérience requise pour achever le niveau 'n' et multiplier par 100 pour avoir des %
On peut abréger en la formule:
complétion = 100 * (XP - XP_cumulée_pour_niveau_n) / XP_du_niv_n_à_n+1
(de même que pour la jauge de vie on avait la formule complétion = 100 * (HP_max – HP) / HP_max)
Je me suis heurté à un premier mur: en effet il est facile de connaître à tout moment le niveau ou l'expérience totale du héros, mais il est strictement IMPOSSIBLE de connaître à partir du jeu l'expérience cumulée minimale pour atteindre le niveau du héros, et encore moins l'expérience nécessaire pour passer du niveau actuel au suivant.
En revanche on peut calculer ces deux variables en utilisant les données de la courbe d'expérience dans la base de données!
Ouvrons donc la base de données, onglet « Héros », sélectionnez le héros dont vous voudrons afficher l'expérience, et cliquez sur « courbe d'expérience ».
Voilà ce que vous devriez avoir:
Le challenge consiste à conjecturer, à partir de cette page, l'écriture d'une suite Un qui pour un 'n' donné, donnera pour résultat l'expérience cumulée nécessaire au héros pour être parvenu à son niveau actuel, soit XP_cumulée_pour_niveau_n.
Accrochez vous, on décolle!
Conjecture de la suite Un
L'expérience totale accumulée obéit à la suite Un telle que:
Soit D1 le 'Degré d'augmentation primaire', D2 le 'Degré d'augmentation secondaire' et D3 le 'Degré d'augmentation tertiaire'
Quelque soit n supérieur ou égal à 1 et appartenant à l'ensemble N:
U1 = 0
Un+1 = Un + n * D2 + (D1 + D3)
Par exemple pour le niveau 4 avec D1 = 1, D2 = 677, D3 = 40 et U3 = 2113
U4 = 2113 + 3 * 677 + 1 + 40 = 4185
Ou encore pour le niveau 12 avec D1 = 1, D2 = 677, D3 = 40 et U11 = 37645
U12 = 37645 + 11 * 677 + 1 + 40 = 45133
(je compte sur vous pour vérifier en même temps dur les screens que je donne)
On a cependant déterminé la suite par récurrence. Il faut impérativement que la suite soit définie explicitement (Un en fonction de n et non Un+1 en fonction de Un) pour qu'elle ne dépende pas du terme précédent, et que l'on ai pas à calculer 98 termes avant pour pouvoir afficher l'expérience au niveau 99...
Pour définir Un explicitement on va calculer quelques termes de la suite et conjecture une nouvelle écriture de Un:
Afin de simplifier les calculs nous prendrons q = D2 et r = D1 + D3
U1 = 0
U2 = U1 + 1 * D2 + D1 + D3 = U1 + q + r or U1 = 0 donc U2 = q + r
U3 = U2 + 2q + r = q + r + 2q + r = 3q + 2r
U4 = U3 + 3q + r = 3q + 2r + 3q + r = 6q + 3r
U5 = U4 + 4q + r = 6q + 4r + 4q + r = 10q + 4r
U6 = U5 + 5q + r = 10q + 4r + 5q + r = 15q + 5r
U7 = U6 + 6q + r = 15q +5r + 6q + r = 21q + 6r
Bon je m'arrête ici car c'est là que j'ai fini par tilter.
En effet: pour n = 7 on a U7 = 21q + 6r or 21 = 1 + 2 + 3 + 4 + 5 + 6 et 6 = 7 – 1 et 6 = (n – 1)
Vous pouvez vérifier çà marche pour ceux d'avant.
Pour n = 10 on a U10 = 57q + 9r avec 57 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 et 9 = 10 -1 (n -1)
On peut donc conjecturer que pour Un on aura:
Quelque soit n appartenant à N:
Un = (1 + 2 + 3 + … + (n -2) + (n – 1)) * q + (n – 1) * r
On reconnaît 1 + 2 + 3 + … + (n -2) + (n – 1) comme étant la somme des n – 1 premiers entiers, or la somme des n premiers entiers s'écrit:
1 + 2 + 3 + … + (n -2) + (n – 1) + n = (n(n + 1)) / 2
<=> Σ (k=1;n) = n * (n + 1) / 2
Or 1 + 2 + 3 + … + (n -2) + (n – 1) = Σ (k=1;n – 1) = Σ (k=1;n) – n
Et Σ (k=1;n) – n = (n * (n + 1) / 2) - n = (n(n + 1) – 2n) / 2 = (n² – n) / 2 = (n(n – 1)) / 2
Donc 1 + 2 + 3 + … + (n -2) + (n – 1) = n * (n – 1) / 2 (bon je suis désolé, c'est plus visuel sur des fractions)
Remplaçons dans Un:
Un = (n(n – 1) / 2) * q + (n-1) * r
Un = (n(n – 1) * q + 2(n – 1) * r) / 2
Un = (n – 1)(nq + 2r) / 2 avec q = D2 et r = D1 + D3
Si vous testez cette formule elle vous donnera le nombre vert pour n égal au niveau correspondant.
On est donc en mesure de calculer U99: pour D2 = 677 et D1 + D3 = 1 + 40 = 41
U99 = 98 * (99 * 677 + 2 * 41) / 2 = 3288145 → çà marche!
Ce nombre indique l'expérience cumulée que vous devez avoir pour le niveau 99.
Courage! On a fait le plus long, et le plus dur!
Conjecture de la suite Vn
Je vous rappelle la formule:
complétion = 100 * (XP - XP_cumulée_pour_niveau_n) / XP_du_niv_n_à_n+1
Nous avons donc réussi à exprimer XP_cumulée_pour_niveau_n à l'aide de la suite Un, mais il nous reste à déterminer la variable XP_du_niv_n_à_n+1.
Nous pourrons facilement récupérer cette valeur en observant la deuxième page de la courbe d'expérience:
En effet, XP_du_niv_10_à_11, par exemple, n'est autre que l'expérience requise au niveau 10, soit 6811 sur le screen.
Après une simple observation on conjecture que l'expérience requise par niveau obéit à la suite Vn telle que:
Quelque soit n supérieur ou égal à 1 et appartenant à l'ensemble N:
Vn = n * D2 + (D1 + D3)
Par exemple l'expérience requise au niveau 4, c'est à dire l'expérience requise pour finir le niveau 4 et passer au niveau 5 est de:
V4 = 4 * 677 + 1 + 40 = 2749
(On remarquera aussi que Vn = Un+1 – Uns)
Conclusion
Voici notre formule « fil rouge »:
complétion = 100 * (XP - XP_cumulée_pour_niveau_n) / XP_du_niv_n_à_n+1
Nous pouvons désormais la simplifier un peu:
Complétion du niveau n = 100 * (XP – Un) / Vn
Prenons comme exemple un héros au niveau 11 dont D1 = 173, D2 = 719, D3 = 50 et qui a comme expérience totale 47078.
U11 = 10 * (11 * 719 + 2 * (173 + 50)) / 2 = 5 * (7909 + 446) = 5 * 8355 = 41775
V11 = 11 * 719 + 173 + 50 = 7909 + 223 = 8132
complétion du niveau 11 = 100 * (47078 – U11) / V11 = 100 * (47078 – 41775) / 8132 = 530300 / 8132 ≈ 65%
Ce héros a donc accompli 65% du niveau 11! Ça valait le coup non?
Ne reste plus qu'à créer l'événement commun qui calculera ce nombre en utilisant la formule et qui affichera la jauge!
Codage de l'événement commun « afficher_XP »
voici le code de l'événement, en appel car destiné en général à un CMS.
Je tiens à préciser que je considère que vous savez déjà afficher une jauge, et que vous savez les créer.
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
|
<>Modifier une variable: « D2 » = <valeur du degré secondaire dans la courbe d'xp de la BDD>
<>Modifier une variable: « D1+D3 » = <valeur du degré primaire plus le degré tertiaire dans la courbe d'xp de la BDD>
<>Modifier une variable: « X » = <Coordonnée X de la barre lorsqu'elle est vide>
<>Modifier une variable: « Y » = <Coordonnée Y de la barre>
//calcul de la complétion de niveau selon la formule
<>Modifier une variable: « Un » = Niveau du héros
<>Modifier une variable: « Un » * « D2 »
<>Modifier une variable: « Un » + « D1+D3 »
<>Modifier une variable: « Un » + « D1+D3 » //Non je ne bégaye pas [img]smileys/grincant.gif[/img]
<>Modifier une variable: « Niveau » = Niveau du héros
<>Modifier une variable: « Niveau » - 1
<>Modifier une variable: « Un » * « Niveau »
<>Modifier une variable: « Un » / 2
<>Modifier une variable: « Vn » = Niveau du héros
<>Modifier une variable: « Vn » * « D2 »
<>Modifier une variable: « Vn » + « D1+D3 »
<>Modifier une variable: « Complétion » = Expérience du héros
<>Modifier une variable: « Complétion » - « Un »
<>Modifier une variable: « Complétion » * 100
<>Modifier une variable: « Complétion » / « Vn »
//affichage de la barre
<>Modifier une variable: « Complétion » * <largeur de la jauge en pixels>
<>Modifier une variable: « Complétion » / 100 //car on a une valeur en %
<>Modifier une variable: « X » + « Complétion »
<>Afficher une image: n°'Z', <image de la jauge>, coordonnées (« X », « Y »)
<>Afficher une image: n°'Z+1', <Cadre>, coordonnées (?, ?) //C'est le cadre qui sera à la gauche de la jauge et qui masquera la jauge lorsque celle-ci sera vide. Dans mon premier screen, il s'agissait des inscriptions LV HP et MP qui ne sont qu'une seule image en réalité |
Et voilà !
Nous y sommes arrivés !
J'espère que cela aura été utile, et surtout que vous avez compris mon charabia (c'est dur d'écrire des formules sans jolies mises en forme...)
Si vous avez des questions, n'hésitez surtout pas !
(évidemment çà aurait été plus simple sur rmXP ou VX avec des scripts...)
|
kmi81 -
posté le 28/09/2010 à 13:35:35 (102 messages postés)
| Buvez, c'est mon sang. Mangez, c'est mon corps. Touchez pas c'est mon cul. | Problème dans le début du code:
<>Modifier une variable: « D2 » = 2nd degré dans la fenêtre de la courbe d'XP
<>Modifier une variable: « D1+D3 » = 1er + 3eme degré dans la fenêtre de la courbe d'XP
<>Modifier une variable: « X » = position X à l'affichage (extrême gauche, quand la jauge est vide)
<>Modifier une variable: « Y » = position Y à l'affichage
Début de la dernière partie du code:
<>Modifier une variable: « Complétion » * taille en px de la jauge
|
Commence tout, ne fini rien... |
Metroid_Prime -
posté le 29/09/2010 à 18:27:37 (193 messages postés)
| | Bon boulot =).
Je n'ai jamais été doué pour les suites T.T
|
kmi81 -
posté le 30/09/2010 à 08:43:59 (102 messages postés)
| Buvez, c'est mon sang. Mangez, c'est mon corps. Touchez pas c'est mon cul. | Merci!
(Un commentaire çà fait toujours plaisir )
|
Commence tout, ne fini rien... |
mtarzaim -
posté le 02/10/2010 à 13:41:27 (2926 messages postés)
| Anaxagoras -500 BC | Très bon tuto !
Avec ça, plus personne ne cherchera à afficher une jauge d'xp, tellement c'est compliqué à comprendre.
Si tu pouvais faire pareil pour le mode 7, le A-RPG et le MMO, ça soulagerait l'entraide.
Merci Jupiter81.
|
Projets terminés : DIX Life Precious - TheFrogStudio.Net |
kmi81 -
posté le 02/10/2010 à 20:05:17 (102 messages postés)
| Buvez, c'est mon sang. Mangez, c'est mon corps. Touchez pas c'est mon cul. | Pourtant j'ai essayé d'expliquer le plus simplement possible!
Je ne sais pas ce que tu appelles mode 7, mais pour l'A-RPG, tu mets l’évènement en parallèle et tu met un attendre 0.0s histoire de faire antilag
Sinon merci, mtarzaim (mais pourquoi m'appelles-tu Jupiter81? )
|
Commence tout, ne fini rien... |
crackerwood -
posté le 10/10/2010 à 14:21:54 (176 messages postés)
| | Bravo bien joué moi qui justement aller essayer d'en faire une je suis servi. Encore bravo et merçi.
EDIT : J'ai voulu essayer sur une version de RMXP mais les calculs ne sont pas les mêmes. J'ai un peu fouillé les script et j'ai trouvé ça :
1
2
3
4
5
6
7
8
9
10
11
12
13
| def make_exp_list
actor = $data_actors[@actor_id]
@exp_list[1] = 0
pow_i = 2.4 + actor.exp_inflation / 100.0
for i in 2..100
if i > actor.final_level
@exp_list[i] = 0
else
n = actor.exp_basis * ((i + 3) ** pow_i) / (5 ** pow_i)
@exp_list[i] = @exp_list[i-1] + Integer(n)
end
end
end |
Le problème étant que je n'y arrive pas. Si quelqu'un pouvait m'aider. Merçi
|
CMS event--PHS--Blackjack--PHS event VX |
kmi81 -
posté le 22/10/2010 à 00:14:03 (102 messages postés)
| Buvez, c'est mon sang. Mangez, c'est mon corps. Touchez pas c'est mon cul. | Hum....
Poste sur le forum car malheureusement je ne m'y entend pas en "scriptage"
Mais le script ne m'a pas lair complet pour arriver au resultat final du tuto...
Désolé, mais merci de l’intérêt que tu as porté au tuto
|
Commence tout, ne fini rien... |
crackerwood -
posté le 22/10/2010 à 21:29:38 (176 messages postés)
| | C'est bon j'ai trouvé la formule exact.
|
CMS event--PHS--Blackjack--PHS event VX |
kmi81 -
posté le 22/10/2010 à 23:58:38 (102 messages postés)
| Buvez, c'est mon sang. Mangez, c'est mon corps. Touchez pas c'est mon cul. | Ok tout va bien alors
|
Commence tout, ne fini rien... |
crackerwood -
posté le 23/10/2010 à 12:55:31 (176 messages postés)
| | Ouais le souci étant que ce n'est que des nombres à virgule alors je dois le faire en script ou alors le faire personnellement
|
CMS event--PHS--Blackjack--PHS event VX |
Benku -
posté le 28/10/2010 à 09:37:23 (2843 messages postés)
| Benku, le prince des ténèbres ! | Bon tuto, trés facile à faire.
|
Comme tout ceux qui vivent des heures si sombres mais ce n'est pas à eux de décider, tout ce que vous avez à décider, c'est quoi faire du temps qui vous est imparti. |
Sahone -
posté le 27/03/2011 à 11:02:32 (2081 messages postés)
| Maker / Smasher | Très bon tuto. Sa m'a beaucoup aidé.
|
Venez visiter ma Galerie | Ma Chaine Youtube |
RikuSH -
posté le 04/08/2014 à 02:05:49 (95 messages postés)
| Shiny Hunter | J'ai rien compris .. ( Malheuresement x) )
|
Senbonzakura Kageyoshi |
|
|
|