1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package tsukuba_bunko.peko.canvas.stage;
20
21 import java.awt.Color;
22 import java.awt.Image;
23
24 import java.io.Serializable;
25
26 import java.util.HashMap;
27 import java.util.Iterator;
28 import java.util.Map;
29
30 import tsukuba_bunko.peko.Logger;
31
32 import tsukuba_bunko.peko.resource.ColorManager;
33
34
35 /***
36 * 舞台を表示するキャンバスです。
37 * @author $Author: ppoi $
38 * @version $Revision: 1.3 $
39 */
40 public class Stage implements Serializable {
41
42 /***
43 * serial version UID
44 */
45 private static final long serialVersionUID = -5885153839184445498L;
46
47 /***
48 * このステージを描画する StageCanvas
49 */
50 transient private StageCanvas _canvas = null;
51
52 /***
53 * 音楽を再生する AudioPlayer
54 */
55 private AudioPlayer _audioPlayer = new AudioPlayer();
56
57
58 /***
59 * 登場人物
60 */
61 transient private Map _actors = new HashMap();
62
63 /***
64 * 確定した登場人物
65 */
66 private HashMap _committedActors = new HashMap();
67
68 /***
69 * 背景
70 */
71 transient private String _background = null;
72
73 /***
74 * 確定した背景
75 */
76 private String _committedBackground = null;
77
78 /***
79 * 背景画像
80 */
81 transient private Image _backgroundImage = null;
82
83 /***
84 * 背景色
85 */
86 transient private Color _backgroundColor = null;
87
88 /***
89 * 確定した背景色
90 */
91 private Color _committedBackgroundColor = null;
92
93 /***
94 * スライド名
95 */
96 transient private String _slide = null;
97
98 /***
99 * 確定したスライド名
100 */
101 private String _committedSlide = null;
102
103 /***
104 * スライド画像
105 */
106 transient private Image _slideImage = null;
107
108
109 /***
110 * <code>Stage</code> のインスタンスを作成します。
111 */
112 public Stage()
113 {
114 super();
115 }
116
117
118 /***
119 * 人物を舞台に登場させます。
120 * @param actor 人物
121 */
122 public void enter( Actor actor )
123 {
124 _actors.put( actor.getName(), actor );
125 }
126
127 /***
128 * 人物を取得します。
129 */
130 public Actor getName( String name )
131 {
132 return (Actor)_actors.get( name );
133 }
134
135 /***
136 * 人物を舞台から退場させます。
137 */
138 public Actor exit( String name )
139 {
140 Actor actor = (Actor)_actors.remove( name );
141 if( actor != null ) {
142 actor.disposeLooks();
143 }
144 return actor;
145 }
146
147 /***
148 * 全ての人物を舞台から退場させます。
149 */
150 public void exitAll()
151 {
152 String[] names = (String[])_actors.keySet().toArray( new String[_actors.size()] );
153 for( int i = 0; i < names.length; ++i ) {
154 exit( names[i] );
155 }
156 }
157
158 /***
159 * 人物を取得します。
160 */
161 public Actor getActor( String name )
162 {
163 return (Actor)_actors.get( name );
164 }
165
166 /***
167 * 人物リストを取得します。
168 */
169 public Map getActors()
170 {
171 return _actors;
172 }
173
174 /***
175 * 背景画像を設定します。このメソッドを呼び出すと、背景色は null に設定されます。
176 * @param image 背景画像
177 */
178 public void setBackgroundImage( String image )
179 {
180 ImageManager images = ImageManager.getInstance();
181 if( (_backgroundImage != null) && !_background.equals(image) ) {
182 images.putImage( _background, _backgroundImage );
183 _backgroundImage = null;
184 }
185
186 Image background = images.getImage( image );
187 if( background != null ) {
188 _backgroundImage = background;
189 _background = image;
190 _backgroundColor = null;
191 }
192 else if( background == null ) {
193 Logger.error( "[canvas.stage] invalid background-image :" + image );
194 _backgroundColor = Color.black;
195 _background = "black";
196 }
197 }
198
199 /***
200 * 背景画像を取得します。
201 * @return 背景画像
202 */
203 public Image getBackgroundImage()
204 {
205 return _backgroundImage;
206 }
207
208 /***
209 * 背景色を設定します。このメソッドを呼び出すと、背景画像は null に設定されます。
210 * @param color 背景色
211 */
212 public void setBackgroundColor( String color )
213 {
214 if( _backgroundImage != null ) {
215 ImageManager images = ImageManager.getInstance();
216 images.putImage( _background, _backgroundImage );
217 _backgroundImage = null;
218 }
219 ColorManager colors = ColorManager.getInstance();
220 _backgroundColor = colors.getColor( color );
221 _background = color;
222 }
223
224 /***
225 * 背景色を取得します。
226 * @return 背景色
227 */
228 public Color getBackgroundColor()
229 {
230 return _backgroundColor;
231 }
232
233 /***
234 * スライドを表示します。
235 * @param slide スライド名
236 */
237 public void showSlide( String slide )
238 {
239 ImageManager images = ImageManager.getInstance();
240 if( (_slide != null) && !_slide.equals(slide) ) {
241 images.putImage( _slide, _slideImage );
242 }
243 _slideImage = images.getImage( slide );
244 _slide = slide;
245 }
246
247 /***
248 * スライドを隠します。
249 */
250 public void hideSlide()
251 {
252 if( _slideImage != null ) {
253 ImageManager images = ImageManager.getInstance();
254 images.putImage( _slide, _slideImage );
255 }
256 _slide = null;
257 _slideImage = null;
258 }
259
260 /***
261 * スライド名を取得します。
262 * @return スライド名
263 */
264 public String getSlide()
265 {
266 return _slide;
267 }
268
269 /***
270 * スライド画像を取得します。
271 * @return スライド画像
272 */
273 public Image getSlideImage()
274 {
275 return _slideImage;
276 }
277
278 /***
279 * BGM を再生します。
280 * @param id BGM ID
281 * @param clipName クリップ名
282 * @param loop ループする場合は <code>true</code>、しない場合は <code>false</code>
283 */
284 public void playBGM( String id, String clipName, boolean loop )
285 {
286 _audioPlayer.playBGM( id, clipName, loop );
287 }
288
289 /***
290 * BGM を停止します。
291 * @param id 停止する BGM の ID
292 * @param mode 停止モード
293 */
294 public void stopBGM( String id, int mode )
295 {
296 _audioPlayer.stop( id, mode );
297 }
298
299 /***
300 * SE を停止します。
301 * @param id 停止する SE の ID
302 */
303 public void stopSE( String id, int mode )
304 {
305 _audioPlayer.stop( id, mode );
306 }
307
308 /***
309 * SE を再生します。
310 * @param id SE ID
311 * @param clipName クリップ名
312 * @param loop ループする場合は <code>true</code>、しない場合は <code>false</code>
313 */
314 public void playSE( String id, String clipName, boolean loop )
315 {
316 _audioPlayer.playSE( id, clipName, loop );
317 }
318
319 /***
320 * サウンド効果を処理するオーディオプレーヤーを設定します。
321 * @param audioPlayer オーディオプレーヤー
322 */
323 public void setAudioPlayer( AudioPlayer audioPlayer )
324 {
325 _audioPlayer = audioPlayer;
326 }
327
328 /***
329 * サウンド効果を処理するオーディオプレーヤーを取得します。
330 * @return オーディオプレーヤー
331 */
332 public AudioPlayer getAudioPlayer()
333 {
334 return _audioPlayer;
335 }
336
337 /***
338 * このステージを描画するキャンバスを設定します。
339 * @param canvas このステージを描画するキャンバス
340 */
341 void setStageCanvas( StageCanvas canvas )
342 {
343 _canvas = canvas;
344 }
345
346 /***
347 * このステージを描画するキャンバスを取得します。
348 * @return ステージキャンバス
349 */
350 public StageCanvas getStageCanvas()
351 {
352 return _canvas;
353 }
354
355 /***
356 * このステージを描画しているキャンバスを最新の状態に更新します。
357 */
358 public void updateCanvas()
359 {
360 _canvas.updateCanvas( null );
361 }
362
363 /***
364 * このステージを描画しているキャンバスを最新の状態に更新します。
365 */
366 public void updateCanvas( String effect )
367 {
368 if( _canvas != null ) {
369 Logger.debug( "[canvas.stage] effect :" + effect );
370 _canvas.updateCanvas( effect );
371 }
372 }
373
374
375 public void commit()
376 {
377 _committedActors.clear();
378 _committedActors.putAll( _actors );
379 _committedBackground = _background;
380 _committedBackgroundColor = _backgroundColor;
381 _committedSlide = _slide;
382 }
383
384 /***
385 * Stage を破棄します。
386 */
387 void dispose()
388 {
389 Iterator itr = _actors.values().iterator();
390 while( itr.hasNext() ) {
391 ((Actor)itr.next()).disposeLooks();
392 }
393
394 if( _backgroundImage != null ) {
395 ImageManager images = ImageManager.getInstance();
396 images.putImage( _background, _backgroundImage );
397 }
398
399 _audioPlayer.stopAll();
400 }
401
402 /***
403 * Stage を描画する準備を実行します。
404 */
405 public void prepare()
406 {
407 if( _actors == null ) {
408 _actors = (Map)_committedActors.clone();
409 }
410
411 Iterator itr = _actors.values().iterator();
412 while( itr.hasNext() ) {
413 ((Actor)itr.next()).prepare();
414 }
415
416 if( _committedBackgroundColor == null ) {
417 setBackgroundImage( _committedBackground );
418 }
419 else {
420 _background = _committedBackground;
421 _backgroundColor = _committedBackgroundColor;
422 }
423
424 if( _committedSlide != null ) {
425 showSlide( _committedSlide );
426 }
427
428 updateCanvas();
429 }
430 }