- (OS X Carbon|Win32)+Cpp(03)+OpenGL+SDLでRPG作っています。
- コメントはTwitter上でどうぞ。
- twitter:Longsword (たまにprivateになってたらごめんなさい)
2012-02-14
87にちめ(Rocomoco32にちめ)
スプライトの衝突判定の処理をしました。実際にこのルーチンをプログラマーが使うかどうかは任意ですが、機構としては作っておこうと思ったのです。簡易にでもあれば便利だしね。
今日のバイナリもまたRocomoco Download Centreにアップロードしました。20120214-spriteってやつです。
http://lovalotta.pya.jp/Rocomoco/
衝突すると効果音もなるよ。
効果音1
t120 l64 o6 @3 cgc<d>>d
効果音2
t120 l64 o7 @0 ceg+a<c<c
雑なテストコードを載せておきます。
#include "rocomoco-i.h" class my_class : public Rocomoco { enum { SIZE1=12, SIZE2=3,SIZE3=5 }; Sprite spr1[SIZE1]; Sprite spr2[SIZE2]; Sprite spr3[SIZE3]; SE hit0,hit1; void hit(Sprite sp) { switch (sp->group) { case 0: sp->color=Color::Blue; break; case 1: sp->color=Color::Pink; break; case 2: sp->color=Color::Red; break; } } virtual bool hit_test(Sprite spr1, Sprite spr2) { int g1 = spr1->group; int g2 = spr2->group; if (g1==g2) return false; if (g1>g2) { g1 = spr2->group; g2 = spr1->group; } if (g1==1 && g2==2) return false; if (g1==0 && g2==1) { audio.play(0, hit0); } if (g1==0 && g2==2) { audio.play(1, hit1); } return true; } virtual void onsprite(Sprite spr1, Sprite spr2) { if (!hit_test(spr1,spr2)) { return; } hit(spr1); hit(spr2); } virtual void onbegin() { hit0.compile("T240 L32 O6 @3 cgc<d>>d"); hit1.compile("T240 L32 O7 @0 ceg+a<c<c"); for (int i=0; i<SIZE1; ++i) { spr1[i] = graphics.sprites.alloc(); spr1[i]->chr = 'A'+i%26; spr1[i]->group = 0; } for (int i=0; i<SIZE2; ++i) { spr2[i] = graphics.sprites.alloc(); spr2[i]->chr = 'a'+i%26; spr2[i]->group = 1; } for (int i=0; i<SIZE3; ++i) { spr3[i] = graphics.sprites.alloc(); spr3[i]->chr = '@'; spr3[i]->group = 2; } } virtual void onuser() { int T = display_tick; for (int i=0; i<SIZE1; ++i) { int r1 = 2*i*math::pi/SIZE1 - icos(T*math::pi/200,1200); int len = 40 + icos(display_tick*math::pi/300, 20); spr1[i]->pos.x = 160 + icos(r1, len); spr1[i]->pos.y = 120 + isin(r1, len); spr1[i]->color = Color::DarkBlue; } for (int i=0; i<SIZE2; ++i) { int r2 = 2*i*math::pi/SIZE2 + T*math::pi/80; int len = 60 + icos(display_tick*math::pi/300, 50); spr2[i]->pos.x = 160 + icos(r2, 80) + isin(r2/2, len); spr2[i]->pos.y = 120 + isin(r2, 50) + icos(r2/2, len); spr2[i]->color = Color::DarkYellow; } for (int i=0; i<SIZE3; ++i) { int r = 2*i*math::pi/SIZE3 + T*math::pi/350; int len = 50 + icos(display_tick*math::pi/140, 70); spr3[i]->pos.x = 160 + icos(r, 120) + isin(r/2, len); spr3[i]->pos.y = 120 + isin(r, 60) + icos(r/2, len); spr3[i]->color = Color::DarkPurple; } } virtual void onpaint() { bg0.print(0,0,format("sprite conflictions:{0:D4}", graphics.sprites.conflictions())); bg0.print(0,1,format(" sprite count:{0:D4}", graphics.sprites.count())); } }; int rocomoco_main() { return my_class()(); }
トラックバック - http://d.hatena.ne.jp/Longsword/20120214/1329223279
