Siv3Dにおけるオブジェクト指向プログラミングについて
名無し 2017/10/26(Thu) 18:24
Siv3Dを用いたオブジェクト指向について質問です。
質問は大きく分けて2つあります。
1つ目は大量にインスタンスが生成されるであろうクラスのメンバ変数に
Texture型を用いて良いのか、という質問です。
例えば
class Apple
{
private:
Vec2 m_Pos;
const Texture m_Texture;
...
public:
Apple(const Vec2 pos);
void draw() const;
...
};
Apple::Apple(const Vec2 pos) :
m_Pos(pos),
m_texture(L"img/apple.png")
...{}
void Apple::draw() const
{
m_texture.resize(40, 40).draw(m_Pos - Vec2(20, 20));
}
のようなクラスを作り、配列などを用いて複数インスタンスを生成した場合、
同じデータを持つTexture型が複数生成されてしまい大変効率が悪く思えます。
このようなコードでいいのでしょうか。
それとも私の知らないclassのなかで完結するようにdraw関数を実装する方法があるのでしょうか。
2つ目は当たり判定をクラス側に実装する場合についての質問です。
ここに2つのクラス(私の場合、PlayerとApple)があるとします。
PlayerはAppleと接触すると、Appleが消え、得点が加算されるように
以下のように実装しようとしました。
class Apple
{
...
public:
Vec2 GetPos() const;
...
};
Vec2 Apple::GetPos() const
{
return m_Pos;
}
class Player
{
private:
Vec2 m_Pos;
...
public:
Player();
void intersect(const Vec2& pos) const;
...
};
Player::Player() :
m_pos(600, 1800){}
void Player::intersect(const Vec2& pos) const
{
return Rect(m_pos - Vec2(40, 100), 80, 100).intersects(pos);
}
class Game : public SceneManager<String>
{
private:
Player player;
Array<Apple> apples;
int score;
public:
void update();
...
};
void Game::update()
{
...
for (auto itr = aplles.begin(), e = apples.end(); itr != e; ++itr)
{
if (player.intersect(*itr.GetPos()))
{
score += 100;
apples.erase(itr);
}
}
...
}
しかし、疑問が2つ残りました。
1つ目は、当たり判定を判断する関数はPlayerが持つべきなのか。
2つ目は、その関数はAppleがGetPos()を持っていることを前提としているが、それは正しいコードといえるのか。
です。
以上の2つを質問とさせていただきます。
どちらか一方で構いません。回答をお待ちしています。
Reputeless 2017/10/29(Sun) 15:44