|
TSDA XP Ace Maping - Utiliser les maps de RPG Maker XP sur VX Ace
Par thiago_d_d
Vous avez un peu de mal avec le système de maping de VX Ace et celui de XP vous manque ? (Comme moi)
Et bien ce script est fait pour vous.
Le script chargera les maps, les tilesets et les autotiles fabriqués avec RPG Maker XP.
I- Installation
Vous devez installer ces deux scripts dans leur version respective. (L'instruction dans ces scripts est en portugais, mais je vous l'expliquerai en français)
Le premier est pour RPG Maker XP
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
| #==============================================================================
# XP Ace Mapping
# RMXP part
# by thiago_d_d
# Tilemap class by ____
#==============================================================================
# Com esse script, você poderá mapear usando o XP para criar mapas de VX Ace!
#==============================================================================
# Para instalar coloque o script acima de Main.
#==============================================================================
# Como fazer a conversão:
# Instale o script RMVXAce part no seu projeto do rmvx ace, primeiramente. Não se
# esqueça, use pasta separadas para o projeto do xp e o do vx ace.
#
# Para cada mapa no vx ace, você deverá criar um mapa de igual tamanho no XP. Os
# dois devem ter a mesma ID.
#
# Mapeie normalmente no xp, lembrando que os eventos que você colocar no
# mapa do XP não funcionarão no Ace. Se for necessário colocar eventos,
# coloque no Ace, gravando qual a posição em que o evento deverá ser colocado.
# A única coisa para que servirá o uso do XP será para mapear: apenas
# as passagens do tileset e sua aparência serão colocados no mapa pronto
# do vx ace.
#
# Após terminar de mapear, desca o script que voce está lendo agora, até achar
# uma parte em que está MAPS = [1]. Coloque entre os colchetes a ID do mapa em
# questão. Lembrando que entre os colchetes deve estar todas as IDs de todos
# os mapas que serão convertidos para o vx ace, separados por vÃrgula, no modelo:
# MAPS = [1,2,3,....999]
#
# Coloque os gráficos de tileset e autotiles na pasta Graphics\Tilesets e
# Graphics\Autotiles do projeto de VX Ace.
#
# Em seguida, execute o projeto do XP e espere até que a title seja carregada.
# Após isso, copie os arquivos TilesetsXP.rxdata e Map"ID do mapa"XP.rxdata
# na pasta Data no projeto do XP e copie para a pasta Data no projeto
# do ace. Pronto!
#==============================================================================
module TSDA
#Coloque a ID dos mapas a serem convertidos
MAPS = [1]
end
class TilesetXP
attr_accessor :id
attr_accessor :name
attr_accessor :tileset_name
attr_accessor :autotile_names
attr_accessor :priorities
attr_accessor :terrain_tags
attr_accessor :flags
def initialize(til)
@id = til.id
@name = til.name
@tileset_name = til.tileset_name
@autotile_names = til.autotile_names
@priorities = til.priorities
@terrain_tags = til.terrain_tags
@flags = til.passages
convert
end
def convert
for i in 0...@priorities.xsize
v = @flags[i]
if i == 0
v |= 0x10
else
v &= ~0x10
end
@flags[i] = v
end
end
end
class MapXP
def initialize(map)
@tileset_id = map.tileset_id
@width = map.width
@height = map.height
@data = map.data
end
attr_accessor :tileset_id
attr_accessor :width
attr_accessor :height
attr_accessor :data
end
def initialize_maps
data_tilesets = load_data("Data/Tilesets.rxdata")
for map in TSDA::MAPS
m = load_data(sprintf("Data/Map%03d.rxdata", map))
mapxp = MapXP.new(m)
save_data(mapxp,sprintf("Data/Map%03dXP.rxdata", map))
end
data_tilesetsxp = []
for til in 0...data_tilesets.size
next if data_tilesets[til].nil?
tilesetxp = TilesetXP.new(data_tilesets[til])
data_tilesetsxp[til] = tilesetxp
end
save_data(data_tilesetsxp,"Data/TilesetsXP.rxdata")
end
initialize_maps |
Le second est pour RPG Maker VX Ace
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
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
| #==============================================================================
# XP Ace Mapping
# RMVXAce part
# by thiago_d_d
#==============================================================================
# Para instalar coloque o script acima de Main(é importante que esteja após
# todos os scripts)
#==============================================================================
module Cache
def self.tilesetxp(filename)
load_bitmap("Graphics/Tilesets/", filename)
end
def self.autotile(filename)
load_bitmap("Graphics/Autotiles/", filename)
end
end
class TilesetXP
attr_accessor :id
attr_accessor :name
attr_accessor :tileset_name
attr_accessor :autotile_names
attr_accessor :priorities
attr_accessor :terrain_tags
attr_accessor :flags
end
class MapXP
attr_accessor :tileset_id
attr_accessor :width
attr_accessor :height
attr_accessor :data
end
module DataManager
class << self
alias load_normal_database_comp load_normal_database
def load_normal_database
load_normal_database_comp
$data_tilesetsxp = load_data("Data/TilesetsXP.rxdata")
end
end
end
class Game_CharacterBase
def screen_z
tile? ? (return (@priority_type + 1) * 150) : (return (@priority_type) * 150)
end
end
class Sprite_Character
def tileset_bitmap(tile_id)
Cache.tileset($game_map.tilesetoriginal.tileset_names[5 + tile_id / 256])
end
end
class Game_Map
alias game_map_xp_comp setup
alias tilesetoriginal tileset
def setup(map_id)
@mapxp = load_data(sprintf("Data/Map%03dXP.rxdata", map_id))
@tilesetxp = $data_tilesetsxp[@mapxp.tileset_id]
game_map_xp_comp(map_id)
end
def tileset_namexp
@tilesetxp.tileset_name
end
def autotile_namesxp
@tilesetxp.autotile_names
end
def tileset
@tilesetxp
end
def priorities
@tilesetxp.priorities
end
def dataxp
@mapxp.data
end
def tile_id(x, y, z)
dataxp[x,y,z]
end
def layered_tiles(x, y)
[2, 1, 0].collect {|z| tile_id(x, y, z) }
end
def check_passage(x, y, bit)
v = tile_events_xy(x, y).collect {|ev| ev.tile_id }
v.each do |tile_id|
flag = tilesetoriginal.flags[tile_id]
next if flag & 0x10 != 0
return false if flag & bit == bit
end
for i in [2, 1, 0]
tile_id = tile_id(x,y,i)
if tile_id == nil
return false
elsif tileset.flags[tile_id] & bit != 0
return false
elsif tileset.flags[tile_id] & 0x0f == 0x0f
return false
elsif tileset.priorities[tile_id] == 0
return true
end
end
end
end
class Spriteset_Map
def create_tilemap
load_tilemap
load_tileset
end
def load_tilemap
dispose_tilemap unless @tilemap.nil?
at = []
for i in 0..6
autotile_name = $game_map.autotile_namesxp[i]
at[i] = Cache.autotile(autotile_name)
end
@tilemap = Tilemap.new(@viewport1)
@tilemap.tileset = Cache.tileset($game_map.tileset_namexp)
for i in 0..6
autotile_name = $game_map.autotile_namesxp[i]
@tilemap.autotiles[i] = Cache.autotile(autotile_name)
end
@tilemap.map_data = $game_map.dataxp
@tilemap.priorities = $game_map.priorities
end
def dispose_tilemap
@tilemap.tileset.dispose
for i in 0..6
@tilemap.autotiles[i].dispose
end
@tilemap.dispose
end
def load_tileset
@tileset = $game_map.tileset
end
def update_tileset
if @tileset != $game_map.tileset
load_tileset
refresh_characters
end
end
def update_tilemap
if @map_id != $game_map.map_id
load_tilemap
end
@tilemap.ox = $game_map.display_x * 32
@tilemap.oy = $game_map.display_y * 32
@tilemap.update
end
end
class Tilemap
attr_accessor :viewport
attr_accessor :ox
attr_accessor :oy
attr_accessor :tileset
attr_accessor :autotiles
attr_accessor :map_data
attr_reader :priorities
attr_reader :visible
Autotiles = [
[ [27, 28, 33, 34], [ 5, 28, 33, 34], [27, 6, 33, 34], [ 5, 6, 33, 34],
[27, 28, 33, 12], [ 5, 28, 33, 12], [27, 6, 33, 12], [ 5, 6, 33, 12] ],
[ [27, 28, 11, 34], [ 5, 28, 11, 34], [27, 6, 11, 34], [ 5, 6, 11, 34],
[27, 28, 11, 12], [ 5, 28, 11, 12], [27, 6, 11, 12], [ 5, 6, 11, 12] ],
[ [25, 26, 31, 32], [25, 6, 31, 32], [25, 26, 31, 12], [25, 6, 31, 12],
[15, 16, 21, 22], [15, 16, 21, 12], [15, 16, 11, 22], [15, 16, 11, 12] ],
[ [29, 30, 35, 36], [29, 30, 11, 36], [ 5, 30, 35, 36], [ 5, 30, 11, 36],
[39, 40, 45, 46], [ 5, 40, 45, 46], [39, 6, 45, 46], [ 5, 6, 45, 46] ],
[ [25, 30, 31, 36], [15, 16, 45, 46], [13, 14, 19, 20], [13, 14, 19, 12],
[17, 18, 23, 24], [17, 18, 11, 24], [41, 42, 47, 48], [ 5, 42, 47, 48] ],
[ [37, 38, 43, 44], [37, 6, 43, 44], [13, 18, 19, 24], [13, 14, 43, 44],
[37, 42, 43, 48], [17, 18, 47, 48], [13, 18, 43, 48], [ 1, 2, 7, 8] ] ]
def initialize(viewport)
@viewport = viewport
@map_data = nil
@autotiles = []
@real_map_data = nil
@bitmaps = []
@sprites = nil
@disposed = false
@ox = 0
@oy = 0
@autotile_sprites = {}
@anim_list = []
@stored_autotiles = {}
@stored_tiles = {}
@visible = true
@anim_count = 0
@anim_list = []
end
def priorities=(v)
@priorities = v
refresh
end
def refresh
@stored_tiles = {}
@stored_autotiles = {}
@map_data = @real_map_data
@autotile_max_count = []
@autotile_count = []
@sprites = []
@anim_list = []
create_sprites
end
def map_data=(data)
@real_map_data = data
end
def map_data
@real_map_data
end
def create_sprites
for i in 0..6
@autotile_max_count[i] = @autotiles[i].width / 96
@autotile_count[i] = 0
end
@sprites = []
for z in 0...3
for x in 0...@map_data.xsize
for y in 0...@map_data.ysize
tile_id = @map_data[x,y,z]
next if tile_id.nil? or tile_id == 0
if tile_id < 384
create_at(x,y,tile_id,z)
else
create_t(x,y,tile_id,z)
end
end
end
end
update_sprites
end
def create_at(x,y,id,z)
count = @autotile_count[id / 48 - 1]
string = "##{id}##{count}"
string2 = "##{x}##{y}##{z}"
if @stored_autotiles[string].nil?
autotile = @autotiles[id / 48 - 1]
tid = id % 48
bitmap = Bitmap.new(32,32)
tiles = Autotiles[tid / 8][tid % 8]
anim = count * 96
for i in 0...4
tile_position = tiles[i] - 1
src_rect = Rect.new(tile_position % 6 * 16 + anim, tile_position / 6 * 16, 16, 16)
bitmap.blt(i % 2 * 16, i / 2 * 16, autotile, src_rect)
end
@stored_autotiles[string] = bitmap
end
if @autotile_sprites[string2].nil?
sp = Sprite.new(@viewport)
sp.x = x * 32
sp.y = y * 32
c = @priorities[id]
c += 1 if c > 0
sp.z = 150 * c
@autotile_sprites[string2] = sp
@anim_list.push([x,y,id,z])
end
@autotile_sprites[string2].bitmap = @stored_autotiles[string]
end
def create_t(x,y,id,z)
string = "##{id}"
if @stored_tiles[string].nil?
rect = Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32, 32, 32)
bt = Bitmap.new(32,32)
bt.blt(0,0,@tileset,rect)
@stored_tiles[string] = bt
end
sp = Sprite.new(@viewport)
sp.x = x * 32
sp.y = y * 32
c = @priorities[id]
c += 1 if c > 0
sp.z = 150 * c
sp.bitmap = @stored_tiles[string]
@sprites.push(sp)
end
def update
return if disposed?
if @map_data != @real_map_data
refresh
end
@anim_count += 1
if @anim_count >= 15
@anim_count = 0
for i in 0..6
@autotile_count[i] += 1
@autotile_count[i] = 0 if @autotile_count[i] >= @autotile_max_count[i]
end
for b in @anim_list
create_at(b[0],b[1],b[2],b[3])
end
end
end
def update_sprites
@autotile_sprites.each_value{|v|v.ox = @ox;v.oy = @oy;v.visible = @visible}
for sp in @sprites;sp.ox = @ox;sp.oy = @oy;sp.visible = @visible;end
end
def dispose
dispose_sprites unless @sprites.nil?
@disposed = true
end
def disposed?
@disposed
end
def ox=(v)
@ox = v
update_sprites
end
def oy=(v)
@oy = v
update_sprites
end
def visible=(v)
@visible = v
update_sprites
end
def dispose_sprites
unless @sprites.nil?
for element in @sprites
element.dispose unless element.nil?
end
@sprites = nil
end
@autotile_sprites.each_value{|sprite|sprite.dispose unless sprite.nil?}
@autotile_sprites = {}
GC.start
end
end |
II - Comment ça marche ?
Avec RPG Maker XP :
Vous devez créer un nouveau projet et installer le premier script, rendez-vous à la ligne 41 où vous mettez l'id des maps que vous souhaitez convertir. (Par exemple "MAPS = [1,2,3,4,8]")
Faites simplement votre map, sauvegardez puis testez le projet et fermez le test.
Allez dans le dossier "Data" et vous verrez qu'il y a des fichiers supplémentaires :
- TilesetsXP.rxdata sont là où les tilesets de XP s'y trouvent.
- MapIDXP.rxdata ce sont les maps qui sont convertis pour VX Ace.
Il est inutile de créer les events et de mettre les panoramas/fogs dessus, ce script ne chargera que la tilemap.
Avec RPG Maker VX Ace :
Vous copiez ces fichiers ci-dessus dans le dossier "Data" de votre projet ainsi que le les graphismes utilisés pour les tilesets sur XP. (Pour les autotiles, vous devez créer un dossier "Autotiles" dans le dossier graphique de votre projet.
Lancez et normalement, RPG Maker VX Ace chargera la map correspondante. (La tilemap de VX Ace ne sera pas pris en compte)
III - Petit correctif
Le seul truc que je reprochais à ce script, c'est que les tiles qui ont ☆1, ☆2, ☆3, ☆4 ou ☆5 en priorité de superposition s'afficheront au dessus du héro quoi qu'il arrive.
J'ai modifié comme j'ai pu le script de VX Ace pour corriger ça, par exemple, les tiles qui ont ☆1 en superposition seront sous ou sur l'event s'il est en bas ou en haut :
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
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
| #==============================================================================
# XP Ace Mapping
# RMVXAce part
# by thiago_d_d
#==============================================================================
# Para instalar coloque o script acima de Main(é importante que esteja após
# todos os scripts)
#==============================================================================
# Edited by Erwill
#==============================================================================
module Cache
def self.tilesetxp(filename)
load_bitmap("Graphics/Tilesets/", filename)
end
def self.autotile(filename)
load_bitmap("Graphics/Autotiles/", filename)
end
end
class TilesetXP
attr_accessor :id
attr_accessor :name
attr_accessor :tileset_name
attr_accessor :autotile_names
attr_accessor :priorities
attr_accessor :terrain_tags
attr_accessor :flags
end
class MapXP
attr_accessor :tileset_id
attr_accessor :width
attr_accessor :height
attr_accessor :data
end
module DataManager
class << self
alias load_normal_database_comp load_normal_database
def load_normal_database
load_normal_database_comp
$data_tilesetsxp = load_data("Data/TilesetsXP.rxdata")
end
end
end
class Game_CharacterBase
def screen_z
if @priority_type==2
tile? ? (return (@priority_type*2 + 1) * 150 + @y*160) : (return (@priority_type*2) * 150 + @y*160)
else
tile? ? (return (@priority_type + 1) * 150 + @y*160) : (return (@priority_type) * 150 + @y*160)
end
end
end
class Sprite_Character
def tileset_bitmap(tile_id)
Cache.tileset($game_map.tilesetoriginal.tileset_names[5 + tile_id / 256])
end
end
class Game_Map
alias game_map_xp_comp setup
alias tilesetoriginal tileset
def setup(map_id)
@mapxp = load_data(sprintf("Data/Map%03dXP.rxdata", map_id))
@tilesetxp = $data_tilesetsxp[@mapxp.tileset_id]
game_map_xp_comp(map_id)
end
def tileset_namexp
@tilesetxp.tileset_name
end
def autotile_namesxp
@tilesetxp.autotile_names
end
def tileset
@tilesetxp
end
def priorities
@tilesetxp.priorities
end
def dataxp
@mapxp.data
end
def tile_id(x, y, z)
dataxp[x,y,z]
end
def layered_tiles(x, y)
[2, 1, 0].collect {|z| tile_id(x, y, z) }
end
def check_passage(x, y, bit)
v = tile_events_xy(x, y).collect {|ev| ev.tile_id }
v.each do |tile_id|
flag = tilesetoriginal.flags[tile_id]
next if flag & 0x10 != 0
return false if flag & bit == bit
end
for i in [2, 1, 0]
tile_id = tile_id(x,y,i)
if tile_id == nil
return false
elsif tileset.flags[tile_id] & bit != 0
return false
elsif tileset.flags[tile_id] & 0x0f == 0x0f
return false
elsif tileset.priorities[tile_id] == 0
return true
end
end
end
end
class Spriteset_Map
def create_tilemap
load_tilemap
load_tileset
end
def load_tilemap
dispose_tilemap unless @tilemap.nil?
at = []
for i in 0..6
autotile_name = $game_map.autotile_namesxp[i]
at[i] = Cache.autotile(autotile_name)
end
@tilemap = Tilemap.new(@viewport1)
@tilemap.tileset = Cache.tileset($game_map.tileset_namexp)
for i in 0..6
autotile_name = $game_map.autotile_namesxp[i]
@tilemap.autotiles[i] = Cache.autotile(autotile_name)
end
@tilemap.map_data = $game_map.dataxp
@tilemap.priorities = $game_map.priorities
end
def dispose_tilemap
@tilemap.tileset.dispose
for i in 0..6
@tilemap.autotiles[i].dispose
end
@tilemap.dispose
end
def load_tileset
@tileset = $game_map.tileset
end
def update_tileset
if @tileset != $game_map.tileset
load_tileset
refresh_characters
end
end
def update_tilemap
if @map_id != $game_map.map_id
load_tilemap
end
@tilemap.ox = $game_map.display_x * 32
@tilemap.oy = $game_map.display_y * 32
@tilemap.update
end
end
class Tilemap
attr_accessor :viewport
attr_accessor :ox
attr_accessor :oy
attr_accessor :tileset
attr_accessor :autotiles
attr_accessor :map_data
attr_reader :priorities
attr_reader :visible
Autotiles = [
[ [27, 28, 33, 34], [ 5, 28, 33, 34], [27, 6, 33, 34], [ 5, 6, 33, 34],
[27, 28, 33, 12], [ 5, 28, 33, 12], [27, 6, 33, 12], [ 5, 6, 33, 12] ],
[ [27, 28, 11, 34], [ 5, 28, 11, 34], [27, 6, 11, 34], [ 5, 6, 11, 34],
[27, 28, 11, 12], [ 5, 28, 11, 12], [27, 6, 11, 12], [ 5, 6, 11, 12] ],
[ [25, 26, 31, 32], [25, 6, 31, 32], [25, 26, 31, 12], [25, 6, 31, 12],
[15, 16, 21, 22], [15, 16, 21, 12], [15, 16, 11, 22], [15, 16, 11, 12] ],
[ [29, 30, 35, 36], [29, 30, 11, 36], [ 5, 30, 35, 36], [ 5, 30, 11, 36],
[39, 40, 45, 46], [ 5, 40, 45, 46], [39, 6, 45, 46], [ 5, 6, 45, 46] ],
[ [25, 30, 31, 36], [15, 16, 45, 46], [13, 14, 19, 20], [13, 14, 19, 12],
[17, 18, 23, 24], [17, 18, 11, 24], [41, 42, 47, 48], [ 5, 42, 47, 48] ],
[ [37, 38, 43, 44], [37, 6, 43, 44], [13, 18, 19, 24], [13, 14, 43, 44],
[37, 42, 43, 48], [17, 18, 47, 48], [13, 18, 43, 48], [ 1, 2, 7, 8] ] ]
def initialize(viewport)
@viewport = viewport
@map_data = nil
@autotiles = []
@real_map_data = nil
@bitmaps = []
@sprites = nil
@disposed = false
@ox = 0
@oy = 0
@autotile_sprites = {}
@anim_list = []
@stored_autotiles = {}
@stored_tiles = {}
@visible = true
@anim_count = 0
@anim_list = []
end
def priorities=(v)
@priorities = v
refresh
end
def refresh
@stored_tiles = {}
@stored_autotiles = {}
@map_data = @real_map_data
@autotile_max_count = []
@autotile_count = []
@sprites = []
@anim_list = []
create_sprites
end
def map_data=(data)
@real_map_data = data
end
def map_data
@real_map_data
end
def create_sprites
for i in 0..6
@autotile_max_count[i] = @autotiles[i].width / 96
@autotile_count[i] = 0
end
@sprites = []
for z in 0...3
for x in 0...@map_data.xsize
for y in 0...@map_data.ysize
tile_id = @map_data[x,y,z]
next if tile_id.nil? or tile_id == 0
if tile_id < 384
create_at(x,y,tile_id,z)
else
create_t(x,y,tile_id,z)
end
end
end
end
update_sprites
end
def create_at(x,y,id,z)
count = @autotile_count[id / 48 - 1]
string = "##{id}##{count}"
string2 = "##{x}##{y}##{z}"
if @stored_autotiles[string].nil?
autotile = @autotiles[id / 48 - 1]
tid = id % 48
bitmap = Bitmap.new(32,32)
tiles = Autotiles[tid / 8][tid % 8]
anim = count * 96
for i in 0...4
tile_position = tiles[i] - 1
src_rect = Rect.new(tile_position % 6 * 16 + anim, tile_position / 6 * 16, 16, 16)
bitmap.blt(i % 2 * 16, i / 2 * 16, autotile, src_rect)
end
@stored_autotiles[string] = bitmap
end
if @autotile_sprites[string2].nil?
sp = Sprite.new(@viewport)
sp.x = x * 32
sp.y = y * 32
c = @priorities[id]
c += 1 if c > 0
sp.z = 150 * c
@autotile_sprites[string2] = sp
@anim_list.push([x,y,id,z])
end
@autotile_sprites[string2].bitmap = @stored_autotiles[string]
end
def create_t(x,y,id,z)
string = "##{id}"
if @stored_tiles[string].nil?
rect = Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32, 32, 32)
bt = Bitmap.new(32,32)
bt.blt(0,0,@tileset,rect)
@stored_tiles[string] = bt
end
sp = Sprite.new(@viewport)
sp.x = x * 32
sp.y = y * 32
if @priorities[id]==0
c = @priorities[id]
else
c = @priorities[id]+y
end
c += 1 if c > 0
sp.z = 150 * c
sp.bitmap = @stored_tiles[string]
@sprites.push(sp)
end
def update
return if disposed?
if @map_data != @real_map_data
refresh
end
@anim_count += 1
if @anim_count >= 15
@anim_count = 0
for i in 0..6
@autotile_count[i] += 1
@autotile_count[i] = 0 if @autotile_count[i] >= @autotile_max_count[i]
end
for b in @anim_list
create_at(b[0],b[1],b[2],b[3])
end
end
end
def update_sprites
@autotile_sprites.each_value{|v|v.ox = @ox;v.oy = @oy;v.visible = @visible}
for sp in @sprites;sp.ox = @ox;sp.oy = @oy;sp.visible = @visible;end
end
def dispose
dispose_sprites unless @sprites.nil?
@disposed = true
end
def disposed?
@disposed
end
def ox=(v)
@ox = v
update_sprites
end
def oy=(v)
@oy = v
update_sprites
end
def visible=(v)
@visible = v
update_sprites
end
def dispose_sprites
unless @sprites.nil?
for element in @sprites
element.dispose unless element.nil?
end
@sprites = nil
end
@autotile_sprites.each_value{|sprite|sprite.dispose unless sprite.nil?}
@autotile_sprites = {}
GC.start
end
end |
IV - Source
https://www.rpgmakercentral.com/topic/18978-tsda-xp-ace-maping-create-your-maps-using-rmxp/
|