cyross-ruby-miyako-mswin32 2.0.5
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.
- data/README +929 -0
- data/img/cursor.png +0 -0
- data/img/cursors.png +0 -0
- data/img/dice.png +0 -0
- data/img/wait_cursor.png +0 -0
- data/img/win_base.png +0 -0
- data/img/window.png +0 -0
- data/install_miyako.rb +61 -0
- data/lib/Miyako/API/audio.rb +198 -0
- data/lib/Miyako/API/basic_data.rb +573 -0
- data/lib/Miyako/API/bitmap.rb +507 -0
- data/lib/Miyako/API/choices.rb +475 -0
- data/lib/Miyako/API/collision.rb +460 -0
- data/lib/Miyako/API/diagram.rb +561 -0
- data/lib/Miyako/API/drawing.rb +151 -0
- data/lib/Miyako/API/fixedmap.rb +428 -0
- data/lib/Miyako/API/font.rb +403 -0
- data/lib/Miyako/API/input.rb +447 -0
- data/lib/Miyako/API/layout.rb +433 -0
- data/lib/Miyako/API/map.rb +529 -0
- data/lib/Miyako/API/map_event.rb +198 -0
- data/lib/Miyako/API/modules.rb +109 -0
- data/lib/Miyako/API/movie.rb +154 -0
- data/lib/Miyako/API/parts.rb +189 -0
- data/lib/Miyako/API/plane.rb +166 -0
- data/lib/Miyako/API/screen.rb +325 -0
- data/lib/Miyako/API/shape.rb +443 -0
- data/lib/Miyako/API/sprite.rb +752 -0
- data/lib/Miyako/API/sprite_animation.rb +481 -0
- data/lib/Miyako/API/spriteunit.rb +147 -0
- data/lib/Miyako/API/story.rb +300 -0
- data/lib/Miyako/API/textbox.rb +725 -0
- data/lib/Miyako/API/utility.rb +388 -0
- data/lib/Miyako/API/viewport.rb +140 -0
- data/lib/Miyako/API/yuki.rb +996 -0
- data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
- data/lib/Miyako/EXT/raster_scroll.rb +138 -0
- data/lib/Miyako/EXT/slides.rb +157 -0
- data/lib/Miyako/miyako.rb +171 -0
- data/lib/Miyako/miyako_no_katana.so +0 -0
- data/logo/EGSR_logo.png +0 -0
- data/logo/EGSR_logo_bg.png +0 -0
- data/logo/EGSR_logo_fg.png +0 -0
- data/logo/EGSR_title_banner.png +0 -0
- data/logo/EGSR_title_logo.png +0 -0
- data/logo/miyako.png +0 -0
- data/logo/miyako_banner.png +0 -0
- data/logo/space.png +0 -0
- data/sample/Animation1/m1ku.rb +68 -0
- data/sample/Animation1/m1ku_arm_0.png +0 -0
- data/sample/Animation1/m1ku_arm_1.png +0 -0
- data/sample/Animation1/m1ku_arm_2.png +0 -0
- data/sample/Animation1/m1ku_arm_3.png +0 -0
- data/sample/Animation1/m1ku_back.jpg +0 -0
- data/sample/Animation1/m1ku_body.png +0 -0
- data/sample/Animation1/m1ku_eye_0.png +0 -0
- data/sample/Animation1/m1ku_eye_1.png +0 -0
- data/sample/Animation1/m1ku_eye_2.png +0 -0
- data/sample/Animation1/m1ku_eye_3.png +0 -0
- data/sample/Animation1/m1ku_hair_front.png +0 -0
- data/sample/Animation1/m1ku_hair_rear.png +0 -0
- data/sample/Animation1/readme.txt +72 -0
- data/sample/Animation2/lex.rb +96 -0
- data/sample/Animation2/lex_back.png +0 -0
- data/sample/Animation2/lex_body.png +0 -0
- data/sample/Animation2/lex_roadroller.png +0 -0
- data/sample/Animation2/lex_wheel_0.png +0 -0
- data/sample/Animation2/lex_wheel_1.png +0 -0
- data/sample/Animation2/lex_wheel_2.png +0 -0
- data/sample/Animation2/readme.txt +72 -0
- data/sample/Animation2/song_title.png +0 -0
- data/sample/Diagram_sample/back.png +0 -0
- data/sample/Diagram_sample/chr01.png +0 -0
- data/sample/Diagram_sample/chr02.png +0 -0
- data/sample/Diagram_sample/cursor.png +0 -0
- data/sample/Diagram_sample/diagram_sample_yuki2.rb +387 -0
- data/sample/Diagram_sample/readme.txt +90 -0
- data/sample/Diagram_sample/wait_cursor.png +0 -0
- data/sample/Room3/blue.rb +297 -0
- data/sample/Room3/ending.rb +180 -0
- data/sample/Room3/green.rb +220 -0
- data/sample/Room3/image/akamatsu.png +0 -0
- data/sample/Room3/image/aoyama.png +0 -0
- data/sample/Room3/image/congra.png +0 -0
- data/sample/Room3/image/congratulation.png +0 -0
- data/sample/Room3/image/congratulation_bg.png +0 -0
- data/sample/Room3/image/cursor.png +0 -0
- data/sample/Room3/image/midori.png +0 -0
- data/sample/Room3/image/mittsu_no_oheya.png +0 -0
- data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
- data/sample/Room3/image/room_blue.png +0 -0
- data/sample/Room3/image/room_green.png +0 -0
- data/sample/Room3/image/room_red.png +0 -0
- data/sample/Room3/image/start.png +0 -0
- data/sample/Room3/image/three_doors.png +0 -0
- data/sample/Room3/image/wait_cursor.png +0 -0
- data/sample/Room3/main.rb +120 -0
- data/sample/Room3/main_component.rb +59 -0
- data/sample/Room3/readme.txt +76 -0
- data/sample/Room3/red.rb +227 -0
- data/sample/Room3/room3.rb +27 -0
- data/sample/Room3/title.rb +184 -0
- data/sample/ball_action_sample.rb +204 -0
- data/sample/blit_rop.rb +70 -0
- data/sample/cairo_sample.rb +25 -0
- data/sample/circle_collision_test.rb +62 -0
- data/sample/collision_test.rb +33 -0
- data/sample/collision_test2.rb +104 -0
- data/sample/fixed_map_test/cursor.png +0 -0
- data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
- data/sample/fixed_map_test/map.csv +19 -0
- data/sample/fixed_map_test/map_01.png +0 -0
- data/sample/fixed_map_test/mapchip.csv +23 -0
- data/sample/fixed_map_test/monster.png +0 -0
- data/sample/fixed_map_test/readme.txt +72 -0
- data/sample/map_test/chara.rb +58 -0
- data/sample/map_test/chr1.png +0 -0
- data/sample/map_test/cursor.png +0 -0
- data/sample/map_test/main_parts.rb +69 -0
- data/sample/map_test/main_scene.rb +153 -0
- data/sample/map_test/map.png +0 -0
- data/sample/map_test/map2.png +0 -0
- data/sample/map_test/map_layer.csv +127 -0
- data/sample/map_test/map_manager.rb +75 -0
- data/sample/map_test/map_test.rb +23 -0
- data/sample/map_test/mapchip.csv +21 -0
- data/sample/map_test/oasis.rb +71 -0
- data/sample/map_test/readme.txt +89 -0
- data/sample/map_test/route.rb +157 -0
- data/sample/map_test/sea.png +0 -0
- data/sample/map_test/town.rb +74 -0
- data/sample/map_test/wait_cursor.png +0 -0
- data/sample/map_test/window.png +0 -0
- data/sample/polygon_test.rb +35 -0
- data/sample/rasterscroll.rb +25 -0
- data/sample/takahashi.rb +42 -0
- data/sample/text.png +0 -0
- data/sample/textbox_sample.rb +190 -0
- data/sample/transform.rb +54 -0
- data/sample/utility_test.rb +73 -0
- data/sample/utility_test2.rb +61 -0
- data/sample/utility_test3.rb +64 -0
- data/sample/utility_test4.rb +73 -0
- data/uninstall_miyako.rb +19 -0
- metadata +196 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
=begin
|
|
3
|
+
--
|
|
4
|
+
Miyako v2.0
|
|
5
|
+
Copyright (C) 2007-2009 Cyross Makoto
|
|
6
|
+
|
|
7
|
+
This library is free software; you can redistribute it and/or
|
|
8
|
+
modify it under the terms of the GNU Lesser General Public
|
|
9
|
+
License as published by the Free Software Foundation; either
|
|
10
|
+
version 2.1 of the License, or (at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This library is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
15
|
+
Lesser General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU Lesser General Public
|
|
18
|
+
License along with this library; if not, write to the Free Software
|
|
19
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
20
|
+
++
|
|
21
|
+
=end
|
|
22
|
+
|
|
23
|
+
# フォント関連クラス(群)
|
|
24
|
+
module Miyako
|
|
25
|
+
|
|
26
|
+
=begin rdoc
|
|
27
|
+
==フォント管理クラス
|
|
28
|
+
フォントは、等幅フォント奨励(プロポーショナルフォントを選ぶと、文字が正しく描画されない可能性あり)
|
|
29
|
+
=end
|
|
30
|
+
class Font
|
|
31
|
+
extend Forwardable
|
|
32
|
+
|
|
33
|
+
# OS_MAC_OS_X = "mac_osx"
|
|
34
|
+
# ORG_ENC = "UTF-8"
|
|
35
|
+
# NEW_ENC = "UTF-8-MAC"
|
|
36
|
+
|
|
37
|
+
attr_reader :size, :line_skip, :height, :ascent, :descent
|
|
38
|
+
attr_accessor :color, :use_shadow, :shadow_color, :shadow_margin, :vspace, :hspace
|
|
39
|
+
|
|
40
|
+
@@font_cache = {}
|
|
41
|
+
|
|
42
|
+
@@name_2_font_path = Hash.new
|
|
43
|
+
|
|
44
|
+
@@font_base_path = Hash.new
|
|
45
|
+
@@font_base_path["win"] = ENV['SystemRoot'] ? ["./", ENV['SystemRoot'].tr("\\", "/") + "/fonts/"] : ["./"]
|
|
46
|
+
@@font_base_path["linux"] = ["./", "/usr/share/fonts/", "/usr/X11R6/lib/X11/fonts/"]
|
|
47
|
+
@@font_base_path["mac_osx"] = ["./", "~/Library/Fonts/", "/Library/Fonts/", "/System/Library/Fonts/",
|
|
48
|
+
"/ライブラリ/Fonts/", "/システム/ライブラリ/Fonts/"]
|
|
49
|
+
|
|
50
|
+
@@font_base_name = Hash.new
|
|
51
|
+
@@font_base_name["win"] = [{:serif=>"msmincho.ttc", :sans_serif=>"msgothic.ttc"},
|
|
52
|
+
{:serif=>"VL-Gothic-Regular.ttf", :sans_serif=>"VL-Gothic-Regular.ttf"},
|
|
53
|
+
{:serif=>"umeplus-gothic.ttf", :sans_serif=>"umeplus-gothic.ttf"},
|
|
54
|
+
{:serif=>"msmincho.ttc", :sans_serif=>"meiryo.ttc"}]
|
|
55
|
+
@@font_base_name["linux"] = [{:serif=>"sazanami-mincho.ttf", :sans_serif=>"sazanami-gothic.ttf"},
|
|
56
|
+
{:serif=>"VL-Gothic-Regular.ttf", :sans_serif=>"VL-Gothic-Regular.ttf"},
|
|
57
|
+
{:serif=>"umeplus-gothic.ttf", :sans_serif=>"umeplus-gothic.ttf"}]
|
|
58
|
+
@@font_base_name["mac_osx"] = [{:serif=>"Hiragino Mincho Pro W3.otf", :sans_serif=>"Hiragino Kaku Gothic Pro W3.otf"},
|
|
59
|
+
{:serif=>"Hiragino Mincho Pro W6.otf", :sans_serif=>"Hiragino Kaku Gothic Pro W6.otf"},
|
|
60
|
+
{:serif=>"ヒラギノ明朝 Pro W3.otf", :sans_serif=>"ヒラギノ角ゴ Pro W3.otf"},
|
|
61
|
+
{:serif=>"ヒラキ゛ノ明朝 Pro W3.otf", :sans_serif=>"ヒラキ゛ノ角コ゛ Pro W3.otf"},
|
|
62
|
+
{:serif=>"ヒラギノ明朝 Pro W6.otf", :sans_serif=>"ヒラギノ角ゴ Pro W6.otf"},
|
|
63
|
+
{:serif=>"ヒラキ゛ノ明朝 Pro W6.otf", :sans_serif=>"ヒラキ゛ノ角コ゛ Pro W6.otf"},
|
|
64
|
+
{:serif=>"VL-Gothic-Regular.ttf", :sans_serif=>"VL-Gothic-Regular.ttf"},
|
|
65
|
+
{:serif=>"umeplus-gothic.ttf", :sans_serif=>"umeplus-gothic.ttf"}]
|
|
66
|
+
|
|
67
|
+
def Font.search_font_path_file(hash, path) #:nodoc:
|
|
68
|
+
Dir.glob(path+"*"){|d|
|
|
69
|
+
hash = Font.search_font_path_file(hash, d+"/") if test(?d, d)
|
|
70
|
+
d = d.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
|
|
71
|
+
d = d.tr("\\", "\/")
|
|
72
|
+
hash[$1] = d if (d =~ /\/([^\/\.]+\.tt[fc])\z/ || d =~ /\/([^\/\.]+\.otf)\z/) # MacOSX対応
|
|
73
|
+
}
|
|
74
|
+
return hash
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def Font.create_font_path #:nodoc:
|
|
78
|
+
osn = Miyako::getOSName
|
|
79
|
+
@@font_base_path[osn].each{|path|
|
|
80
|
+
path = path.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
|
|
81
|
+
path = path.tr("\\", "\/")
|
|
82
|
+
@@name_2_font_path = Font.search_font_path_file(@@name_2_font_path, path)
|
|
83
|
+
}
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def Font.findFontPath(fname) #:nodoc:
|
|
87
|
+
fname = fname.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
|
|
88
|
+
return @@name_2_font_path.fetch(fname, nil)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def Font.get_font_inner(fname, fpath, size=16) #:nodoc:
|
|
92
|
+
if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
|
|
93
|
+
fname = fname.encode(Encoding::UTF_8)
|
|
94
|
+
fpath = fpath.encode(Encoding::UTF_8)
|
|
95
|
+
end
|
|
96
|
+
@@font_cache[fname] ||= {}
|
|
97
|
+
@@font_cache[fname][size] ||= SDL::TTF.open(fpath, size)
|
|
98
|
+
return @@font_cache[fname][size]
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def init_height #:nodoc:
|
|
102
|
+
@line_skip = @font.line_skip
|
|
103
|
+
@height = @font.height
|
|
104
|
+
@ascent = @font.ascent
|
|
105
|
+
@descent = @font.descent
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
private :init_height
|
|
109
|
+
|
|
110
|
+
#===インスタンス生成
|
|
111
|
+
#指定したフォントファイル名から、フォントインスタンスを生成する。
|
|
112
|
+
#フォントファイルのパスは、Miyako2.0起動時にファイルパス(カレントディレクトリとシステムのフォントディレクトリ)を
|
|
113
|
+
#再帰的に検索し、先に見つけた方を採用する(同一ファイル名がカレントディレクトリとシステムのディレクトリに両方
|
|
114
|
+
#存在するときは、カレントディレクトリを優先する)
|
|
115
|
+
#そのため、フォントファイル名は、パスを指定する必要がない(逆に言うと、パスを指定すると例外が発生する)。
|
|
116
|
+
#_fname_:: フォントファイル名(フォントファミリー名不可)。パス指定不可
|
|
117
|
+
#_size_:: フォントの大きさ。単位はピクセル。デフォルトは 16
|
|
118
|
+
#返却値:: 生成されたインスタンスを返す
|
|
119
|
+
def initialize(fname, size=16)
|
|
120
|
+
@size = size
|
|
121
|
+
@color = [255, 255, 255]
|
|
122
|
+
@fname = fname
|
|
123
|
+
@vspace = 0
|
|
124
|
+
@hspace = 0
|
|
125
|
+
@bold = false
|
|
126
|
+
@italic = false
|
|
127
|
+
@under_line = false
|
|
128
|
+
@fpath = Font.findFontPath(@fname) or raise MiyakoError, "Cannot Find Font! : #{@fname}"
|
|
129
|
+
@font = Font.get_font_inner(@fname, @fpath, @size)
|
|
130
|
+
@font.style = SDL::TTF::STYLE_NORMAL
|
|
131
|
+
init_height
|
|
132
|
+
@use_shadow = false
|
|
133
|
+
@shadow_color = [128, 128, 128]
|
|
134
|
+
@shadow_margin = [2, 2]
|
|
135
|
+
@unit = SpriteUnitFactory.create
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
#===フォントの大きさを変更する
|
|
139
|
+
#_sz_:: 変更するフォントの大きさ(単位:ピクセル)
|
|
140
|
+
#返却値:: 変更されたフォントのインスタンス
|
|
141
|
+
def size=(sz)
|
|
142
|
+
@size = sz
|
|
143
|
+
@font = Font.get_font_inner(@fname, @fpath, @size)
|
|
144
|
+
@font.style = (@bold ? SDL::TTF::STYLE_BOLD : 0) | (@italic ? SDL::TTF::STYLE_ITALIC : 0) | (@under_line ? SDL::TTF::STYLE_UNDERLINE : 0)
|
|
145
|
+
init_height
|
|
146
|
+
return self
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
#===ブロック評価中のみ、フォントの大きさを変更する
|
|
150
|
+
#_sz_:: 変更するフォントの大きさ(単位:ピクセル)
|
|
151
|
+
#返却値:: 自分自身を返す
|
|
152
|
+
def size_during(sz)
|
|
153
|
+
raise MiyakoError, "not given block!" unless block_given?
|
|
154
|
+
tsize = @size
|
|
155
|
+
self.size = sz
|
|
156
|
+
yield
|
|
157
|
+
self.size = tsize
|
|
158
|
+
return self
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
#===ブロック評価中のみ、フォントの文字の色を変更する
|
|
162
|
+
#_color_:: 変更する色([r,g,b]の3要素の配列(値:0~255))
|
|
163
|
+
#返却値:: 自分自身を返す
|
|
164
|
+
def color_during(color)
|
|
165
|
+
raise MiyakoError, "not given block!" unless block_given?
|
|
166
|
+
tcolor, self.color = @color, color
|
|
167
|
+
yield
|
|
168
|
+
self.color = tcolor
|
|
169
|
+
return self
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
#===ブロック評価中のみ、影文字文字の色・マージンを変更する
|
|
173
|
+
#また、ブロック評価中は影文字が強制的に有効になる
|
|
174
|
+
#_color_:: 変更する色([r,g,b]の3要素の配列(値:0~255))、デフォルトはFont#shadow_colorメソッドの値([128,128,128])
|
|
175
|
+
#_margin_:: 変更する色(2要素の整数の配列、デフォルトはFont#shadow_marginメソッドの値([2,2])
|
|
176
|
+
#返却値:: 自分自身を返す
|
|
177
|
+
def shadow_during(color = @shadow_color, margin = @shadow_margin)
|
|
178
|
+
raise MiyakoError, "not given block!" unless block_given?
|
|
179
|
+
tflag, @use_shadow = @use_shadow, true
|
|
180
|
+
tcolor, @shadow_color = @shadow_color, color
|
|
181
|
+
tmargin, @shadow_margin = @shadow_margin, margin
|
|
182
|
+
yield
|
|
183
|
+
@use_shadow = tflag
|
|
184
|
+
@shadow_color = tcolor
|
|
185
|
+
@shadow_margin = tmargin
|
|
186
|
+
return self
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
#===指定したピクセル数のフォントが十分(欠けることなく)収まるピクセル数を取得する
|
|
190
|
+
#_size_:: フォントの大きさ(単位:ピクセル)
|
|
191
|
+
#返却値:: 算出されたピクセル数
|
|
192
|
+
def get_fit_size(size)
|
|
193
|
+
path = Font.findFontPath(@fname)
|
|
194
|
+
font = SDL::TTF.open(path, size)
|
|
195
|
+
return (size.to_f * (size.to_f / font.line_skip.to_f)).to_i
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
#===フォントサイズ(yやjなどの下にはみ出る箇所も算出)を取得する
|
|
199
|
+
#返却値:: 算出されたフォントサイズ
|
|
200
|
+
def line_height
|
|
201
|
+
return @line_skip + @vspace + (@use_shadow ? @shadow_margin[1] : 0)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
#===フォントインスタンスを解放する
|
|
205
|
+
def dispose
|
|
206
|
+
@font = nil
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
#===フォントの属性をbold(太文字)に設定する
|
|
210
|
+
#ブロックを渡したときは、ブロック評価中のみ太字になる
|
|
211
|
+
#文字が領域外にはみ出る場合があるので注意!
|
|
212
|
+
#返却値:: 自分自身
|
|
213
|
+
def bold
|
|
214
|
+
if block_given?
|
|
215
|
+
tbold, self.bold = self.bold?, true
|
|
216
|
+
yield
|
|
217
|
+
self.bold = tbold
|
|
218
|
+
else
|
|
219
|
+
self.bold = true
|
|
220
|
+
end
|
|
221
|
+
return self
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
#===フォントのbold属性の有無を返す
|
|
225
|
+
#返却値:: bold属性かどうか(true/false)
|
|
226
|
+
def bold?
|
|
227
|
+
return @bold
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
#===フォントのbold属性を設定する
|
|
231
|
+
#_f_:: bold属性かどうか(true/false)
|
|
232
|
+
def bold=(f)
|
|
233
|
+
@bold = f
|
|
234
|
+
@font.style |= SDL::TTF::STYLE_BOLD
|
|
235
|
+
@font.style -= SDL::TTF::STYLE_BOLD unless @bold
|
|
236
|
+
return self
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
#===フォントの属性をitalic(斜め)に設定する
|
|
240
|
+
#ブロックを渡したときは、ブロック評価中のみ斜体文字になる
|
|
241
|
+
#文字が領域外にはみ出る場合があるので注意!
|
|
242
|
+
#返却値:: 自分自身
|
|
243
|
+
def italic
|
|
244
|
+
if block_given?
|
|
245
|
+
titalic, self.italic = self.italic?, true
|
|
246
|
+
yield
|
|
247
|
+
self.italic = titalic
|
|
248
|
+
else
|
|
249
|
+
self.italic = true
|
|
250
|
+
end
|
|
251
|
+
return self
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
#===フォントのitalic属性の有無を返す
|
|
255
|
+
#返却値:: italic属性かどうか(true/false)
|
|
256
|
+
def italic?
|
|
257
|
+
return @italic
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
#===フォントのitalic属性を設定する
|
|
261
|
+
#_f_:: italic属性かどうか(true/false)
|
|
262
|
+
def italic=(f)
|
|
263
|
+
@italic = f
|
|
264
|
+
@font.style |= SDL::TTF::STYLE_ITALIC
|
|
265
|
+
@font.style -= SDL::TTF::STYLE_ITALIC unless @italic
|
|
266
|
+
return self
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
#===フォントの属性をunder_line(下線)に設定する
|
|
270
|
+
#ブロックを渡したときは、ブロック評価中のみ下線付き文字になる
|
|
271
|
+
#返却値:: 自分自身
|
|
272
|
+
def under_line
|
|
273
|
+
if block_given?
|
|
274
|
+
tunder_line, self.under_line = self.under_line?, true
|
|
275
|
+
yield
|
|
276
|
+
self.under_line = tunder_line
|
|
277
|
+
else
|
|
278
|
+
self.under_line = true
|
|
279
|
+
end
|
|
280
|
+
return self
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
#===フォントのunder_line属性の有無を返す
|
|
284
|
+
#返却値:: under_line属性かどうか(true/false)
|
|
285
|
+
def under_line?
|
|
286
|
+
return @under_line
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
#===フォントのunder_line属性を設定する
|
|
290
|
+
#_f_:: under_line属性かどうか(true/false)
|
|
291
|
+
def under_line=(f)
|
|
292
|
+
@under_line = f
|
|
293
|
+
@font.style |= SDL::TTF::STYLE_UNDERLINE
|
|
294
|
+
@font.style -= SDL::TTF::STYLE_UNDERLINE unless @under_line
|
|
295
|
+
return self
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
#===フォントの属性をすべてクリアする
|
|
299
|
+
#_f_:: 自分自身
|
|
300
|
+
def normal
|
|
301
|
+
@font.style = 0
|
|
302
|
+
return self
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
#===文字列を描画する
|
|
306
|
+
#対象のスプライトに文字列を描画する
|
|
307
|
+
#_dst_:: 描画先スプライト
|
|
308
|
+
#_str_:: 描画する文字列
|
|
309
|
+
#_x_:: 描画位置x軸
|
|
310
|
+
#_y_:: 描画位置Y軸
|
|
311
|
+
def draw_text(dst, str, x, y)
|
|
312
|
+
str = str.encode(Encoding::UTF_8)
|
|
313
|
+
str.chars{|c|
|
|
314
|
+
if @use_shadow
|
|
315
|
+
src2 = @font.renderBlendedUTF8(c, @shadow_color[0], @shadow_color[1], @shadow_color[2])
|
|
316
|
+
if src2
|
|
317
|
+
SpriteUnitFactory.apply(@unit, {:bitmap=>src2, :ow=>src2.w, :oh=>src2.h})
|
|
318
|
+
Miyako::Bitmap.blit_aa(@unit, dst.to_unit, x+@shadow_margin[0], y+@shadow_margin[1])
|
|
319
|
+
else
|
|
320
|
+
break x
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
src = @font.renderBlendedUTF8(c, @color[0], @color[1], @color[2])
|
|
324
|
+
if src
|
|
325
|
+
SpriteUnitFactory.apply(@unit, {:bitmap=>src, :ow=>src.w, :oh=>src.h})
|
|
326
|
+
Miyako::Bitmap.blit_aa(@unit, dst.to_unit, x, y)
|
|
327
|
+
else
|
|
328
|
+
break x
|
|
329
|
+
end
|
|
330
|
+
x += chr_size_inner(c)
|
|
331
|
+
}
|
|
332
|
+
return x
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
#===文字列描画したときの大きさを取得する
|
|
336
|
+
#現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。
|
|
337
|
+
#_txt_:: 算出したい文字列
|
|
338
|
+
#返却値:: 文字列を描画したときの大きさ([w,h]の配列)
|
|
339
|
+
def chr_size_inner(char)
|
|
340
|
+
return (char.bytesize == 1 ? @size >> 1 : @size) + (@use_shadow ? @shadow_margin[0] : 0) + @hspace
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
private :chr_size_inner
|
|
344
|
+
|
|
345
|
+
#===文字列描画したときの大きさを取得する
|
|
346
|
+
#現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。
|
|
347
|
+
#_txt_:: 算出したい文字列
|
|
348
|
+
#返却値:: 文字列を描画したときの大きさ([w,h]の配列)
|
|
349
|
+
def text_size(txt)
|
|
350
|
+
width = txt.chars.inject(0){|r, c|
|
|
351
|
+
r += (c.bytesize == 1 ? @size >> 1 : @size) } +
|
|
352
|
+
((@use_shadow ? @shadow_margin[0] : 0) + @hspace) * (txt.chars.to_a.length - 1)
|
|
353
|
+
return [width, self.line_height]
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
#===指定した高さで描画する際のマージンを求める
|
|
357
|
+
#現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。
|
|
358
|
+
#第1引数に渡す"align"は、以下の3種類のシンボルのどれかを渡す
|
|
359
|
+
#:top:: 上側に描画(マージンはゼロ)
|
|
360
|
+
#:middle:: 中間に描画
|
|
361
|
+
#:bottom:: 下部に描画
|
|
362
|
+
#
|
|
363
|
+
#_align_:: 描画位置
|
|
364
|
+
#_height_:: 描画する高さ
|
|
365
|
+
#返却値:: マージンの値
|
|
366
|
+
def margin_height(align, height)
|
|
367
|
+
case align
|
|
368
|
+
when :top
|
|
369
|
+
return 0
|
|
370
|
+
when :middle
|
|
371
|
+
return (height - self.line_height) >> 1
|
|
372
|
+
when :bottom
|
|
373
|
+
return height - self.line_height
|
|
374
|
+
end
|
|
375
|
+
#else
|
|
376
|
+
raise MiyakoError, "Illegal margin_height align! : #{align}"
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
Font.create_font_path
|
|
380
|
+
|
|
381
|
+
#===Serifフォント(明朝フォント)を取得する
|
|
382
|
+
#マルチプラットフォームのソフトを作る際、OS間の差異を吸収するため、
|
|
383
|
+
#共通の名称でフォントインスタンスを取得するときに使う(主に明朝フォント)
|
|
384
|
+
#返却値:: OSごとに設定されたフォントイン寸タンス(フォントサイズは16)
|
|
385
|
+
def Font::serif
|
|
386
|
+
filename = @@font_base_name[Miyako::getOSName].detect{|base| Font.findFontPath(base[:serif]) }[:serif]
|
|
387
|
+
return Font.new(filename)
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
#===Sans Serifフォント(ゴシックフォント)を取得する
|
|
391
|
+
#マルチプラットフォームのソフトを作る際、OS間の差異を吸収するため、
|
|
392
|
+
#共通の名称でフォントインスタンスを取得するときに使う(主にゴシックフォント)
|
|
393
|
+
#返却値:: OSごとに設定されたフォントイン寸タンス(フォントサイズは16)
|
|
394
|
+
def Font::sans_serif
|
|
395
|
+
filename = @@font_base_name[Miyako::getOSName].detect{|base| Font.findFontPath(base[:sans_serif]) }[:sans_serif]
|
|
396
|
+
return Font.new(filename)
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
def Font::system_font #:nodoc:
|
|
400
|
+
return Font.serif
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
end
|
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
=begin
|
|
3
|
+
--
|
|
4
|
+
Miyako v2.0
|
|
5
|
+
Copyright (C) 2007-2009 Cyross Makoto
|
|
6
|
+
|
|
7
|
+
This library is free software; you can redistribute it and/or
|
|
8
|
+
modify it under the terms of the GNU Lesser General Public
|
|
9
|
+
License as published by the Free Software Foundation; either
|
|
10
|
+
version 2.1 of the License, or (at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This library is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
15
|
+
Lesser General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU Lesser General Public
|
|
18
|
+
License along with this library; if not, write to the Free Software
|
|
19
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
20
|
+
++
|
|
21
|
+
=end
|
|
22
|
+
|
|
23
|
+
module Miyako
|
|
24
|
+
|
|
25
|
+
#==入力管理モジュール
|
|
26
|
+
#本モジュールでは、キーボードやマウス、ゲームパッドなどの入力装置からの情報を管理する。
|
|
27
|
+
#メソッドのほとんどは、「押されたかどうか」などの問い合わせメソッドで構成されている。
|
|
28
|
+
#本モジュールでは、以下のボタンが使用可能。キー(ボタン)すべてシンボルとして定義
|
|
29
|
+
#_:btn1_ ~ _:btn12_:: ゲームパッドの 1~12 に対応するボタン、もしくはキーボード上の z~n、a~hの各ボタンに対応
|
|
30
|
+
#_:down,_:left_,_:right_,_:up_:: ゲームパッドの方向ボタンとキーボードの方向キーに対応
|
|
31
|
+
#_:spc_:: スペースバーに対応
|
|
32
|
+
#_:ent_:: Enterキーに対応
|
|
33
|
+
#_:esc_:: エスケープキーに対応
|
|
34
|
+
#_:alt_:: Altキー(左右)に対応
|
|
35
|
+
#_:ctl_:: コントロールキー(左右)に対応
|
|
36
|
+
#_:sft_:: シフトキー(左右)に対応
|
|
37
|
+
#
|
|
38
|
+
#また、本モジュールのメソッドに "trigger", "pushed" の2つのメソッドがあるが、
|
|
39
|
+
#"trigger"系メソッドは、「押されていたら常にtrue」を示すのに対して、
|
|
40
|
+
#"pushed"系メソッドは、「押した瞬間のみtrue、次の更新(Input.update)の時以降は、
|
|
41
|
+
#ボタンを放して再び押されるまでfalse」という機能を持つ
|
|
42
|
+
module Input
|
|
43
|
+
BTNS = 12 # 使用するボタン数(ボタン1〜ボタン12)
|
|
44
|
+
@@joy = nil
|
|
45
|
+
@@joy = SDL::Joystick.open(0) if SDL::Joystick.num >= 1
|
|
46
|
+
@@quit = false
|
|
47
|
+
@@toggle_screen_mode = true
|
|
48
|
+
@@click_start_tick = 0
|
|
49
|
+
|
|
50
|
+
@@syms = [:btn1, :btn2, :btn3, :btn4, :btn5, :btn6, :btn7, :btn8, :btn9, :btn10, :btn11, :btn12,
|
|
51
|
+
:down, :left, :right, :up, :spc, :ent, :esc, :alt, :ctl, :sft]
|
|
52
|
+
|
|
53
|
+
@@mods = [SDL::Key::MOD_LALT, SDL::Key::MOD_RALT, SDL::Key::MOD_LCTRL, SDL::Key::MOD_RCTRL,
|
|
54
|
+
SDL::Key::MOD_LSHIFT, SDL::Key::MOD_RSHIFT]
|
|
55
|
+
|
|
56
|
+
@@btn2sym = {SDL::Key::Z => :btn1, SDL::Key::X => :btn2, SDL::Key::C => :btn3,
|
|
57
|
+
SDL::Key::A => :btn4, SDL::Key::S => :btn5, SDL::Key::D => :btn6,
|
|
58
|
+
SDL::Key::Q => :btn7, SDL::Key::W => :btn8, SDL::Key::E => :btn9,
|
|
59
|
+
SDL::Key::V => :btn10, SDL::Key::B => :btn11, SDL::Key::N => :btn12,
|
|
60
|
+
SDL::Key::KP2 => :down, SDL::Key::DOWN => :down,
|
|
61
|
+
SDL::Key::KP4 => :left, SDL::Key::LEFT => :left,
|
|
62
|
+
SDL::Key::KP6 => :right, SDL::Key::RIGHT => :right,
|
|
63
|
+
SDL::Key::KP8 => :up, SDL::Key::UP => :up,
|
|
64
|
+
SDL::Key::SPACE => :spc,
|
|
65
|
+
SDL::Key::RETURN => :ent,
|
|
66
|
+
SDL::Key::ESCAPE => :esc,
|
|
67
|
+
SDL::Key::MOD_LALT => :alt, SDL::Key::MOD_RALT => :alt,
|
|
68
|
+
SDL::Key::MOD_LCTRL => :ctl, SDL::Key::MOD_RCTRL => :ctl,
|
|
69
|
+
SDL::Key::MOD_LSHIFT => :sft, SDL::Key::MOD_RSHIFT => :sft}
|
|
70
|
+
|
|
71
|
+
@@num2bsym = [:btn1, :btn2, :btn3, :btn4, :btn5, :btn6,
|
|
72
|
+
:btn7, :btn8, :btn9, :btn10, :btn11, :btn12]
|
|
73
|
+
|
|
74
|
+
def Input::create_btns #:nodoc:
|
|
75
|
+
return {:btn1 => 0, :btn2 => 0, :btn3 => 0,
|
|
76
|
+
:btn4 => 0, :btn5 => 0, :btn6 => 0,
|
|
77
|
+
:btn7 => 0, :btn8 => 0, :btn9 => 0,
|
|
78
|
+
:btn10 => 0, :btn11 => 0, :btn12 => 0,
|
|
79
|
+
:down => 0, :left => 0, :right => 0, :up => 0,
|
|
80
|
+
:spc => 0, :ent => 0, :esc => 0,
|
|
81
|
+
:alt => 0, :ctl => 0, :sft => 0}
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
@@btn = {:trigger => create_btns,
|
|
85
|
+
:pushed => create_btns,
|
|
86
|
+
:pre => create_btns}
|
|
87
|
+
|
|
88
|
+
@@move_amount = [{:down => 0, :left => -1, :right => 1, :up => 0},
|
|
89
|
+
{:down => 1, :left => 0, :right => 0, :up => -1}]
|
|
90
|
+
|
|
91
|
+
@@process = {SDL::Event2::Active => lambda {|e| Input::process_active(e)},
|
|
92
|
+
SDL::Event2::Quit => lambda {|e| Input::process_quit(e)},
|
|
93
|
+
SDL::Event2::KeyDown => lambda {|e| Input::process_keydown(e)},
|
|
94
|
+
SDL::Event2::KeyUp => lambda {|e| Input::process_keyup(e)},
|
|
95
|
+
SDL::Event2::JoyAxis => lambda {|e| Input::process_joyaxis(e)},
|
|
96
|
+
SDL::Event2::JoyButtonDown => lambda {|e| Input::process_joybuttondown(e)},
|
|
97
|
+
SDL::Event2::JoyButtonUp => lambda {|e| Input::process_joybuttonup(e)},
|
|
98
|
+
SDL::Event2::MouseMotion => lambda {|e| Input::process_mousemotion(e)},
|
|
99
|
+
SDL::Event2::MouseButtonDown => lambda {|e| Input::process_mousebuttondown(e)},
|
|
100
|
+
SDL::Event2::MouseButtonUp => lambda {|e| Input::process_mousebuttonup(e)}}
|
|
101
|
+
@@process.default = lambda {|e| }
|
|
102
|
+
|
|
103
|
+
@@mouse = {:pos => {:x => 0, :y => 0, :dx => 0, :dy => 0},
|
|
104
|
+
:trigger => {:left => false, :middle => false, :right => false}, # 2008.06.11
|
|
105
|
+
:click => {:left => false, :middle => false, :right => false, :interval => 200},
|
|
106
|
+
:drag => {:left => false, :middle => false, :right => false, :x => 0, :y => 0},
|
|
107
|
+
:drop => {:left => false, :middle => false, :right => false, :succeed => true},
|
|
108
|
+
:inner => true}
|
|
109
|
+
|
|
110
|
+
def Input::process_quit(e) #:nodoc:
|
|
111
|
+
@@quit = true
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def Input::process_keydown(e) #:nodoc:
|
|
115
|
+
set_btn(@@btn2sym[e.sym]) if @@btn2sym.include?(e.sym)
|
|
116
|
+
@@mods.each{|m| set_btn(@@btn2sym[m]) if e.mod & m == m}
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def Input::process_keyup(e) #:nodoc:
|
|
120
|
+
reset_btn(@@btn2sym[e.sym]) if @@btn2sym.include?(e.sym)
|
|
121
|
+
@@mods.each{|m| reset_btn(@@btn2sym[m]) if e.mod & m == m}
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def Input::process_joyaxis(e) #:nodoc:
|
|
125
|
+
if e.axis == 0
|
|
126
|
+
if e.value >= 16384
|
|
127
|
+
set_btn(:right)
|
|
128
|
+
elsif e.value < -16384
|
|
129
|
+
set_btn(:left)
|
|
130
|
+
else
|
|
131
|
+
reset_btn(:left)
|
|
132
|
+
reset_btn(:right)
|
|
133
|
+
end
|
|
134
|
+
elsif e.axis == 1
|
|
135
|
+
if e.value >= 16384
|
|
136
|
+
set_btn(:down)
|
|
137
|
+
elsif e.value < -16384
|
|
138
|
+
set_btn(:up)
|
|
139
|
+
else
|
|
140
|
+
reset_btn(:down)
|
|
141
|
+
reset_btn(:up)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def Input::process_joybuttondown(e) #:nodoc:
|
|
147
|
+
set_btn(@@num2bsym[e.button]) if e.button < BTNS
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def Input::process_joybuttonup(e) #:nodoc:
|
|
151
|
+
reset_btn(@@num2bsym[e.button]) if e.button < BTNS
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def Input::process_mousemotion(e) #:nodoc:
|
|
155
|
+
@@mouse[:pos][:x] = e.x
|
|
156
|
+
@@mouse[:pos][:y] = e.y
|
|
157
|
+
@@mouse[:pos][:dx] = e.xrel
|
|
158
|
+
@@mouse[:pos][:dy] = e.yrel
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def Input::process_mousebuttondown(e) #:nodoc:
|
|
162
|
+
set_mouse_button(:trigger, e.button)
|
|
163
|
+
return unless @@mouse[:inner]
|
|
164
|
+
click_mouse_button(:click, e.button)
|
|
165
|
+
set_mouse_button(:drag, e.button)
|
|
166
|
+
@@mouse[:drag][:x] = @@mouse[:pos][:x]
|
|
167
|
+
@@mouse[:drag][:y] = @@mouse[:pos][:y]
|
|
168
|
+
@@click_start_tick = SDL.getTicks
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def Input::process_mousebuttonup(e) #:nodoc:
|
|
172
|
+
reset_mouse_button(:trigger, e.button)
|
|
173
|
+
click_interval = SDL.getTicks - @@click_start_tick
|
|
174
|
+
if click_interval < @@mouse[:click][:interval]
|
|
175
|
+
[:left, :middle, :right].each{|b| @@mouse[:drag][b] = false }
|
|
176
|
+
else
|
|
177
|
+
@@mouse[:drop][:left] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_LEFT)
|
|
178
|
+
@@mouse[:drop][:middle] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_MIDDLE)
|
|
179
|
+
@@mouse[:drop][:right] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_RIGHT)
|
|
180
|
+
@@mouse[:drop][:succeed] = [:left,:middle,:right].inject(false){|r,i| r |= @@mouse[:drag][i]} && @@mouse[:inner]
|
|
181
|
+
[:left, :middle, :right].each{|b| @@mouse[:drag][b] = false }
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def Input::process_active(e) #:nodoc:
|
|
186
|
+
@@mouse[:inner] = e.gain if e.state == 1
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def Input::process_default(e) #:nodoc:
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def Input::click_mouse_button(mode, btn) #:nodoc:
|
|
193
|
+
@@mouse[mode][:left] = (btn == SDL::Mouse::BUTTON_LEFT)
|
|
194
|
+
@@mouse[mode][:middle] = (btn == SDL::Mouse::BUTTON_MIDDLE)
|
|
195
|
+
@@mouse[mode][:right] = (btn == SDL::Mouse::BUTTON_RIGHT)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def Input::set_mouse_button(mode, btn) #:nodoc:
|
|
199
|
+
@@mouse[mode][:left] = (btn == SDL::Mouse::BUTTON_LEFT)
|
|
200
|
+
@@mouse[mode][:middle] = (btn == SDL::Mouse::BUTTON_MIDDLE)
|
|
201
|
+
@@mouse[mode][:right] = (btn == SDL::Mouse::BUTTON_RIGHT)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def Input::reset_mouse_button(mode, btn) #:nodoc:
|
|
205
|
+
@@mouse[mode][:left] = false if (btn == SDL::Mouse::BUTTON_LEFT)
|
|
206
|
+
@@mouse[mode][:middle] = false if (btn == SDL::Mouse::BUTTON_MIDDLE)
|
|
207
|
+
@@mouse[mode][:right] = false if (btn == SDL::Mouse::BUTTON_RIGHT)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def Input::set_btn(n) #:nodoc:
|
|
211
|
+
@@btn[:trigger][n] = 1
|
|
212
|
+
return if @@btn[:pre][n] == 1
|
|
213
|
+
@@btn[:pushed][n] = 1
|
|
214
|
+
@@btn[:pre][n] = 1
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def Input::reset_btn(n) #:nodoc:
|
|
218
|
+
@@btn.each_key{|k| @@btn[k][n] = 0}
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
#===入力装置からの情報を更新する
|
|
222
|
+
#必ず1回は呼び出す必要がある
|
|
223
|
+
#(特に、ゲームループの最初に呼び出す必要がある
|
|
224
|
+
#また、このメソッドを呼び出すのは必ずメインスレッドから呼び出すこと
|
|
225
|
+
def Input::update
|
|
226
|
+
SDL::Joystick.updateAll
|
|
227
|
+
@@btn[:pushed].each_key{|p| @@btn[:pushed][p] = 0 }
|
|
228
|
+
[:dx, :dy].each{|e| @@mouse[:pos][e] = 0 }
|
|
229
|
+
[:left, :middle, :right].each{|e|
|
|
230
|
+
@@mouse[:click][e] = false
|
|
231
|
+
@@mouse[:drop][e] = false
|
|
232
|
+
}
|
|
233
|
+
e_list = []
|
|
234
|
+
while e = SDL::Event2.poll
|
|
235
|
+
e_list << e
|
|
236
|
+
end
|
|
237
|
+
e_list.reverse.each{|e|
|
|
238
|
+
@@process[e.class].call(e)
|
|
239
|
+
if @@btn[:trigger][:alt] & @@btn[:pushed][:ent]==1 and @@toggle_screen_mode
|
|
240
|
+
Screen.toggle_mode
|
|
241
|
+
@@btn[:trigger][:alt] = false
|
|
242
|
+
@@btn[:pushed][:ent] = 0
|
|
243
|
+
end
|
|
244
|
+
}
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
#===指定のボタンがすべて押下状態かを問い合わせるメソッド
|
|
248
|
+
#_inputs_:: ボタンを示すシンボル。複数指定可能
|
|
249
|
+
#((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
|
|
250
|
+
#返却値:: すべて押下状態ならば true を返す
|
|
251
|
+
def Input::trigger_all?(*inputs)
|
|
252
|
+
raise MiyakoError, "No setting any buttons! : trigger_all?" if inputs.length == 0
|
|
253
|
+
return inputs.inject(false){|r, v| r &= (@@btn[:trigger][v] == 1)}
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
#===指定のボタンがどれかが押下状態かを問い合わせるメソッド
|
|
257
|
+
#引数を省略した場合は、「どれかのキーが押下状態か」を問い合わせる。
|
|
258
|
+
#_inputs_:: ボタンを示すシンボル。複数指定可能
|
|
259
|
+
#((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)。
|
|
260
|
+
#返却値:: どれかが押下状態ならば true を返す
|
|
261
|
+
def Input::trigger_any?(*inputs)
|
|
262
|
+
inputs = @@syms if inputs.length == 0
|
|
263
|
+
return inputs.inject(false){|r, v| r |= (@@btn[:trigger][v] == 1)}
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
#===指定のボタンがすべて押されたかを問い合わせるメソッド
|
|
267
|
+
#_inputs_:: ボタンを示すシンボル。複数指定可能
|
|
268
|
+
#((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
|
|
269
|
+
#返却値:: すべて押されていれば true を返す
|
|
270
|
+
def Input::pushed_all?(*inputs)
|
|
271
|
+
raise MiyakoError, "No setting any buttons! : trigger_any?" if inputs.length == 0
|
|
272
|
+
return inputs.inject(true){|r, v| r &= (@@btn[:pushed][v] == 1)}
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
#===指定のボタンのどれかが押されたかを問い合わせるメソッド
|
|
276
|
+
#_inputs_:: ボタンを示すシンボル。複数指定可能
|
|
277
|
+
#((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)
|
|
278
|
+
#返却値:: すべて押されていれば true を返す
|
|
279
|
+
def Input::pushed_any?(*inputs)
|
|
280
|
+
inputs = @@syms if inputs.length == 0
|
|
281
|
+
return inputs.inject(false){|r, v| r |= (@@btn[:pushed][v] == 1)}
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
#===ボタンが押下状態にある方向を取得する
|
|
285
|
+
#方向キーが押下状態にある情報を、2要素の配列[x,y]で示す。
|
|
286
|
+
#
|
|
287
|
+
#各要素の値は以下の通り。
|
|
288
|
+
#x ・・・ -1:左、0:変化なし、1:右
|
|
289
|
+
#
|
|
290
|
+
#y ・・・ -1:上、0:変化なし、1:下
|
|
291
|
+
#返却値:: 移動方向を示す配列
|
|
292
|
+
def Input::trigger_amount
|
|
293
|
+
amt = [0, 0]
|
|
294
|
+
[:down, :left, :right, :up].each{|d| [0, 1].each{|n| amt[n] += @@btn[:trigger][d] * @@move_amount[n][d]} }
|
|
295
|
+
return amt
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
#===ボタンが押された方向を取得する
|
|
299
|
+
#方向キーが押された情報を、2要素の配列[x,y]で示す。
|
|
300
|
+
#
|
|
301
|
+
#各要素の値は以下の通り。
|
|
302
|
+
#x ・・・ -1:左、0:変化なし、1:右
|
|
303
|
+
#
|
|
304
|
+
#y ・・・ -1:上、0:変化なし、1:下
|
|
305
|
+
#返却値:: 移動方向を示す配列
|
|
306
|
+
def Input::pushed_amount
|
|
307
|
+
amt = [0, 0]
|
|
308
|
+
[:down, :left, :right, :up].each{|d| [0, 1].each{|n| amt[n] += @@btn[:pushed][d] * @@move_amount[n][d]} }
|
|
309
|
+
return amt
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
#===ウィンドウの「閉じる」ボタンが選択されたかどうかを問い合わせる
|
|
313
|
+
#Windowsの場合、ウィンドウ右上の「×」ボタンを押したときに相当
|
|
314
|
+
#返却値:: 「×」ボタンが押されていれば true を返す
|
|
315
|
+
def Input::quit?
|
|
316
|
+
return @@quit
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
#===エスケープキーが押されたかどうかを問い合わせる
|
|
320
|
+
#返却値:: エスケープキーが押されていれば true を返す
|
|
321
|
+
def Input::escape?
|
|
322
|
+
return (@@btn[:pushed][:esc] == 1)
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
#===ウィンドウの「×」ボタンか、エスケープキーが押されたかどうかを問い合わせる
|
|
326
|
+
#返却値:: 「×」ボタンが押されてる、もしくはエスケープキーが押されていれば true を返す
|
|
327
|
+
def Input::quit_or_escape?
|
|
328
|
+
return @@quit || (@@btn[:pushed][:esc] == 1)
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
#===マウスカーソルを表示する
|
|
332
|
+
def Input::mouse_cursor_show
|
|
333
|
+
SDL::Mouse.show
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
#===マウスカーソルを隠蔽する
|
|
337
|
+
def Input::mouse_cursor_hide
|
|
338
|
+
SDL::Mouse.hide
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
#===マウスの現在位置を取得する
|
|
342
|
+
#求める値は、{:x=>n,:y=>n}で示すハッシュとする
|
|
343
|
+
#原点は、画面領域の左上を{:x=>0,:y=>0}とする
|
|
344
|
+
#返却値:: マウスカーソルの位置を示すPoint構造体
|
|
345
|
+
def Input::get_mouse_position
|
|
346
|
+
return Point.new(@@mouse[:pos][:x],@@mouse[:pos][:y])
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
#===マウスの移動量を取得する
|
|
350
|
+
#求める値は、{:x=>n,:y=>n}で示すハッシュとする
|
|
351
|
+
#移動量は、右下方向を正とする
|
|
352
|
+
#返却値:: マウスカーソルの移動量を示すSize構造体
|
|
353
|
+
def Input::get_mouse_amount
|
|
354
|
+
return Size.new(@@mouse[:pos][:dx],@@mouse[:pos][:dy])
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
#===ボタンがクリックされたかを問い合わせるメソッド
|
|
358
|
+
#ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
|
|
359
|
+
#このメソッドを呼び出した後、そのボタンの返却値は、Input.updateが呼ばれない限りfalseになることに注意。
|
|
360
|
+
#
|
|
361
|
+
#:left : 左ボタン
|
|
362
|
+
#:middle : 中ボタン(ホイールをクリック)
|
|
363
|
+
#:right : 右ボタン
|
|
364
|
+
#:any : 上記ボタンの少なくともどれか一つ
|
|
365
|
+
#
|
|
366
|
+
#_btn_:: 問い合わせるボタンを示すシンボル(可変個)
|
|
367
|
+
#返却値:: ボタンが押されていれば true を返す
|
|
368
|
+
def Input::click?(btn)
|
|
369
|
+
btns = (btn == :any ? [:left, :middle, :right] : [btn])
|
|
370
|
+
ret = btns.inject(false){|r, f| r |= @@mouse[:click][f]}
|
|
371
|
+
return ret
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
#===ボタンが押されているかを問い合わせるメソッド
|
|
375
|
+
#ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
|
|
376
|
+
#
|
|
377
|
+
#_:left_:: 左ボタン
|
|
378
|
+
#_:middle_:: 中ボタン(ホイールをクリック)
|
|
379
|
+
#_:right_:: 右ボタン
|
|
380
|
+
#_:any_:: 上記ボタンの少なくともどれか一つ
|
|
381
|
+
#
|
|
382
|
+
#_btn_:: 問い合わせるボタンを示すシンボル(可変個)
|
|
383
|
+
#返却値:: ボタンが押されていれば true を返す
|
|
384
|
+
def Input::mouse_trigger?(btn)
|
|
385
|
+
return btn == :any ? (@@mouse[:trigger][:left] || @@mouse[:trigger][:middle] || @@mouse[:trigger][:right]) : @@mouse[:trigger][btn]
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
#===ドラッグアンドドロップが行われたかどうかを問い合わせる
|
|
389
|
+
#ドラッグアンドドロップした際に使ったボタンの問い合わせは、
|
|
390
|
+
#可変個数のシンボルで行う。指定できるボタンは以下の通り
|
|
391
|
+
#
|
|
392
|
+
#_:left_:: 左ボタン
|
|
393
|
+
#_:middle_:: 中ボタン(ホイールをクリック)
|
|
394
|
+
#_:right_:: 右ボタン
|
|
395
|
+
#_:any_:: 上記ボタンの少なくともどれか一つ
|
|
396
|
+
#
|
|
397
|
+
#_btn_:: 問い合わせるボタンを示すシンボル(可変個)
|
|
398
|
+
#返却値:: ドラッグアンドドロップが成功していれば、true を返す
|
|
399
|
+
def Input::drag_and_drop?(btn)
|
|
400
|
+
return @@mouse[:drop][:succeed] && (btn == :any ? (@@mouse[:drop][:left] || @@mouse[:drop][:middle] || @@mouse[:drop][:right]) : @@mouse[:click][btn])
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
#===ドラッグアンドドロップされた範囲を取得する
|
|
404
|
+
#取得できる範囲は、以下のハッシュで取得できる。
|
|
405
|
+
#{:drag_x => ドラッグが行われた x 座標, :drag_y => ドラッグが行われた y 座標, :drop_x => ドロップが行われた x 座業, :drop_y => ドロップが行われた y 座標}
|
|
406
|
+
#返却値:: ドラッグアンドドロップが成功していれば、移動範囲を示すハッシュ、失敗していれば nil を返す
|
|
407
|
+
def Input::get_drag_and_drop_range
|
|
408
|
+
return @@mouse[:drop][:succeed] ? {:drag_x => @@mouse[:drag][:x], :drag_y => @@mouse[:drag][:y], :drop_x => @@mouse[:pos][:x], :drop_y => @@mouse[:pos][:y]} : nil
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
#===ダブルクリックの間隔を取得する
|
|
412
|
+
#間隔は、ミリ秒単位で取得できる
|
|
413
|
+
#返却値:: ボタンのクリック間隔
|
|
414
|
+
def Input::click_interval
|
|
415
|
+
return @@mouse[:click][:interval]
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
#===ダブルクリックの間隔を設定する
|
|
419
|
+
#間隔は、ミリ秒単位で設定できる
|
|
420
|
+
#_v_:: ボタンのクリック間隔
|
|
421
|
+
def Input::click_interval=(v)
|
|
422
|
+
@@mouse[:click][:interval] = v
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
#===マウスカーソルが画面の内側に有るかどうかを問い合わせる
|
|
426
|
+
#返却値:: マウスカーソルが画面内ならtrueを返す
|
|
427
|
+
def Input::mouse_cursor_inner?
|
|
428
|
+
return @@mouse[:inner]
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
#===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えの可否を切り替える
|
|
432
|
+
def Input::enable_toggle_screen_mode
|
|
433
|
+
@@toggle_screen_mode = true
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
#===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えを不可にする
|
|
437
|
+
def Input::disenable_toggle_screen_mode
|
|
438
|
+
@@toggle_screen_mode = false
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
#===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えができるかどうかを問い合わせる
|
|
442
|
+
#返却値:: 切り替えができるときは true を返す
|
|
443
|
+
def Input::toggle_screen_mode?
|
|
444
|
+
return @@toggle_screen_mode
|
|
445
|
+
end
|
|
446
|
+
end
|
|
447
|
+
end
|