RMEx / RME

Extension tool for RPGMaker VXAce
http://rmex.github.io/
MIT License
40 stars 10 forks source link

Défilement caméra #115

Open Zer0zer0x opened 7 years ago

Zer0zer0x commented 7 years ago

Salut ! Dans pas mal de projets RPG Maker XP, des gens utilisaient un script pour que la caméra défile légèrement en retard... ce qui tombe mal, c'est que personne ne l'a codé proprement sur VX Ace (quand on affiche une anim' de combat sur la map, c'est la merde, et quand on déplace la caméra puis qu'on la recentre sur le héros ce n'est jamais recentré correctement, etc.).

https://www.youtube.com/watch?v=wYQ90ed2ZNk

Serait-il possible de créer une commande comme "camera_move_style" ?

Désolé, c'est un peu HS... :D

Have fun.

acs-l commented 6 years ago

Je pense que je n'ai pas très bien compris ta demande :S.

En gros, tu voudrais une commande similaire à camera_scroll_towards(x, y, nb_steps, easing_function, position -- genre camera_move_style(nb_steps, easing_function, position) -- mais qui ne soit pas bloquante et qui définisse la manière dont la caméra bouge lorsque le héros se déplace ? C'est bien ça ?

Zer0zer0x commented 6 years ago

Lorsque le héros se déplace, oui. :) http://rpgmakersource.com/freebies/systems/enhanced-camera/

Ce script est cool, mais il buggue un peu avec les animations de combat sur la map... (pour ça, y'a un patch, qui fonctionne bien, mais bon...)

BilouMaster commented 6 years ago

En fait on peut déjà le faire avec camera_scroll_towards(x, y, nb_steps, *easing_function, *position)...

En mettant :InOutQuad ou :OutQuad en easing_function par exemple... Il faut que je documente les easing_functions.

Tu as aussi :

BilouMaster commented 6 years ago

Typiquement, les easing_functions, tu as :

Pour chacune de ces fonctions, tu dois mettre devant soit :

Par exemple: :OutElastic

Ca se comporte comme le HTML5 : http://easings.net/fr

BilouMaster commented 6 years ago

...Qui est le gros débile qui a mit :top_left par défaut pour "*position" ??? O_o Putain...

J'ai testé pour faire une caméra qui suit le héros avec du retard, mais tant que la caméra suit la position square_x square_y de l'id donné et non la position screen_x screen_y ou pixel_x/pixel_y, ça ne marchera pas, c'est dégueulasse. Il faut changer ça.

acs-l commented 6 years ago

Sachant que j'ai implémenté la commande, il doit s'agir de moi :S. Je crois me souvenir qu'il s'agissait de la valeur par défaut : déplacer la caméra vers un point A positionne automatiquement ce point en haut à gauche de l'écran.

Parcontre, j'ai du mal à cerner le problème que ça cause :(.

xvw commented 6 years ago

@Jauke : les reproches formulés sur le ton "un peu trop agressif" de @Zer0zer0x s'applique...aussi à toi :) merci.

BilouMaster commented 6 years ago

Ben quand on veut déplacer la caméra vers un personnage... On ne pense pas à le mettre tout en haut à gauche de l'écran... on centre la caméra dessus. x) Du coup dans 90% des cas l'utilisateur sera obligé de renseigner le easing function et la position car il ne voudra pas la valeur par défaut de la position qui est... peu naturelle.

  1. Pour le problème d'avoir un scrolling qui cible le square_x / y et non le screen / pixel_x / y, c'est que ça fonctionne très bien si on veut une caméra qui se déplace vers tel ou tel événement fixe, mais très mauvais si on veut que la caméra suive cet événement en temps réel. La caméra suivra chaque changement en square_x / y et donc attendra chaque fois que l'événement soit à plus de la moitié de son déplacement d'une case, pour bouger... En gros ça saccade net.

  2. Le problème si on a un scrolling qui cible à l'inverse le screen / pixel_x / y et non le square_x / y, c'est qu'on peut se retrouver avec une caméra qui ne se retrouve pas centrée sur les carreaux... Est-ce un problème ?

  3. Avec les commandes actuelles, j'imagine que ça enregistre et utilise la position de l'événement ou héros au moment ou on lance la commande, mais pendant le temps de scrolling si l'événement ou le héros s'est déplacé, le scrolling se termine à la position où se trouvait le héros ou l'événement et n'aura pas suivi son déplacement. Faut-il actualiser le x/y de la cible du scrolling pendant le scrolling ? (ça se trouve c'est déjà le cas, je n'ai pas vérifié)

  4. Autre chose qui me dérange, c'est le paramètre "nb_steps"... Quand bien même ce serait nommé comme ça dans les scripts par défaut (j'en doute puisqu'on parle de "speed"), "nb_steps" ne correspondrait pas plutôt à "duration", qui est un terme bien plus clair ?

  5. Dans la documentation, ça serait bien de donner des exemples pour le paramètre speed, je suppose que ça correspond aux vitesses possibles des événements (comme le défilement d'écran par défaut) alors il faut les lister, et dire si on peut donner une vitesse supérieure à celles par défaut, que ça correspond à une vitesse de pixels par frame, et aussi qu'on peut donner une vitesse plus précise en float. (ce qui doit être le cas, si non ce serait pratique.)

  6. En plus de mettre position en :centered par défaut, ce qui me paraîtrait plus logique, on pourrait ajouter la possibilité de donner pour valeur un tableau [dx, dy], la position relative en pixel de la caméra par rapport à la cible. Par exemple si on met [0, -50], la caméra serait centrée 50px au dessus de la cible.

  7. Il n'y a pas de wait_flag optionnel dans ces commandes ?

  8. Au final ça serait effectivement pas mal d'ajouter camera_follow_event(id, *speed_min, *speed_max, *deceleration, *acceleration, *position) et camera_follow_player(*speed_min, *speed_max, *deceleration, *acceleration, *position)... Ce qui permettrait d'ignorer les problèmes 2. et 3. et répondre à la demande initiale.

    • speed_min : Vitesse de départ et fin du mouvement de la caméra. Jamais comptée pour supérieure à la vitesse actuelle de la cible.
    • speed_max : Vitesse intermédiaire atteinte pour scroller vers la cible quand elle est loin de la position actuelle de la caméra. Jamais comptée pour inférieure à la vitesse actuelle de la cible.
    • deceleration : La valeur de décélération de la caméra quand elle rattrape la cible qui s'est arrêtée.
    • acceleration : La valeur d'accélération de la caméra quand elle rattrape la cible qui commence à se déplacer.
    • Le suivi de la cible se terminera avec l'utilisation d'une autre commande de camera.

@xvw : Je suis désolé, mais seul un gros débile va mettre :top_left par défaut... Il suffit de tester la commande pour se dire "ok..."

BilouMaster commented 6 years ago

En gros, si je suis pas trop fatigué, ça donnerait un truc comme ça :

(speed < target_speed) ? speed += acceleration : speed -= deceleration
speed = [[[target_speed, speed_max].max, speed].min, speed_min].max
camera_pixel_x = [camera_pixel_x + speed, target_pixel_x].min if camera_pixel_x < target_pixel_x
camera_pixel_x = [camera_pixel_x - speed, target_pixel_x].max if camera_pixel_x > target_pixel_x
camera_pixel_y = [camera_pixel_y + speed, target_pixel_y].min if camera_pixel_y < target_pixel_y
camera_pixel_y = [camera_pixel_y - speed, target_pixel_y].max if camera_pixel_y > target_pixel_y

avec target_speed = 0 si la cible est immobile.