[PSDK] Pack d'animations pour pokéballs

12 Replies • 2782 Views

Bonjour,

Voilà un pack d'animations de pokéballs comprenant 18 modèles  de pokéballs : (il manque quelques balls spéciales de la 2G)

Exemples :





Téléchargement : https://mega.nz/#!uWwzALyL!3elzpTGqMDgDFQrvzT_DVCKh5sWXB38O7pNhCfr2zXA

Pour utiliser ce pack sur PSDK, c'est très simple :

1 - Placez tous les dossiers numérotés dans le dossier "Graphics/ball"
(Pour information les numéros correspondent aux id des balls, cela reste à confirmer pour l'ultraball et la GS ball et dépend aussi de votre BDD mais si vous ne l'avez pas modifiée, aucun problème !)

2 - Ajoutez ce scripts aux scripts de votre projet :

Spoiler

# Header: psdk.pokemonworkshop.com/index.php/ScriptHeader
# Author: Nuri Yuri / Splifingald
# Date: 2014
# Update: 2018-06-14
# ScriptNorm: No
# Description: Définition de fonctions utiles ou d'animations pendant la phase 4

class Scene_Battle
  #===
  #>phase4_animation_capture
  #Animation de la capture //!!!\\ A terminer !
  #===
  #animation du lancer de la ball
  def p4_anim_throw_ball(id)
    $gif = Yuki::GifReader.new("Graphics/ball/"+id.to_s+"/throw.gif")
    Graphics.update
    $animation = Sprite.new
    $animation.bitmap = Bitmap.new($gif.width, $gif.height)
    $animation.x = 0
    $animation.y = 0
    while $gif.frame_count > ($gif.frame+1)
      Graphics.update
      $gif.update($animation.bitmap)
    end
    $animation.bitmap.dispose
    $animation.dispose
    $animation = $gif = nil
  end 
 
  #animation si le pokémon est attrapé (cnt = 4)
  def p4_anim_captured(id)
    $gif = Yuki::GifReader.new("Graphics/ball/"+id.to_s+"/catch.gif")
    Graphics.update
    $animation = Sprite.new
    $animation.bitmap = Bitmap.new($gif.width, $gif.height)
    $animation.x = 0
    $animation.y = 0
    while $gif.frame_count > ($gif.frame+1)
      Graphics.update
      $gif.update($animation.bitmap)
    end
    $animation.bitmap.dispose
    $animation.dispose
    $animation = $gif = nil
  end 
 
  #animation si le pokémon n'est pas attrapé (cnt = 0,1,2 ou 3)
  def p4_anim_escaped(id,cnt)
    $gif = Yuki::GifReader.new("Graphics/ball/"+id.to_s+"/open_"+cnt.to_s+".gif")
    Graphics.update
    $animation = Sprite.new
    $animation.bitmap = Bitmap.new($gif.width, $gif.height)
    $animation.x = 0
    $animation.y = 0
    while $gif.frame_count > ($gif.frame+1)
      Graphics.update
      $gif.update($animation.bitmap)
    end
    $animation.bitmap.dispose
    $animation.dispose
    $animation = $gif = nil
  end
 
  def phase4_animation_capture(cnt,pokemon,id)
    #lancé de la ball
    p4_anim_throw_ball(id)
    @enemy_sprites[0].visible=false
    if(cnt==4)
      p4_anim_captured(id)
      $game_switches[Yuki::Sw::BT_Catch] = true
      pokemon.captured_with = id
      pokemon.captured_at = Time.new.to_i
      pokemon.trainer_name = $trainer.name
      pokemon.trainer_id = $trainer.id
      pokemon.code_generation(pokemon.shiny, !pokemon.shiny)
      start_phase5
    else
      p4_anim_escaped(id,cnt)
      @enemy_sprites[0].visible=true
      display_message(_parse(18, 63+rand(4)))
    end
  end
end

Voilà, c'est terminé !


Si vous voulez mettre vos propres gif à la place de ceux-ci ou les modifier, je vous conseille ce site : https://ezgif.com/maker
Il permet d'extraire les frames d'un gif, de construire des gifs à partir d'images ou à partir d'autres gifs...

« Last Edit: 14 June 2018, 21:27:07 by Splifingald »

Pixel Art Pack PSDK

Leikt

Programmeur

Super ! Content de voir tes efforts aboutirent !

Je note juste un truc bizarre, l'utilisation de throw comme nom de methode. Throw est un mot clef du langage, ca m'etonne qu'il ne te mette pas une erreur sur le nom de la methode...
Salut. Merci pour le boulot fournit :) ces vrai que sa manquer un peu cette animations. Mais j'ai juste une question (nul comme je suis, je préfère demander et être sur) il faut bien le mettre en nouveaux scripts ?? Si oui, on nomme le titre de repère comme l'on veut ou il faut un noms spécifiques ??. Merci pour les réponse et merci pour les animations :).

EDIT: j'ai réussi a faire fonctionner ces bon apparemment :) .

« Last Edit: 14 June 2018, 18:13:58 by Jimmy »

Leikt, ouais c'est vrai que le choix de "throw" n'est pas forcement très malin mais ça ne pose pas de soucis, je change ça au cas où.

Jimmy, oui c'est un nouveau script, tu le nommes comme tu veux, content que tu aies réussi ! :)

Leikt

Programmeur

Bonne idée, une autre recommandation. Scene_Battle est un énorme script avec beaucoup de fonctions, et il y a de grosse chance que nouvelles extensions apparaissent.
Aussi je te conseille de nommer tes méthodes de façon à ce qu'il n'y a pas de confusion possible :

throwing => p4_anim_throw_ball
gotcha    => p4_anim_captured
escaped  => p4_anim_escaped

Merci pour ton travail :)
Modifications effectuées ! Merci pour ces conseils ;)
Merci pour ce pack Splifingald. Je compte l'utiliser avec grand plaisir. C'est clairement une qualité au-dessus que l'animation de base de PSDK.

Juste une question : il y a t-il possibilité d'utiliser une timeline PNG à la place du gif. (Une spritesheet PNG permet une meilleur qualité et surtout la gestion de la transparence partielle. C'est plus facile à éditer qu'un gif aussi.)

Il a t-il aussi possibilité de rajouter les sons du "remuement" de la Pokéball. (En l'état, la capture est totalement silencieuse.)

Je compte faire les balls de Johto absentes de ce pack. C'est pour cela que je pose la question s'il y a moyen d'améliorer encore l'animation.
Merci.
Merci pour ce pack Splifingald. Je compte l'utiliser avec grand plaisir. C'est clairement une qualité au-dessus que l'animation de base de PSDK.

Juste une question : il y a t-il possibilité d'utiliser une timeline PNG à la place du gif. (Une spritesheet PNG permet une meilleur qualité et surtout la gestion de la transparence partielle. C'est plus facile à éditer qu'un gif aussi.)

Il a t-il aussi possibilité de rajouter les sons du "remuement" de la Pokéball. (En l'état, la capture est totalement silencieuse.)

Je compte faire les balls de Johto absentes de ce pack. C'est pour cela que je pose la question s'il y a moyen d'améliorer encore l'animation.
Merci.
Pour le coup, quand ce gif a été réalisée l’animation de la pokeball sur psdk n’existait pas.
Mais maintenant elle est bien codée, et c’est quand même bien plus opti et aussi je trouve de bien meilleure qualité que d’utiliser un gif. (Non pas que les gifs soient mauvais loin de là! Splif avait fait un super taff)

Nuri Yuri

HostMaster

En effet, cela dit l'effet à la validation de la capture est bien sympathique, faudrait qu'on l'ajoute à l'animation actuelle un jour :)
ln(yo) = <3
Il y a deux mois, j'avais amélioré l'animation du lancer de Pokéball (spritesheets et script). Le fruit de mon travail est visible dans cette vidéo :



À la base, je n'avais fait les spritesheets que pour le monde de Keltios et ses balls uniques.
Mais certains m'ont fait part qu'il étaient très intéressés par mon mod (Bugfix, Eurons...). Je me suis donc attelé à faire les spritesheets pour les balls officielles et en ais profité pour faire une V2 avec des effets de particules encore plus beaux à la DPP/HGSS.
D'où le passage d'un format 16x22 à un format 64x64.

Actuellement terminé : Pokéball, Super Ball, Hyper Ball, Master Ball, Honor Ball, Mémoire Ball
Comme ça, il y aura l'effet de validation de capture désirée par Nuri.



Nuri Yuri

HostMaster

Ca c'est super :D
J'espère que les autres balls arriveront :3 (Y'en a normalement 18 dans PSDK)
ln(yo) = <3
Salut Nuri, je ne sais pas si tu pourras m'aider.

J'essaye de modifier la trajectoire de la ball codée au début du script pokeball_catch.rb.
Plus précisément le moment entre le lancer de la ball et le moment où la ball touche l'adversaire.

Actuellement, la ball part du centre-haut de la sprite de notre Pokémon. (Trait Rouge avec comme origine la mire orange.)



Or, je souhaiterai que la ball parte du bord de l'écran (mire bleu clair), comme dans la 4G. (Trajectoire en bleu.) Pour cela, il me faudrait changer le point d'apparition de la ball sans toucher au point d'arrivée*. Parce que même avec un time_of_flight = 15 (ce qui est trop rapide : 1/4 de secondes.), on devine que la ball n'est pas lancée depuis la position supposée du dresseur.
Si la ball part bien du bord de l'écran, je pourrai mettre un time_of_flight = 30 sans que son point d'apparition ne pique les yeux.

(*D'ailleurs, gros point positif sur le fait que le point d'arrivée soit automatiquement calibré à la position du Pokémon adverse.)

Je sais que le code clé est ici. J'ai tenté plein de modifications en mettant quelques annotations.
Le mieux que j'ai réussi à faire, c'est décaler l'animation. (Aka une translation : si le point de départ était 50 pixels plus à gauche, le point d'arrivée l'était aussi.) Et bien sûr jouer sur sa vitesse (modification de la valeur de time_of_flight).
Au pire je me prenais une NoMethod Error : undefined method "x" (ou "x=").

begin
include Math

$data = {
:origin => [],
#:global => [],
:target => [],
}

trainer_height = 60
time_of_flight = 15

origin = $data[:origin]
target = $data[:target]

# Create the ball sprite animation copy
origin << [:spawn_sprite, 0]
origin << [:set_property, 0, {z: 9_999}]
origin << [:advance, 0, 0, 0] # Set the sprite at the original position - modifier les 2 derniers chiffres est absolument sans effet
origin << [:load_parameter, :ball_sprite] # Load the ball sprite
origin << [:copy_bitmap, 0, false] # Copy the ball sprite image
origin << [:set_src_rect, 0, 0, 0, 64, 64] # Largeur de sprite, Hauteur de sprite en fin d'array
origin << [:set_sprite_origin_div, 0, 2, 1] # Division de quelque chose, car si je mets 0, erreur division par zéro. (Inconnu, X, Y)
origin << [:move, 0, 0, ((-trainer_height + 16 )* cos(-PI / 2 / 4) ).round ] # Le second chiffre modifie la coordonnée X de la première frame, mais la position normale reprend dès la seconde frame.
origin << :synchronize
target << [:spawn_sprite, 0]
target << [:copy_bitmap, 0, false, true]
target << [:set_property, false, {visible: false}]
target << [:se_play, 'fall']

lv = 0
last_ball_height = 0
time_of_flight.times do |i|
origin << [:advance, 0, 0, 1000 * (i + 1) / time_of_flight] # Le 1000 joue sur la longueur de course et sur la hauteur indirectement.
origin << [:move, 0, 0, last_ball_height = ((-trainer_height + 16) * cos(PI / 2 * (i * 4 - time_of_flight) / (time_of_flight * 4)) ).round ] # Changer le premier 0 donne une erreur.
cv = 64 * (i * 4 / time_of_flight)
origin << [:set_src_rect, 0, 0, lv = cv] if lv != cv # Changer le second zéro rend la ball invisible à mi-course.
origin << :synchronize
end

« Last Edit: 01 October 2019, 00:20:39 by Amras Anárion »

Nuri Yuri

HostMaster

Il faut rajouter un offset_x à l'aide de la fonction move (je pense que c'est le 0 avant le calcul de y).
Faut que cet offset corresponde à la distance entre le bord de l'écran et la position du Pokémon * le % de non-avancement (ie 1 - l'avancement entre 0 et 1).

Malheureusement l'animateur actuel n'est pas capable de traduire des équations, de ce fait ça marchera bien en 1v1 pour PSDK si le système n'est pas modifié, par contre tous les autres cas auront un léger glitch graphique ^^
ln(yo) = <3

There was an error while thanking
Thanking...