2月, 2012 のアーカイブ

今回は(も)短めのメモで、コントローラーを振動させる方法をメモります。

XBOXコントローラーを振動させるときは、GamePad.SetVibration()メソッドを使用します。

GamePad.SetVibration()メソッドの第1引数には、振動させるコントローラー、第2引数には左のモーターの振動値、第3引数は右のモーターの振動値です。モーターの振動値は、0.0f~1.0fの間である必要が有り、0.0fは0%、1.0fは100%で中間はそれに比例したパーセンテージで振動します。

それで実際に振動させる時は以下の用に書きます。

KeyboardState keystate = Keyboard.GetState();
if (keystate.IsKeyDown(Keys.Z))
{
GamePad.SetVibration(PlayerIndex.One, 0.5f, 0.5f);
}

これで最高の50%で振動します。ですが、このままだと振動しっ放しになるので、止める処理も必要です。その為には、GamePad.SetVibration()メソッドを呼び出し、第2と第3引数を0.0fにすれば止まります。

KeyboardState keystate = Keyboard.GetState();

if (keystate.IsKeyDown(Keys.Z))
{
GamePad.SetVibration(PlayerIndex.One, 0.5f, 0.5f);
}

if (keystate.IsKeyDown(Keys.X))
{
GamePad.SetVibration(PlayerIndex.One, 0.0f, 0.0f);
}

以上です。

今回は、前に書いた当たり判定の記事の続編で、円と長方形の当たり判定の実装方法をメモります(いつか書くと思ったまま忘れてました・・・)。

今回は出来るだけ簡単で短い実装方法を目指します。まず、下準備として円を表すクラスを作ります。

class Circle
{
 public Vector2 Center;
 public float Radius;

 public Circle(Vector2 center, float radius)
 {
 Center = center;
 Radius = radius;
 }
}

そして、当たり判定の実装です。当たり判定の確認は、円の中心点から、長方形の一番近い点を獲得し、その距離を測る事で判定します。

private bool CheckCollision(Circle circle, Rectangle rect)
{
 // 円に一番近い位置を長方形から探す
 Vector2 closest = new Vector2(MathHelper.Clamp(circle.Center.X, rect.Left, rect.Right),
 MathHelper.Clamp(circle.Center.Y, rect.Top, rect.Bottom));

 // 計算した位置と、円の中心点との距離を測る
 float distanceSquared = Vector2.DistanceSquared(closest, circle.Center);

 // 距離が円の半径より長い場合は、当たっていない
 return (distanceSquared < (circle.Radius * circle.Radius));
}

後は、このメソッドを呼び、確認したい長方形と円を渡します。

if (CheckCollision(m_circle, m_bound))
{
// ... 当たった時の処理
}

こんな感じになります。

 

以上です。今回、距離の計算にVector2.DistanceSquared()を使ったのは、2乗のまま計算したほうが、sqrt()を使わずにすむ分速いからです。なので、距離を計算する時も半径の2乗を使っています。

今回の実装方法は多分速度としても悪くは無いですが、一つの問題は長方形を回転させたら位置がずれ、ちゃんと確認出来ないことです。それについては気が向いたら書きます(また忘れるフラグ)。

昨日の記事の続きです。

 

enchant.js – このゲームエンジンは、HTML5とJavascriptで簡単にゲームを作れるらしいです。後、このゲームエンジンはクロスプラットフォーム用のゲームを作れるらしいです。個人的には、ウェブ系の知識が無いのでまだ手を出していませんが、ゲームを投稿出来るサイトもあり、使いやすそうなのでその内試したい物の一つです。

 

Wild Magic – このミドルウェアは、Geometric Tools製で、主にグラフィックス用のミドルウェアです(と言ってもグラフィックス以外の機能も実装されています)。内用は、製作者のDavid Earbly氏がEmergent社のGamebryoに関わっていた事もあり、Gamebryoに結構近いです。使いやすさは解りませんが、かなり出来が良さそうなのでその内使ってみる予定です。

ちなみに、David Earbly氏が書いた本では、このミドルウェアを例として説明がされています。

 

Crazy Eddie – このライブラリはC++を使用しているゲーム製作者向けの、GUI制作ライブラリです。このライブラリを使用する事により、かなり簡単にUI部分が実装できるらしいです。

その内自分でも同じ様なものを作ってみたい気もしますが、ScaleformとCrazy Eddieがあれば必要無さそうな気もします・・・

 

以上です。特に誰も得しなさそうな記事2連続でした。

 

参考:

enchant.js – http://enchantjs.com/ja/?s=ja

Wild Magic – http://www.geometrictools.com/index.html

Crazy Eddie – http://www.cegui.org.uk

現在興味があり、その内試そうと思っているライブラリとゲームエンジンが幾つかあるので、怠けないでその内試すって事を身に刻むためにもちょっと書いておきます。

 

sharpdx – このライブラリは.net環境にdirectx9, 10, 11を速い速度のまま使用できるようにする為のライブラリです。このライブラリを使用する事により、C#でdirectxを使う時にXNAやSlimDXを使用しないでもゲーム開発などを出来ます。その上、現在公開されているC# (.Net環境)でdirectxを使用できるメジャーなライブラリでは一番早いらしいです(ネイティブのC++とdirectxには及びませんが、その次に早いです)。

ちなみに、作者曰くこのライブラリは日本の某ゲーム会社のゲームエンジンでも使用されているらしいです。

 

ANX Framework – このライブラリは、XNA4のコードを名前空間を変更するだけで使用出来るように設計されており、XNAを使っている人は簡単に移行出来るらしいです。XNAとの違いは、XNAは描画にdirectx9を使用しており、ANXはsharpdxを使用しdirectx10、 11、そしてOpenGL 3を使っています。なので、ANXはマルチプラットフォームを目指しているらしいです(現在はまだWindows専用)。XNAはPCで開発するには、ソフトを使用する側のハードルが結構高いので、PC用にゲームを作るのであれば、XNAより使いやすくなるかもしれません。

現在はまだバージョン0.4.9なので、XNA全体はまだ使用出来るようになっていません。ですが、SpriteBatch、数学などの基本機能の実装は出来ているみたいです。結論を言えば、まだ使わないと思いますが、バージョン1.0が出る頃には移行してるかもしれません。

 

Delta Engine – このゲームエンジンは、C#で簡単にゲームを作ることを目的とされ(XNAになじみがあれば簡単に使えるらしい)、クロスプラットフォームを目指して制作されているらしいです。対応している/する予定のプラットフォームはかなり多く、Windows、Mac、Linux、各スマフォ、ウェブ、ゲーム機(XBOX、Vita等)等です(現在何処まで対応しているかは未だわかりませんが)。このゲームエンジンは、オープンソースなので興味がある方はソースコードを見ることも出来ますので、それも多分うれしいところです。

中身を見て見ると解るのですが、このエンジンには、sharpdxを含めた(sharpdx大活躍!)数々のライブラリや、ミドルウェアが使用されており、色々と最適化もされているらしいので使いやすいだけでなく、速度もかなり良いらしいです。

ちなみに、マルチプラットフォーム用にゲームをビルドするには、別途のライセンスが必要らしいです(詳しいことは見つかりませんでした・・・)。現在はバージョン0.97と言うこともあり、まだちゃんと完成していると言えませんが、ドキュメントやチュートリアルは揃っている上に、製作者はこのエンジンを使用してゲームを作ったらしいので、もう始めることは出来そうです。

 

他にも興味がある物は色々ありますが、今回かココまでにしときます。多分また今度続きを書きます。

 

参考:

sharpdx – http://code.google.com/p/sharpdx/

ANX Framework – http://anxframework.codeplex.com/

Delta Engine – http://deltaengine.net/

 

今回は、前2回で作ったパーティクルシステムに、円形の様なエフェクトを追加します。

今回は実装方法として、一つのメソッド(Emit()メソッド)で別のエフェクトを作製します。なので、まずエフェクトの種類を表すenumを宣言します。

enum ParticleType
{
Linear, // 同じ速度のエフェクト
Spread, // ランダムな速度で移動
}

次に、Emit()メソッドに、ParticleTypeを渡せるようにします。その後に、ParticleTypeによって違う速度のパーティクルを作るようにメソッドの内容を変更します。

public void Emit(ParticleType type, Texture2D tex, Vector2 pos, int minAngle, int maxAngle, float scale,
float shrinkRate, float duration, int amount, int maxSpeed, Color colour)
{
Particle p;
float angle = 0.0f;
float speed = 0.0f;

for (int i = 0; i < amount; i++)
{
// ランダムな角度を獲得する
angle = m_rand.Next(minAngle, maxAngle);

if (type == ParticleType.Linear)
{
// 一定の速度を設定する。
speed = maxSpeed;
}

else if (type == ParticleType.Spread)
{
// ランダムな速度を獲得する
speed = m_rand.Next(1, maxSpeed);
}

// 新しいパーティクルを作る
p = new Particle(tex, pos, speed, angle, scale, shrinkRate, duration, colour);

// パーティクルを足す
m_particles.Add(p);
}
}

後は、Emit()メソッドの呼び出しを変更するだけです。最初のエフェクトは、360度に向けて作成され、二つ目は150~230度に向けて作成されます。

protected override void Update(GameTime gameTime)
{
// スペースキーが押されたら
if (Input.IsPressed(Keys.Space))
{
// パーティクルを作る
emitter.Emit(ParticleType.Linear, particleTex, new Vector2(300, 300), 0, 360, 1.0f, 1.0f, 1.5f, 100, 200, Color.Gold);
}

if (Input.IsPressed(Keys.Z))
{
float scale = 0.5f;
float shrink = 0.5f;
int speed = 600;
int min = 150;
int max = 230;
Vector2 pos = new Vector2(350, 200);
emitter.Emit(ParticleType.Linear, particleTex, pos, min, max, scale, shrink, 1.0f, 40, speed, Color.Salmon);
emitter.Emit(ParticleType.Linear, particleTex, pos, min, max, scale, shrink, 2.5f, 40, speed, Color.Pink);
emitter.Emit(ParticleType.Linear, particleTex, pos, min, max, scale, shrink, 2.0f, 40, speed, Color.Crimson);
}

// パーティクルの更新
emitter.Update((float)gameTime.ElapsedGameTime.TotalSeconds);

base.Update(gameTime);
}

変更後はこんな感じになります。

以上です。気が向いたら別のエフェクトも追加してみますが、やるかどうかは今の所未定です。