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
[1]
アセット管理機能を使うか、以下のようにハンドルをコピーすれば、ファイル読み込みやメモリ消費は 1 回分で済みます

Texture texture(L"img/apple.png");

Texture texture2(texture);

Texture texture3(texture);

Texture texture4(texture2);


[2]
現状の設計で問題はないと思います。
Player と Apple のあたり判定しか行わないのであれば、
Player::intersects(const Apple&) const; のほうがわかりやすいです。
編集
名無し  2017/11/01(Wed) 20:36
丁寧な返答ありがとうございました。参考にさせていただきます。
編集
件名
Re: Siv3Dにおけるオブジェクト指向プログラミングについて
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -