dxrubynd 1.4.7

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.
@@ -0,0 +1,1313 @@
1
+ #define WINVER 0x0500 /* �o�[�W������` Windows2000�ȏ� */
2
+ #define _WIN32_WINNT WINVER
3
+
4
+ #include "ruby.h"
5
+ #ifndef RUBY_ST_H
6
+ #include "st.h"
7
+ #endif
8
+
9
+ #define DXRUBY_EXTERN 1
10
+ #include "dxruby.h"
11
+ #include "sprite.h"
12
+ #include "image.h"
13
+ #include "collision.h"
14
+ #ifdef DXRUBY15
15
+ #include "matrix.h"
16
+ #endif
17
+
18
+ static VALUE cSprite; /* �X�v���C�g�N���X */
19
+ #ifdef DXRUBY15
20
+ extern VALUE cVector;
21
+ #endif
22
+
23
+ #ifdef DXRUBY_USE_TYPEDDATA
24
+ extern rb_data_type_t Image_data_type;
25
+ extern rb_data_type_t RenderTarget_data_type;
26
+ extern rb_data_type_t Shader_data_type;
27
+ #ifdef DXRUBY15
28
+ extern rb_data_type_t Matrix_data_type;
29
+ extern rb_data_type_t Vector_data_type;
30
+ #endif
31
+ #endif
32
+
33
+ ID id_shot;
34
+ ID id_hit;
35
+ ID id_update;
36
+ ID id_draw;
37
+ ID id_render;
38
+ ID id_vanished;
39
+ ID id_visible;
40
+
41
+ static VALUE Sprite_check( int argc, VALUE *argv, VALUE klass );
42
+
43
+ /*********************************************************************
44
+ * Sprite�N���X
45
+ *
46
+ * �`��v���~�e�B�u�Ƃ��Ē񋟂���X�v���C�g�@�\
47
+ *********************************************************************/
48
+ /*--------------------------------------------------------------------
49
+ �Q�Ƃ���Ȃ��Ȃ����Ƃ���GC����Ă΂��֐�
50
+ ---------------------------------------------------------------------*/
51
+ void Sprite_release( struct DXRubySprite *sprite )
52
+ {
53
+ free( sprite );
54
+ }
55
+
56
+ /*--------------------------------------------------------------------
57
+ Sprite�N���X��mark
58
+ ---------------------------------------------------------------------*/
59
+ static void Sprite_mark( struct DXRubySprite *sprite )
60
+ {
61
+ rb_gc_mark( sprite->vx );
62
+ rb_gc_mark( sprite->vy );
63
+ rb_gc_mark( sprite->vz );
64
+ rb_gc_mark( sprite->vimage );
65
+ rb_gc_mark( sprite->vtarget );
66
+ rb_gc_mark( sprite->vangle );
67
+ rb_gc_mark( sprite->vscale_x );
68
+ rb_gc_mark( sprite->vscale_y );
69
+ rb_gc_mark( sprite->vcenter_x );
70
+ rb_gc_mark( sprite->vcenter_y );
71
+ rb_gc_mark( sprite->valpha );
72
+ rb_gc_mark( sprite->vblend );
73
+ rb_gc_mark( sprite->vvisible );
74
+ rb_gc_mark( sprite->vshader );
75
+ rb_gc_mark( sprite->vcollision );
76
+ rb_gc_mark( sprite->vcollision_enable );
77
+ rb_gc_mark( sprite->vcollision_sync );
78
+ #ifdef DXRUBY15
79
+ rb_gc_mark( sprite->vxy );
80
+ rb_gc_mark( sprite->vxyz );
81
+ #endif
82
+ rb_gc_mark( sprite->voffset_sync );
83
+ }
84
+
85
+ #ifdef DXRUBY_USE_TYPEDDATA
86
+ const rb_data_type_t Sprite_data_type = {
87
+ "Sprite",
88
+ {
89
+ Sprite_mark,
90
+ Sprite_release,
91
+ 0,
92
+ },
93
+ NULL, NULL
94
+ };
95
+ #endif
96
+
97
+ /*--------------------------------------------------------------------
98
+ Sprite�N���X��allocate�B���������m�ۂ���ׂ�initialize�O�ɌĂ΂��B
99
+ ---------------------------------------------------------------------*/
100
+ static VALUE Sprite_allocate( VALUE klass )
101
+ {
102
+ VALUE obj;
103
+ struct DXRubySprite *sprite;
104
+
105
+ /* DXRubySprite�̃������擾��Sprite�I�u�W�F�N�g���� */
106
+ sprite = malloc( sizeof(struct DXRubySprite) );
107
+ if( sprite == NULL ) rb_raise( eDXRubyError, "Out of memory - Sprite_allocate" );
108
+ #ifdef DXRUBY_USE_TYPEDDATA
109
+ obj = TypedData_Wrap_Struct( klass, &Sprite_data_type, sprite );
110
+ #else
111
+ obj = Data_Wrap_Struct(klass, Sprite_mark, Sprite_release, sprite);
112
+ #endif
113
+ sprite->vx = INT2FIX( 0 );
114
+ sprite->vy = INT2FIX( 0 );
115
+ sprite->vz = INT2FIX( 0 );
116
+ sprite->vimage = Qnil;
117
+ sprite->vtarget = Qnil;
118
+ sprite->vangle = INT2FIX( 0 );
119
+ sprite->vscale_x = INT2FIX( 1 );
120
+ sprite->vscale_y = INT2FIX( 1 );
121
+ sprite->vcenter_x = Qnil;
122
+ sprite->vcenter_y = Qnil;
123
+ sprite->valpha = INT2FIX( 255 );
124
+ sprite->vblend = Qnil;
125
+ sprite->vvisible = Qtrue;
126
+ sprite->vshader = Qnil;
127
+ sprite->vcollision = Qnil;
128
+ sprite->vcollision_enable = Qtrue;
129
+ sprite->vcollision_sync = Qtrue;
130
+ sprite->vanish = FALSE;
131
+ #ifdef DXRUBY15
132
+ sprite->vxy = Qnil;
133
+ sprite->vxyz = Qnil;
134
+ #endif
135
+ sprite->voffset_sync = Qfalse;
136
+
137
+ return obj;
138
+ }
139
+
140
+
141
+ /*--------------------------------------------------------------------
142
+ Sprite�N���X��Initialize
143
+ ---------------------------------------------------------------------*/
144
+ static VALUE Sprite_initialize( int argc, VALUE *argv, VALUE self )
145
+ {
146
+ struct DXRubySprite *sprite = DXRUBY_GET_STRUCT( Sprite, self );
147
+
148
+ sprite->vx = (argc == 0 || argv[0] == Qnil) ? INT2FIX( 0 ) : argv[0];
149
+ sprite->vy = (argc < 2 || argv[1] == Qnil) ? INT2FIX( 0 ) : argv[1];
150
+ sprite->vimage = (argc < 3) ? Qnil : argv[2];
151
+
152
+ return self;
153
+ }
154
+
155
+
156
+ /*--------------------------------------------------------------------
157
+ Sprite�N���X��draw
158
+ ---------------------------------------------------------------------*/
159
+ void Sprite_internal_draw( VALUE self, VALUE vrt )
160
+ {
161
+ struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, vrt );
162
+ struct DXRubySprite *sprite = DXRUBY_GET_STRUCT( Sprite, self );
163
+ struct DXRubyImage *image;
164
+ float z;
165
+
166
+ if( !RTEST(sprite->vvisible) || sprite->vanish )
167
+ {
168
+ return;
169
+ }
170
+
171
+ /* �C���[�W�I�u�W�F�N�g���璆�g�����o�� */
172
+ if( sprite->vimage == Qnil )
173
+ {
174
+ return;
175
+ }
176
+
177
+ DXRUBY_CHECK_IMAGE( sprite->vimage );
178
+ image = DXRUBY_GET_STRUCT( Image, sprite->vimage );
179
+ DXRUBY_CHECK_DISPOSE( image, texture );
180
+
181
+ if( sprite->vangle == INT2FIX( 0 ) && sprite->vscale_x == INT2FIX( 1 ) && sprite->vscale_y == INT2FIX( 1 ) )
182
+ {/* ��]�g�喳�� */
183
+ volatile VALUE temp;
184
+ struct DXRubyPicture_draw *picture;
185
+
186
+ picture = (struct DXRubyPicture_draw *)RenderTarget_AllocPictureList( rt, sizeof( struct DXRubyPicture_draw ) );
187
+
188
+ /* DXRubyPicture�I�u�W�F�N�g�ݒ� */
189
+ picture->x = (int)(NUM2FLOAT( sprite->vx ) - (RTEST(sprite->voffset_sync) ? (sprite->vcenter_x == Qnil ? image->width / 2.0f : NUM2FLOAT( sprite->vcenter_x )) : 0));
190
+ picture->y = (int)(NUM2FLOAT( sprite->vy ) - (RTEST(sprite->voffset_sync) ? (sprite->vcenter_y == Qnil ? image->height / 2.0f : NUM2FLOAT( sprite->vcenter_y )) : 0));
191
+ picture->x -= rt->ox;
192
+ picture->y -= rt->oy;
193
+
194
+ if( sprite->vshader == Qnil )
195
+ {/* �V�F�[�_�Ȃ� */
196
+ picture->func = RenderTarget_draw_func;
197
+ picture->value = sprite->vimage;
198
+ }
199
+ else
200
+ {/* �V�F�[�_���� */
201
+ struct DXRubyShader *shader;
202
+ struct DXRubyShaderCore *core;
203
+
204
+ DXRUBY_CHECK_TYPE( Shader, sprite->vshader );
205
+ shader = DXRUBY_GET_STRUCT( Shader, sprite->vshader );
206
+ core = DXRUBY_GET_STRUCT( ShaderCore, shader->vcore );
207
+ DXRUBY_CHECK_DISPOSE( core, pD3DXEffect );
208
+
209
+ temp = rb_ary_new3( 3, sprite->vimage, shader->vcore, shader->vparam );
210
+ picture->value = temp;
211
+
212
+ /* Shader����Image�I�u�W�F�N�g�����b�N���� */
213
+ // rb_hash_foreach( RARRAY_PTR( picture->value )[2], Window_drawShader_func_foreach_lock, RARRAY_PTR( picture->value )[1]);
214
+
215
+ picture->func = RenderTarget_drawShader_func;
216
+ }
217
+
218
+ picture->alpha = NUM2INT( sprite->valpha );
219
+ picture->blendflag = (sprite->vblend == Qnil ? 0 :
220
+ (sprite->vblend == symbol_add ? 4 :
221
+ (sprite->vblend == symbol_none ? 1 :
222
+ (sprite->vblend == symbol_add2 ? 5 :
223
+ (sprite->vblend == symbol_sub ? 6 :
224
+ (sprite->vblend == symbol_sub2 ? 7 : 0))))));
225
+
226
+ /* ���X�g�f�[�^�ɒlj� */
227
+ rt->PictureList[rt->PictureCount].picture = (struct DXRubyPicture *)picture;
228
+ z = NUM2FLOAT( sprite->vz );
229
+ rt->PictureList[rt->PictureCount].z = z;
230
+ picture->z = z;
231
+ rt->PictureCount++;
232
+ }
233
+ else
234
+ {
235
+ volatile VALUE temp;
236
+ struct DXRubyPicture_drawEx *picture;
237
+
238
+ picture = (struct DXRubyPicture_drawEx *)RenderTarget_AllocPictureList( rt, sizeof( struct DXRubyPicture_drawEx ) );
239
+
240
+ /* DXRubyPicture�I�u�W�F�N�g�ݒ� */
241
+ picture->func = RenderTarget_drawEx_func;
242
+ picture->x = (int)(NUM2FLOAT( sprite->vx ) - (RTEST(sprite->voffset_sync) ? (sprite->vcenter_x == Qnil ? image->width / 2.0f : NUM2FLOAT( sprite->vcenter_x )) : 0));
243
+ picture->y = (int)(NUM2FLOAT( sprite->vy ) - (RTEST(sprite->voffset_sync) ? (sprite->vcenter_y == Qnil ? image->height / 2.0f : NUM2FLOAT( sprite->vcenter_y )) : 0));
244
+ picture->x -= rt->ox;
245
+ picture->y -= rt->oy;
246
+
247
+ if( sprite->vshader != Qnil )
248
+ {/* �V�F�[�_���� */
249
+ struct DXRubyShader *shader;
250
+ struct DXRubyShaderCore *core;
251
+ DXRUBY_CHECK_TYPE( Shader, sprite->vshader );
252
+ shader = DXRUBY_GET_STRUCT( Shader, sprite->vshader );
253
+ core = DXRUBY_GET_STRUCT( ShaderCore, shader->vcore );
254
+ DXRUBY_CHECK_DISPOSE( core, pD3DXEffect );
255
+
256
+ temp = rb_ary_new3( 3, sprite->vimage, shader->vcore, shader->vparam );
257
+ picture->value = temp;
258
+
259
+ /* Shader����Image�I�u�W�F�N�g�����b�N���� */
260
+ // rb_hash_foreach( RARRAY_PTR( picture->value )[2], Window_drawShader_func_foreach_lock, RARRAY_PTR( picture->value )[1]);
261
+ }
262
+ else
263
+ {
264
+ picture->value = sprite->vimage;
265
+ }
266
+
267
+ picture->angle = NUM2FLOAT( sprite->vangle );
268
+ picture->scalex = NUM2FLOAT( sprite->vscale_x );
269
+ picture->scaley = NUM2FLOAT( sprite->vscale_y );
270
+ picture->centerx = (sprite->vcenter_x == Qnil ? image->width / 2.0f : NUM2FLOAT( sprite->vcenter_x ));
271
+ picture->centery = (sprite->vcenter_y == Qnil ? image->height / 2.0f : NUM2FLOAT( sprite->vcenter_y ));
272
+
273
+ picture->alpha = NUM2INT( sprite->valpha );
274
+ picture->blendflag = (sprite->vblend == Qnil ? 0 :
275
+ (sprite->vblend == symbol_add ? 4 :
276
+ (sprite->vblend == symbol_none ? 1 :
277
+ (sprite->vblend == symbol_add2 ? 5 :
278
+ (sprite->vblend == symbol_sub ? 6 :
279
+ (sprite->vblend == symbol_sub2 ? 7 : 0))))));
280
+
281
+ /* ���X�g�f�[�^�ɒlj� */
282
+ rt->PictureList[rt->PictureCount].picture = (struct DXRubyPicture *)picture;
283
+ z = NUM2FLOAT( sprite->vz );
284
+ rt->PictureList[rt->PictureCount].z = z;
285
+ picture->z = z;
286
+ rt->PictureCount++;
287
+ }
288
+
289
+ /* RenderTarget�������ꍇ�ɕ`��\�񂪂����update���� */
290
+ if( DXRUBY_CHECK( RenderTarget, sprite->vimage ) )
291
+ {
292
+ struct DXRubyRenderTarget *src_rt = DXRUBY_GET_STRUCT( RenderTarget, sprite->vimage );
293
+
294
+ if( src_rt->clearflag == 0 && src_rt->PictureCount == 0 )
295
+ {
296
+ g_pD3DDevice->lpVtbl->SetRenderTarget( g_pD3DDevice, 0, src_rt->surface );
297
+ g_pD3DDevice->lpVtbl->Clear( g_pD3DDevice, 0, NULL, D3DCLEAR_TARGET,
298
+ D3DCOLOR_ARGB( src_rt->a, src_rt->r, src_rt->g, src_rt->b ), 1.0f, 0 );
299
+ src_rt->clearflag = 1;
300
+ }
301
+ else if( src_rt->PictureCount > 0 )
302
+ {
303
+ RenderTarget_update( sprite->vimage );
304
+ }
305
+ }
306
+
307
+ /* �g��ꂽimage�̃��b�N */
308
+ // image->lockcount += 1;
309
+ }
310
+
311
+
312
+ VALUE Sprite_draw( VALUE self )
313
+ {
314
+ VALUE vrt;
315
+ struct DXRubySprite *sprite = DXRUBY_GET_STRUCT( Sprite, self );
316
+
317
+ if( sprite->vtarget == Qnil || sprite->vtarget == mWindow )
318
+ {
319
+ vrt = g_WindowInfo.render_target;
320
+ }
321
+ else
322
+ {
323
+ DXRUBY_CHECK_TYPE( RenderTarget, sprite->vtarget );
324
+ vrt = sprite->vtarget;
325
+ }
326
+
327
+ Sprite_internal_draw( self, vrt );
328
+
329
+ return self;
330
+ }
331
+
332
+ /*--------------------------------------------------------------------
333
+ �v���p�e�B��Setter/Getter
334
+ ---------------------------------------------------------------------*/
335
+ /* x */
336
+ static VALUE Sprite_get_x( VALUE self )
337
+ {
338
+ return DXRUBY_GET_STRUCT( Sprite, self )->vx;
339
+ }
340
+
341
+ /* x= */
342
+ static VALUE Sprite_set_x( VALUE self, VALUE vx )
343
+ {
344
+ DXRUBY_GET_STRUCT( Sprite, self )->vx = vx;
345
+ return vx;
346
+ }
347
+
348
+ /* y */
349
+ static VALUE Sprite_get_y( VALUE self )
350
+ {
351
+ return DXRUBY_GET_STRUCT( Sprite, self )->vy;
352
+ }
353
+
354
+ /* y= */
355
+ static VALUE Sprite_set_y( VALUE self, VALUE vy )
356
+ {
357
+ DXRUBY_GET_STRUCT( Sprite, self )->vy = vy;
358
+ return vy;
359
+ }
360
+
361
+ /* z */
362
+ static VALUE Sprite_get_z( VALUE self )
363
+ {
364
+ return DXRUBY_GET_STRUCT( Sprite, self )->vz;
365
+ }
366
+
367
+ /* z= */
368
+ static VALUE Sprite_set_z( VALUE self, VALUE vz )
369
+ {
370
+ DXRUBY_GET_STRUCT( Sprite, self )->vz = vz;
371
+ return vz;
372
+ }
373
+
374
+ /* angle */
375
+ static VALUE Sprite_get_angle( VALUE self )
376
+ {
377
+ return DXRUBY_GET_STRUCT( Sprite, self )->vangle;
378
+ }
379
+
380
+ /* angle= */
381
+ static VALUE Sprite_set_angle( VALUE self, VALUE vangle )
382
+ {
383
+ DXRUBY_GET_STRUCT( Sprite, self )->vangle = vangle;
384
+ return vangle;
385
+ }
386
+
387
+
388
+ /* image */
389
+ static VALUE Sprite_get_image( VALUE self )
390
+ {
391
+ return DXRUBY_GET_STRUCT( Sprite, self )->vimage;
392
+ }
393
+
394
+ /* image= */
395
+ static VALUE Sprite_set_image( VALUE self, VALUE vimage )
396
+ {
397
+ DXRUBY_GET_STRUCT( Sprite, self )->vimage = vimage;
398
+ return vimage;
399
+ }
400
+
401
+ /* blend */
402
+ static VALUE Sprite_get_blend( VALUE self )
403
+ {
404
+ return DXRUBY_GET_STRUCT( Sprite, self )->vblend;
405
+ }
406
+
407
+ /* blend= */
408
+ static VALUE Sprite_set_blend( VALUE self, VALUE vblend )
409
+ {
410
+ DXRUBY_GET_STRUCT( Sprite, self )->vblend = vblend;
411
+ return vblend;
412
+ }
413
+
414
+ /* alpha */
415
+ static VALUE Sprite_get_alpha( VALUE self )
416
+ {
417
+ return DXRUBY_GET_STRUCT( Sprite, self )->valpha;
418
+ }
419
+
420
+ /* alpha= */
421
+ static VALUE Sprite_set_alpha( VALUE self, VALUE valpha )
422
+ {
423
+ DXRUBY_GET_STRUCT( Sprite, self )->valpha = valpha;
424
+ return valpha;
425
+ }
426
+
427
+ /* target */
428
+ static VALUE Sprite_get_target( VALUE self )
429
+ {
430
+ return DXRUBY_GET_STRUCT( Sprite, self )->vtarget;
431
+ }
432
+
433
+ /* target= */
434
+ static VALUE Sprite_set_target( VALUE self, VALUE vtarget )
435
+ {
436
+ DXRUBY_GET_STRUCT( Sprite, self )->vtarget = vtarget;
437
+ return vtarget;
438
+ }
439
+
440
+ /* shader */
441
+ static VALUE Sprite_get_shader( VALUE self )
442
+ {
443
+ return DXRUBY_GET_STRUCT( Sprite, self )->vshader;
444
+ }
445
+
446
+ /* shader= */
447
+ static VALUE Sprite_set_shader( VALUE self, VALUE vshader )
448
+ {
449
+ DXRUBY_GET_STRUCT( Sprite, self )->vshader = vshader;
450
+ return vshader;
451
+ }
452
+
453
+ /* scale_x */
454
+ static VALUE Sprite_get_scale_x( VALUE self )
455
+ {
456
+ return DXRUBY_GET_STRUCT( Sprite, self )->vscale_x;
457
+ }
458
+
459
+ /* scale_x= */
460
+ static VALUE Sprite_set_scale_x( VALUE self, VALUE vscale_x )
461
+ {
462
+ DXRUBY_GET_STRUCT( Sprite, self )->vscale_x = vscale_x;
463
+ return vscale_x;
464
+ }
465
+
466
+ /* scale_y */
467
+ static VALUE Sprite_get_scale_y( VALUE self )
468
+ {
469
+ return DXRUBY_GET_STRUCT( Sprite, self )->vscale_y;
470
+ }
471
+
472
+ /* scale_y= */
473
+ static VALUE Sprite_set_scale_y( VALUE self, VALUE vscale_y )
474
+ {
475
+ DXRUBY_GET_STRUCT( Sprite, self )->vscale_y = vscale_y;
476
+ return vscale_y;
477
+ }
478
+
479
+ /* center_x */
480
+ static VALUE Sprite_get_center_x( VALUE self )
481
+ {
482
+ struct DXRubySprite *sprite = DXRUBY_GET_STRUCT( Sprite, self );
483
+ if( sprite->vcenter_x == Qnil )
484
+ {
485
+ struct DXRubyImage *image;
486
+
487
+ if( sprite->vimage == Qnil )
488
+ {
489
+ return Qnil;
490
+ }
491
+
492
+ DXRUBY_CHECK_IMAGE( sprite->vimage );
493
+ image = DXRUBY_GET_STRUCT( Image, sprite->vimage );
494
+ DXRUBY_CHECK_DISPOSE( image, texture );
495
+ return rb_float_new( image->width / 2.0f );
496
+ }
497
+ else
498
+ {
499
+ return sprite->vcenter_x;
500
+ }
501
+ }
502
+
503
+ /* center_x= */
504
+ static VALUE Sprite_set_center_x( VALUE self, VALUE vcenter_x )
505
+ {
506
+ DXRUBY_GET_STRUCT( Sprite, self )->vcenter_x = vcenter_x;
507
+ return vcenter_x;
508
+ }
509
+
510
+ /* center_y */
511
+ static VALUE Sprite_get_center_y( VALUE self )
512
+ {
513
+ struct DXRubySprite *sprite = DXRUBY_GET_STRUCT( Sprite, self );
514
+ if( sprite->vcenter_y == Qnil )
515
+ {
516
+ struct DXRubyImage *image;
517
+
518
+ if( sprite->vimage == Qnil )
519
+ {
520
+ return Qnil;
521
+ }
522
+
523
+ DXRUBY_CHECK_IMAGE( sprite->vimage );
524
+ image = DXRUBY_GET_STRUCT( Image, sprite->vimage );
525
+ DXRUBY_CHECK_DISPOSE( image, texture );
526
+ return rb_float_new( image->height / 2.0f );
527
+ }
528
+ else
529
+ {
530
+ return sprite->vcenter_y;
531
+ }
532
+ }
533
+
534
+ /* center_y= */
535
+ static VALUE Sprite_set_center_y( VALUE self, VALUE vcenter_y )
536
+ {
537
+ DXRUBY_GET_STRUCT( Sprite, self )->vcenter_y = vcenter_y;
538
+ return vcenter_y;
539
+ }
540
+
541
+ /* collision_enable */
542
+ static VALUE Sprite_get_collision_enable( VALUE self )
543
+ {
544
+ return DXRUBY_GET_STRUCT( Sprite, self )->vcollision_enable;
545
+ }
546
+
547
+ /* collision_enable= */
548
+ static VALUE Sprite_set_collision_enable( VALUE self, VALUE vcollision_enable )
549
+ {
550
+ DXRUBY_GET_STRUCT( Sprite, self )->vcollision_enable = vcollision_enable;
551
+ return vcollision_enable;
552
+ }
553
+
554
+ /* collision_sync */
555
+ static VALUE Sprite_get_collision_sync( VALUE self )
556
+ {
557
+ return DXRUBY_GET_STRUCT( Sprite, self )->vcollision_sync;
558
+ }
559
+
560
+ /* collision_sync= */
561
+ static VALUE Sprite_set_collision_sync( VALUE self, VALUE vcollision_sync )
562
+ {
563
+ DXRUBY_GET_STRUCT( Sprite, self )->vcollision_sync = vcollision_sync;
564
+ return vcollision_sync;
565
+ }
566
+
567
+ /* collision */
568
+ static VALUE Sprite_get_collision( VALUE self )
569
+ {
570
+ return DXRUBY_GET_STRUCT( Sprite, self )->vcollision;
571
+ // struct DXRubySprite *sprite = DXRUBY_GET_STRUCT( Sprite, self );
572
+ // struct DXRubyCollision temp;
573
+ // make_volume( rb_ary_new3(1, self), &temp );
574
+ // return rb_ary_new3( 4, rb_float_new(temp.x1), rb_float_new(temp.y1), rb_float_new(temp.x2), rb_float_new(temp.y2) );
575
+ }
576
+
577
+ /* collision= */
578
+ static VALUE Sprite_set_collision( VALUE self, VALUE vcollision )
579
+ {
580
+ DXRUBY_GET_STRUCT( Sprite, self )->vcollision = vcollision;
581
+ return vcollision;
582
+ }
583
+
584
+ /* visible */
585
+ static VALUE Sprite_get_visible( VALUE self )
586
+ {
587
+ return DXRUBY_GET_STRUCT( Sprite, self )->vvisible;
588
+ }
589
+
590
+ /* visible= */
591
+ static VALUE Sprite_set_visible( VALUE self, VALUE vvisible )
592
+ {
593
+ DXRUBY_GET_STRUCT( Sprite, self )->vvisible = vvisible;
594
+ return vvisible;
595
+ }
596
+
597
+ /* param_hash */
598
+ static VALUE Sprite_get_param_hash( VALUE self )
599
+ {
600
+ struct DXRubySprite *sprite = DXRUBY_GET_STRUCT( Sprite, self );
601
+ VALUE vresult;
602
+
603
+ vresult = rb_hash_new();
604
+ rb_hash_aset( vresult, symbol_angle, sprite->vangle );
605
+ rb_hash_aset( vresult, symbol_alpha, sprite->valpha );
606
+ rb_hash_aset( vresult, symbol_z, sprite->vz );
607
+ #ifdef DXRUBY15
608
+ rb_hash_aset( vresult, symbol_scale_x, sprite->vscale_x );
609
+ rb_hash_aset( vresult, symbol_scale_y, sprite->vscale_y );
610
+ rb_hash_aset( vresult, symbol_center_x, sprite->vcenter_x );
611
+ rb_hash_aset( vresult, symbol_center_y, sprite->vcenter_y );
612
+ #else
613
+ rb_hash_aset( vresult, symbol_scalex, sprite->vscale_x );
614
+ rb_hash_aset( vresult, symbol_scaley, sprite->vscale_y );
615
+ rb_hash_aset( vresult, symbol_centerx, sprite->vcenter_x );
616
+ rb_hash_aset( vresult, symbol_centery, sprite->vcenter_y );
617
+ #endif
618
+ rb_hash_aset( vresult, symbol_shader, sprite->vshader );
619
+ rb_hash_aset( vresult, symbol_blend, sprite->vblend );
620
+ rb_hash_aset( vresult, symbol_offset_sync, sprite->voffset_sync );
621
+
622
+ return vresult;
623
+ }
624
+
625
+ /* vanish */
626
+ static VALUE Sprite_vanish( VALUE self )
627
+ {
628
+ DXRUBY_GET_STRUCT( Sprite, self )->vanish = TRUE;
629
+ return self;
630
+ }
631
+
632
+ /* vanish? */
633
+ static VALUE Sprite_get_vanish( VALUE self )
634
+ {
635
+ return DXRUBY_GET_STRUCT( Sprite, self )->vanish ? Qtrue : Qfalse;
636
+ }
637
+
638
+ /* update */
639
+ static VALUE Sprite_update( VALUE self )
640
+ {
641
+ return self;
642
+ }
643
+
644
+ /* offset_sync */
645
+ static VALUE Sprite_get_offset_sync( VALUE self )
646
+ {
647
+ return DXRUBY_GET_STRUCT( Sprite, self )->voffset_sync;
648
+ }
649
+
650
+ /* offset_sync= */
651
+ static VALUE Sprite_set_offset_sync( VALUE self, VALUE voffset_sync )
652
+ {
653
+ DXRUBY_GET_STRUCT( Sprite, self )->voffset_sync = voffset_sync;
654
+ return voffset_sync;
655
+ }
656
+
657
+ #ifdef DXRUBY15
658
+ /* xy */
659
+ static VALUE Sprite_get_xy( VALUE self )
660
+ {
661
+ struct DXRubySprite *sprite = DXRUBY_GET_STRUCT( Sprite, self );
662
+ struct DXRubyVector *result;
663
+ VALUE vresult;
664
+ float sx, sy;
665
+ sx = NUM2FLOAT( sprite->vx );
666
+ sy = NUM2FLOAT( sprite->vy );
667
+
668
+ if( sprite->vxy != Qnil )
669
+ {
670
+ float x, y;
671
+ DXRUBY_CHECK_TYPE( Vector, sprite->vxy );
672
+ x = DXRUBY_GET_STRUCT( Vector, sprite->vxy )->v1;
673
+ y = DXRUBY_GET_STRUCT( Vector, sprite->vxy )->v2;
674
+
675
+ if( sx == x && sy == y )
676
+ {
677
+ return sprite->vxy;
678
+ }
679
+ }
680
+
681
+ vresult = Vector_allocate( cVector );
682
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
683
+ result->x = 2;
684
+ result->v1 = sx;
685
+ result->v2 = sy;
686
+ sprite->vxy = vresult;
687
+
688
+ return vresult;
689
+ }
690
+
691
+ /* xy= */
692
+ static VALUE Sprite_set_xy( VALUE self, VALUE vxy )
693
+ {
694
+ struct DXRubyVector *vec;
695
+
696
+ DXRUBY_CHECK_TYPE( Vector, vxy );
697
+ vec = DXRUBY_GET_STRUCT( Vector, vxy );
698
+
699
+ DXRUBY_GET_STRUCT( Sprite, self )->vxy = vxy;
700
+ DXRUBY_GET_STRUCT( Sprite, self )->vx = rb_float_new( vec->v1 );
701
+ DXRUBY_GET_STRUCT( Sprite, self )->vy = rb_float_new( vec->v2 );
702
+
703
+ return vxy;
704
+ }
705
+
706
+ /* xyz */
707
+ static VALUE Sprite_get_xyz( VALUE self )
708
+ {
709
+ struct DXRubySprite *sprite = DXRUBY_GET_STRUCT( Sprite, self );
710
+ struct DXRubyVector *result;
711
+ VALUE vresult;
712
+ float sx, sy, sz;
713
+ sx = NUM2FLOAT( sprite->vx );
714
+ sy = NUM2FLOAT( sprite->vy );
715
+ sz = NUM2FLOAT( sprite->vz );
716
+
717
+ if( sprite->vxyz != Qnil )
718
+ {
719
+ float x, y, z;
720
+ DXRUBY_CHECK_TYPE( Vector, sprite->vxyz );
721
+ x = DXRUBY_GET_STRUCT( Vector, sprite->vxyz )->v1;
722
+ y = DXRUBY_GET_STRUCT( Vector, sprite->vxyz )->v2;
723
+ z = DXRUBY_GET_STRUCT( Vector, sprite->vxyz )->v3;
724
+
725
+ if( sx == x && sy == y && sz == z)
726
+ {
727
+ return sprite->vxyz;
728
+ }
729
+ }
730
+
731
+ vresult = Vector_allocate( cVector );
732
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
733
+ result->x = 3;
734
+ result->v1 = sx;
735
+ result->v2 = sy;
736
+ result->v3 = sz;
737
+ sprite->vxyz = vresult;
738
+
739
+ return vresult;
740
+ }
741
+
742
+
743
+ /* xyz= */
744
+ static VALUE Sprite_set_xyz( VALUE self, VALUE vxyz )
745
+ {
746
+ struct DXRubyVector *vec;
747
+
748
+ DXRUBY_CHECK_TYPE( Vector, vxyz );
749
+ vec = DXRUBY_GET_STRUCT( Vector, vxyz );
750
+
751
+ DXRUBY_GET_STRUCT( Sprite, self )->vxyz = vxyz;
752
+ DXRUBY_GET_STRUCT( Sprite, self )->vx = rb_float_new( vec->v1 );
753
+ DXRUBY_GET_STRUCT( Sprite, self )->vy = rb_float_new( vec->v2 );
754
+ DXRUBY_GET_STRUCT( Sprite, self )->vz = rb_float_new( vec->v3 );
755
+
756
+ return vxyz;
757
+ }
758
+ #endif
759
+
760
+ /*--------------------------------------------------------------------
761
+ �P�̂Ɣz��̔���
762
+ ---------------------------------------------------------------------*/
763
+ static VALUE Sprite_hitcheck( VALUE self, VALUE vsprite )
764
+ {
765
+ struct DXRubyCollisionGroup collision1;
766
+ VALUE vary;
767
+
768
+ /* �Փ˂����I�u�W�F�N�g������z�� */
769
+ vary = rb_ary_new();
770
+
771
+ /* self��AABB�{�����[���v�Z */
772
+ if( make_volume( self, &collision1 ) == 0 )
773
+ {
774
+ collision_clear();
775
+ return vary;
776
+ }
777
+
778
+ if( TYPE(vsprite) == T_ARRAY )
779
+ {
780
+ struct DXRubyCollisionGroup *collision2;
781
+ int i, d_total;
782
+
783
+ /* �Ώۂ�AABB�{�����[���v�Z */
784
+ collision2 = (struct DXRubyCollisionGroup *)malloc( get_volume_count( vsprite ) * sizeof(struct DXRubyCollisionGroup) );
785
+ d_total = make_volume_ary( vsprite, collision2 );
786
+
787
+ /* �ΏۃI�u�W�F�N�g�̃��[�v */
788
+ for( i = 0; i < d_total; i++ )
789
+ {
790
+ /* ���� */
791
+ if( check_box_box( &collision1, collision2 + i ) && check( &collision1, collision2 + i ) )
792
+ {
793
+ rb_ary_push( vary, (collision2 + i)->vsprite );
794
+ }
795
+ }
796
+
797
+ free( collision2 );
798
+ }
799
+ else
800
+ {
801
+ struct DXRubyCollisionGroup collision2;
802
+
803
+ /* �Ώۂ�AABB�{�����[���v�Z */
804
+ if( make_volume( vsprite, &collision2 ) > 0 )
805
+ {
806
+ /* ���� */
807
+ if( check_box_box( &collision1, &collision2 ) && check( &collision1, &collision2 ) )
808
+ {
809
+ rb_ary_push( vary, collision2.vsprite );
810
+ }
811
+ }
812
+ }
813
+
814
+ collision_clear();
815
+ return vary;
816
+ }
817
+
818
+
819
+ /*--------------------------------------------------------------------
820
+ �P�̂̔���
821
+ ---------------------------------------------------------------------*/
822
+ static VALUE Sprite_compare( VALUE self, VALUE vsprite )
823
+ {
824
+ struct DXRubyCollisionGroup collision1;
825
+ VALUE vary;
826
+
827
+ /* �Փ˂����I�u�W�F�N�g������z�� */
828
+ vary = rb_ary_new();
829
+
830
+ /* self��AABB�{�����[���v�Z */
831
+ if( make_volume( self, &collision1 ) == 0 )
832
+ {
833
+ collision_clear();
834
+ return vary;
835
+ }
836
+
837
+ if( TYPE(vsprite) == T_ARRAY )
838
+ {
839
+ struct DXRubyCollisionGroup *collision2;
840
+ int i, d_total;
841
+
842
+ /* �Ώۂ�AABB�{�����[���v�Z */
843
+ collision2 = (struct DXRubyCollisionGroup *)malloc( get_volume_count( vsprite ) * sizeof(struct DXRubyCollisionGroup) );
844
+ d_total = make_volume_ary( vsprite, collision2 );
845
+
846
+ /* �ΏۃI�u�W�F�N�g�̃��[�v */
847
+ for( i = 0; i < d_total; i++ )
848
+ {
849
+ /* ���� */
850
+ if( check_box_box( &collision1, collision2 + i ) && check( &collision1, collision2 + i ) )
851
+ {
852
+ free( collision2 );
853
+ collision_clear();
854
+ return Qtrue;
855
+ }
856
+ }
857
+
858
+ free( collision2 );
859
+ }
860
+ else
861
+ {
862
+ struct DXRubyCollisionGroup collision2;
863
+
864
+ /* �Ώۂ�AABB�{�����[���v�Z */
865
+ if( make_volume( vsprite, &collision2 ) > 0 )
866
+ {
867
+ /* ���� */
868
+ if( check_box_box( &collision1, &collision2 ) && check( &collision1, &collision2 ) )
869
+ {
870
+ collision_clear();
871
+ return Qtrue;
872
+ }
873
+ }
874
+ }
875
+
876
+ collision_clear();
877
+ return Qfalse;
878
+ }
879
+
880
+
881
+ /*--------------------------------------------------------------------
882
+ �z�񓯎m�̔���
883
+ ---------------------------------------------------------------------*/
884
+ static VALUE Sprite_check( int argc, VALUE *argv, VALUE klass )
885
+ {
886
+ int i, j;
887
+ int flag = 0; /* �ʃO���[�v�Ȃ�0�A�����O���[�v�Ȃ�1 */
888
+ VALUE hitflag = Qfalse; /* ��‚ł�����������Qtrue */
889
+ VALUE o, d;
890
+ ID id_shot_temp, id_hit_temp;
891
+ int shot_flg = 0, hit_flg = 0;
892
+ VALUE ary;
893
+ int ary_count = 0;
894
+ struct DXRubyCollisionGroup *collision1;
895
+ struct DXRubyCollisionGroup *collision2;
896
+ int o_total, d_total;
897
+
898
+ if( argc < 1 || argc > 4 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 1, 4 );
899
+
900
+ o = argv[0];
901
+
902
+ if( argc == 1 )
903
+ {
904
+ d = o;
905
+ }
906
+ else
907
+ {
908
+ d = argv[1];
909
+ }
910
+
911
+ /* �P�̎w��̏ꍇ�͂Ƃ肠�����z��ɓ˂����� */
912
+ if( TYPE(o) != T_ARRAY )
913
+ {
914
+ o = rb_ary_new3( 1, o );
915
+ }
916
+ if( TYPE(d) != T_ARRAY )
917
+ {
918
+ d = rb_ary_new3( 1, d );
919
+ }
920
+
921
+ /* �����z�񂾂�����flag�𗧂Ă� */
922
+ if( o == d )
923
+ {
924
+ flag = 1;
925
+ id_shot_temp = id_hit;
926
+ id_hit_temp = id_hit;
927
+ }
928
+ else
929
+ {
930
+ id_shot_temp = id_shot;
931
+ id_hit_temp = id_hit;
932
+ }
933
+
934
+ /* �Ăѐ惁�\�b�h */
935
+ if( argc > 2 )
936
+ {
937
+ if( TYPE(argv[2]) == T_STRING )
938
+ {
939
+ id_shot_temp = rb_intern( RSTRING_PTR(argv[2]) );
940
+ }
941
+ else if( TYPE(argv[2]) == T_SYMBOL )
942
+ {
943
+ id_shot_temp = SYM2ID( argv[2] );
944
+ }
945
+ else if( argv[2] == Qnil )
946
+ {
947
+ shot_flg = 1;
948
+ }
949
+ else
950
+ {
951
+ rb_raise( rb_eTypeError, "wrong argument type %s (expected String or Symbol)", rb_obj_classname( argv[2] ) );
952
+ }
953
+ }
954
+
955
+ if( argc > 3 )
956
+ {
957
+ if( TYPE(argv[3]) == T_STRING )
958
+ {
959
+ id_hit_temp = rb_intern( RSTRING_PTR(argv[3]) );
960
+ }
961
+ else if( TYPE(argv[3]) == T_SYMBOL )
962
+ {
963
+ id_hit_temp = SYM2ID( argv[3] );
964
+ }
965
+ else if( argv[3] == Qnil )
966
+ {
967
+ hit_flg = 1;
968
+ }
969
+ else
970
+ {
971
+ rb_raise( rb_eTypeError, "wrong argument type %s (expected String or Symbol)", rb_obj_classname( argv[3] ) );
972
+ }
973
+ }
974
+
975
+ /* AABB�{�����[���v�Z */
976
+ collision1 = (struct DXRubyCollisionGroup *)malloc( get_volume_count( o ) * sizeof(struct DXRubyCollisionGroup) );
977
+ o_total = make_volume_ary( o, collision1 );
978
+
979
+ if( flag == 0 )
980
+ {
981
+ collision2 = (struct DXRubyCollisionGroup *)malloc( get_volume_count( d ) * sizeof(struct DXRubyCollisionGroup) );
982
+ d_total = make_volume_ary( d, collision2 );
983
+ }
984
+ else
985
+ {
986
+ d_total = o_total;
987
+ collision2 = collision1;
988
+ }
989
+
990
+ /* �Փ˂��m�点�Ώ� */
991
+ // ary = (VALUE *)alloca( o_total * d_total * 2 * sizeof(VALUE *) );
992
+ ary = rb_ary_new();
993
+
994
+ /* �U�����I�u�W�F�N�g�̃��[�v */
995
+ for( i = 0; i < o_total - flag; i++ )
996
+ {
997
+ /* �h�䑤�I�u�W�F�N�g�̃��[�v */
998
+ for( j = (flag == 0 ? 0 : i + 1); j < d_total; j++ )
999
+ {
1000
+ /* ���� */
1001
+ if( check_box_box( collision1 + i, collision2 + j ) && check( collision1 + i, collision2 + j ) )
1002
+ {
1003
+ hitflag = Qtrue;
1004
+ rb_ary_push( ary, (collision1 + i)->vsprite );
1005
+ rb_ary_push( ary, (collision2 + j)->vsprite );
1006
+ // *(ary + ary_count) = (collision1 + i)->vsprite;
1007
+ // *(ary + ary_count + 1) = (collision2 + j)->vsprite;
1008
+ ary_count += 2;
1009
+ }
1010
+ }
1011
+ }
1012
+
1013
+ /* �Փ˂��m�点�R�[���o�b�N */
1014
+ for( i = 0; i < ary_count; i += 2 )
1015
+ {
1016
+ VALUE result;
1017
+ if( DXRUBY_GET_STRUCT(Sprite, RARRAY_AREF(ary, i))->vanish || DXRUBY_GET_STRUCT(Sprite, RARRAY_AREF(ary, i + 1))->vanish )
1018
+ {
1019
+ continue;
1020
+ }
1021
+ if( flag == 0 )
1022
+ {
1023
+ if( rb_respond_to( RARRAY_AREF(ary, i), id_shot_temp ) && !shot_flg )
1024
+ {
1025
+ if( rb_obj_method_arity( RARRAY_AREF(ary, i), id_shot_temp) == 0 ) /* ���������� */
1026
+ {
1027
+ result = rb_funcall( RARRAY_AREF(ary, i), id_shot_temp, 0 );
1028
+ }
1029
+ else /* ���������� */
1030
+ {
1031
+ result = rb_funcall( RARRAY_AREF(ary, i), id_shot_temp, 1, RARRAY_AREF(ary, i + 1) );
1032
+ }
1033
+
1034
+ if( result == symbol_discard )
1035
+ { /* ��������Ȃ� */
1036
+ int j;
1037
+ for( j = i + 2; j < ary_count; j += 2) /* ����Sprite�������׍H���� */
1038
+ {
1039
+ if( RARRAY_AREF(ary, i) == RARRAY_AREF(ary, j) || RARRAY_AREF(ary, i) == RARRAY_AREF(ary, j + 1) ) /* �����I�u�W�F�N�g�������� */
1040
+ {
1041
+ RARRAY_ASET(ary, j, Qnil); /* ���� */
1042
+ RARRAY_ASET(ary, j + 1, Qnil);
1043
+ }
1044
+ }
1045
+ }
1046
+ }
1047
+ }
1048
+ else
1049
+ {
1050
+ if( rb_respond_to( RARRAY_AREF(ary, i), id_hit_temp ) && !hit_flg )
1051
+ {
1052
+ if( rb_obj_method_arity( RARRAY_AREF(ary, i), id_hit_temp) == 0 ) /* ���������� */
1053
+ {
1054
+ result = rb_funcall( RARRAY_AREF(ary, i), id_hit_temp, 0 );
1055
+ }
1056
+ else /* ���������� */
1057
+ {
1058
+ result = rb_funcall( RARRAY_AREF(ary, i), id_hit_temp, 1, RARRAY_AREF(ary, i + 1) );
1059
+ }
1060
+
1061
+ if( result == symbol_discard )
1062
+ { /* ��������Ȃ� */
1063
+ int j;
1064
+ for( j = i + 2; j < ary_count; j += 2) /* ����Sprite�������׍H���� */
1065
+ {
1066
+ if( RARRAY_AREF(ary, i) == RARRAY_AREF(ary, j) || RARRAY_AREF(ary, i) == RARRAY_AREF(ary, j + 1) ) /* �����I�u�W�F�N�g�������� */
1067
+ {
1068
+ RARRAY_ASET(ary, j, Qnil); /* ���� */
1069
+ RARRAY_ASET(ary, j + 1, Qnil);
1070
+ }
1071
+ }
1072
+ }
1073
+ }
1074
+ }
1075
+
1076
+ if( rb_respond_to( RARRAY_AREF(ary, i + 1), id_hit_temp ) && !hit_flg )
1077
+ {
1078
+ if( rb_obj_method_arity( RARRAY_AREF(ary, i + 1), id_hit_temp) == 0 ) /* ���������� */
1079
+ {
1080
+ result = rb_funcall( RARRAY_AREF(ary, i + 1), id_hit_temp, 0 );
1081
+ }
1082
+ else /* ���������� */
1083
+ {
1084
+ result = rb_funcall( RARRAY_AREF(ary, i + 1), id_hit_temp, 1, RARRAY_AREF(ary, i) );
1085
+ }
1086
+
1087
+ if( result == symbol_discard )
1088
+ { /* ��������Ȃ� */
1089
+ int j;
1090
+ for( j = i + 2; j < ary_count; j += 2) /* ����Sprite�������׍H���� */
1091
+ {
1092
+ if( RARRAY_AREF(ary, i + 1) == RARRAY_AREF(ary, j) || RARRAY_AREF(ary, i + 1) == RARRAY_AREF(ary, j + 1) ) /* �����I�u�W�F�N�g�������� */
1093
+ {
1094
+ RARRAY_ASET(ary, j, Qnil); /* ���� */
1095
+ RARRAY_ASET(ary, j + 1, Qnil);
1096
+ }
1097
+ }
1098
+ }
1099
+ }
1100
+ }
1101
+
1102
+ free( collision1 );
1103
+ if( flag == 0 )
1104
+ {
1105
+ free( collision2 );
1106
+ }
1107
+
1108
+ collision_clear();
1109
+
1110
+ return hitflag;
1111
+ }
1112
+
1113
+
1114
+ static VALUE Sprite_class_update( VALUE klass, VALUE ary )
1115
+ {
1116
+ int i;
1117
+
1118
+ if( TYPE( ary ) != T_ARRAY )
1119
+ {
1120
+ ary = rb_ary_new3( 1, ary );
1121
+ }
1122
+
1123
+ for( i = 0; i < RARRAY_LEN( ary ); i++ )
1124
+ {
1125
+ VALUE p = RARRAY_AREF( ary, i );
1126
+
1127
+ if( TYPE( p ) == T_ARRAY )
1128
+ {
1129
+ Sprite_class_update( cSprite, p );
1130
+ }
1131
+ else if( !rb_respond_to( p, id_vanished ) || !RTEST( rb_funcall2( p, id_vanished, 0, 0 ) ) )
1132
+ {
1133
+ if( rb_respond_to( p, id_update ) )
1134
+ {
1135
+ rb_funcall2( p, id_update, 0, 0 );
1136
+ }
1137
+ }
1138
+ }
1139
+ return Qnil;
1140
+ }
1141
+
1142
+
1143
+ static VALUE Sprite_class_draw( VALUE klass, VALUE ary )
1144
+ {
1145
+ int i;
1146
+
1147
+ if( TYPE( ary ) != T_ARRAY )
1148
+ {
1149
+ ary = rb_ary_new3( 1, ary );
1150
+ }
1151
+
1152
+ for( i = 0; i < RARRAY_LEN( ary ); i++ )
1153
+ {
1154
+ VALUE p = RARRAY_AREF( ary, i );
1155
+
1156
+ if( TYPE( p ) == T_ARRAY )
1157
+ {
1158
+ Sprite_class_draw( cSprite, p );
1159
+ }
1160
+ else if( !rb_respond_to( p, id_vanished ) || !RTEST( rb_funcall2( p, id_vanished, 0, 0 ) ) )
1161
+ {
1162
+ if( rb_respond_to( p, id_draw ) )
1163
+ {
1164
+ rb_funcall2( p, id_draw, 0, 0 );
1165
+ }
1166
+ }
1167
+ }
1168
+ return Qnil;
1169
+ }
1170
+
1171
+
1172
+ static VALUE Sprite_class_render( VALUE klass, VALUE ary )
1173
+ {
1174
+ int i;
1175
+
1176
+ if( TYPE( ary ) != T_ARRAY )
1177
+ {
1178
+ ary = rb_ary_new3( 1, ary );
1179
+ }
1180
+
1181
+ for( i = 0; i < RARRAY_LEN( ary ); i++ )
1182
+ {
1183
+ VALUE p = RARRAY_AREF( ary, i );
1184
+
1185
+ if( TYPE( p ) == T_ARRAY )
1186
+ {
1187
+ Sprite_class_draw( cSprite, p );
1188
+ }
1189
+ else if( !rb_respond_to( p, id_vanished ) || !RTEST( rb_funcall2( p, id_vanished, 0, 0 ) ) )
1190
+ {
1191
+ if( rb_respond_to( p, id_render ) )
1192
+ {
1193
+ rb_funcall2( p, id_render, 0, 0 );
1194
+ }
1195
+ }
1196
+ }
1197
+ return Qnil;
1198
+ }
1199
+
1200
+
1201
+ static VALUE Sprite_class_clean( VALUE klass, VALUE ary )
1202
+ {
1203
+ int i;
1204
+
1205
+ if( TYPE( ary ) != T_ARRAY )
1206
+ {
1207
+ return Qnil;
1208
+ }
1209
+
1210
+ for( i = 0; i < RARRAY_LEN( ary ); i++ )
1211
+ {
1212
+ VALUE p = RARRAY_AREF( ary, i );
1213
+
1214
+ if( TYPE( p ) == T_ARRAY )
1215
+ {
1216
+ Sprite_class_clean( cSprite, p );
1217
+ }
1218
+ else if( rb_respond_to( p, id_vanished ) && RTEST( rb_funcall2( p, id_vanished, 0, 0 ) ) )
1219
+ {
1220
+ RARRAY_ASET( ary, i, Qnil);
1221
+ }
1222
+ }
1223
+
1224
+ rb_funcall( ary, rb_intern("compact!"), 0 );
1225
+
1226
+ return Qnil;
1227
+ }
1228
+
1229
+
1230
+ /*
1231
+ ***************************************************************
1232
+ *
1233
+ * Global functions
1234
+ *
1235
+ ***************************************************************/
1236
+
1237
+ void Init_dxruby_Sprite()
1238
+ {
1239
+ /* Sprite�N���X��` */
1240
+ cSprite = rb_define_class_under( mDXRuby, "Sprite", rb_cObject );
1241
+
1242
+ rb_define_private_method( cSprite, "initialize", Sprite_initialize, -1 );
1243
+ rb_define_method( cSprite, "x", Sprite_get_x, 0 );
1244
+ rb_define_method( cSprite, "x=", Sprite_set_x, 1 );
1245
+ rb_define_method( cSprite, "y", Sprite_get_y, 0 );
1246
+ rb_define_method( cSprite, "y=", Sprite_set_y, 1 );
1247
+ rb_define_method( cSprite, "z", Sprite_get_z, 0 );
1248
+ rb_define_method( cSprite, "z=", Sprite_set_z, 1 );
1249
+ rb_define_method( cSprite, "angle", Sprite_get_angle, 0 );
1250
+ rb_define_method( cSprite, "angle=", Sprite_set_angle, 1 );
1251
+ rb_define_method( cSprite, "scale_x", Sprite_get_scale_x, 0 );
1252
+ rb_define_method( cSprite, "scale_x=", Sprite_set_scale_x, 1 );
1253
+ rb_define_method( cSprite, "scale_y", Sprite_get_scale_y, 0 );
1254
+ rb_define_method( cSprite, "scale_y=", Sprite_set_scale_y, 1 );
1255
+ rb_define_method( cSprite, "center_x", Sprite_get_center_x, 0 );
1256
+ rb_define_method( cSprite, "center_x=", Sprite_set_center_x, 1 );
1257
+ rb_define_method( cSprite, "center_y", Sprite_get_center_y, 0 );
1258
+ rb_define_method( cSprite, "center_y=", Sprite_set_center_y, 1 );
1259
+ rb_define_method( cSprite, "alpha", Sprite_get_alpha, 0 );
1260
+ rb_define_method( cSprite, "alpha=", Sprite_set_alpha, 1 );
1261
+ rb_define_method( cSprite, "blend", Sprite_get_blend, 0 );
1262
+ rb_define_method( cSprite, "blend=", Sprite_set_blend, 1 );
1263
+ rb_define_method( cSprite, "image", Sprite_get_image, 0 );
1264
+ rb_define_method( cSprite, "image=", Sprite_set_image, 1 );
1265
+ rb_define_method( cSprite, "target", Sprite_get_target, 0 );
1266
+ rb_define_method( cSprite, "target=", Sprite_set_target, 1 );
1267
+ rb_define_method( cSprite, "shader", Sprite_get_shader, 0 );
1268
+ rb_define_method( cSprite, "shader=", Sprite_set_shader, 1 );
1269
+ rb_define_method( cSprite, "collision", Sprite_get_collision, 0 );
1270
+ rb_define_method( cSprite, "collision=", Sprite_set_collision, 1 );
1271
+ rb_define_method( cSprite, "collision_enable", Sprite_get_collision_enable, 0 );
1272
+ rb_define_method( cSprite, "collision_enable=", Sprite_set_collision_enable, 1 );
1273
+ rb_define_method( cSprite, "collision_sync", Sprite_get_collision_sync, 0 );
1274
+ rb_define_method( cSprite, "collision_sync=", Sprite_set_collision_sync, 1 );
1275
+ rb_define_method( cSprite, "visible", Sprite_get_visible, 0 );
1276
+ rb_define_method( cSprite, "visible=", Sprite_set_visible, 1 );
1277
+ rb_define_method( cSprite, "update", Sprite_update, 0 );
1278
+ rb_define_method( cSprite, "draw", Sprite_draw, 0 );
1279
+ // rb_define_method( cSprite, "render", Sprite_draw, 0 );
1280
+ rb_define_method( cSprite, "===", Sprite_compare, 1 );
1281
+ rb_define_method( cSprite, "check", Sprite_hitcheck, 1 );
1282
+ rb_define_method( cSprite, "param_hash", Sprite_get_param_hash, 0 );
1283
+ rb_define_method( cSprite, "vanish", Sprite_vanish, 0 );
1284
+ rb_define_method( cSprite, "vanished?", Sprite_get_vanish, 0 );
1285
+ rb_define_method( cSprite, "offset_sync", Sprite_get_offset_sync, 0 );
1286
+ rb_define_method( cSprite, "offset_sync=", Sprite_set_offset_sync, 1 );
1287
+ #ifdef DXRUBY15
1288
+ rb_define_method( cSprite, "xy", Sprite_get_xy, 0 );
1289
+ rb_define_method( cSprite, "xy=", Sprite_set_xy, 1 );
1290
+ rb_define_method( cSprite, "xyz", Sprite_get_xyz, 0 );
1291
+ rb_define_method( cSprite, "xyz=", Sprite_set_xyz, 1 );
1292
+ #endif
1293
+
1294
+ /* Sprite�N���X�Ƀ��\�b�h�o�^ */
1295
+ rb_define_singleton_method( cSprite, "check", Sprite_check, -1 );
1296
+ rb_define_singleton_method( cSprite, "update", Sprite_class_update, 1 );
1297
+ rb_define_singleton_method( cSprite, "draw", Sprite_class_draw, 1 );
1298
+ // rb_define_singleton_method( cSprite, "render", Sprite_class_render, 1 );
1299
+ rb_define_singleton_method( cSprite, "clean", Sprite_class_clean, 1 );
1300
+
1301
+ rb_define_alloc_func( cSprite, Sprite_allocate );
1302
+
1303
+ id_shot = rb_intern("shot");
1304
+ id_hit = rb_intern("hit");
1305
+ id_update = rb_intern("update");
1306
+ id_draw = rb_intern("draw");
1307
+ id_render = rb_intern("render");
1308
+ id_vanished = rb_intern("vanished?");
1309
+ id_visible = rb_intern("visible");
1310
+
1311
+ collision_init();
1312
+ }
1313
+