ruby-miyako 2.1.0 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +275 -20
- data/extern.h +21 -1
- data/install_miyako.rb +5 -3
- data/lib/Miyako/API/audio.rb +11 -6
- data/lib/Miyako/API/basic_data.rb +0 -985
- data/lib/Miyako/API/bitmap.rb +19 -22
- data/lib/Miyako/API/choices.rb +203 -69
- data/lib/Miyako/API/collision.rb +451 -9
- data/lib/Miyako/API/color.rb +177 -0
- data/lib/Miyako/API/diagram.rb +18 -20
- data/lib/Miyako/API/fixedmap.rb +207 -73
- data/lib/Miyako/API/font.rb +111 -18
- data/lib/Miyako/API/i_yuki.rb +1201 -0
- data/lib/Miyako/API/input.rb +65 -0
- data/lib/Miyako/API/layout.rb +41 -29
- data/lib/Miyako/API/map.rb +202 -157
- data/lib/Miyako/API/map_event.rb +86 -19
- data/lib/Miyako/API/map_struct.rb +268 -0
- data/lib/Miyako/API/modules.rb +136 -37
- data/lib/Miyako/API/movie.rb +8 -8
- data/lib/Miyako/API/parts.rb +63 -20
- data/lib/Miyako/API/plane.rb +4 -4
- data/lib/Miyako/API/screen.rb +16 -8
- data/lib/Miyako/API/sprite.rb +290 -23
- data/lib/Miyako/API/sprite_animation.rb +23 -11
- data/lib/Miyako/API/sprite_list.rb +406 -183
- data/lib/Miyako/API/story.rb +4 -65
- data/lib/Miyako/API/struct_point.rb +157 -0
- data/lib/Miyako/API/struct_rect.rb +233 -0
- data/lib/Miyako/API/struct_segment.rb +641 -0
- data/lib/Miyako/API/struct_size.rb +158 -0
- data/lib/Miyako/API/struct_square.rb +253 -0
- data/lib/Miyako/API/textbox.rb +49 -35
- data/lib/Miyako/API/viewport.rb +5 -5
- data/lib/Miyako/API/wait_counter.rb +350 -0
- data/lib/Miyako/API/yuki.rb +95 -60
- data/lib/Miyako/EXT/raster_scroll.rb +30 -8
- data/lib/Miyako/EXT/slides.rb +6 -6
- data/lib/Miyako/miyako.rb +25 -11
- data/lib/miyako.rb +28 -0
- data/lib/miyako_require_only.rb +35 -0
- data/miyako_basicdata.c +201 -17
- data/miyako_collision.c +315 -6
- data/miyako_diagram.c +331 -0
- data/miyako_drawing.c +26 -7
- data/miyako_font.c +259 -129
- data/miyako_input_audio.c +24 -14
- data/miyako_layout.c +106 -8
- data/miyako_no_katana.c +398 -171
- data/miyako_sprite2.c +275 -38
- data/miyako_transform.c +113 -107
- data/miyako_utility.c +34 -48
- data/miyako_yuki.c +241 -0
- data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
- data/sample/Room3/blue.rb +19 -19
- data/sample/Room3/green.rb +9 -9
- data/sample/Room3/main.rb +12 -12
- data/sample/Room3/red.rb +12 -12
- data/sample/Room3/title.rb +15 -10
- data/sample/collision_test2.rb +2 -1
- data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
- data/sample/map_test/main_scene.rb +12 -10
- data/sample/map_test/map_manager.rb +14 -13
- data/sample/rasterscroll.rb +5 -5
- data/sample/takahashi.rb +3 -3
- data/sample/textbox_sample.rb +7 -6
- data/sample/transform.rb +2 -1
- data/uninstall_miyako.rb +4 -1
- data/win/miyako_no_katana.so +0 -0
- metadata +15 -4
- data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
- data/sample/cairo_sample.rb +0 -25
data/lib/Miyako/API/fixedmap.rb
CHANGED
@@ -29,12 +29,12 @@ module Miyako
|
|
29
29
|
include SpriteBase
|
30
30
|
include Animation
|
31
31
|
include Layout
|
32
|
-
|
32
|
+
|
33
33
|
@@idx_ix = [-1, 2, 4]
|
34
34
|
@@idx_iy = [-1, 0, 6]
|
35
35
|
|
36
36
|
attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
|
37
|
-
attr_reader :name, :map_layers, :mapchips, :
|
37
|
+
attr_reader :name, :map_layers, :mapchips, :map_size, :map_w, :map_h
|
38
38
|
|
39
39
|
#==あとで書く
|
40
40
|
class FixedMapLayer #:nodoc: all
|
@@ -43,10 +43,10 @@ module Miyako
|
|
43
43
|
extend Forwardable
|
44
44
|
|
45
45
|
@@use_chip_list = Hash.new(nil)
|
46
|
-
|
46
|
+
|
47
47
|
attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
|
48
48
|
attr_accessor :mapchip, :mapchip_units
|
49
|
-
attr_reader :pos
|
49
|
+
attr_reader :pos, :ignore_list
|
50
50
|
|
51
51
|
def round(v, max) #:nodoc:
|
52
52
|
v = max + (v % max) if v < 0
|
@@ -90,9 +90,11 @@ module Miyako
|
|
90
90
|
:ox => (idx % @mapchip.size.w) * @ow, :oy => (idx / @mapchip.size.w) * @oh,
|
91
91
|
:ow => @ow, :oh => @oh)
|
92
92
|
}
|
93
|
+
@def_ignore = -1
|
94
|
+
@ignore_list = []
|
93
95
|
reSize
|
94
96
|
end
|
95
|
-
|
97
|
+
|
96
98
|
def initialize_copy(obj) #:nodoc:
|
97
99
|
@mapchip = @mapchip.dup
|
98
100
|
@size = @size.dup
|
@@ -130,6 +132,15 @@ module Miyako
|
|
130
132
|
@modpy2[round(y, @size.h)])
|
131
133
|
end
|
132
134
|
|
135
|
+
#===レイヤー配列を取得する
|
136
|
+
#レイヤーを構成している配列を取得する
|
137
|
+
#取得した配列にアクセスするときの書式は、以下のようになる。
|
138
|
+
#layer[y][x]
|
139
|
+
#返却値:: 所持しているレイヤー配列
|
140
|
+
def layer
|
141
|
+
@mapdat
|
142
|
+
end
|
143
|
+
|
133
144
|
#===指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す
|
134
145
|
#但し、引数には、Rect(x,y,w,h)形式のインスタンスを渡す
|
135
146
|
#_rect_:: キャラクタの矩形
|
@@ -159,61 +170,79 @@ module Miyako
|
|
159
170
|
#===キャラクタとマップチップが重なっているかどうか問い合わせる
|
160
171
|
#指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと重なっているかどうか問い合わせる
|
161
172
|
#引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
|
162
|
-
|
173
|
+
#指定の位置のマップチップ番号が以下の時はfalseを返す
|
174
|
+
#1)-1(未定義)のとき
|
175
|
+
#2)FixexMapLayer#ignore_listに含まれているとき
|
176
|
+
#3)引数ignoresに含まれているとき
|
163
177
|
#_type_:: 移動形式(0以上の整数)
|
164
178
|
#_pos_:: 調査対象のマップチップの位置
|
165
179
|
#_collision_:: キャラクタのコリジョン
|
166
|
-
#
|
180
|
+
#_cpos_:: キャラクタの位置
|
181
|
+
#_ignores_:: コリジョンの対象にしないマップチップ番号のリスト
|
167
182
|
#返却値:: コリジョンが重なっていればtrueを返す
|
168
|
-
def collision?(type, pos, collision,
|
183
|
+
def collision?(type, pos, collision, cpos, *ignores)
|
169
184
|
code = get_code(*pos.to_a)
|
170
|
-
return false if code ==
|
171
|
-
return @mapchip.collision_table[type][code].collision?(pos, collision,
|
185
|
+
return false if (code == @def_ignore or @ignore_list.include?(code) or ignores.flatten.include?(code))
|
186
|
+
return @mapchip.collision_table[type][code].collision?(pos, collision, cpos)
|
172
187
|
end
|
173
188
|
|
174
189
|
#===キャラクタとマップチップが隣り合っているかどうか問い合わせる
|
175
190
|
#指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと隣り合っているかどうか問い合わせる
|
176
191
|
#引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
|
177
|
-
|
192
|
+
#指定の位置のマップチップ番号が以下の時はfalseを返す
|
193
|
+
#1)-1(未定義)のとき
|
194
|
+
#2)FixexMapLayer#ignore_listに含まれているとき
|
195
|
+
#3)引数ignoresに含まれているとき
|
178
196
|
#_type_:: 移動形式(0以上の整数)
|
179
197
|
#_pos_:: 調査対象のマップチップの位置
|
180
198
|
#_collision_:: キャラクタのコリジョン
|
181
|
-
#
|
199
|
+
#_cpos_:: キャラクタの位置
|
200
|
+
#_ignores_:: コリジョンの対象にしないマップチップ番号のリスト
|
182
201
|
#返却値:: コリジョンが隣り合っていればtrueを返す
|
183
|
-
def meet?(type, pos, collision, rect)
|
202
|
+
def meet?(type, pos, collision, rect, *ignores)
|
184
203
|
code = get_code(*pos.to_a)
|
185
|
-
return false if code ==
|
186
|
-
return @mapchip.collision_table[type][code].meet?(pos, collision,
|
204
|
+
return false if (code == @def_ignore or @ignore_list.include?(code) or ignores.flatten.include?(code))
|
205
|
+
return @mapchip.collision_table[type][code].meet?(pos, collision, cpos)
|
187
206
|
end
|
188
207
|
|
189
208
|
#===キャラクタとマップチップが覆い被さっているかどうか問い合わせる
|
190
209
|
#指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンを覆い被さっているかどうか問い合わせる
|
191
210
|
#引数は、Rect(x,y,w,h)形式(Rect構造体、[x,y,w,h]の配列)で渡す
|
192
|
-
|
211
|
+
#指定の位置のマップチップ番号が以下の時はfalseを返す
|
212
|
+
#1)-1(未定義)のとき
|
213
|
+
#2)FixexMapLayer#ignore_listに含まれているとき
|
214
|
+
#3)引数ignoresに含まれているとき
|
193
215
|
#_type_:: 移動形式(0以上の整数)
|
194
216
|
#_pos_:: 調査対象のマップチップの位置
|
195
217
|
#_collision_:: キャラクタのコリジョン
|
196
|
-
#
|
218
|
+
#_cpos_:: キャラクタの位置
|
219
|
+
#_ignores_:: コリジョンの対象にしないマップチップ番号のリスト
|
197
220
|
#返却値:: どちらかのコリジョンが覆い被さっていればtrueを返す
|
198
|
-
def cover?(type, pos, collision, rect)
|
221
|
+
def cover?(type, pos, collision, rect, *ignores)
|
199
222
|
code = get_code(*pos.to_a)
|
200
|
-
return false if code ==
|
201
|
-
return @mapchip.collision_table[type][code].cover?(pos, collision,
|
223
|
+
return false if (code == @def_ignore or @ignore_list.include?(code) or ignores.flatten.include?(code))
|
224
|
+
return @mapchip.collision_table[type][code].cover?(pos, collision, cpos)
|
202
225
|
end
|
203
226
|
|
204
227
|
#===キャラクタとマップチップが重なっているかどうか問い合わせる
|
205
228
|
#指定の位置と方向で、指定の位置のマップチップ上で移動できるかどうか問い合わせる
|
206
|
-
|
229
|
+
#指定の位置のマップチップ番号が以下の時はtrueを返す
|
230
|
+
#1)-1(未定義)のとき
|
231
|
+
#2)FixexMapLayer#ignore_listに含まれているとき
|
232
|
+
#3)引数ignoresに含まれているとき
|
233
|
+
#また、dx==0, dy==0のときもtrueを返す
|
207
234
|
#_type_:: 移動形式(0以上の整数)
|
208
235
|
#_inout_:: 入退形式(:in もしくは :out)
|
209
236
|
#_pos_:: 調査対象のマップチップの位置
|
210
237
|
#_dx_:: 移動量(x座標)
|
211
238
|
#_dy_:: 移動量(y座標)
|
239
|
+
#_ignores_:: チェックの対象にしないマップチップ番号のリスト。番号に含まれているときはtrueを返す
|
212
240
|
#返却値:: 移動可能ならばtrueを返す
|
213
|
-
def can_access?(type, inout, pos, dx, dy)
|
241
|
+
def can_access?(type, inout, pos, dx, dy, *ignores)
|
242
|
+
return true if dx == 0 and dy == 0
|
214
243
|
code = get_code(pos[0]+dx, pos[1]+dy)
|
215
|
-
return true if code ==
|
216
|
-
index =
|
244
|
+
return true if (code == @def_ignore or @ignore_list.include?(code) or ignores.flatten.include?(code))
|
245
|
+
index = MapDir.index2(inout, dx, dy)
|
217
246
|
return true if index == -1
|
218
247
|
return @mapchip.access_table[type][code][index]
|
219
248
|
end
|
@@ -221,6 +250,8 @@ module Miyako
|
|
221
250
|
def dispose #:nodoc:
|
222
251
|
@mapdat = nil
|
223
252
|
@baseimg = nil
|
253
|
+
@ignore_list.clear
|
254
|
+
@ignore_list = []
|
224
255
|
end
|
225
256
|
|
226
257
|
#===マップレイヤーを画面に描画する
|
@@ -258,88 +289,191 @@ module Miyako
|
|
258
289
|
#先頭に戻って繰り返し渡す仕様になっている
|
259
290
|
#各MapChip構造体のマップチップの大きさを同じにしておく必要がある
|
260
291
|
#_mapchips_:: マップチップ構造体群(MapChip構造体単体もしくは配列)
|
261
|
-
#
|
262
|
-
#_event_manager_:: MapEventManager
|
292
|
+
#_map_struct_:: MapStruct構造体のインスタンス
|
293
|
+
#_event_manager_:: MapEventManagerクラスのインスタンス。省略時(イベントを使わない時)はnil
|
263
294
|
#返却値:: 生成したインスタンス
|
264
|
-
def initialize(mapchips,
|
265
|
-
raise MiyakoIOError.no_file(layer_csv) unless File.exist?(layer_csv)
|
295
|
+
def initialize(mapchips, map_struct, event_manager=nil)
|
266
296
|
init_layout
|
267
297
|
@visible = true
|
268
|
-
|
269
|
-
|
270
|
-
|
298
|
+
if event_manager
|
299
|
+
@em = event_manager.dup
|
300
|
+
@em.set(self)
|
301
|
+
else
|
302
|
+
@em = nil
|
303
|
+
end
|
271
304
|
@mapchips = mapchips.to_a
|
272
|
-
layer_data = CSV.readlines(layer_csv)
|
273
|
-
|
274
|
-
raise MiyakoFileFormatError, "This file is not Miyako Map Layer file! : #{layer_csv}" unless layer_data.shift[0] == "Miyako Maplayer"
|
275
|
-
|
276
|
-
tmp = layer_data.shift # 空行の空読み込み
|
277
|
-
|
278
|
-
@size = Size.new(tmp[0].to_i, tmp[1].to_i)
|
279
|
-
@w = @size.w * @mapchips.first.chip_size.w
|
280
|
-
@h = @size.h * @mapchips.first.chip_size.h
|
281
305
|
|
282
|
-
|
306
|
+
@map_size = map_struct.size
|
307
|
+
@map_w = @map_size.w * @mapchips.first.chip_size.w
|
308
|
+
@map_h = @map_size.h * @mapchips.first.chip_size.h
|
283
309
|
|
284
|
-
|
285
|
-
brlist = []
|
286
|
-
layers.times{|n|
|
287
|
-
name = layer_data.shift[0]
|
288
|
-
values = []
|
289
|
-
@size.h.times{|y|
|
290
|
-
values << layer_data.shift.map{|m| m.to_i}
|
291
|
-
}
|
292
|
-
if name == "<event>"
|
293
|
-
evlist << values
|
294
|
-
else
|
295
|
-
brlist << values
|
296
|
-
end
|
297
|
-
}
|
298
|
-
|
299
|
-
@event_layer = nil
|
310
|
+
@event_layers = []
|
300
311
|
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
312
|
+
if map_struct.elayers
|
313
|
+
raise MiyakoError "Event Manager is not registered!" unless @em
|
314
|
+
map_struct.elayers.each{|events|
|
315
|
+
event_layer = Array.new
|
316
|
+
events.each_with_index{|ly, y|
|
317
|
+
ly.each_with_index{|code, x|
|
318
|
+
next unless @em.include?(code)
|
319
|
+
event_layer.push(@em.create(code, x * @mapchips.first.chip_size.w, y * @mapchips.first.chip_size.h))
|
320
|
+
}
|
307
321
|
}
|
322
|
+
@event_layers << event_layer
|
308
323
|
}
|
309
|
-
|
310
|
-
|
324
|
+
end
|
325
|
+
|
326
|
+
@event_layers << [] if @event_layers.empty?
|
311
327
|
|
312
328
|
mc = @mapchips.cycle
|
313
|
-
@mapchips = mc.take(
|
329
|
+
@mapchips = mc.take(map_struct.layer_num)
|
314
330
|
@map_layers = []
|
315
|
-
|
331
|
+
map_struct.layers.each{|br|
|
316
332
|
br = br.map{|b| b.map{|bb| bb >= @mapchips.first.chips ? -1 : bb } }
|
317
|
-
@map_layers.push(FixedMapLayer.new(mc.next, br, @
|
333
|
+
@map_layers.push(FixedMapLayer.new(mc.next, br, @map_size))
|
318
334
|
}
|
319
|
-
set_layout_size(@
|
335
|
+
set_layout_size(@map_w, @map_h)
|
320
336
|
end
|
321
|
-
|
337
|
+
|
322
338
|
def initialize_copy(obj) #:nodoc:
|
323
339
|
@map_layers = @map_layers.dup
|
324
340
|
@event_layers = @event_layers.dup
|
325
|
-
@em = em.dup
|
341
|
+
@em = @em.dup if @em
|
326
342
|
@mapchips = @mapchips.dup
|
327
|
-
@
|
343
|
+
@map_size = @map_size.dup
|
328
344
|
copy_layout
|
329
345
|
end
|
330
346
|
|
331
347
|
#===マップにイベントを追加する
|
348
|
+
#イベントレイヤーでの番号はイベント番号と一致する
|
349
|
+
#ブロックを渡すと、求めたマップチップ番号をブロック引数として受け取る評価を行える
|
332
350
|
#_idx_:: 追加するイベントレイヤの指標
|
333
351
|
#_code_:: イベント番号(Map.newメソッドで渡したイベント番号に対応)
|
334
352
|
#_x_:: マップ上の位置(x方向)
|
335
353
|
#_y_:: マップ常温位置(y方向)
|
336
354
|
#返却値:: 自分自身を返す
|
337
355
|
def add_event(idx, code, x, y)
|
338
|
-
|
356
|
+
raise MiyakoError "Event Manager is not registered!" unless @em
|
357
|
+
raise MiyakoError "Unregisted event code! : #{code}" unless @em.include?(code)
|
339
358
|
@event_layers[idx].push(@em.create(code, x, y))
|
340
359
|
return self
|
341
360
|
end
|
342
361
|
|
362
|
+
#===マップに生成済みのイベントを追加する
|
363
|
+
#_idx_:: 追加するイベントレイヤの指標
|
364
|
+
#_event_:: イベント番号(Map.newメソッドで渡したイベント番号に対応)
|
365
|
+
#返却値:: 自分自身を返す
|
366
|
+
def append_event(idx, event)
|
367
|
+
@event_layers[idx].push(event)
|
368
|
+
return self
|
369
|
+
end
|
370
|
+
|
371
|
+
|
372
|
+
#===指定のレイヤーのイベントに対してupdateメソッドを呼び出す
|
373
|
+
#イベントレイヤーidxの全てのイベントに対してupdateメソッドを呼び出す
|
374
|
+
#_idx_:: 更新するイベントレイヤーの番号
|
375
|
+
#_params_:: イベントのupdateメソッドを呼び出すときに渡す引数。可変個数
|
376
|
+
#返却値:: レシーバ
|
377
|
+
def event_update(idx, *params)
|
378
|
+
@event_layers[idx].each{|event| event.update(self, @event_layers[idx], *params) }
|
379
|
+
self
|
380
|
+
end
|
381
|
+
|
382
|
+
#===全てのイベントに対してupdateメソッドを呼び出す
|
383
|
+
#全レイヤーのイベントを呼び出すことに注意
|
384
|
+
#_params_:: イベントのupdateメソッドを呼び出すときに渡す引数。可変個数
|
385
|
+
def all_event_update(*params)
|
386
|
+
@event_layers.each{|el| el.each{|event| event.update(self, el, *params) } }
|
387
|
+
self
|
388
|
+
end
|
389
|
+
|
390
|
+
#===指定のレイヤーのイベントに対してupdate2メソッドを呼び出す
|
391
|
+
#イベントレイヤーidxの全てのイベントに対してupdateメソッドを呼び出す
|
392
|
+
#_idx_:: 更新するイベントレイヤーの番号
|
393
|
+
#_params_:: イベントのupdateメソッドを呼び出すときに渡す引数。可変個数
|
394
|
+
#返却値:: レシーバ
|
395
|
+
def event_update2(idx, *params)
|
396
|
+
@event_layers[idx].each{|event| event.update2(*params) }
|
397
|
+
self
|
398
|
+
end
|
399
|
+
|
400
|
+
#===全てのイベントに対してupdate2メソッドを呼び出す
|
401
|
+
#全レイヤーのイベントを呼び出すことに注意
|
402
|
+
#_params_:: イベントのupdate2メソッドを呼び出すときに渡す引数。可変個数
|
403
|
+
def all_event_update2(*params)
|
404
|
+
@event_layers.each{|el| el.each{|event| event.update2(*params) } }
|
405
|
+
self
|
406
|
+
end
|
407
|
+
|
408
|
+
#===指定のレイヤーのイベントに対してmove!メソッドを呼び出す
|
409
|
+
#イベントレイヤーidxの全てのイベントに対してmove!メソッドを呼び出す
|
410
|
+
#_idx_:: 更新するイベントレイヤーの番号
|
411
|
+
#_dx_:: x座標の移動量
|
412
|
+
#_dy_:: y座標の移動量
|
413
|
+
#_params_:: イベントのmove!メソッドを呼び出すときに渡す引数。可変個数
|
414
|
+
#返却値:: レシーバ
|
415
|
+
def event_move!(idx, dx, dy, *params)
|
416
|
+
@event_layers[idx].each{|event| event.move!(dx, dy, *params) }
|
417
|
+
self
|
418
|
+
end
|
419
|
+
|
420
|
+
#===全てのイベントに対してmove!メソッドを呼び出す
|
421
|
+
#全レイヤーのイベントを呼び出すことに注意
|
422
|
+
#_dx_:: x座標の移動量
|
423
|
+
#_dy_:: y座標の移動量
|
424
|
+
#_params_:: イベントのmove!メソッドを呼び出すときに渡す引数。可変個数
|
425
|
+
#返却値:: レシーバ
|
426
|
+
def all_event_move!(dx, dy, *params)
|
427
|
+
@event_layers.each{|el| el.each{|event| event.move!(dx, dy, *params) } }
|
428
|
+
self
|
429
|
+
end
|
430
|
+
|
431
|
+
#===指定のレイヤーのイベントに対してsprite_move!メソッドを呼び出す
|
432
|
+
#イベントレイヤーidxの全てのイベントに対してsprite_move!メソッドを呼び出す
|
433
|
+
#_idx_:: 更新するイベントレイヤーの番号
|
434
|
+
#_dx_:: x座標の移動量
|
435
|
+
#_dy_:: y座標の移動量
|
436
|
+
#_params_:: イベントのmove!メソッドを呼び出すときに渡す引数。可変個数
|
437
|
+
#返却値:: レシーバ
|
438
|
+
def event_sprite_move!(idx, dx, dy, *params)
|
439
|
+
@event_layers[idx].each{|event| event.sprite_move!(dx, dy, *params) }
|
440
|
+
self
|
441
|
+
end
|
442
|
+
|
443
|
+
#===全てのイベントに対してsprite_move!メソッドを呼び出す
|
444
|
+
#全レイヤーのイベントを呼び出すことに注意
|
445
|
+
#_dx_:: x座標の移動量
|
446
|
+
#_dy_:: y座標の移動量
|
447
|
+
#_params_:: イベントのmove!メソッドを呼び出すときに渡す引数。可変個数
|
448
|
+
#返却値:: レシーバ
|
449
|
+
def all_event_sprite_move!(dx, dy, *params)
|
450
|
+
@event_layers.each{|el| el.each{|event| event.sprite_move!(dx, dy, *params) } }
|
451
|
+
self
|
452
|
+
end
|
453
|
+
|
454
|
+
#===指定のレイヤーのイベントに対してsprite_move!メソッドを呼び出す
|
455
|
+
#イベントレイヤーidxの全てのイベントに対してsprite_move!メソッドを呼び出す
|
456
|
+
#_idx_:: 更新するイベントレイヤーの番号
|
457
|
+
#_dx_:: x座標の移動量
|
458
|
+
#_dy_:: y座標の移動量
|
459
|
+
#_params_:: イベントのmove!メソッドを呼び出すときに渡す引数。可変個数
|
460
|
+
#返却値:: レシーバ
|
461
|
+
def event_pos_move!(idx, dx, dy, *params)
|
462
|
+
@event_layers[idx].each{|event| event.pos_move!(dx, dy, *params) }
|
463
|
+
self
|
464
|
+
end
|
465
|
+
|
466
|
+
#===全てのイベントに対してsprite_move!メソッドを呼び出す
|
467
|
+
#全レイヤーのイベントを呼び出すことに注意
|
468
|
+
#_dx_:: x座標の移動量
|
469
|
+
#_dy_:: y座標の移動量
|
470
|
+
#_params_:: イベントのmove!メソッドを呼び出すときに渡す引数。可変個数
|
471
|
+
#返却値:: レシーバ
|
472
|
+
def all_event_pos_move!(dx, dy, *params)
|
473
|
+
@event_layers.each{|el| el.each{|event| event.pos_move!(dx, dy, *params) } }
|
474
|
+
self
|
475
|
+
end
|
476
|
+
|
343
477
|
def update_layout_position #:nodoc:
|
344
478
|
@map_layers.each{|ml| ml.pos.move_to!(*@layout.pos) }
|
345
479
|
end
|
data/lib/Miyako/API/font.rb
CHANGED
@@ -28,13 +28,16 @@ module Miyako
|
|
28
28
|
フォントは、等幅フォント奨励(プロポーショナルフォントを選ぶと、文字が正しく描画されない可能性あり)
|
29
29
|
=end
|
30
30
|
class Font
|
31
|
+
include SpriteBase
|
32
|
+
include Animation
|
33
|
+
include Layout
|
31
34
|
extend Forwardable
|
32
35
|
|
33
36
|
# OS_MAC_OS_X = "mac_osx"
|
34
37
|
# ORG_ENC = "UTF-8"
|
35
38
|
# NEW_ENC = "UTF-8-MAC"
|
36
|
-
|
37
|
-
attr_reader :size, :line_skip, :height, :ascent, :descent
|
39
|
+
|
40
|
+
attr_reader :size, :line_skip, :height, :ascent, :descent, :text
|
38
41
|
attr_accessor :color, :use_shadow, :shadow_color, :shadow_margin, :vspace, :hspace
|
39
42
|
|
40
43
|
@@font_cache = {}
|
@@ -132,6 +135,7 @@ module Miyako
|
|
132
135
|
#_size_:: フォントの大きさ。単位はピクセル。デフォルトは 16
|
133
136
|
#返却値:: 生成されたインスタンスを返す
|
134
137
|
def initialize(fname, size=16)
|
138
|
+
init_layout
|
135
139
|
@size = size
|
136
140
|
@color = [255, 255, 255]
|
137
141
|
@fname = fname
|
@@ -148,6 +152,9 @@ module Miyako
|
|
148
152
|
@shadow_color = [128, 128, 128]
|
149
153
|
@shadow_margin = [2, 2]
|
150
154
|
@unit = SpriteUnitFactory.create
|
155
|
+
@text = ""
|
156
|
+
@visible = true
|
157
|
+
set_layout_size(*self.text_size(@text))
|
151
158
|
end
|
152
159
|
|
153
160
|
def initialize_copy(obj) #:nodoc:
|
@@ -157,6 +164,32 @@ module Miyako
|
|
157
164
|
@shadow_color = @shadow_color.dup
|
158
165
|
@shadow_margin = @shadow_margin.dup
|
159
166
|
@unit = @unit.dup
|
167
|
+
@text = @text.dup
|
168
|
+
end
|
169
|
+
|
170
|
+
#===描画可能・不可状態を返す
|
171
|
+
#描画可能の時はtrue、不可能なときはfalseを返す
|
172
|
+
#返却値:: true/falseを返す
|
173
|
+
def visible
|
174
|
+
return @visible
|
175
|
+
end
|
176
|
+
|
177
|
+
#===描画可能・不可状態を設定する
|
178
|
+
#描画可能の時はtrue、不可能なときはfalseを渡す
|
179
|
+
#返却値:: 自分自身を返す
|
180
|
+
def visible=(v)
|
181
|
+
@visible = v
|
182
|
+
return self
|
183
|
+
end
|
184
|
+
|
185
|
+
#===描画する文字列を変更する
|
186
|
+
#_str_:: 描画する文字列。文字列以外でも、to_sメソッドで文字列、endocdeメソッドでUTF-8に変換する
|
187
|
+
#返却値:: 自分自身を返す
|
188
|
+
def text=(str)
|
189
|
+
@text = str.to_s
|
190
|
+
@text = @text.encode(Encoding::UTF_8)
|
191
|
+
set_layout_size(*self.text_size(@text))
|
192
|
+
return self
|
160
193
|
end
|
161
194
|
|
162
195
|
#===フォントの大きさを変更する
|
@@ -165,10 +198,11 @@ module Miyako
|
|
165
198
|
def size=(sz)
|
166
199
|
@size = sz
|
167
200
|
@font = Font.get_font_inner(@fname, @fpath, @size)
|
168
|
-
@font.style = (@bold ? SDL::TTF::STYLE_BOLD : 0) |
|
201
|
+
@font.style = (@bold ? SDL::TTF::STYLE_BOLD : 0) |
|
169
202
|
(@italic ? SDL::TTF::STYLE_ITALIC : 0) |
|
170
203
|
(@under_line ? SDL::TTF::STYLE_UNDERLINE : 0)
|
171
204
|
init_height
|
205
|
+
set_layout_size(*self.text_size(@text))
|
172
206
|
return self
|
173
207
|
end
|
174
208
|
|
@@ -218,9 +252,9 @@ module Miyako
|
|
218
252
|
def get_fit_size(size)
|
219
253
|
path = Font.findFontPath(@fname)
|
220
254
|
font = SDL::TTF.open(path, size)
|
221
|
-
return (size.to_f * (size.to_f / font.line_skip.to_f)).to_i
|
255
|
+
return (size.to_f * (size.to_f / font.line_skip.to_f)).to_i
|
222
256
|
end
|
223
|
-
|
257
|
+
|
224
258
|
#===フォントサイズ(yやjなどの下にはみ出る箇所も算出)を取得する
|
225
259
|
#返却値:: 算出されたフォントサイズ
|
226
260
|
def line_height
|
@@ -246,13 +280,13 @@ module Miyako
|
|
246
280
|
end
|
247
281
|
return self
|
248
282
|
end
|
249
|
-
|
283
|
+
|
250
284
|
#===フォントのbold属性の有無を返す
|
251
285
|
#返却値:: bold属性かどうか(true/false)
|
252
286
|
def bold?
|
253
287
|
return @bold
|
254
288
|
end
|
255
|
-
|
289
|
+
|
256
290
|
#===フォントのbold属性を設定する
|
257
291
|
#_f_:: bold属性かどうか(true/false)
|
258
292
|
def bold=(f)
|
@@ -261,7 +295,7 @@ module Miyako
|
|
261
295
|
@font.style -= SDL::TTF::STYLE_BOLD unless @bold
|
262
296
|
return self
|
263
297
|
end
|
264
|
-
|
298
|
+
|
265
299
|
#===フォントの属性をitalic(斜め)に設定する
|
266
300
|
#ブロックを渡したときは、ブロック評価中のみ斜体文字になる
|
267
301
|
#文字が領域外にはみ出る場合があるので注意!
|
@@ -276,13 +310,13 @@ module Miyako
|
|
276
310
|
end
|
277
311
|
return self
|
278
312
|
end
|
279
|
-
|
313
|
+
|
280
314
|
#===フォントのitalic属性の有無を返す
|
281
315
|
#返却値:: italic属性かどうか(true/false)
|
282
316
|
def italic?
|
283
317
|
return @italic
|
284
318
|
end
|
285
|
-
|
319
|
+
|
286
320
|
#===フォントのitalic属性を設定する
|
287
321
|
#_f_:: italic属性かどうか(true/false)
|
288
322
|
def italic=(f)
|
@@ -291,7 +325,7 @@ module Miyako
|
|
291
325
|
@font.style -= SDL::TTF::STYLE_ITALIC unless @italic
|
292
326
|
return self
|
293
327
|
end
|
294
|
-
|
328
|
+
|
295
329
|
#===フォントの属性をunder_line(下線)に設定する
|
296
330
|
#ブロックを渡したときは、ブロック評価中のみ下線付き文字になる
|
297
331
|
#返却値:: 自分自身
|
@@ -305,13 +339,13 @@ module Miyako
|
|
305
339
|
end
|
306
340
|
return self
|
307
341
|
end
|
308
|
-
|
342
|
+
|
309
343
|
#===フォントのunder_line属性の有無を返す
|
310
344
|
#返却値:: under_line属性かどうか(true/false)
|
311
345
|
def under_line?
|
312
346
|
return @under_line
|
313
347
|
end
|
314
|
-
|
348
|
+
|
315
349
|
#===フォントのunder_line属性を設定する
|
316
350
|
#_f_:: under_line属性かどうか(true/false)
|
317
351
|
def under_line=(f)
|
@@ -327,7 +361,7 @@ module Miyako
|
|
327
361
|
@font.style = 0
|
328
362
|
return self
|
329
363
|
end
|
330
|
-
|
364
|
+
|
331
365
|
#===文字列を描画する
|
332
366
|
#対象のスプライトに文字列を描画する
|
333
367
|
#_dst_:: 描画先スプライト
|
@@ -358,6 +392,65 @@ module Miyako
|
|
358
392
|
return x
|
359
393
|
end
|
360
394
|
|
395
|
+
#===文字列を画面に描画する
|
396
|
+
#返却値:: 自分自身を返す
|
397
|
+
def render
|
398
|
+
return self unless @visible
|
399
|
+
draw_text(Screen, @text, @layout[:pos][0], @layout[:pos][1])
|
400
|
+
return self
|
401
|
+
end
|
402
|
+
|
403
|
+
#===文字列をスプライトに描画する
|
404
|
+
#_dst_:: 描画先スプライト
|
405
|
+
#返却値:: 自分自身を返す
|
406
|
+
def render_to(dst)
|
407
|
+
return self unless @visible
|
408
|
+
draw_text(dst, @text, @layout[:pos][0], @layout[:pos][1])
|
409
|
+
return self
|
410
|
+
end
|
411
|
+
|
412
|
+
#===文字列を画面の指定の位置に描画する
|
413
|
+
#_x_:: x方向位置
|
414
|
+
#_y_:: y方向位置
|
415
|
+
#返却値:: 自分自身を返す
|
416
|
+
def render_xy(x, y)
|
417
|
+
return self unless @visible
|
418
|
+
draw_text(Screen, @text, x, y)
|
419
|
+
return self
|
420
|
+
end
|
421
|
+
|
422
|
+
#===文字列をスプライトの指定の位置に描画する
|
423
|
+
#_dst_:: 描画先スプライト
|
424
|
+
#_x_:: x方向位置
|
425
|
+
#_y_:: y方向位置
|
426
|
+
#返却値:: 自分自身を返す
|
427
|
+
def render_xy_to(dst, x, y)
|
428
|
+
return self unless @visible
|
429
|
+
draw_text(dst, @text, x, y)
|
430
|
+
return self
|
431
|
+
end
|
432
|
+
|
433
|
+
#===文字列を画面に描画する
|
434
|
+
#引数textは、内部でto_sメソッドを呼び出して文字列化している
|
435
|
+
#_text_:: 描画対象の文字列
|
436
|
+
#返却値:: 自分自身を返す
|
437
|
+
def render_str(text)
|
438
|
+
return self unless @visible
|
439
|
+
draw_text(Screen, text.to_s, @layout[:pos][0], @layout[:pos][1])
|
440
|
+
return self
|
441
|
+
end
|
442
|
+
|
443
|
+
#===文字列をスプライトに描画する
|
444
|
+
#引数textは、内部でto_sメソッドを呼び出して文字列化している
|
445
|
+
#_dst_:: 描画先スプライト
|
446
|
+
#_text_:: 描画対象の文字列
|
447
|
+
#返却値:: 自分自身を返す
|
448
|
+
def render_str_to(dst, text)
|
449
|
+
return self unless @visible
|
450
|
+
draw_text(dst, text.to_s, @layout[:pos][0], @layout[:pos][1])
|
451
|
+
return self
|
452
|
+
end
|
453
|
+
|
361
454
|
#===文字列描画したときの大きさを取得する
|
362
455
|
#現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。
|
363
456
|
#_txt_:: 算出したい文字列
|
@@ -365,7 +458,7 @@ module Miyako
|
|
365
458
|
def chr_size_inner(char)
|
366
459
|
return (char.bytesize == 1 ? @size >> 1 : @size) + (@use_shadow ? @shadow_margin[0] : 0) + @hspace
|
367
460
|
end
|
368
|
-
|
461
|
+
|
369
462
|
private :chr_size_inner
|
370
463
|
|
371
464
|
#===文字列描画したときの大きさを取得する
|
@@ -374,11 +467,11 @@ module Miyako
|
|
374
467
|
#返却値:: 文字列を描画したときの大きさ([w,h]の配列)
|
375
468
|
def text_size(txt)
|
376
469
|
width = txt.chars.inject(0){|r, c|
|
377
|
-
r += (c.bytesize == 1 ? @size >> 1 : @size) } +
|
470
|
+
r += (c.bytesize == 1 ? @size >> 1 : @size) } +
|
378
471
|
((@use_shadow ? @shadow_margin[0] : 0) + @hspace) * (txt.chars.to_a.length - 1)
|
379
472
|
return [width, self.line_height]
|
380
473
|
end
|
381
|
-
|
474
|
+
|
382
475
|
#===指定した高さで描画する際のマージンを求める
|
383
476
|
#現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。
|
384
477
|
#第1引数に渡す"align"は、以下の3種類のシンボルのどれかを渡す
|
@@ -417,7 +510,7 @@ module Miyako
|
|
417
510
|
#返却値:: OSごとに設定されたフォントイン寸タンス(フォントサイズは16)
|
418
511
|
def Font::sans_serif
|
419
512
|
filename = @@font_base_name[Miyako::getOSName].
|
420
|
-
detect{|base|
|
513
|
+
detect{|base|
|
421
514
|
Font.findFontPath(base[:sans_serif])
|
422
515
|
}[:sans_serif]
|
423
516
|
return Font.new(filename)
|