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

2011年6月11日 (土)

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

ノードを連結して、見た目レーザーっぽくしてみた。

曲がるレーザー レーザーっぽい?


とりあえず配列。あとでリストにする。

動きが単調なのでいまいち。

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;

/**************************************
 *  初期化
 */
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];
		}
	}
}

/**************************************
 *  後始末
 */
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];
		}

		// ターゲットに対する角度を求める
		Radian angle = atan2(target_y - node[i][0].y, target_x - node[i][0].x);
		Fixed ax = cos(angle);
		Fixed ay = sin(angle);
		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_BLUE   = GetColor(0, 0, 255);
	static const int COLOR_RED    = GetColor(255, 0, 0);
	static const int COLOR_YELLOW = GetColor(255, 255, 255);
	static const int COLOR_WHITE  = GetColor(255, 255, 255);

	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;

			// 中心に円
			DrawCircle(cx, cy, 2, COLOR_BLUE);
			// 進行方向と垂直に線分
			DrawLine(cx+ay, cy-ax, cx-ay, cy+ax, COLOR_RED);

			if (j > 0) {
				// ノードに垂直な線分の両端を、前後のノード同士で結ぶ
				DrawLine(bcx+bay, bcy-bax, cx+ay, cy-ax, COLOR_YELLOW);
				DrawLine(bcx-bay, bcy+bax, cx-ay, cy+ax, COLOR_YELLOW);
			}

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

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

|

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

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

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

コメント

コメントを書く



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




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