読者です 読者をやめる 読者になる 読者になる

ゲーム作りは楽しい

なんか書く

四分木空間分割やってみた

アクションゲーム作るマンだから、空間分割をやってみました。

参考サイトは大正義

http://marupeke296.com/COL_2D_No8_QuadTree.html

です。

f:id:mahou_ptr:20170322054803p:plain上のスクショだとA30とB30の判定で試した奴なので、速度差がわかりにくいですが、10000*10000で試したりすると多少早くなります

判定のチェック回数自体が減っているのは一目でわかりますね!

 

作ったclassとかは後日

曲と同期するためのclassを作る

音楽ゲームを作る時などに役立つ、曲と同期するための記事を書きました

qiita.com

classって素敵

ゲームを作っているとシーンclassみたいなものをだいたい使うわけですが

ついメインシーンclassとかにゲームのメイン部分を書いていっちゃうんですよね

 

でも、例えばチュートリアルシーンみたいなのを作りたくなったときとかにメインシーンとは別でメイン動作と同じものが必要になったとき、すべて移さなくちゃいけなくて大変だったりするんですよね

だから動作のclassを作ったうえでシーンclassに持たせてやるのがあとあと何かあったときに楽に移植できたりしていいなぁって思いますね

XMMATRIXにはめられた話

たまに動作が停止するのでなんでだーなんでだーって原因をさぐっていたら

DirectX::XMMATRIXやDirectX::XMVECTOR(それをメンバにもつclassも)をスマートポインタで扱ってたのがマズかったらしい

こいつらの扱いには注意が必要そうですね

 

 

DirectWriteのttf読み込みやっとできた

ずっとやりたかったけど、MSのサンプル見てても結構めんどくさくて困ってたんです

スタックオーバーフローでそれっぽいの見つけたので、ぽいぽいっと入れたらやっとできた

 

とりあえず一安心です。

 

困ったときはググろうな!!

 

Siv3DのStopwatchなどをまとめて止める

Siv3D Advent Calender 2016の記事

 

以前Siv3Dでゲームを作っていた時に苦労したことの改善策の一つ

qiita.com

constexprでテンプレートメソッドパターンやろうとしたら、よくわからんくなった話

そもそもテンプレートメソッドパターンとは、以下のようにアクセスするpublicのメンバ関数内で、(純粋)仮想関数などを使用し、決められた型にはまった動作を行うようにするデザインパターンです。

class Original
{
protected:
	int m_num;

	virtual int cal()const=0;

public:
	Original(const int num):
		m_num(num)
	{}

	void value()const
	{
		cout << "値は:"<< this->cal()<<endl;
		
	}
};

class Square : public  Original
{
private:
	int cal() const override
	{
		return m_num*m_num;
	}

public:

	Square(const int num):
		Original(num)
	{}

};

//後で比較するためにあえてここに作る
const Square num(2);

void main()
{
	num.value();
}

これの場合は

  1. 「値は」と出力
  2. 何かわからんがcal関数で計算された値が出力

というだけの枠組みに決まったvalue()関数である。


ですがconstexprを学びだした僕はこう思ったわけです
ん?おいまてよ、これくらいならconstexprにしたいぞと、

ってことでconstexprにしてみる

class Original
{
protected:
	int m_num;

	virtual int hoge()const=0;

public:
	constexpr Original(const int num):
		m_num(num)
	{}

	void value()const
	{
		cout << "値は:"<< this->hoge()<<endl;
		
	}
};

class Square : public  Original
{
private:
	int hoge() const override
	{
		return m_num*m_num;
	}

public:

	constexpr Square(const int num):
		Original(num)
	{}

};

constexpr Square num(2);

void main()
{

	num.value();
}

やってやったぞ!優勝!!!と思ったあなたは大間違い

これを実行すると…動作が停止します。

thisがねえって怒られます。
constexprはvirtualメソッドがNGって聞きます。つまりはダメ

ちなみに下みたいにしたら問題なく動いたのですが、その理由がわからない(T T)

void main()
{
	constexpr Square num(2);

	num.value();
}


h内に書いたりした場合ももちろん動作は停止。

では、どうやって解決するかですが

templateを使って静的ポリモーフィズムのようにします

template<class _T>
class Original
{
protected:
	int m_num;

public:
	constexpr Original(const int num):
		m_num(num)
	{}

	void value()const
	{
		cout << "値は:"<< static_cast<const _T&>(*this).cal()<<endl;
		
	}
};

class Square : public  Original<Square>
{
	friend class Original<Square>;
private:
	int cal() const
	{
		return m_num*m_num;
	}

public:

	constexpr Square(const int num):
		Original(num)
	{}

};

おいおいfriendがでてきたぞと、
friendとはそのclassに自身のprivateやprotectedのメンバへのアクセスを許可するものです。
hogeをpublicにすればいいのですが、それではテンプレートメソッドを使ってるメリットがなくなってしまいます。

これでOKですが…

Originalにhogeさえ持ってればどんなclassでも_Tに渡せる状態なのでわりと危険かな
(static_castしてるのでそこでエラーは、はいてくれるが)


templateを使うたびにやばいこと(危険なこと)してる気がしてます。