[Résolu] Afficher les rubis, problème de limite!

Démarré par supersonic_3, 08 Août 2009 à 23:04

0 Membres et 1 Invité sur ce sujet

08 Août 2009 à 23:04 Dernière édition: 20 Septembre 2009 à 18:30 par yoshi04
EDIT: Voir mon dernier post, j'ai changé le titre du sujet pour ne pas polluer le topic avec trop de topic!


Bonjour, c'est encore moi  :) Voilà, je veux utiliser l'event "demander l'appui d'une touche", c'est juste que contrairement à RM03, la valeur des touches n'est pas écrite, je ne peux donc pas comparer ma variable pour savoir quelle touche à été appuyée(vous suivez toujours?  :P ) J'apprécierais donc que vous me donniez la valeur de toutes les touches qu'on peut utiliser(à moins qu'elles soient toutes utilisables?  :huh: ) Merci beaucoup de votre aide!

PS: Vous auriez pas un logiciel hack qui permet d'utiliser toutes les touches(si ce n'est pas possible), il y en a un semblable sous RM02, mais il ne fonctionne pas sous XP. Je sais qu'il y a les scripts, mais je veux les utiliser le moins possible, surtout pas des scripts que je n'ai pas fais. Merci encore!




Je n'ai aucune idée de la valeur numérique des touches, en revanche, tu peux le faire ta requête manuellement à l'aide d'une ligne de RUBY à insérer en page 4 des conditions ;).

http://rpgmakerxp-factory.net/forum/index.php?topic=12511.0

Ça te permet en plus de gérer différents types d'appuis de touches, et sur pas mal de touches :).
Pour avoir toutes les touches du clavier à ta disposition, là par contre à ma connaissance seul un script peut faire ça.

    







09 Août 2009 à 01:23 #2 Dernière édition: 09 Août 2009 à 01:26 par supersonic_3
Merci, je préfère la manière avec la ligne de code, puisque qu'il y a aussi trigger et repeat, ça va m'être utile! En plus je me suis aperçu qu'il y a les touches suivantes: Q W D ainsi que A et Z. Je voulais utiliser les boutons Q,W et D dans mon jeux( J'ai un clavier QWERTY). Le Q et le W sont remplacés par A et Z sur un clavier AZERTY donc je vais pouvoir configurer les deux pour que les boutons soient situés au même endroit  :D (M'as-tu suivis?) Merci beaucoup!

PS:D'ailleurs comment peut-on faire un OU? Exemple:

Si la touche appuyé est Q OU A
{
    faire ceci
}

Je pourrais faire un "sinon si la touche appuyé est A" mais y a-t-il une autre solution?




S je me souviens bien, quand on fait une condition sous RM, on peux automatiquement ajouter des instruction si ce n'est pas respecté ( il faut cocher une case pour activer ça, dans la fenêtre des conditions si mes souvenirs sont bons ). Ainsi, tu n'a qu'a créer une seconde condition dans la "partie else" de la première :P.

    







09 Août 2009 à 05:26 #4 Dernière édition: 09 Août 2009 à 06:01 par supersonic_3
J'ai encore besoin d'aide, j'essaie de programmer un truc en event pour prendre un vase, puis le lancer(pas vraiment le lancer, mais comme dans la demo de skulltula's amulet) Voici mon code:




Et voici le projet:

http://www.mediafire.com/?qzgwatmmdbi


Pouvez-vous m'aider, ça fait déjà quelques heures que je cherche, j'ai moins de difficulté que ça à déboguer mes programme en C++  :P




N'ayant pas RMXP d'installé, je n'ai pas pu tester.

D'après ton code, en appuyant sur espace, tu déplaces jute le pot de trois cases... ce qui ne rend donc pas du tout réaliste l'action.
Je pense qu'en bidouillant des charsets ça doit être faisable, à chaque "étape" ( chaque pas différent quoi ) tu avance légèrement le pot, pour que le pot ait l'impression de voler. Il faut ainsi faire ça trois fois, et changer de charset après chaque pas.

A essayer...
Je sais que je n'ai pas été très clair alors voici un schéma ( mal fait mais bon, je suis un peu fatigué là, désolé ^^' ) :



En gros, tu crée une simili-animation grâce à des charsets... :)

A part utiliser les animations de combat ( plus joli/pratique mais si tu es contre un mur ou un obstacle c'est plus dur à gérer que avec un déplacement d'objet à mon avis ) ou ça, hormis grâce au RUBY que tu souhaite éviter, je ne vois pas trop comment faire autrement ( avec des images ça serait également possible remarque, mais tellement ch**nt :P ).

Bref, j'espère avoir été un minimum explicite, bonne chance :P.

    







En effet, c'était dans mes plans d'ajouter un charset de ce genre. Évidemment tu n'as pas pu tester mon code, mais le problème n'est pas, il ne fonctionne juste pas  :P Je prends le pot, mais c'est pour le lancer que je trouve pas comment faire!




Qu'est-ce que tu entends par "lancer" ?
Ici tu le déplace, mais c'est une ( bonne à mon avis ) solution :).

Code (Évènement du pot, en processus parallèle) Sélectionner

SI ( Touche espace pressée )
__SI ( Le héros est tourné vers la gauche )
____ Changer charset du pot ( Début de l'animation )
____ Déplacer une case vers la gauche le pot
____ Changer charset du pot ( Milieu de l'animation )
____ Déplacer une case vers la gauche le pot
____ Changer charset du pot ( Fin de l'animation )
____ Déplacer une case vers la gauche le pot
__END
END


Pour gérer les collisions éventuelles, là c'est autre chose...
Avec quelques lignes de RUBY tu dois pouvoir te débrouiller pour calculer si le pot est en contact d'un obstacle, si il doit le blesser/tuer/casser ( Montre ou décor ) ou si il s'agit d'un décor statique, où il faudra juste casser le pot ;).

A vérifier avant chaque pas !

Pour le décor :

Gauche : if $game_player.passable(x - 1, y, 4)
Droite : if $game_player.passable(x + 1, y, 6)
Haut : if $game_player.passable(x, y - 1, 8 )
Bas : if $game_player.passable(x, y + 1, 2)


Et pour un événement ( tel un monstre ) :

Gauche : if $game_player.x -1 == $game_map.events[ID de l'évènement].x and if if $game_player.y == $game_map.events[ID de l'évènement].y
Droite : if $game_player.x +1 == $game_map.events[ID de l'évènement].x and if if $game_player.y == $game_map.events[ID de l'évènement].y
Haut : if $game_player.x == $game_map.events[ID de l'évènement].x and if if $game_player.y -1 == $game_map.events[ID de l'évènement].y
Bas : if $game_player.x == $game_map.events[ID de l'évènement].x and if if $game_player.y +1 == $game_map.events[ID de l'évènement].y


N'oublies pas d'enlever les if si tu utilises la fonction Condition ;).
Et si tu as besoin d'un exemple fais moi signe ^^.

    







Je vais essayé, mais le problème est que avec le code montrer plus haut, le pot suis link grace à ses coordonnées x et y, mais lorsque je le lance, link le suis, puis par la suite lorsque je me déplace, le pot me suis toujours!





09 Août 2009 à 19:06 #10 Dernière édition: 09 Août 2009 à 20:12 par supersonic_3
Bon j'ai réussi, le pot bouge de deux cases sans que link le suive, puis je peux bouger sans problème sans que le pot bouge! Pour les charsets, ça ne devrait pas être trop dur, mais pour le code ruby, je dis pas non à un exemple pour vérifier à chaque pas, voici le code de l'event, si ça peut aider à me dire ou je le placer et pourquoi:

Page 1:

http://img39.imageshack.us/img39/9783/sanstitrewjh.png

Page 2:

http://img29.imageshack.us/img29/6218/sanstitre2znx.png

Page 3:

http://img526.imageshack.us/img526/4816/sanstitre3h.png

Pour la partie de la page 3 qu'on ne voit pas, c'est la même chose que le reste mais pour la droite! Merci!

EDIT: bon j'ai créer l'animation en charset, ça fonctionne bien, mais si il se heurte à un obstable, qui se trouve "au dessus":

http://img256.imageshack.us/img256/7233/sanstitretrq.jpg

Si je suis juste sous une buche, le pot s'arretera à l'endroit souligner en bleu, que je sois à la troisième ou à la première, il s'arrete là. mais à tout les endroits souligner en vert, il fonctionne normalement. Je tiens à préciser que même si j'enlève les buches, et que je mets ce chemin passant, ça arrive, j'ai refait la map, pensant à un bug du fichier de la map, ça ne fonctionne pas non plus! je suis désespéré  :P




Il faut vérifier si le pot va entrer en collision avec un obstacle ou avec un monstre avant chaque déplacement du pot.
Vola un petit algo pour le lancé vers la gauche, première case ( sur les deux, voir le contenu entre crochets dans le code ci-dessous ) ;).


_SI Direction de Link est gauche
____SI le décor est passable en x-1
_______ALORS SI L'évènement "monstre" a pour position x-1 par rapport au héros et si les deux ont la même position y
_____________ALORS Changer sprite du pot
_____________ALORS Déplacer de 1 vers la gauche le pot
_____________ ALORS Blesser montre
_____________ALORS Détruire le pot ( graphiquement )
_____________ALORS Détruire évènement du pot
_______SINON Changer sprite du pot
_______SINON Déplacer de 1 vers la gauche le pot
_______ [ DEUXIÈME DÉPLACEMENT DU POT, CODE SIMILAIRE A CELUI-CI ( éventuellement sur une nouvelle page, dans ce cas, tu utilises un interrupteur local ) ]
____SINON Changer sprite du pot
____SINON Déplacer de 1 vers la gauche le pot
____SINON Détruire le pot ( graphiquement )
____SINON Détruire l'évènement du pot
_FIN

    







09 Août 2009 à 21:35 #12 Dernière édition: 09 Août 2009 à 21:48 par supersonic_3
Fonctionne pas, comment on fait un "Si le décor est passable en x-1!? J'ai essayé ton code:

$game_player.passable(x - 1, y, 4)

Mais le jeu écrit une erreur quand je lance le pot!

EDIT: Trop compliqué  :P Je crois que je vais faire un système de vases à la zelda solarus, c'est simple et efficace, de toute façon mon jeu sera assez personnalisé que sauf, ce détail, ça va sembler être un vrai jeu  :P




09 Août 2009 à 22:02 #13 Dernière édition: 09 Août 2009 à 22:13 par Daru13
Cette condition là je l'ai récupéré sur un vieux sujet que j'avais ouvert sur Factory, alors désolé, ne connaissant pas le problème, je ne peux t'aider :unsure:.

EDIT : Ah si, je pense savoir quel est le problème, il faut remplacer x et y par des variables ^^.
Tu peux essayer avec game_player.x et game_player.y :).

    







Mon nouveau problème:

Je me suis inventé une façon de faire les coeurs qui fonctionne très bien, le problème n'est pas là...

je fais par exemple:

Si PV_link = 1
afficher image: 0 coeurs et ¼ plein


Il y aura 18 coeurs dans mon jeu, en gros, 18 coeurs, divisés en quatre, chaque quart est égal à un point de vie, donc 18*4 = 72. Le problème est que si je fais une fourchette de condition de 72 "Else if" et que à chaque fois la ligne dévie un peu vers la droite, à un moment, je ne vois plus la condition, et il n'y a pas de flèche dans la fenêtre d'event pour se déplacer à l'horizontal, donc je suis coincé! Comment faire pour me tasser à l'horizontal dans la fenêtre d'event?




Hum y'a pas une touche de raccourcis qui permet d'ouvrir la fenêtre d'événement?

Ou bien si tu clique sur la bonne ligne où il n'y a pas de texte, ça ne fonctionne pas?

Le problème n'est pas là, je peux très bien l'ouvrir, mais ça donne ça si il y a une trop grosse fourchette:




Si je clique sur la ligne, ça fonctionne mais se guider à l'aveuglette c'est pas évident!




10 Août 2009 à 06:57 #17 Dernière édition: 10 Août 2009 à 07:28 par Maxime
Arrête tout simplement cette fourchette à par exemple 15 et repars s'en une autre à 16.

Si pdv link = 1, afficher X image
Sinon Si pdv link = 2 afficher X image
Sinon Si pdv link = 3 afficher X image
Sinon Si pdv link = 4 afficher X image
Sinon Si pdv link = 5 afficher X image (la tu te rend compte que ça commence a être trop long, donc tu recommence une autre chaine)
Si pdv link = 6 afficher X image
Sinon Si pdv link = 7 afficher X image
...

Tu comprends le principe?

Oui, j'y avais pensé, je voulais savoir si il n'y avait pas un moyen, mais bon, je vais le faire comme tu as dis, merci!




Il y en a un : oublie les "sinon", ils te servent a rien dans ce cas la. Si tu veux vérifie que Link n'a pas des pv inférieur/supérieur à la normale, tu le vérifie juste à la fin.

On peut pas donner des noms d'images dynamiques ?

Si c'est le cas, il suffit de nommer les image en fonction de la vie du joueur et c'est fini.

Citation de: Binbin le 10 Août 2009 à 13:13
On peut pas donner des noms d'images dynamiques ?

Si c'est le cas, il suffit de nommer les image en fonction de la vie du joueur et c'est fini.
Eh, c'est de Rpg Maker qu'on parle, ne rêve pas :P. On a juste des fourches conditionnelles et les cinq opérations de base^^.

Sinon, supersonic_3, pour ton problème je vois deux solutions:

1/ Recréer un nouveau système de coeur qui demandera moins d'images et de fourchettes conditionnelles. En fait, ton système de coeur fonctionne avec des quarts de coeur. Je suppose que dans ton système, 1PV = 1quart de coeur? Si c'est le cas, je te conseille donc la solution suivante, qui ne demande que deux images.

variable coeurs_entiers = variable PV divisé par 4
variable quarts_coeur = variable PV modulo 4


Ainsi, la première variable te donne le nombre de coeurs "entiers" que le joueur possède, et la seconde indique si éventuellement il faut rajouter un ou plusieurs quarts de coeur.

Ainsi, si le joueur a 9 PV, soit 2 coeurs et un quart, on obtient:
9 / 4 = 2
9 modulo 4 = 1

Bref, à partir de ça, la suite est facile à imaginer. Il faut créer un système d'affichage de coeurs "simples":

Si coeurs_entiers = 1
     Afficher image 1 Coeur1

Si coeurs_entiers = 2
     Afficher image 1 Coeur2

etc...

Et faire de même avec les quarts de coeur (seulement 4 fourches conditionnelles dans cette partie).

Si quarts_coeur = 0
     Effacer image 2

Si quarts_coeur = 1
    Afficher image 2 Quart_coeur1 (x_quartcoeur, y)

Si quarts_coeur = 2
    Afficher image 2 Quart_coeur2 (x_quartcoeur, y)

Si quarts_coeur = 3
    Afficher image 2 Quart_coeur3 (x_quartcoeur, y)

Et voilà. Il faudra juste calculer dans les premières lignes la variable x_quartcoeur, qui dit où afficher le dernier coeur. Pour ça, une opération simple du genre (position x du coeur 1 + (nombre de coeurs pleins à afficher * nombre de pixels entre chaque coeur)) devrait suffire :).

Ce système est en fait un intermédiaire entre le système pas optimisé, qui ne demande qu'une seule image à afficher mais est long et répétitif, et le système optimisé, qui est rapide à programmer mais qui demande autant d'images à afficher qu'il y a de coeurs (or en général on essaye d'économiser les images sous Rpg Maker).

Voilà pour le système que je te conseille. Si tu ne veux pas le faire, la solution 2/ est plus simple:

2/ Tu souhaites garder ton système tel quel. Dans ce cas, deux choses à savoir:

Déjà, tu n'es pas obligé de mettre le "sinon" à chaque fourche conditionnelle. Les deux scripts ci-dessous fonctionnent de la même manière:

Si PV=1
    Afficher  coeur1
         sinon si PV =2
               Afficher coeur2
                          etc...

Si PV=1
    Afficher  coeur1
Si PV=2
    Afficher  coeur2
etc...


Le "sinon", mieux vaut l'utiliser que lorsqu'on en a vraiment besoin. Par exemple, si tu veux afficher une image de super_Link lorsque Link a tous ses coeurs (je dis n'importe quoi :ninja: ), on peut faire:

Si PV=PVmax
      Afficher image 1 Super_Link
Sinon
     Effacer image 1


Ensuite, comme l'a dit Maxime, tu peux séparer un trop gros script en plusieurs parties. Ca permet de mieux visualiser ton script. Tu peux réutiliser les lignes que j'ai faites plus haut:

variable coeurs_entiers = variable PV divisé par 4
variable quarts_coeur = variable PV modulo 4


Comme ça, tu peux après séparer ton script en quatre grosses parties. Une partie où l'on affiche tous les images qui ne contiennent aucun quart de coeur, puis une autre avec un quart de coeur...   ...personnellement le script me semblerait beaucoup plus clair ainsi :).

Si quarts_coeur = 0

     Si coeurs_entier = 1
          Afficher image coeur1
     Si coeurs_entier  = 2
          Afficher image coeur2
     Si coeurs_entier = 3
          Afficher image coeur3
     etc...

Si quarts_coeur = 1

     Si coeurs_entier = 1
          Afficher image coeur1+unquart
     Si coeurs_entier = 2
          Afficher image coeur2+unquart
     Si coeurs_entier = 3
          Afficher image coeur3+unquart
     etc...

etc...


Voilà pour les conseils que je peux te donner. Bon courage pour ton système de coeur :). Juste un dernier petit rappel: tous les évènements d'affichage sont de préférence des évènements à appeler (et non en processus parallèle), et il vaut mieux donner un numéro d'image élevé à tes coeurs pour qu'ils s'affichent devant toutes les autres images (du genre afficher image 40) :).



Les sinon servent ici à rendre le jeu un peu plus plus rapide, mais ce n'est effectivement pas une obligation ^_^.

    







En quoi ça l'accélère ? Logiquement, ça devrait, au contraire, le ralentir. De trop peu pour qu'on puisse le ressentir, mais ça le ralentit.

Sinon n'accélère pas pour moi la vitesse du jeu :)
Et d'ailleurs je trouve son utilisation très mal fichue dans rpg maker ^^

Je suis du même avis que Neo2. S'il y a une case à cocher pour activer ou non le "sinon", c'est pour s'en servir. Laisser tout le temps cette case cochée est une mauvaise habitude, c'est à soi-même de savoir si on a besoin de cette option ou pas. Autrement, cela rajoute des instructions inutiles dans l'évènement^^.

Oui mais moins Link à de cœurs, moins l'évènement effectuera de calculs ;).
Mais je doute qu'on sente la différence là, surtout quand le jeu n'en est qu'au moteur, il faut plutôt faire des test une fois que c'est plus complet que que plus de calculs sont effectués ;).

Sinon, je suis tout à fait d'accord que de mettre sinon lorsque il ne sert à rien ça optimise ^^.

    







Si on procédait comme ça, a plus grande échelle, le joueur qui commence sa partie aura un jeu qui fonctionne a la perfection, et finira avec un jeu qui rame a mort. Donc bon, oui, pour des coeurs, osef un peu, mais il vaut mieux faire sans des "sinon".

Merci à tous, je comprends que le jeu ralenti, c'est un peu normal en fait  :)

Merci Ynanome, je vais garder mon système actuel, mais seulement avec des "si", en enlevant les sinon. Merci beaucoup!




@Neo2 : Pas faux ^^.

Un petit conseil, je ne sais pas si tu as prévu de procéder comme ça dès le départ ou non, mais au lieu de vérifier la vie en permanence, ne la vérifie que lorsque quelque chose doit ou peux l'augmenter/la baisser ;).

    







15 Août 2009 à 05:27 #30 Dernière édition: 15 Août 2009 à 06:56 par supersonic_3
Bon nouveau problème, j'ai fais le code pour afficher les rubis, très facile! Mais je veux mettre un système qui empêche de dépasser 99, 200 ou 500 rubis selon le porte monnaie qu'on a, fonctionne aussi! Mais ça ne fonctionne qu'à l'affichage, voici mon code:


EDIT: PROBLÈME RÉSOLU!