« DXライブラリを使うプロジェクト設定のプロパティシート | トップページ | 曲がるレーザーの実装実験(2/6) »

2011年6月11日 (土)

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

ネットを徘徊していて「曲がるレーザーは重い」と書かれているのを見た。どれだけ軽くできるか実験してみたくなった。

まずは、ノードの実装。いわゆる誘導弾と同じ。

あとで連結して細長くする。

曲がるレーザー 誘導弾ノード


DXライブラリを使用する。

画面内にランダムに初期配置した複数のノードがマウスカーソルを追いかける。

とりあえず速度固定。ノードを連結したあとレーザーっぽい動きに調整していく予定。

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 = 32;
static struct Node node[NODE_NUM];

static int target_x, target_y;

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

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

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

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

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

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

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

		// ターゲットに対する角度を求める
		Radian angle = atan2(target_y - node[i].y, target_x - node[i].x);
		Fixed ax = cos(angle);
		Fixed ay = sin(angle);
		Fixed bx = cos(node[i].angle);
		Fixed by = sin(node[i].angle);
		if (ax*by-ay*bx < 0) {
			// 正方向に進行方向を回転
			node[i].angle += M_PI/24;
		}
		else {
			// 逆方向に進行方向を回転
			node[i].angle -= M_PI/24;
		}

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

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

	ClearDrawScreen();

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

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

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

	// ターゲットに十字
	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);
}

CurveLaser.h

#ifndef CURVELASER_H
#define CURVELASER_H

void CurveLaser_Initialize();
void CurveLaser_Finalize();
void CurveLaser_Update();
void CurveLaser_Render();

#endif

|

« DXライブラリを使うプロジェクト設定のプロパティシート | トップページ | 曲がるレーザーの実装実験(2/6) »

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

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

コメント

コメントを書く



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




« DXライブラリを使うプロジェクト設定のプロパティシート | トップページ | 曲がるレーザーの実装実験(2/6) »