Aller à la page 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
Reprise du message précédent:
Gari -
posté le 14/05/2020 à 11:00:25 (5901 messages postés)
- | | Ca fait un joli rectangle bleu sur fond noir.
Ca me dit pas trop comment le premier fonctionne (désolé, c'est pour mettre à jour le script du dessus, pas pour un usage personnel )
Je suppose que l'objectif pour rendre ton script utilisable, ce serait que je crée un Class_Rotation pour éviter que ça se lance automatiquement et le code qui permettrait de faire ça par appel de script...
| Suite du sujet:
xvw -
posté le 14/05/2020 à 11:34:41 (736 messages postés)
- | yo | Je pense qu'il vaut mieux supprimer le script. (Simplement);
|
https://xvw.lol |
gif -
posté le 14/05/2020 à 11:57:02 (4782 messages postés)
- | Egotrip Gigamaxé | Ah ok je croyais que c'était pour toi, du coup j'avais fais un exemple avec un rectangle bleu qui tourne sur lui même .
Ouais faudrait rendre ça plus générique.
|
Itch.io | Twitter | Une IA qui génère des sprites de Pokémon | Cochouchou à la coupe du monde ! | le concours hebdomadaire du meilleur screen ! |
Gari -
posté le 14/05/2020 à 12:23:46 (5901 messages postés)
- | | Non, je nettoie fais le ménage.
Désolé de t'avoir plébiscité pour pas grand-chose (dans la mesure où je ne ferai rien de ce mini script, n'étant pas... maker/programmeur). Mais merci quand même !
A défaut de pouvoir rajouter des choses, je pense que je dois pouvoir expliquer ce que tu as fait (à l'aide d'un cours de maths cve serait mieux, mais faudra se contenter de la version CE2). L'objectif du script posté sur Oniro était peut-être juste d'expliquer comment scripter une rotation sur XP (ce qui peut être intéressant pour créer des animations sans image, avec des collisions précises au pixel prêt, ou d'autresz trucs dont vous avez plus l'idée que moi).
Spoiler (cliquez pour afficher) Citation: spriteRotation = Sprite.new |
Commande pour dire qu'on crée un objet de type Sprite (défini par la suite), avec pour nom spriteRotation. Ce qui signifie que pour créer une nouvelle image du même type, il faudrait soit a) dupliquer le script en changeant le nom de Sprite.new (par spriteRotation2 ou autre), soit b) créer un euh... module (?) de type Sprite.new = spriteRotation.name("nomdel'image.png" ou codenomdesprite ; position_x ; position_y ; vitesse_rotation ; autres paramètres)
Citation: # Position initiale du sprite
spriteRotation.x = 320
spriteRotation.y = 240
spriteRotation.z = 0 |
x et y par rapport à l'écran. z normalement c'est la profondeur, RM étant 2D je suppose que ce ne serait utile qu'en alliant avec des systèmes utilisant cette méthode ? (peut-être le mode 7) Ou alors c'est autre chose.
Citation: spriteRotation.bitmap = Bitmap.new(100,150) |
on associe des dimensions à notre sprite, bitmap référant aux fonctions graphiques, et les éléments entre parenthèses à largeur et hauteur. Vulgairement, on a un rectangle de 100 de largeur par 150 de hauteur.
Citation: blue = Color.new(0,0,255,255) |
On crée une variable "blue" de type couleur (R, V, B, saturation).
Citation: # Création de quelques alias utiles
w = spriteRotation.bitmap.width.to_f # largeur du sprite
h = spriteRotation.bitmap.height.to_f # longueur du sprite
r = Math.sqrt(w*w + h*h) / 2 # dist entre coin haut gauche et centre du sprite
originX = spriteRotation.x # position initiale axe X
originY = spriteRotation.y # position initiale axe Y
originTheta = Math.atan((w/2.0)/(h/2.0)) # angle entre longueur et diagonal
Pi = 3.14159 |
Création de termes réutilisables pour ce script mais aussi ailleurs (l'alias n'étant implémenté qu'à partir de VXAce)
Citation: spriteRotation.bitmap.fill_rect(0, 0, w, h, blue) |
On remplit notre objet Sprite avec la variable blue définie plus haut, selon la largeur et la hauteur du sprites (pour les deux premiers 0, je vois pas ce que c'est).
Citation:
On définit l'angle à 0 avant qu'il soit assigné à notre sprite.
Le reste (inséré dans le loop) permet de faire tourner le sprite en fonction de l'angle sur son centre, et de retourner au menu de l'écran titre quand Echap/X est pressé.
|
gif -
posté le 14/05/2020 à 12:49:52 (4782 messages postés)
- | Egotrip Gigamaxé | Ok, je comprend mieux ce que tu veux faire .
Du coup j'ai intégré ça dans la classe Sprite (script à coller au dessus de main) :
Spoiler (cliquez pour afficher)
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
35
36
37
38
39
40
41
42
43
| #==============================================================================
# ** Sprite_Rotation
#------------------------------------------------------------------------------
# Cette classe permet de faire tourner un sprite depuis son centre
#==============================================================================
class Sprite
#--------------------------------------------------------------------------
# * Rotate_around_center
# angle : angle de rotation (degree, anti-horaire)
#--------------------------------------------------------------------------
def rotate_around_center(angle)
if (self.angle == 0)
@originX = self.x
@originY = self.y
end
# Création de quelques termes utiles
w = self.bitmap.width.to_f # largeur du sprite (axe X)
h = self.bitmap.height.to_f # hauteur du sprite (axe Y)
r = Math.sqrt(w*w + h*h) / 2.0 # dist entre coin haut gauche et centre sprite
originTheta = Math.atan((w/2.0) / (h/ 2.0)) # angle entre hauteur et diagonale
pi=3.14159
# rotation du sprite selon l'angle demandé
self.angle += angle
# Calcul de la position du center du sprite
centreX = @originX + Math.sin(self.angle * 2 * pi / 360.0 + originTheta) * r
centreY = @originY + Math.cos(self.angle * 2 * pi / 360.0 + originTheta) * r
# Calcul de l'offset a appliquer au coin haut gauche
deltaX = centreX.to_f - (@originX + w / 2.0)
deltaY = (@originY + (h / 2.0)) - centreY.to_f
# Mise à jour de la position coin haut gauche
self.x = @originX.to_f - deltaX.to_f
self.y = @originY.to_f + deltaY.to_f
end
end |
Je l'utilise depuis un event pour l'exemple :
Ca donne ça une fois que je touche l'event :
On peut sûrement faire mieux, bien sur .
Veux-tu que je mette à jour le tuto dans ce sens ?
|
Itch.io | Twitter | Une IA qui génère des sprites de Pokémon | Cochouchou à la coupe du monde ! | le concours hebdomadaire du meilleur screen ! |
Gari -
posté le 14/05/2020 à 13:46:35 (5901 messages postés)
- | | Oui, c'est l'idée (enfin c'est ce que je pense être voulu par le tuto à la base) !
Est-ce que ces deux lignes permettraient le déplacement du centre de rotation sur la carte ?
Citation: self.x = x.round + x_centre
self.y = y.round + y_centre |
Les positions x et y ont l'air d'être calculées selon la position de ce fameux centre.
Vu que le titre du tuto mentionne le centre mobile, ce serait juste bien de rajouter ça si ça a effectivement été montré (sinon juste le script comme tu l'as fait ce sera déjà très super bien, je suppose qu'il s'agissait surtout d'expliquer le principe de la rotation à la base).
J'ai quand même vérifié qu'aucun script identique similaire n'existait pour XP (serait peut-être temps Gari ), et à priori non. Il y a quand même ce script de Fabien qui donne des méthodes pour déplacer des images, mais je ne pense pas que ce soit exactement la même chose.
Ce serait vraiment super si tu voulais bien refaire le tuto dans ce sens en tout cas (avec les explications)
xvw : J'aimerais tellement masquer (supprimer n'est pas une option), mais ma direction (les grands pontes tout là-haut) m'incite à une extrême prudence, surtout que je peux avoir la main un peu lourde quand je nettoie.
|
xvw -
posté le 14/05/2020 à 13:57:38 (736 messages postés)
- | yo | Le tutoriel est discutablement pédagogique. Et même si la version de Gif est "plus user-friendly", elle nécéssite de comprendre la logique des Sprites (et donc par extension des Bitmaps). Et généralement, dès lors que l'on connait ça, l'implémentation du script devient assez évidente.
Pour améliorer le script, il faudrait ajouter sa représentation dynamique (dans Game_Picture, Game_Character etc.).
Ici, posé "plic ploc" comme ça, il n'apporte pas grand chose.
|
https://xvw.lol |
Gari -
posté le 14/05/2020 à 14:41:06 (5901 messages postés)
- | | Citation: Pour améliorer le script, il faudrait ajouter sa représentation dynamique (dans Game_Picture, Game_Character etc.). |
Tu veux dire faire en sorte d'adapter cette méthode pour les pictures, charset, etc ?
Est-ce que l'expliquer ne suffirait pas ? A partir du moment où la méthode de base a été expliquée, elle doit pouvoir être adptable un peu partout, non ?
Pour les charset et autres éléments regroupés sur un fichier commun, cela voudrait dire faire en sorte que seul le charset actif tourne, sans voir les autres éléments.
Ou peut-être que tu parles d'autre chose. (un schéma représentant l'objet en mouvement sur des cercles pour montrer la façon dont les angles progressent en fonction du déplacement ?)
|
xvw -
posté le 14/05/2020 à 17:03:09 (736 messages postés)
- | yo | Citation: Est-ce que l'expliquer ne suffirait pas |
Je ne trouve pas... parce que la démarche passe à côté de "la manière de programmer pour RPGmaker". Je ne doute pas une seule seconde que l'auteur savait parfaitement "comment s'en servir". Mais ce tutoriel est, pour moi, une petite curiosité partagé entre "potes scripteurs". Ce qui le rend assez inutile car :
- un scripteur sait déjà comment l'implémenter
- un non scripteur ne comprendra pas comment s'en servir.
Expliquer l'approche de manière "moins concrètes" serait sans aucun doute "plus intéressant".
Citation: Est-ce que l'expliquer ne suffirait pas ? A partir du moment où la méthode de base a été expliquée, elle doit pouvoir être adptable un peu partout, non ? |
Dans RPGMaker, un script "ne modifie généralement pas directement le sprite". Il modifie une instance "dynamique" Game_quelquechose qui transmettra ses données à une instance de Sprite_quelquechose. Généralement, on voudrait que ce genre de transformation soit calculée dans la représentation dynamique (Game_xxx) et non visuelle (Sprite_xxx).
D'où le fait que pour moi, il faut soit :
- proposer un script qui implémente correctement ce que propose l'auteur et facile à prendre en main. Ce qui permettrait de réécrire le tutoriel en expliquant comment utiliser le script et eventuellement ajouter un point sur "comment fonctionne le script" (en introduisant la notion de coordonnées).
- soit simplement supprimer/archiver le tutoriel car il n'apporte pas grand chose.
|
https://xvw.lol |
Gari -
posté le 14/05/2020 à 18:13:34 (5901 messages postés)
- | | Je vais voir ce que gif propose. En l'état, le script a de toute manière été masqué, il n'est pas utilisable comme tel.
Citation: Expliquer l'approche de manière "moins concrète" serait sans aucun doute "plus intéressant". |
Je te sens motivé, là. =>[]
Bon, assez ri, j'ai des tutos à latter.
|
gif -
posté le 17/05/2020 à 15:28:12 (4782 messages postés)
- | Egotrip Gigamaxé | Je te proposerai quelque chose ce week-end .
Edit : Voila ma proposition.
J'ai implémenté une méthode de rotation depuis la classe Game_Picture. C'est utilisable sur les images du coup et l'on peut choisir n'importe quel point de rotation : (script à placer au dessus de main)
Spoiler (cliquez pour afficher)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
| #==============================================================================
# ** Game_Picture
#------------------------------------------------------------------------------
# This class handles the picture. It's used within the Game_Screen class
# ($game_screen).
#==============================================================================
class Game_Picture
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :origine_X # position originale X de l'image
attr_reader :origine_Y # position originale Y de l'image
attr_reader :point_rotation_X # position de rotation X
attr_reader :point_rotation_Y # position de rotation Y
#--------------------------------------------------------------------------
# * Change Rotation Speed
# a_x : position sur l'axe X du point de rotation
# a_y : position sur l'axe Y du point de rotation
# a_vitesse_rotation : vitesse de rotation (sens anti-horaire) de l'image
#--------------------------------------------------------------------------
def rotate(a_x, a_y, a_vitesse_rotation)
@point_rotation_X = a_x
@point_rotation_Y = a_y
@rotate_speed = a_vitesse_rotation
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# partie originale de l'update (depuis Game_Picture)
if @duration >= 1
d = @duration
@x = (@x * (d - 1) + @target_x) / d
@y = (@y * (d - 1) + @target_y) / d
@zoom_x = (@zoom_x * (d - 1) + @target_zoom_x) / d
@zoom_y = (@zoom_y * (d - 1) + @target_zoom_y) / d
@opacity = (@opacity * (d - 1) + @target_opacity) / d
@duration -= 1
end
if @tone_duration >= 1
d = @tone_duration
@tone.red = (@tone.red * (d - 1) + @tone_target.red) / d
@tone.green = (@tone.green * (d - 1) + @tone_target.green) / d
@tone.blue = (@tone.blue * (d - 1) + @tone_target.blue) / d
@tone.gray = (@tone.gray * (d - 1) + @tone_target.gray) / d
@tone_duration -= 1
end
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# partie rotation de l'image (on quitte ici si il n'y a pas de rotation
# a faire)
if @rotate_speed == 0
return
end
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# l'idée est simple : effectuer la rotation autour du coin haut gauche
# de l'image, puis translater l'image correctement pour donner l'impression
# qu'elle tourne en fait autour du point de rotation voulu.
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# On recupere au prealable la position originale de l'image
# cette position est necessaire pour les calculs ci-dessous
if (@angle == 0)
@origine_X = @x
@origine_Y = @y
end
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# On determine l'ecart entre le point de rotation et le coin-haut gauche
# de l'image
dX = @point_rotation_X - @origine_X
dY = @point_rotation_Y - @origine_Y
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# On calcul ainsi la distance entre le point de rotation et le coin-haut
# gauche de l'image
d = Math.sqrt(dX*dX + dY*dY)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# On mesure l'angle formé entre l'axe Y et la droite passant par le coin
# haut gauche et le point de rotation. Cet angle constitue l'offset a
# appliquer lorsque l'on va calculer la position du point de rotation
if (dX > 0 and dY > 0)
angle_Offset = Math.atan(dX.to_f / dY.to_f)
elsif (dX > 0 and dY < 0)
angle_Offset = Math.atan(((-1.0) * dY.to_f) / dX.to_f) + Math::PI / 2.0
elsif (dX < 0 and dY < 0)
angle_Offset = Math.atan(dX.to_f / dY.to_f) + Math::PI
elsif (dX < 0 and dY > 0)
angle_Offset = Math.atan(dY.to_f / ((-1.0) * dX.to_f)) + 3.0 * Math::PI / 2.0
# On prend en compte quelque cas particuliers (si dX ou dY vaut zero)
elsif (dX == 0 and dY >= 0)
angle_Offset = 0
elsif (dX >= 0 and dY == 0)
angle_Offset = Math::PI / 2.0
elsif (dX == 0 and dY < 0)
angle_Offset = Math::PI
else (dX < 0 and dY == 0)
angle_Offset = 3.0 * Math::PI / 2.0
end
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# On applique la rotation de l'image autour de son coin haut gauche
@angle += @rotate_speed / 2.0
while @angle < 0
@angle += 360
end
@angle %= 360
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# On calcul le position du point de rotation
# note : on prend soin de convertir @angle en radian au prealable
angle_Radian = @angle * 2 * Math::PI / 360.0
point_rotation_X = @origine_X + Math.sin(angle_Radian + angle_Offset) * d
point_rotation_Y = @origine_Y + Math.cos(angle_Radian + angle_Offset) * d
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Si l'on s'arrete ici, l'image va tourner autour de son coin haut gauche
# mais nous connaissons à présent le position du point de rotation, il
# suffit maintenant de translater l'image
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# On determine la translation a appliquer à l'image
dX = point_rotation_X.to_f - @point_rotation_X.to_f
dY = @point_rotation_Y.to_f - point_rotation_Y.to_f
@x = @origine_X.to_f - dX.to_f
@y = @origine_Y.to_f + dY.to_f
end
end |
La méthode peut être utilisée par appel de script (depuis un event). Ci-dessous un exemple avec une rotation de l'image autour de son centre :
1
2
3
4
5
6
7
| #--------------------------------------------------------------------------
# * Change la vitesse de rotation de l'image
# a_x : position sur l'axe X du point de rotation
# a_y : position sur l'axe Y du point de rotation
# a_vitesse_rotation : vitesse de rotation (sens anti-horaire) de l'image
#--------------------------------------------------------------------------
$game_screen.pictures[1].rotate(a_x, a_y, a_vitesse_rotation ) |
Résultat :
Ça manque d'illustration pour expliquer le processus et les calculs, mais je manque de temps aujourd'hui => je ferrai ça pendant le pont la semaine prochaine.
On part la dessus ?
Edit : ce que ça ne fait pas :
- Translation + rotation en même temps
|
Itch.io | Twitter | Une IA qui génère des sprites de Pokémon | Cochouchou à la coupe du monde ! | le concours hebdomadaire du meilleur screen ! |
xvw -
posté le 17/05/2020 à 15:31:25 (736 messages postés)
- | yo | Le fait de passer par une boucle est assez ennuyant. Est-ce que tu ne penses pas que ce serait mieux de t'inspirer de ce qui est fait pour la rotation (normale) (ou les changements de teintes) histoire de pouvoir l'activer/désactiver à la demande.
|
https://xvw.lol |
gif -
posté le 17/05/2020 à 15:41:29 (4782 messages postés)
- | Egotrip Gigamaxé | C'est une bonne idée .
Edit : c'est fait. Ça peut encore être amélioré (voir édit post précédent).
|
Itch.io | Twitter | Une IA qui génère des sprites de Pokémon | Cochouchou à la coupe du monde ! | le concours hebdomadaire du meilleur screen ! |
xvw -
posté le 17/05/2020 à 23:13:36 (736 messages postés)
- | yo | C'est beaucoup mieux !
Par contre plusieurs points :
- je pense que le code ne devrait pas être un mélange entre Anglais et Français. (Et je dropperai les commentaires en Français, quitte à décrire les étapes en complément)
- ton code devrait utiliser des Alias pour ne pas répéter le code déjà existant. Déjà, ça réduira fortement ton code et en plus ça maximisera la comptabilité avec d'autres scripts.
|
https://xvw.lol |
xvw -
posté le 18/05/2020 à 04:08:45 (736 messages postés)
- | yo | Ruby est un langage "ouvert", ça veut dire que tu peux modifier n'importe quelle classe en "ajoutant" des méthodes. Par exemple, imaginons qu'on ait cette classe :
1
2
3
4
5
6
7
|
class Foo
def bar
p "Bar"
end
end
|
Tu peux ajouter une méthode à la classe Foo dans un nouveau script :
1
2
3
4
5
6
7
|
class Foo
def foobar
p "FooBar"
end
end
|
Maintenant, la classe Foo a deux methodes (en plus du initialize/new). Ce qui veut dire que tu peux écraser une méthode qui existe déja :
1
2
3
4
5
6
7
|
class Foo
def bar
p "Nouveau bar"
end
end
|
Dorénavant quand tu appelleras :
Ça affichera (dans la console) "Nouveau bar".
Tout ça pourrait passer pour très dangereux (ce qui est d'ailleurs le cas) mais Ruby offre un mécanisme d'extension basé sur les alias.
Par exemple :
1
2
3
4
5
6
7
8
9
10
|
class Foo
alias_method :ancien_bar, :bar
def bar
p "J'appelle bar"
ancien_bar
p "J'ai appelé bar"
end
end
|
Concrètement, la méthode `alias_method` permet de créer une copie d'une méthode en lui donnant un nouveau nom. De ce fait, il devient possible de l'appeler dans l'écrasement de l'ancienne méthode.
C'est primordiale quand on écrit un script parce que si on n'avait pas ce mécanisme d'alias, chaque personne modifiant un script rendrait l'ensemble des autres scripts incompatibles.
Ici, dans le script de Gif, si un Script avait été ajouté avant qui modifiait, par exemple, l'update de Game_picture (ce qui est le cas de RME par exemple), le script de Gif supprimerait toutes les modifications d'avant... ce qui est balot.
Donc concrètement, ça permet d'écrire du code "avant" et "après" une autre méthode. Pas "au milieu", cependant, le RGSS est suffisament bien découpé pour qu'il soit possible d'injecter du code à peu près où l'on veut.
Pour comprendre comment construire des scripts, je t'invite, si ça t'intéresse, à lire ces deux tutoriels (qui sont relativement accessibles) :
https://www.biloucorp.com/creation-dun-shifumi-avec-le-rgss3-16
https://www.biloucorp.com/creer-son-propre-systeme-de-quetes-partie-12-17
|
https://xvw.lol |
Gari -
posté le 18/05/2020 à 15:00:44 (5901 messages postés)
- | | C'est que ça prend forme tout ça.
Je connaissais l'alias comme réutilisateur d'ancienne méthode, mais je comprends un peu mieux pourquoi les gens préfèrent le RGSS3 pour les scripts.
|
xvw -
posté le 19/05/2020 à 10:14:29 (736 messages postés)
- | yo | Tu fais référence aux tutoriels que j'ai posté en bas de message ?
Parce que les alias fonctionnent sur tout les RGSS.
|
https://xvw.lol |
Gari -
posté le 19/05/2020 à 10:33:42 (5901 messages postés)
- | | Non, je croyais qu'il s'agissait d'une généralité (RGSS3 qui utilise l'alias, et pas les autres)
(voilà ce que c'est de lire en diagonales)
|
xvw -
posté le 20/05/2020 à 10:12:24 (736 messages postés)
- | yo | Non, ça n'existe pas. Tu as peut être vu ça :
1
2
3
4
5
6
7
8
|
class A
alias new_method old_method
def old_method
...
end
end
|
Qui est, en terme de fonctionnement, identique à l'utilisation d'alias_method. Mais je privilégie toujours les méthodes plutôt que les instructions un peu magique (each au lieu de for par exemple). La seule exception que je fais, c'est l'utilisation de begin/rescue, if/else/etc et while/do while parce qu'on a rarement le choix.
|
https://xvw.lol |
gif -
posté le 25/05/2020 à 18:28:36 (4782 messages postés)
- | Egotrip Gigamaxé | @Gari : J'ai terminé le code pour la rotation d'image (utilisation des alias + anglais):
Spoiler (cliquez pour afficher)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
| #==============================================================================
# ** Game_Picture
#------------------------------------------------------------------------------
# This class handles the picture. It's used within the Game_Screen class
# ($game_screen).
#==============================================================================
class Game_Picture
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :origine_X # original X coordinate of the picture
attr_reader :origine_Y # original Y coordinate of the picture
attr_reader :point_rotation_X # X coordinate of the rotation center
attr_reader :point_rotation_Y # Y coordinate of the rotation center
#--------------------------------------------------------------------------
# * Alias
#--------------------------------------------------------------------------
alias old_update update
alias old_rotate rotate
#--------------------------------------------------------------------------
# * Change Rotation Speed
# a_x : X coordinate of the rotation center
# a_y : Y coordinate of the rotation center
# a_rotation_speed : rotation speed
#--------------------------------------------------------------------------
def rotate(a_x, a_y, a_rotation_speed)
@point_rotation_X = a_x
@point_rotation_Y = a_y
old_rotate(a_rotation_speed)
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Keep track of the original picture position (before any rotation)
if (@angle == 0)
@origine_X = @x
@origine_Y = @y
end
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# original update execution here
old_update
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# stop here if rotation is not required
if @rotate_speed == 0
return
end
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# The idea is the following :
# 1) rotate around the top-left corner
# 2) calculate the offset of the rotation point
# 3) apply the offset to the top-left corner
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Calculate the distance between the rotation point and the top-left corner
dX = @point_rotation_X - @origine_X
dY = @point_rotation_Y - @origine_Y
d = Math.sqrt(dX*dX + dY*dY)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# With the distance we also need the angle between Y axis and the segment
# formed by the top-left corner and the rotation point
if (dX > 0 and dY > 0)
angle_Offset = Math.atan(dX.to_f / dY.to_f)
elsif (dX > 0 and dY < 0)
angle_Offset = Math.atan(((-1.0) * dY.to_f) / dX.to_f) + Math::PI / 2.0
elsif (dX < 0 and dY < 0)
angle_Offset = Math.atan(dX.to_f / dY.to_f) + Math::PI
elsif (dX < 0 and dY > 0)
angle_Offset = Math.atan(dY.to_f / ((-1.0) * dX.to_f)) + 3.0 * Math::PI / 2.0
# Special cases
elsif (dX == 0 and dY >= 0)
angle_Offset = 0
elsif (dX >= 0 and dY == 0)
angle_Offset = Math::PI / 2.0
elsif (dX == 0 and dY < 0)
angle_Offset = Math::PI
else (dX < 0 and dY == 0)
angle_Offset = 3.0 * Math::PI / 2.0
end
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# We can now calculate the new position of the rotation point
angle_Radian = @angle * 2 * Math::PI / 360.0 # degree to radian
point_rotation_X = @origine_X + Math.sin(angle_Radian + angle_Offset) * d
point_rotation_Y = @origine_Y + Math.cos(angle_Radian + angle_Offset) * d
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Finally we apply the offset to the top-left corner so the rotation point
# stay at the same position
dX = point_rotation_X.to_f - @point_rotation_X.to_f
dY = @point_rotation_Y.to_f - point_rotation_Y.to_f
@x = @origine_X.to_f - dX.to_f
@y = @origine_Y.to_f + dY.to_f
end
end |
Script à placer au dessus de "main".
Fonctionne pas appel de script (exemple avec l'image d'ID 1):
1
| $game_screen.pictures[1].rotate(pointRotationX, pointRotationY, vitesseRotation) |
Usage :
Résultat (avec un ptit point rouge juste pour l'exmple):
Ça convient ainsi ?
|
Itch.io | Twitter | Une IA qui génère des sprites de Pokémon | Cochouchou à la coupe du monde ! | le concours hebdomadaire du meilleur screen ! |
Gari -
posté le 26/05/2020 à 14:19:24 (5901 messages postés)
- | | Nickel tant qu'on fait pas un copier coller de la portion de code dans l'appel de script sans enlever les espaces (comme un bousin). Le rendu avec le loop est super propre.
Par contre, j'ai essayé de déplacer l'image avec la rotation, mais on dirait que le centre du cercle est fixe, même en déplaçant l'image (l'image se déplace et refait la rotation sur sa position initiale).
|
xvw -
posté le 26/05/2020 à 14:24:27 (736 messages postés)
- | yo | Le script est vraiment mieux. Quelques petits points "stylistiques".
- Je n'utiliserais pas "old" comme préfixe pour l'alias... parce que c'est une habitude prise par beaucoup de scripteur, donc ça peut engendrer des soucis. Que dirais tu de `gif_rotate_pictures_`.
- Même si ce n'est pas dramatique, c'est assez peu standard de voir des variables avec des majuscules en Ruby. Donc `origin_x` me semble plus adéquat que `origin_X`(par exemple).
- Je localiserai toutes l'update de la rotation dans une méthode spécifique que j'appellerais dans update.
- comme en Ruby, le if est une expression (ce qui est assez rare dans d'autres langages et vraiment domage!) j'utiliserais la forme `x = if` plutot que `if ... x =` ça permettra d'éviter la répétition de angle_offset (et c'est moins chiant si un jour tu veux changer le nom de la variable par exemple).
- Le dernier point est de l'ordre du détail mais en fait : 2 * Math::PI / 360.0 est en fait égal à `Math::PI / 180.0` mais en fait ça donne une réponse vraiment très très précise pour ... "un monde de pixel". Donc tu peux te contenter de multiplier par 57.3.
|
https://xvw.lol |
gif -
posté le 26/05/2020 à 14:41:15 (4782 messages postés)
- | Egotrip Gigamaxé | Ce script c'est un jour sans fin .
@Gari : ouais y'a des limitations actuellement. Tu ne peux pas faire translation + rotation en même temps. C’est cependant une feature quasi indispensable donc je vais la rajouter.
@xyz : Merci pour ton retour. Pour l'histoire des simplifications telles que 57.3, je préfère souvent garder de la clarté au cas ou quelqu'un souhaite lire le code ou qu'il se passe plusieurs jours sans que j'y touche (moi = débile). Mais maintenant que j'y pense, j'peux toujours laisser un commentaire .
Bref, je reviendrai .
|
Itch.io | Twitter | Une IA qui génère des sprites de Pokémon | Cochouchou à la coupe du monde ! | le concours hebdomadaire du meilleur screen ! |
Gari -
posté le 26/05/2020 à 15:14:57 (5901 messages postés)
- | | Désolé, c'est juste ce que j'avais compris par centre mobile (et bon pouvoir bouger l'image ça permet tellement plus de choses... genre, des feuilles qui tournent ! De la grêle ! Ou même des fonctions plus avancées pour un jeu de plateforme). ^^'
gif a dit:
Tiens, y a pas que moi qui la fait.
|
gif -
posté le 26/05/2020 à 15:16:54 (4782 messages postés)
- | Egotrip Gigamaxé | (je taquine .)
Mais je suis d'accord sinon, faut que je pousse dans cette direction.
|
Itch.io | Twitter | Une IA qui génère des sprites de Pokémon | Cochouchou à la coupe du monde ! | le concours hebdomadaire du meilleur screen ! |
xvw -
posté le 26/05/2020 à 15:35:05 (736 messages postés)
- | yo | Oui, c'est pour ça que j'ai dit que le dernier point était de l'ordre du détail. Je trouve que les points précédents sont, eux, vraiment plus important
|
https://xvw.lol | Aller à la page 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73Index du forum > Entraide > [Scripts] Petites questions connes sur les SCRIPTS!!
|