« 曲がるレーザーの実装実験(3/6) | トップページ | 曲がるレーザーの実装実験(5/6) »

2011年6月15日 (水)

曲がるレーザーの実装実験(4/6)

旋回方向を決めるだけならatan2は不要だった。

CurveLaser.cpp

#include "DxLib.h"
#if 0
#define _USE_MATH_DEFINES
#include "math.h"
#define Fixed  double
#define Radian double
#else
#include "fixedmath.h"
#define sin   sin13
#define cos   cos13
#define atan2 atan21
#define Radian int
#endif

struct Node
{
	Fixed x, y;   // 中心座標
	Fixed speed;  // 移動速度
	Radian angle; // 進行方向
};

static const int NODE_NUM = 8;
static const int LINK_NUM = 16;
static struct Node node[NODE_NUM][LINK_NUM];

static int target_x, target_y;

static int graph_laser[2]; // レーザーテクスチャ画像のハンドル

/**************************************
 *  初期化
 */
void CurveLaser_Initialize()
{
	int i, j;

	int sx = 640, sy = 480, cb;
	GetScreenState(&sx, &sy, &cb);

	// 画面内にランダムに配置
	for (i=0; i<NODE_NUM; ++i) {
		node[i][0].x = GetRand(sx-1);
		node[i][0].y = GetRand(sy-1);
		node[i][0].speed = 10;
		node[i][0].angle = 0;

		for (j=1; j<LINK_NUM; ++j) {
			node[i][j] = node[i][0];
		}
	}

	// レーザーテクスチャ画像をロード
	LoadDivGraph("laser.png", 2, 2, 1, 16, 16, graph_laser);
}

/**************************************
 *  後始末
 */
void CurveLaser_Finalize()
{
}

/**************************************
 *  フレーム単位の更新
 */
void CurveLaser_Update()
{
	int i, j;

	// ターゲットはマウス座標
	GetMousePoint(&target_x, &target_y);

	for (i=0; i<NODE_NUM; ++i) {
		for (j=LINK_NUM-1; j>0; --j) {
			// 連結するノードはひとつ前の履歴
			node[i][j] = node[i][j-1];
		}

		// ターゲットへ向けて旋回
		Fixed ax, ay;
		ax = target_x - node[i][0].x;
		ay = target_y - node[i][0].y;
		Fixed bx = cos(node[i][0].angle);
		Fixed by = sin(node[i][0].angle);
		if (ax*by-ay*bx < 0) {
			// 正方向に回転
			node[i][0].angle += M_PI/24;
		}
		else {
			// 逆方向に回転
			node[i][0].angle -= M_PI/24;
		}

		// 進行方向に移動
		node[i][0].x += cos(node[i][0].angle) * node[i][0].speed;
		node[i][0].y += sin(node[i][0].angle) * node[i][0].speed;
	}
}

/**************************************
 *  描画
 */
void CurveLaser_Render()
{
	int i, j;
	static const int COLOR_RED = GetColor(255, 0, 0);

	ClearDrawScreen();

	for (i=0; i<NODE_NUM; ++i) {

		int bcx, bcy;
		int bax, bay;

		for (j=0; j<LINK_NUM; ++j) {

			int cx = node[i][j].x;
			int cy = node[i][j].y;
			int ax = cos(node[i][j].angle) * 4;
			int ay = sin(node[i][j].angle) * 4;

			// 前後のノード間にテクスチャ画像を貼る
			if (j == 1) {
				// 先頭
				DrawModiGraph(bcx+bay, bcy-bax, cx+ay, cy-ax, cx-ay, cy+ax, bcx-bay, bcy+bax, graph_laser[0], TRUE);
			}
			else if (j == LINK_NUM-1) {
				// 後尾
				DrawModiGraph(cx-ay, cy+ax, bcx-bay, bcy+bax, bcx+bay, bcy-bax, cx+ay, cy-ax, graph_laser[0], TRUE);
			}
			else if (j > 0) {
				// それ以外
				DrawModiGraph(bcx+bay, bcy-bax, cx+ay, cy-ax, cx-ay, cy+ax, bcx-bay, bcy+bax, graph_laser[1], TRUE);
			}

			bcx = cx;
			bcy = cy;
			bax = ax;
			bay = ay;
		}
	}

	// ターゲットに十字
	DrawLine(target_x, target_y-4, target_x, target_y+4+1, COLOR_RED);
	DrawLine(target_x-4, target_y, target_x+4+1, target_y, COLOR_RED);
}

|

« 曲がるレーザーの実装実験(3/6) | トップページ | 曲がるレーザーの実装実験(5/6) »

C/C++」カテゴリの記事

DXライブラリ」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 曲がるレーザーの実装実験(3/6) | トップページ | 曲がるレーザーの実装実験(5/6) »