Hatena::ブログ(Diary)

【長剣は】最強武器候補【鈍器です】 このページをアンテナに追加

  • (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