8月, 2012 のアーカイブ

今回は、コントローラーが抜けた事を察知する処理をメモります。

 

何故コントローラーが抜けた事をプログラム的に実装する必要があるかと言うと、抜けた時にゲームをポーズしたり、何らかの処理を行いたい時の為です。

 

では実装に入ります。行う事は、前のフレームにコントローラーが繋がれていて、現在のフレームでは繋がれていないかの確認だけなのです。

 

まずは必要な変数を宣言します。

GamePadState[] m_PadState = new GamePadState[4];
GamePadState[] m_OldPadStates = new GamePadState[4];

 

次に、コントローラーの状態を毎フレーム更新します。

 

protected override void Update(GameTime gameTime)
for (int i = 0; i < 4; i++)
{
m_OldPadStates[i] = m_PadState[i];
m_PadState[i] = GamePad.GetState((PlayerIndex)i);
}
}

 

次に、コントローラーが切断されたかを確認するメソッドを実装します。

 

public bool WasDisconnected(PlayerIndex index)
{
return ( !m_PadState[(int)index].IsConnected && m_OldPadStates[(int)index].IsConnected );
}

 

後は、実装したメソッドを呼び出すだけです。

 

if (WasDisconnected(PlayerIndex.One))
{
// ゲームをポーズする・・・?
}

 

今回は以上です。

本来ならばこの処理はイベント型にした方がいい気がしますが、それはまたの機会と言うことにしておきます(その機会が来ない気もしますが・・・)。

 

久々の、XNAメモです! …と言っても短いですが。

今回は、シンプルな画面のフェードアウト、フェードイン処理の実装方法をメモります。

 

今回の処理は、恐らく一番楽な単純に画面全体を徐々に暗くしていく処理を実装します。
実際に行う事は、画面全体にテクスチャアを描画し、描画時にSpriteBatch.Draw()メソッドに渡す色のアルファ値を、毎フレーム変更するだけです。
ではまず、必要な変数の宣言と初期化です。

Texture2D m_pixel;
float m_alpha;
float m_alphaIncAmount;
bool m_isFadeOut;

public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";

m_alpha = 0.0f;
m_alphaIncAmount = 0.004f;
m_isFadeOut = true;
}

 

次は実際にフェードの処理を実装します。ここで描画で使用するアルファ値を変化します。

 

private void UpdateFade()
{
m_alpha += m_alphaIncAmount;
if (m_alpha >= 1.0f)
{
m_alpha = 1.0f;
m_isFadeOut = false;
}
}

 

後は描画するだけです。

 

protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);

// 画面のサイズ
Rectangle screenBound = new Rectangle(0, 0, 800, 600);

// フェードの色
Color colour = new Color(0.0f, 0.0f, 0.0f, m_alpha);

// 描画
spriteBatch.Begin();
spriteBatch.Draw(m_pixel, screenBound, colour);
spriteBatch.End();

base.Draw(gameTime);
}

 

結果は以下の用になります。

 

 

フェードインの処理は、アルファ値の上げる代わりに下げるだけで実装できます。UpdateFade()メソッド内の処理を以下の用に変更すると、フェードアウトと、フェードインが交互に行われます。

 

private void UpdateFade()
{
if (m_isFadeOut)
{
m_alpha += m_alphaIncAmount;
if (m_alpha >= 1.0f)
{
m_alpha = 1.0f;
m_isFadeOut = false;
}
}
else
{
m_alpha -= m_alphaIncAmount;
if (m_alpha <= 0.0f)
{
m_alpha = 0.0f;
m_isFadeOut = true;
}
}
}

 

結果、以下の用に変わります。

 

 

今回はココまでです。

何時も通りネタが無いので、XNAにしろUnityにしろ、何か取り上げて欲しい事がある方は、ご連絡かコメントください m_ _m

(だからと言ってリクエストに自分の技術が合うかはわかりませんが・・・)