2014年02月

アルファ版配布直前PR

宣伝チラシベルメゾン

製作中のRPG「最果てロマノーヴァ」アルファ版(動作確認版)の配布が近づいてきました。もしプレイしてくれるという方がいましたら、是非バグ報告や、感想などを教えていただけると幸いです。

ゲーム製作日誌 グラフィック編 No.1 立ち絵ヒロイン

はじめまして。グラフィック担当のMarllです。
ライターのういろうにせっつかれたので記事書きます。

グラフィック担当となんかカッコつけた名前ですが、要は絵描きです。
絵下手くそなんですが、まぁスキルアップの為だと思って担当しております。
目指すは講座が書けるくらいの絵師。
絵だけじゃなくて3DCGもやるんですが、それについてはまた今度記事書きます。

文字だけじゃあれなんで、
 今作っている最果てロマノーヴァというゲームのヒロインの立ち絵を置いておきます。ミュルス
これなんですが、自分の服飾センスのなさが表れてますね。今後の課題です。
それと右手が描けなくてずっと放置していた記憶があります。
色塗り難しい。
 

ゲーム製作日誌 プログラム編 No.3 「C#+SharpDXの準備・キーボードの入力検知(テスト)」

1、C#+SharpDXの準備

 予告通り、今回から実際のプログラミングも含めたゲームライブラリの作成に着手していきます。
 その前に、C#開発環境の構築・準備をすることにします。

 C#の開発環境は、Microsoft社の「Visual Studio(VS)」が大きな幅を占めています。ですので今回もこれを使います。この「Visual Studio」には複数のバージョンがあり、物によっては企業が購入するような高額なバージョンも有ります。通常のゲーム制作では、無料の「Express版」で十分使い物になります。
 この日誌は、ゲームプログラミングがテーマなのでC#のプログラムの仕方については、割愛します。

 C#の開発環境が「Visual Studio」で整ったところで、もう一つSharpDXが使えるように準備する必要があります。前々回書いたとおりSharpDXは、C#からDirectXを使う機能のことでこれがないとゲームがつくれません。
 「Visual Studio」では、何かプログラムを作る際には「プロジェクト」という一つの単位にコードをまとめていきます。SharpDXは、プロジェクトに設定することでそのプロジェクト内だけでDirectXが扱えるようになります。
 プロジェクトの設定は以下のとおりです。
  • DirectX 9をインストールしていないPCの場合は、「DirectX End-User Runtimes (June 2010) 」をMicrosoftのページからダウンロードしてインストールしてください。
    ※「DirectX SDK」は、必要に応じてインストールすればよいです
  • SharpDXをダウンロードしたことがない場合は、「SharpDXのページ:http://sharpdx.org/」の「Download」ページの中ほどにある「SharpDX-Full-2.5.0.exe」をダウンロードしてインストールしてください。インストール中のオプションで必ず「SharpDX Runtime Assemblies」は選ぶようにしてください。
  1. VS(Visual Studio)側でプロジェクトを作成、もしくは開く
  2. VSのメニューバー中の「プロジェクト」→「参照の追加」をクリックする
  3. 「参照の追加」ダイアログ中の「参照」タブをクリックする
  4. SharpDXの「DirectX11-net40」というフォルダまで行き着く(笑)
    ※多くの場合、「DirectX11-net40」フォルダは「C:\Program Files (x86)\SharpDX\Bin」にインストールされます。また、スタートメニュー中の「SharpDX」→「SharpDX Runtime Assemblies」→「Bin」と進んでいくことでも見つけられます
  5. 「参照の追加」ダイアログで、そのフォルダ中の「SharpDX.dll」「SharpDX.DirectInput.dll」「SharpDX.Direct3D9.dll」「SharpDX.DirectSound.dll」の4つを選んで「OK」ボタンを押します。
 これでC#でSharpDXを扱えるようになりました。


2、じゃあ使ってみよう

 それでは「コンソールアプリケーション」のプロジェクトを新規作成し、SharpDXが扱えるように設定してみてください。
 そのプロジェクトの「Program.cs」ファイルにいろいろ加えていって今からキーボードの入力を検知するプログラムを作りたいと思います。

 まずは、ファイルの一番先頭の「using」が並んでいるところの最後の行に「using SharpDX.DirectInput;」と入力します。

 コード例:
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using SharpDX.DirectInput;



 次に、「Program」クラス内の「Main」関数の中身に変更を加えていきます。何も書かれていない「Main」関数内に以下のコードを入力します。

 コード例:
  //入力を検知するキーを決める (例:Aキー)
  Key key = Key.A;

  //終了するためのキーを決める (例:Xキー)
  Key exitKey = Key.X;

  //キー入力検知を実際にするクラス
  DirectInput directInput;
  Keyboard device;

  //ここからDirectInputの初期化
  {
    directInput = new DirectInput();

    //接続されているキーボードを探す
    Guid keyboardGuid = Guid.Empty;
    foreach (var g in directInput.GetDevices(DeviceType.Keyboard, DeviceEnumerationFlags.AllDevices))
    {
      keyboardGuid = g.InstanceGuid;
      break;
    }

    //キーボードが見つからない時は終了する
    if (keyboardGuid == Guid.Empty)
    {
      Console.WriteLine("キーボードが見つかりません。終了します。");
      System.Threading.Thread.Sleep(5000);
    }

    //デバイスを初期化
    device = new Keyboard(directInput);

    //キー入力の検知開始
    device.Acquire();
                
  }

  Console.WriteLine("キーボードの入力検知の準備完了 待機します");
  Console.WriteLine("入力を受け付けるキーは「"+key.ToString()+"」で、終了キーは「"+exitKey.ToString()+"」です");

  //ここから入力の検知を開始
  while (true)
  {
    //現在の入力状況を取得する
    KeyboardState state = device.GetCurrentState();

    if (state.IsPressed(key))
    { //キーが押されていたら...
      Console.WriteLine(System.DateTime.Now.ToString() + ":「" + key.ToString() + "」キーが入力されています");
    }

    if (state.IsPressed(exitKey))
    { //終了キーが押されていたら...
      Console.WriteLine("終了キーが押されたため終了します。");
      System.Threading.Thread.Sleep(5000);
      return;
    }

    //50ミリ秒おきに一周する
    System.Threading.Thread.Sleep(50);
  }

  //プログラム終了


 コードの入力が終わったら、プログラムを実行してみてください。「A」キーを入力しているときだけメッセージが表示されます。


3、入力検知の仕方

 SharpDXでキーボードの入力を調べるためには、まずデバイスの初期化をしておく必要があります。

 デバイスとは、キーボードの入力を実際に調べる部分で、どのキーが押されているのかを調べてくれるものです。
 デバイスの実体はKeyboardクラスになっており。初期化は、

  DirectInput.DirectInput directInput = new DirectInput.DirectInput();
  DirectInput.Keyboard device = new DirectInput.Keyboard(directInput);
  device.Acquire();

 のようにKeyboardクラスのコンストラクタにDirectInputを渡して実体化させたあとに、Acquire()メソッドを呼ぶだけで簡単にできます。1行目のDirectInput.DirectInput、名前空間のDirectInputの中にあるDirectInputクラスという意味になっていますが、ちょっとわかりにくいですよね・・・。最初つまづきました。
 のプログラム例は、このDirectInputクラスで接続されているキーボードがあるか調べてない場合は強制終了させています。そちらはなくても通常動くはずです。

 さて、キーボードの入力状況は、初期化したKeyboardクラスのGetCurrentState()メソッドを呼び出した返り値に記録されています。返り値はKeyboardStateクラスで、入力状況を調べたいキーをIsPressed()メソッドに渡してあげればキーが押されているかの真偽値がわかるわけです。


4、まとめ!

 ごちゃごちゃしてきたのでまとめましょう。

  • キーボードの入力を調べる前に、Keyboardクラスを作っておく必要がある
    コード例:
      DirectInput.DirectInput directInput = new DirectInput.DirectInput();
      DirectInput.Keyboard device = new DirectInput.Keyboard(directInput);
      device.Acquire();

  • キーが押されているかの真偽値は、Keyboard.GetCurrentState()で得たKeyboardStateクラスに様々なキーの種類に対して記録されている

  • 1つのキーが押されているかどうか調べるときは、KeyboardState.IsPressed()にキーを渡すと得られる


no3-1


 図にまとめるとこんなかんじですかね(?)。自分で描いててまあひどい図とか思ってますが、ないよりはマシかなと思うので今後も1記事あたり1枚図は載せていくつもりです。



5、次回へのつなぎ


 今回は、キーボードの状態の取得の仕方を実際に説明しました。次回は、このキーボード状態を知る機能をどのようにゲームライブラリに組み込むか考え、実装もしたいと思います。


 また、今回も含む今回までの内容やコードで「動かねーじゃねいか」とか「分りにくい」などがある方は、自分が可能な限り答えをしていきたいと思いますので、ぜひ書いてください。この記事のタイトルをクリックした先の記事ページの最下部にコメント欄があるはずです。


 ゲームの現在の製作状況は、戦闘システムのコードをカキカキ中のところです。特殊なワザなどの例外ファクターをどうやって処理していくのか考えるのが大変です・・・。そこのところも、後々日誌という形で書ければ良いなと思っています。


 がんばってます。

ゲーム製作日誌 プログラム編 No.2 「ゲームライブラリの概要」

1、ゲームライブラリって必要か?

 今回は、ゲームに共通なゲームライブラリの自作に手をつけましょう。
 ゲームライブラリとは、プレイヤーのキーボード・マウスの入力の確認や、画面への描画、音楽の再生を簡単にやってくれるプログラムのことです。
 前回紹介した、DirectXというAPIだけでも一応ゲームを作ってもいけるのですが、はっきりいって面倒くさいです。毎回同じような長いコードを書く必要が出てきます。
 たとえば、「文字を表示したい」とします。もしゲームライブラリがないと、文字を表示するだけでもたくさんのコードを書なくてはなりません。
 ゲームライブラリをつくったらどうでしょう、ただライブラリに「文字を表示しろ!」と一言命令するだけで後はそのとおりに実現してくれます。そんな便利なゲームライブラリを今から作ろうとしています。
no2-1


2、じゃあ何が必要?

 
ゲームライブラリを作り始める前に、どんな機能が必要か考えましょう。それは、便利な機能はいっぱいあったほうに越したことはありません。
 まずは、プレイヤのキーボード・マウス入力を感知する機能は必要です。それがないと、タイトル選択も次にいくこともできません。
 画面描画に関する機能ももちろん必要です。画像・文字表示は必要として、3Dモデルの描画機能もあったらゲームの幅も広がりそうです。(ちなみに、今回開発中のゲームでも3Dダンジョン使ったシーンを入れる予定です)
 また、音楽再生機能もあったほうがいいです。BGMがないとゲーム中さびしいし、SEがないとゲームで何が起こったかわかりにくくなります。

 以上をまとめて、下のような機能をゲームライブラリに組み込んでいくことにしましょう。

 □基本描画機能
  ・画像描画
   読み込んだ画像を画面に表示する機能です
  ・文字描画
   文字列を画面に表示する機能です
  ・テクスチャストッカ
   ファイルから読み込んだ画像を貯めておく機能で、同じファイルを二重に読み込むことを回避できます
  ・グリフストッカ
   一度表示した文字象形を貯めておく機能です

 □3D描画機能
  ・モデル描画
   3Dモデルを描画する機能です
  ・モデルストッカ
   ファイルから読み込んだモデルを貯めておく機能です
  ・スキニング
   3Dモデルの動き表現に必要な機能です
  ・IK
   3Dモデルの動きを作る際に便利な機能です
  ・衝突判定
   3D空間内で物が接触しているか判定する機能です

 □入力機能
  ・キーボード
   キーボードの入力を感知する機能
  ・マウス
   マウスの入力を感知する機能

 □サウンド機能
  ・Waveフォーマット再生
  ・OggVoribisフォーマット再生
   音楽の再生を担当する機能


 次回以降では、これらの機能の実装を始めていきます。上の内容の詳細な説明も、そのときにしていきます。
 
twitterはこちら
ニコ生放送します
ギャラリー
  • ウマモサク
  • ウマモサク
  • ウマモサク
  • 3/17 制作記録
  • 3/17 制作記録
  • C91告知
  • C91告知
  • C91告知
  • C91告知
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

  • ライブドアブログ