ゲーム開発用ライブラリの公開準備にあたって

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
lriki
記事: 88
登録日時: 9年前

ゲーム開発用ライブラリの公開準備にあたって

#1

投稿記事 by lriki » 9年前

これまで仲間内でのゲーム作成に使っていたC++用のライブラリを一般向けに公開しようと考えており、
現在、公開にあたって汎用的に使えるように修正を加えています。
その中でいくつか思うところがあったため、今回質問させていただきました。

つきましては、以下の質問に対してご意見を伺えればと考えています。
全ての項目に答えていただかなくても結構です。
この時点で要望などありましたら、できる限り対応したいと思います。

1.現在、個人またはグループでのゲーム制作に使っているライブラリ
  例)DXライブラリ Selene

2.新しいライブラリを使おうと思ったとき、最初に確認するところ
  例)サンプルプログラム

3.ライブラリを選ぶにあたって重要視する部分
  例)軽さ 機能の豊富さ リファレンスの見やすさ

4.他人の作ったクラスを使うときに注意すること

5.ゲーム開発に必要、またはあれば便利と思う機能

6.その他、意見など

また、他のライブラリ制作者やプロの方の注意や指摘が伺えれば
積極的に考えていきたいと思います。



一応、ライブラリの仕様について簡単に説明します。


使用にあたって必要なスキルはC++のクラスを扱えることです。
導入の方法はDXライブラリと同じです。

以下は画像を表示するための基本的なコードです。

コード:

#include <lnote.h>

// ライブラリが初期化を行う時に自動的に呼び出される関数です。
// この関数は必ず定義する必要があります。
// 特に設定したい項目が無い場合は空の実装でOKです。
void LConfig( ConfigData config )
{
	// 例
	config.setFrameRate( 30 );		// フレームレートを 30 にする
}

// ライブラリ用のエントリーポイントです。
// このライブラリは main() でも WinMain() でもなく、この関数から始まります。
// 始まった時点でライブラリの初期化は完了してウィンドウがひとつ出ており、
// すぐに描画等の処理を行うことができます。
void LMain()
{
	// 表示する画像を読み込んでテクスチャを作成する
	LTexture texture = LTexture::create( "画像ファイル名" );
	
	// スプライト(透明な板みたいなもの)を作成してテクスチャを張り付ける
	LSprite sprite = LSprite::create( texture );
	
	// スプライトの座標を設定する。左から順にX, Y, Z座標。Z座標は前後関係です。
	sprite.setPosition( 100, 200, 10 );
	
	// メインループ
	do
	{
		// Framework.update() はDXライブラリの ProcessMessage に当たる関数です。
		// 作成されているスプライト等を全て自動で描画し、
		// メッセージと待ち時間の処理を行います。
	} while ( Framework.update() );
}
テクスチャ等のリソースの管理には、書籍「ゲームプログラマになる前に覚えておきたい技術」の
平山さんのライブラリにあった参照カウント+ダミークラスという方法を使わせていただいています。
テクスチャ等は必要が無くなった時点で全て自動的に解放されます。

そんなの知らないよ!っていう方に、参考として少し説明します。

コード:

void func()
{
	// 中身は空っぽ
	LTexture tex1;
	
	// "chara.png" を読み込んで作成
	LTexture tex2 = LTexture::create( "chara.png" );
	
	// tex1 は tex2 と同じものを指す
	tex1 = tex2;
	
} // ここで tex1 tex2 のデストラクタが呼ばれ、テクスチャは自動的に解放される
LTexture クラスはテクスチャへのポインタだと考えても特に問題ありません。
関数の引数・戻り値としても使うことができます。

他にも、

・用途に応じた音声の再生(playBGMでループ再生、playSEで重ね合わせ可能な単発再生等)
・キーボードとゲームパッドの差を吸収した入力(キーコンフィグ付き)
・Luaによるスクリプティング
・ファイルカーカイブと非同期のファイル読み込み
・エフェクトエディタを使ったゲームエフェクトの作成支援

…等、グラフィック関係以外でもゲームの質を上げられるような機能を実装しています。

また、汎用DLLとしても作成し、C++以外の言語でも使えるようにする予定です。
(この場合は関数ライブラリになると思います。C#では動作確認済み)


以上です。よろしくお願いします。



(仲間内では結構人気だったけど、他の人から見たらどう感じるのかな…。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲーム開発用ライブラリの公開準備にあたって

#2

投稿記事 by softya(ソフト屋) » 9年前

なかなか面白いですね。

1.現在、個人またはグループでのゲーム制作に使っているライブラリ
DXライブラリ、Seleneはサンプルを触ったのみ。

2.新しいライブラリを使おうと思ったとき、最初に確認するところ
マニュアル、リファレンス、サンプル、実際に作られたゲームの質や量。

3.ライブラリを選ぶにあたって重要視する部分
導入のしやすさ、サンプル、マニュアル、リファレンスの充実、安定性、サポートの速さ。

4.他人の作ったクラスを使うときに注意すること
基本的には深く考えなくても使えることが一番。

5.ゲーム開発に必要、またはあれば便利と思う機能
状態遷移やタスクを管理するクラスのサポート。
Lua部分の実装によりますが、スクリプト言語の拡張性。
あるいはLua以外のスクリプト言語の実装性。

6.その他、意見など
Framework.update()内で描画の実装はされているんでしょうか?
描画の順番や描画有無などの制御もどう行われるか気になります。
あと3DのサポートやDirectXのバージョンなどは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dic
記事: 582
登録日時: 9年前
住所: 宮崎県

Re: ゲーム開発用ライブラリの公開準備にあたって

#3

投稿記事 by dic » 9年前

アマチュアの日曜プログラマですが


1.現在、個人またはグループでのゲーム制作に使っているライブラリ
  吉里吉里(利用側)
  オリジナルDirectXC++クラス群(作成側)
  DxLib(利用側)

2.新しいライブラリを使おうと思ったとき、最初に確認するところ
  言語

3.ライブラリを選ぶにあたって重要視する部分
  ソースコードの読みやすさ、処理速度、汎用性

4.他人の作ったクラスを使うときに注意すること
  経験がない

5.ゲーム開発に必要、またはあれば便利と思う機能
  スクリプト言語のような、すぐに実行できる環境

6.その他、意見など
  変数の宣言がライブラリ内でされていてて、いきなりその変数を使うことが前提となっている
  ライブラリは利用をさけたい(ライブラリを利用するのであって、隅々まで覚えておかないといけない)
  この方法はいきなり変数がでてくるので、とてもとまどう VBや他のスクリプト言語の方は慣れてるかもしれませんが

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲーム開発用ライブラリの公開準備にあたって

#4

投稿記事 by softya(ソフト屋) » 9年前

>>dicさん

グローバル変数はないように見えますが、dicさんが気になった部分は何でしょうか?
もう少し具体的に書いて頂かないと梨樹さんも困ると思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dic
記事: 582
登録日時: 9年前
住所: 宮崎県

Re: ゲーム開発用ライブラリの公開準備にあたって

#5

投稿記事 by dic » 9年前

>>softoyaさん
それは説明不足で、すいません

たとえば上のコードにある

コード:

void LMain()
{
    // 表示する画像を読み込んでテクスチャを作成する
    LTexture texture = LTexture::create( "画像ファイル名" );
の部分の LTexture::create の LTextureってどこから来たのかなぁ・・・って感じです
どこにも宣言、実体がないので、あまり私は使わないのですがstaticなクラスですよね?(間違っていたらすいません)

ここらへんが、私だけの場合に限って困惑します
特に梨樹さんが私の意見を聞く必要もないですけどね

アバター
lriki
記事: 88
登録日時: 9年前

Re: ゲーム開発用ライブラリの公開準備にあたって

#6

投稿記事 by lriki » 9年前

お二人ともご回答、本当にありがとうございます!

ちょっと長文です。失礼します。


>softya(ソフト屋)さん

用語にちょっと自信がないので変なこと答えてたら
目をつむっていただけると幸いです…。


>状態遷移やタスクを管理するクラスのサポート。

状態遷移はタイトル画面、ゲーム画面、メニュー画面等、ひとつのゲームシーン毎の
移り変わりまでを想定して実装しています。
(戦闘画面での 行動選択 アイテム選択 等、細かいフェーズや親子関係に使うことは想定していませんが…)

▼使い方イメージ

例えばタイトル画面を作る場合、

class SceneTitle : SceneBase

というように SceneBase(ライブラリのクラス) を継承して

・タイトル画面の開始処理
・タイトル画面の更新処理
・タイトル画面の終了処理

の3つのメンバ関数を定義します。

あとはタイトル画面に移りたいときに

Scene.change( new SceneTitle() );

とすることで以前のシーンの終了処理が呼ばれ、タイトル画面の状態に移ります。


ゲーム中のタスクの管理については
http://codezine.jp/article/detail/297
こちらのコンテンツ程度のシステムは出来上がっています。


>Lua部分の実装によりますが、スクリプト言語の拡張性。
>あるいはLua以外のスクリプト言語の実装性。

Lua の機能は一通り使えます。
Lua 以外のスクリプト言語の実装性は今のところ殆どありません。

というのも、このライブラリではゲーム中のイベントや敵のAI等を記述することを想定して実装しています。
そのため、並列的に動作できるスクリプト言語(&早い)ということでLuaを選択しました。
また、その実装と簡単に使えるようにするためのクラス作りのために
内部でかなりマニアックなことをしているので、現段階ではLua 以外の実装は難しいです。


>描画の順番や描画有無など
基本的に2D、3Dに毎に自動的にZソートされて描画されます。
順番の制御についてはタスク管理っぽくsetPriority()メンバ関数で描画の優先度を、
描画有無はsetVisible()で表示・非表示を切り替えることができます。

>3Dのサポート
現在はスキンメッシュを実装中です。
それが出来上がればDXライブラリ程度のレベルにはなると思います。

>DirectXのバージョンなどは
DirectX 9 で作成しています。
あと、将来的にはOpenGL等を使ってマルチプラットフォームにしたいなと考えています。
また、DirectX10 や 11 での実装の予定はありません。



まずはサンプルを充実させるとともに、ゲームも1本なにか考えてみようと思います。



>dicさん

やっぱりすぐに実行できないと厳しいですよね。
ストレスなく導入できるように考えてみます。


>変数の宣言がライブラリ内でされていてて

>softyaさん

多分dicさんが気になっているのは Framework.update() の部分だと思います。

Framework の内容が定義されているクラスは事実上シングルトンクラスです。
そのため、いちいちFramework::instance()->update()とか書くのもめんどくさいし、
Framework().update()と書くのも何か気持ち悪いと思いました。
そのため、「cout みたいに使えれば手軽かな・・・」と考えてグローバル変数にしました。
(cout自体にも疑問の声はあるようですが・・・)

これについては仲間からも意見が出たため、ライブラリの内部で定義しているグローバル変数
を使いたくないときは include のところで

#define LNOTE_DISABLE_GLOBAL // グローバル変数無効
#include <lnote.h>

と define を書き加えるという方法で対応しています。


…実際、シングルトンのクラスはたいていの場合はメンバを全て static にしても動くことは動きますよね。
正直なところ、自分的には static をつけることにはちょっとだけ抵抗があるのですが、
使う側は クラス名::メンバ と言う風に::を使って書いても気持ち悪くないのかなっていう思いがあります。

そのため、このあたりの実装は自分でも未だに割りきれていないところがあります。
よろしければこのあたりのご意見も伺えれば幸いです。

dicさんのご意見も参考にさせていだきます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲーム開発用ライブラリの公開準備にあたって

#7

投稿記事 by softya(ソフト屋) » 9年前

dic さんが書きました:>>softoyaさん
それは説明不足で、すいません

たとえば上のコードにある

コード:

void LMain()
{
    // 表示する画像を読み込んでテクスチャを作成する
    LTexture texture = LTexture::create( "画像ファイル名" );
の部分の LTexture::create の LTextureってどこから来たのかなぁ・・・って感じです
どこにも宣言、実体がないので、あまり私は使わないのですがstaticなクラスですよね?(間違っていたらすいません)

ここらへんが、私だけの場合に限って困惑します
特に梨樹さんが私の意見を聞く必要もないですけどね
あくまで私の意見ですがLTextureは単なるクラス名だと思いますよ。LTexture::createはstaticなメンバ実装だと思います。
私からみるとよく有る実装のパターンだと思うのですが。
コンストラクタであれば、納得出来るって感じなのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲーム開発用ライブラリの公開準備にあたって

#8

投稿記事 by softya(ソフト屋) » 9年前

>>梨樹さん

私的には使いやすそうな実装だと思います。
3Dを実装する前でも良いので、ベータ公開してもらった方が意見が集まるかも知れません。実際に使ってみると色々意見が出てくると思いますからね。
公開を楽しみにしています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
lriki
記事: 88
登録日時: 9年前

Re: ゲーム開発用ライブラリの公開準備にあたって

#9

投稿記事 by lriki » 9年前

>dicさん

すみません。LTexture でしたか。

LTexture はクラスです。

定義はこんなイメージです。

コード:

class LTexture
{
public:

	// LTexture のインスタンスを作成して返す
	static LTexture create( const char* filename_ )
	{
		LTexture texture;
		texture.mImpl = new LTextureImpl( filename_ );
		return texture;
	}
	
	// テクスチャをクリアする関数の例
	void clear()
	{
		mImpl->clear();	// 実装クラスのclear()に丸投げ
	}
	
	// ...
	
private:

	LTextureImpl* mImpl;	// 実際のテクスチャクラス。LTexture のメンバ変数はこれだけ。
};

>特に梨樹さんが私の意見を聞く必要もないですけどね
とんでもないです! 

このライブラリのスタイルは私個人が気に入って導入したものなので、多分多くの方から疑問があると思います。
そのため、いろいろな人の声を聞きたいと思っています。

むしろこんな異端っぽいライブラリにほんの僅かでもつきあっていただいてありがとうございます!><


[17:36] public: → private: に直しました。

アバター
lriki
記事: 88
登録日時: 9年前

Re: ゲーム開発用ライブラリの公開準備にあたって

#10

投稿記事 by lriki » 9年前

>softyaさん

がんばる!( `・ω・´)

いただいたご意見も参考にして、まずはドキュメント類を充実させていこうと思います。

dic
記事: 582
登録日時: 9年前
住所: 宮崎県

Re: ゲーム開発用ライブラリの公開準備にあたって

#11

投稿記事 by dic » 9年前

どうしても もめますね やめときます

アバター
ひよこ
記事: 25
登録日時: 9年前

Re: ゲーム開発用ライブラリの公開準備にあたって

#12

投稿記事 by ひよこ » 9年前

おもしろそうな話ですね。
私も使ってみたいです。
使い方も簡単そうですし、簡単なサンプルプログラムがつくなら使ってみたいです。

閉鎖

“C言語何でも質問掲示板” へ戻る