Bienvenue visiteur !
|
Statistiques
Liste des membres
Contact
Mentions légales
267 connectés actuellement
30732363 visiteurs depuis l'ouverture
2341 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
◂
| Scroll Pictures
Permet de rajouter quelques petits effets aux maps en affichant des images qui bouclent à la manière des brouillards, mais sans couvrir tout l'écran et avec la forme qu'on veut.
Pour RPG Maker XP, VX et VX Ace | Script pour RPG Maker XP Ecrit par Zeus81 Publié par zeus81 (lui envoyer un message privé) Signaler un script cassé
|
▸
|
❤ 0 Auteur : Zeus81
Logiciel : RPG Maker XP, VX et Ace
Nombre de scripts : 1
Ce script permet de rajouter quelques petits effets de la more aux maps pour les embellir (ça s'adresse à ceux qui ont plein de temps à perdre dans des détails).
Pour faire simple ce script permet d'afficher des images qui bouclent un peu à la manière des brouillards mais juste dans le cadre d'une image et avec la forme qu'on veut.
Pour ça on a besoin de deux choses, une image en noir et blanc qui servira de masque et une texture.
Plutôt que du blabla des exemples :
- Une lumière avec de la poussière qui flotte.
Le masque et la texture utilisés :
- Une fumée dans un couloir.
Le masque et la texture utilisés (texture que j'ai par ailleurs mis a 400% de zoom dans les réglages pour avoir cet effet) :
J'ai essayé de rendre ça le plus simple possible à configurer donc on va utiliser la commande Afficher une image.
Mais avant d'utiliser la commande on insère un script en écrivant : scroll_picture_mask
Comme ça les commandes qui suivent ne seront pas gérées comme étant des images normales.
Dans la commande Afficher une image on sélectionne l'image de masque, la position sur la map en pixels, etc... toutes les réglages seront pris en compte comme sur une image normale.
Ensuite pour configurer la texture on va réutiliser la commande Afficher une image mais cette fois avant on met un script avec : scroll_picture_texture
Cette fois on choisis l'image de texture mais les autres réglages auront un autre effet, la position X indiquera la vitesse de défilement sur X, la position Y la vitesse de défilement sur Y, le zoom ici est celui de la texture qui est indépendant du zoom de l'image elle même, les autres réglages ne sont pas utilisés.
Ce qui donne quelque chose comme ça :
Si on a besoin d'en configurer plusieurs d’affiler, on a pas besoin de faire :
1
2
3
4
| <> Script : scroll_picture_mask
<> Afficher image : N°1 ...
<> Script : scroll_picture_mask
<> Afficher image : N°2 ... |
On peut simplifier en :
1
2
3
| <> Script : scroll_picture_mask
<> Afficher image : N°1 ...
<> Afficher image : N°2 ... |
De même on peut aussi utiliser les commandes Déplacer une image, Faire tourner une image, Modifier le ton d'une image et Effacer une image.
Toutes les commandes liées aux images suivant directement scroll_picture_mask sont considérées comme telles.
Idem pour scroll_picture_texture
Enfin il y'a deux réglages supplémentaires qu'on ne peut faire qu'en script.
1
| scroll_picture(id).z = valeur |
Avec id le numéro de l'image et valeur la priorité de superposition, la valeur par défaut est 1000 ce qui correspond à Au dessus de tout, mais on peut mettre par exemple 1 pour que l'image soit juste au dessus du sol, ou un nombre négatif pour qu'elle apparaisse derrière la map.
1
| scroll_picture(id).map_anchor = valeur |
Avec id le numéro de l'image et valeur le rapport entre la position de l'image et la map, la valeur par défaut est 1 ce qui signifie que l'image bouge avec la map, à 0 l'image n'est pas fixée à la map, à 2 l'image bouge avec la map et deux fois plus vite, à 0.5 l'image bouge avec la map mais deux fois moins vite.
Le script, à mettre au dessus du main comme d'hab :
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
| # Scroll Pictures 1.0 for XP, VX & VXAce by Zeus81
class Game_Scroll_Picture < Game_Picture
attr_accessor :z, :map_anchor, :texture, :texture_ox, :texture_oy, :erased
def initialize(number)
@z , @map_anchor, @texture , @texture_ox, @texture_oy, @erased =
1000, 1 , Game_Picture.new(number), 0 , 0 , false
super(number)
end
def erase() @erased = true end
def update
super
@texture.update
@texture_ox -= @texture.x / 10.0
@texture_oy -= @texture.y / 10.0
end
end
class Sprite_Scroll_Picture < Sprite
dll = FileTest.directory?('System') ? 'System/ZEUS' : 'ZEUS'
GrayscaleMaskBlt = Win32API.new(dll, 'GrayscaleMaskBlt', 'iiiiiiiiii', 'i')
def initialize(viewport, picture)
super(viewport)
@picture, @last_args = picture, []
end
def dispose
bitmap.dispose if bitmap
super
end
def update
return unless self.visible = !@picture.name.empty? && !@picture.texture.name.empty?
if @last_mask_name != @picture.name
@last_mask_name = @picture.name.dup
bitmap.dispose if bitmap
mask = cache(@picture.name)
self.bitmap = Bitmap.new(mask.width, mask.height)
end
if @picture.origin != 0
self.ox = bitmap.width / 2
self.oy = bitmap.height / 2
else self.ox = self.oy = 0
end
self.x = @picture.x - @picture.map_anchor * map_display_x
self.y = @picture.y - @picture.map_anchor * map_display_y
self.z = @picture.z
self.zoom_x = @picture.zoom_x / 100.0
self.zoom_y = @picture.zoom_y / 100.0
self.opacity = @picture.opacity
self.blend_type = @picture.blend_type
self.angle = @picture.angle
self.tone = @picture.tone
return unless self.visible = on_screen?
super
args = [bitmap.__id__ << 1, 0, cache(@picture.name).__id__ << 1, 0,
cache(@picture.texture.name).__id__ << 1, 0,
@picture.texture_ox.to_i, @picture.texture_oy.to_i,
@picture.texture.zoom_x.to_i, @picture.texture.zoom_y.to_i]
return if @last_args == args
@last_args.replace(args)
GrayscaleMaskBlt.call(*args)
end
def on_screen?
x1, y1, w1, h1 = x, y, (bitmap.width*zoom_x).to_i, (bitmap.height*zoom_y).to_i
w2, h2 = screen_width, screen_height
if angle == 0
x1, y1 = x1-w1/2, y1-h1/2 if ox != 0
x1<w2 and x1+w1>0 and y1<h2 and y1+h1>0
else
x1, y1, r1 = (x1-w2/=2).abs, (y1-h2/=2).abs, Math.hypot(w1, h1)
r1 /= 2 if ox != 0
x1<=w2+r1 and y1<=h2+r1 and (x1<=w2 or y1<=h2 or Math.hypot(x1-w2,y1-h2)<=r1)
end
end
if defined?(Hangup) #xp
def cache(filename) RPG::Cache.picture(filename) end
def screen_width() 640 end
def screen_height() 480 end
def map_display_x() $game_map.display_x / 4 end
def map_display_y() $game_map.display_y / 4 end
else #vx & vxace
def cache(filename) Cache.picture(filename) end
def screen_width() Graphics.width end
def screen_height() Graphics.height end
if RUBY_VERSION == '1.8.1' #vx
def map_display_x() $game_map.display_x / 8 end
def map_display_y() $game_map.display_y / 8 end
else #vxace
def map_display_x() $game_map.display_x * 32 end
def map_display_y() $game_map.display_y * 32 end
end
end
end
class Game_Map
attr_reader :scroll_pictures
alias zeus81_scroll_pictures_setup setup
def setup(map_id)
@scroll_pictures = {}
zeus81_scroll_pictures_setup(map_id)
end
alias zeus81_scroll_pictures_update update
def update(*args)
@scroll_pictures.delete_if {|i, p| p.erased}
@scroll_pictures.each_value {|p| p.update}
zeus81_scroll_pictures_update(*args)
end
end
class Spriteset_Map
alias zeus81_scroll_pictures_dispose dispose
def dispose
@scroll_picture_sprites.each_value {|s| s.dispose}
zeus81_scroll_pictures_dispose
end
alias zeus81_scroll_pictures_update update
def update
@scroll_picture_sprites ||= {}
@scroll_picture_sprites.delete_if do |i, s|
s.dispose if result = !$game_map.scroll_pictures.has_key?(i)
result
end
for i, p in $game_map.scroll_pictures
s = @scroll_picture_sprites[i] ||= Sprite_Scroll_Picture.new(@viewport1, p)
s.update
end
zeus81_scroll_pictures_update
end
end
if defined?(Hangup) #xp
class Interpreter
def execute_command
if @index < @list.size-1
@parameters = @list[@index].parameters
method_name = "command_#{@list[@index].code}"
return send(method_name) if respond_to?(method_name)
else command_end
end
return true
end
def scroll_picture(id)
$game_map.scroll_pictures[id] ||= Game_Scroll_Picture.new(id)
end
def scroll_picture_mask() scroll_picture_setup(0) end
def scroll_picture_texture() scroll_picture_setup(1) end
def scroll_picture_setup(type)
i = @index
while(@list[i += 1].code.between?(231, 235))
@list[i].parameters << type if @list[i].code < 233
@list[i].code += 810000
end
return true
end
def command_810231
picture = scroll_picture(@parameters[0])
picture = picture.texture if @parameters[-1] != 0
x, y = @parameters[4], @parameters[5]
x, y = $game_variables[x], $game_variables[y] if @parameters[3] != 0
picture.show(@parameters[1], @parameters[2], x, y, @parameters[6],
@parameters[7], @parameters[8], @parameters[9])
return true
end
def command_810232
picture = scroll_picture(@parameters[0])
picture = picture.texture if @parameters[-1] != 0
x, y = @parameters[4], @parameters[5]
x, y = $game_variables[x], $game_variables[y] if @parameters[3] != 0
picture.move(@parameters[1]*2, @parameters[2], x, y, @parameters[6],
@parameters[7], @parameters[8], @parameters[9])
return true
end
def command_810233
scroll_picture(@parameters[0]).rotate(@parameters[1])
return true
end
def command_810234
scroll_picture(@parameters[0]).start_tone_change(@parameters[1], @parameters[2]*2)
return true
end
def command_810235
id = @parameters[0]
scroll_picture(id).erase if $game_map.scroll_pictures.has_key?(id)
return true
end
end
else #vx & vxace
class Game_Interpreter
if RUBY_VERSION == '1.8.1' #vx
def wait(duration) @wait_count = duration end
def execute_command
if @index < @list.size-1
@params, @indent = @list[@index].parameters, @list[@index].indent
method_name = "command_#{@list[@index].code}"
return send(method_name) if respond_to?(method_name)
else command_end
end
return true
end
end
def scroll_picture(id)
$game_map.scroll_pictures[id] ||= Game_Scroll_Picture.new(id)
end
def scroll_picture_mask() scroll_picture_setup(0) end
def scroll_picture_texture() scroll_picture_setup(1) end
def scroll_picture_setup(type)
i = @index
while(@list[i += 1].code.between?(231, 235))
@list[i].parameters << type if @list[i].code < 233
@list[i].code += 810000
end
end
def command_810231
picture = scroll_picture(@params[0])
picture = picture.texture if @params[-1] != 0
x, y = @params[4], @params[5]
x, y = $game_variables[x], $game_variables[y] if @params[3] != 0
picture.show(@params[1], @params[2], x, y, @params[6],
@params[7], @params[8], @params[9])
return true
end
def command_810232
picture = scroll_picture(@params[0])
picture = picture.texture if @params[-1] != 0
x, y = @params[4], @params[5]
x, y = $game_variables[x], $game_variables[y] if @params[3] != 0
picture.move(@params[2], x, y, @params[6], @params[7],
@params[8], @params[9], @params[10])
wait(@params[10]) if @params[11]
return true
end
def command_810233
scroll_picture(@params[0]).rotate(@params[1])
return true
end
def command_810234
scroll_picture(@params[0]).start_tone_change(@params[1], @params[2])
wait(@params[2]) if @params[3]
return true
end
def command_810235
id = @params[0]
scroll_picture(id).erase if $game_map.scroll_pictures.has_key?(id)
return true
end
end
end |
La dll, à mettre direct dans le dossier du jeu sauf pour VXace où il faut mettre ça dans le sous-dossier System :
http://www.mediafire.com/?1g4shddbhh1qh
Y'a aussi le code source pour ceux que ça intéresse, c'est un projet VC++2010 Express.
Démo : https://www.dropbox.com/s/lru6jtmwn8git46/Scroll%20Pictures.zip?dl=1
Pour les scripteurs y'a d'autres possibilités avec la fonction GrayscaleMaskBlt qui ne sont pas exploitées dans ce scripts.
1
2
3
4
5
6
7
8
9
10
11
12
| GrayscaleMaskBlt .call(
bitmap.__id__<<1, #Le bitmap dans lequel on veut dessiner
bitmap_rect.__id__<<1, #Rect de la zone à remplir, si c'est tout le bitmap on peut mettre 0
mask.__id__<<1, #(Facultatif) Bitmap d'un masque en niveau de gris à appliquer au remplissage, si la taille du masque est différente de celle du bitmap il est automatiquement étiré
mask_rect.__id__<<1, #Rect de la zone du masque qu'on désire utiliser, si c'est tout le bitmap on peut mettre 0
texture.__id__<<1, #Bitmap de la texture à dessiner
texture_rect.__id__<<1, #Rect du morceau de texture à dessiner, si c'est tout le bitmap on peut mettre 0
texture_ox, #Le décalage en pixels de la texture sur x
texture_oy, #Le décalage en pixels de la texture sur y
texture_zoom_x, #L'étirement de la texture sur x, défaut 100, ne peut pas être égal à 0, si négatif la texture est inversée sur x
texture_zoom_y #L'étirement de la texture sur y, défaut 100, ne peut pas être égal à 0, si négatif la texture est inversée sur y
) |
La fonction retourne aussi un message, 0 = pas d'erreur, 1 = zoom invalide, 2 = rect invalide
Mis à jour le 21 novembre 2020.
|
Joke -
posté le 28/05/2012 à 13:39:28 (5090 messages postés)
| Bilouteux fou | Mais c'est tout bonnement génial... ! Bravo
J'me demandais justement comment ce genre de truc était fait :
Spoiler (cliquez pour afficher)
|
biloumaster.fr, mon joli site ouèb tout bô tout frai ! |
Zeus81 -
posté le 28/05/2012 à 14:10:28 (11071 messages postés)
| | T'as pas besoin de ce script pour faire un truc pareil, c'est un simple fog qui est mis sous la map avec des falaises semi-transparentes je pense. : )
|
Falco -
posté le 28/05/2012 à 14:20:34 (19775 messages postés)
- | Indie game Developer | Excellent ça, bien joué Zeus.
|
Inexistence Rebirth - Inexistence - Portfolio |
Magic -
posté le 28/05/2012 à 14:37:24 (3434 messages postés)
| D: | Enorme, bravo Zeus.
|
Zeus81 -
posté le 28/05/2012 à 16:33:44 (11071 messages postés)
| | Je vois que les bidouilles graphiques ça plait toujours, moi je préfère l'Input Ultimate 2.
|
Joke -
posté le 28/05/2012 à 20:28:08 (5090 messages postés)
| Bilouteux fou | Par contre le titre du script est pas très explicite, on s'attend pas à la gestion de masque
|
biloumaster.fr, mon joli site ouèb tout bô tout frai ! |
Zeus81 -
posté le 28/05/2012 à 20:53:12 (11071 messages postés)
| | Et encore, au début je voulais l'appeler Spaceship. =>[]
|
Gaetz -
posté le 29/05/2012 à 18:24:25 (2394 messages postés)
| ...passe... | Ah sympa, je vais repomper ça
|
Lije : démo 0.5 | Powered by Geex |
Zeus81 -
posté le 29/05/2012 à 19:45:21 (11071 messages postés)
| | Mais toi t'as plus de contrôle avec Geex, les masques c'est direct dans les Sprite et les Viewport qu'il te faut les insérer !
|
zou -
posté le 30/05/2012 à 21:01:27 (2197 messages postés)
| | Attention, il y a une erreur dans le code à cause du smiley ligne 95
|
Chaös17 -
posté le 01/06/2012 à 04:11:20 (868 messages postés)
| | Joli script!
|
Blog of Chaos17 |
leicsirg -
posté le 04/06/2012 à 16:49:58 (830 messages postés)
| | Super!
si j'ai du temps je l'introduirais.
|
Livestreamz | FACTIONS: l'appel aux armes |
Skaaz -
posté le 22/07/2012 à 00:43:25 (898 messages postés)
| Freelance | Chaös17 a dit:
|
https://www.deviantart.com/zewiskaaz |
| Chanter l'hyperchleuasme | leicsirg a dit: si j'ai du temps je l'introduirais. |
|
Es-tu une star ? | Kujira no Hara | Muma|Rope | Polaris 03 | La 7e porte |
Roys -
posté le 08/10/2012 à 08:13:06 (359 messages postés)
| Geex Creator | Comment n'y ai-je pas pensé plus tôt.
Du coup je l'ai ajouté dans Geex...mais en utilisant les pixel shader ^^, donc en plus on peut faire des "displacement"/"refraction" etc
|
Zeus81 -
posté le 08/10/2012 à 12:32:33 (11071 messages postés)
| | D'ailleurs un truc que tu peux faire que j'avais la flemme d'implémenter c'est la possibilité de faire des rotations sur le masque, ça peut donner des trucs sympas.
|
Roys -
posté le 09/10/2012 à 23:15:03 (359 messages postés)
| Geex Creator | ouip, bon moi je balance une Texture2D dans un pixel shader..Donc envoyer une texture en rotation ca ne me vient pas spontanement là...faudra que je m'y penche dessus
Mais plus intéressant, j'ai ajouté des effets de Blur, Glow, Distortion..et ce que tu appelles picture scrolling, que moi j'ai appelé fog Car en fait c'est une sorte de fog mais sur un sprite non
Du coup j'ai en profité pour ajouter une commande geex.make pour appliquer l'effet a soit : la map, un event, une picture
|
Zeus81 -
posté le 10/10/2012 à 16:29:24 (11071 messages postés)
| | Oui un fog qui ne s'étend pas sur tout l'écran, j'ai pas réussi à trouver de titre plus descriptif.
|
Jibtou -
posté le 17/06/2013 à 15:33:08 (2 messages postés)
| | Bonjour, petit up du camarade du dessus pour vous rappeler que le lien de la DLL est mort.
J'aurais bien voulu utiliser ce script
|
StorminGame -
posté le 21/11/2013 à 22:06:09 (1 messages postés)
| Retour aux sources | Hello !
au risque de me faire taper les doights pour le nécropost (délai 3 mois si j'ai bon souvenirs)
je vous fait part de mon problème, ce script est juste parfait je me demandais justement comment affichier des images sublimant mes maps sans qu'elle soit forcément au dessus de tout et en mouvement synchronisé avec les mouvements du héros donc déjà merci Zeus encore un bête de script super utile,
bref je m'explique :
Chez moi Aucune image ne s'affiche comme si l'event n'existait même pas, j'ai beau avoir fait tout pareil que ta description je ne peux y remédier..
J'a créer une MAP test où je veux effectuer en 1 le même effet que sur la fenêtre dans ta description, et en 2 l'effet de la fumée dans la grotte.
donc voici l'event que j'ai creer, conformément a tes instructions. j'y ai ajouter un message "done" pour être sûr que l'event ce déclenche (bah quoi on sait jamais)
et donc en jeu rien ne ce passe :
je tiens a précisé que j'ai bien le fichier .dll, moi pas conpremdre
merci d'avance.
|
--Stormy-- |
Skaaz -
posté le 17/07/2014 à 16:56:30 (898 messages postés)
| Freelance | UP
|
https://www.deviantart.com/zewiskaaz |
glad300 -
posté le 21/09/2014 à 12:42:28 (11 messages postés)
| | Les deux liens de la dll sont morts X(
|
Le train de tes insultes roule sur les rails savonnées de mon indifférence et s'arrête au butoir de mon dépit... |
Kreiss -
posté le 25/01/2016 à 19:32:46 (46 messages postés)
| | Peut-être que tu devrais fournir une démo Zeus81 ?
|
Kreiss -
posté le 25/01/2016 à 20:29:59 (46 messages postés)
| | C'est vraiment étrange... j'ai beau copier exactement le même code de la démo.
Mais rien à faire.
Les images ne s'affichent pas.
Est-ce que c'est un problème de version de rmxp ? (J'ai la 1.03)
|
zeus81 -
posté le 25/01/2016 à 21:24:22 (11071 messages postés)
| | Est-ce que t'as bien copier les images du dossier Pictures et la dll ?
|
Kreiss -
posté le 25/01/2016 à 21:29:00 (46 messages postés)
| | Oui, j'ai tout fait comme il faut.
|
zeus81 -
posté le 25/01/2016 à 21:48:55 (11071 messages postés)
| | Euh et l'event en proc parallèle ?
Parce que je vois pas là.
|
Kreiss -
posté le 25/01/2016 à 21:55:54 (46 messages postés)
| | Ah bah j'ai trouvé... le script entre en confusion avec ton script "Resolution Changer Ultimate v1.1".
C'est vraiment dommage...
|
zeus81 -
posté le 25/01/2016 à 23:09:40 (11071 messages postés)
| | Ah oui, mais si tu changes l'ordre des scripts, tu mets Scroll Pictures après Resolution Changer, ça marche.
| |
|
|