ruby-miyako-mswin32 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. data/README +275 -20
  2. data/install_miyako.rb +5 -3
  3. data/lib/Miyako/API/audio.rb +11 -6
  4. data/lib/Miyako/API/basic_data.rb +0 -985
  5. data/lib/Miyako/API/bitmap.rb +19 -22
  6. data/lib/Miyako/API/choices.rb +203 -69
  7. data/lib/Miyako/API/collision.rb +451 -9
  8. data/lib/Miyako/API/color.rb +177 -0
  9. data/lib/Miyako/API/diagram.rb +18 -20
  10. data/lib/Miyako/API/fixedmap.rb +207 -73
  11. data/lib/Miyako/API/font.rb +111 -18
  12. data/lib/Miyako/API/i_yuki.rb +1201 -0
  13. data/lib/Miyako/API/input.rb +65 -0
  14. data/lib/Miyako/API/layout.rb +41 -29
  15. data/lib/Miyako/API/map.rb +202 -157
  16. data/lib/Miyako/API/map_event.rb +86 -19
  17. data/lib/Miyako/API/map_struct.rb +268 -0
  18. data/lib/Miyako/API/modules.rb +136 -37
  19. data/lib/Miyako/API/movie.rb +8 -8
  20. data/lib/Miyako/API/parts.rb +63 -20
  21. data/lib/Miyako/API/plane.rb +4 -4
  22. data/lib/Miyako/API/screen.rb +16 -8
  23. data/lib/Miyako/API/sprite.rb +290 -23
  24. data/lib/Miyako/API/sprite_animation.rb +23 -11
  25. data/lib/Miyako/API/sprite_list.rb +406 -183
  26. data/lib/Miyako/API/story.rb +4 -65
  27. data/lib/Miyako/API/struct_point.rb +157 -0
  28. data/lib/Miyako/API/struct_rect.rb +233 -0
  29. data/lib/Miyako/API/struct_segment.rb +641 -0
  30. data/lib/Miyako/API/struct_size.rb +158 -0
  31. data/lib/Miyako/API/struct_square.rb +253 -0
  32. data/lib/Miyako/API/textbox.rb +49 -35
  33. data/lib/Miyako/API/viewport.rb +5 -5
  34. data/lib/Miyako/API/wait_counter.rb +350 -0
  35. data/lib/Miyako/API/yuki.rb +95 -60
  36. data/lib/Miyako/EXT/raster_scroll.rb +30 -8
  37. data/lib/Miyako/EXT/slides.rb +6 -6
  38. data/lib/Miyako/miyako.rb +25 -11
  39. data/lib/Miyako/miyako_no_katana.so +0 -0
  40. data/lib/miyako.rb +28 -0
  41. data/lib/miyako_require_only.rb +35 -0
  42. data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
  43. data/sample/Room3/blue.rb +19 -19
  44. data/sample/Room3/green.rb +9 -9
  45. data/sample/Room3/main.rb +12 -12
  46. data/sample/Room3/red.rb +12 -12
  47. data/sample/Room3/title.rb +15 -10
  48. data/sample/collision_test2.rb +2 -1
  49. data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
  50. data/sample/map_test/main_scene.rb +12 -10
  51. data/sample/map_test/map_manager.rb +14 -13
  52. data/sample/rasterscroll.rb +5 -5
  53. data/sample/takahashi.rb +3 -3
  54. data/sample/textbox_sample.rb +8 -5
  55. data/sample/transform.rb +2 -1
  56. data/uninstall_miyako.rb +4 -1
  57. metadata +13 -4
  58. data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
  59. data/sample/cairo_sample.rb +0 -25
@@ -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, :pos, :size, :w, :h
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
- #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
173
+ #指定の位置のマップチップ番号が以下の時はfalseを返す
174
+ #1)-1(未定義)のとき
175
+ #2)FixexMapLayer#ignore_listに含まれているとき
176
+ #3)引数ignoresに含まれているとき
163
177
  #_type_:: 移動形式(0以上の整数)
164
178
  #_pos_:: 調査対象のマップチップの位置
165
179
  #_collision_:: キャラクタのコリジョン
166
- #_rect_:: キャラクタの矩形
180
+ #_cpos_:: キャラクタの位置
181
+ #_ignores_:: コリジョンの対象にしないマップチップ番号のリスト
167
182
  #返却値:: コリジョンが重なっていればtrueを返す
168
- def collision?(type, pos, collision, rect)
183
+ def collision?(type, pos, collision, cpos, *ignores)
169
184
  code = get_code(*pos.to_a)
170
- return false if code == -1
171
- return @mapchip.collision_table[type][code].collision?(pos, collision, rect)
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
- #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
192
+ #指定の位置のマップチップ番号が以下の時はfalseを返す
193
+ #1)-1(未定義)のとき
194
+ #2)FixexMapLayer#ignore_listに含まれているとき
195
+ #3)引数ignoresに含まれているとき
178
196
  #_type_:: 移動形式(0以上の整数)
179
197
  #_pos_:: 調査対象のマップチップの位置
180
198
  #_collision_:: キャラクタのコリジョン
181
- #_rect_:: キャラクタの矩形
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 == -1
186
- return @mapchip.collision_table[type][code].meet?(pos, collision, rect)
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
- #指定の位置のマップチップ番号が-1(未定義)のときはfalseを返す
211
+ #指定の位置のマップチップ番号が以下の時はfalseを返す
212
+ #1)-1(未定義)のとき
213
+ #2)FixexMapLayer#ignore_listに含まれているとき
214
+ #3)引数ignoresに含まれているとき
193
215
  #_type_:: 移動形式(0以上の整数)
194
216
  #_pos_:: 調査対象のマップチップの位置
195
217
  #_collision_:: キャラクタのコリジョン
196
- #_rect_:: キャラクタの矩形
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 == -1
201
- return @mapchip.collision_table[type][code].cover?(pos, collision, rect)
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
- #指定の位置のマップチップ番号が-1(未定義)のとき、移動していない(dx==0 and dy==0)ときはtrueを返す
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 == -1
216
- index = AccessIndex.index2(inout, dx, dy)
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
- #_layer_csv_:: レイヤーファイル(CSVファイル)
262
- #_event_manager_:: MapEventManagerクラスのインスタンス
292
+ #_map_struct_:: MapStruct構造体のインスタンス
293
+ #_event_manager_:: MapEventManagerクラスのインスタンス。省略時(イベントを使わない時)はnil
263
294
  #返却値:: 生成したインスタンス
264
- def initialize(mapchips, layer_csv, event_manager)
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
- @event_layers = []
269
- @em = event_manager.dup
270
- @em.set(self)
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
- layers = layer_data.shift[0].to_i
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
- evlist = []
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
- evlist.each{|events|
302
- event_layer = Array.new
303
- events.each_with_index{|ly, y|
304
- ly.each_with_index{|code, x|
305
- next unless @em.include?(code)
306
- event_layer.push(@em.create(code, x * @mapchips.first.chip_size.w, y * @mapchips.first.chip_size.h))
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
- @event_layers << event_layer
310
- }
324
+ end
325
+
326
+ @event_layers << [] if @event_layers.empty?
311
327
 
312
328
  mc = @mapchips.cycle
313
- @mapchips = mc.take(layers)
329
+ @mapchips = mc.take(map_struct.layer_num)
314
330
  @map_layers = []
315
- brlist.each{|br|
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, @size))
333
+ @map_layers.push(FixedMapLayer.new(mc.next, br, @map_size))
318
334
  }
319
- set_layout_size(@w, @h)
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
- @size = @size.dup
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
- return self unless @em.include?(code)
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
@@ -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)