0

私は大学の仕事のために (SFML で) 2D プラットフォーム ベースのゲームを作ろうとしています。私は誰かに私のためにコードを書くように頼んでいるわけではありませんが、誰かがいくつかの指針を提供できるなら、私は非常に感謝しています:)

現在、以下を含む約 13 のクラスがあります。

BaseEntity (ほとんどのゲーム オブジェクトはこれから派生します)

プレーヤー (BE から継承)

ビートル (BE から継承 - このゲームは「ビートル ドジャー」と呼ばれるため、プレイヤーへの脅威として動くビートルが存在します)

宝石

MagicGem (プレイヤーはレベルを進めるためにこれらが必要です)

プラットホーム

SolidBlock (プラットフォームから継承)

DownBlock (Platform から継承 - プレイヤーはこのブロックを通り抜けることができますが、飛び越えることはできません)

UpBlock (上記と同じですが、その逆)

ゲームサウンド

ゲーム (ゲームマネージャー)

いわばほとんどのゲームの「ビルディング ブロック」を作成しました。すべてのクラスには、Game::Update で呼び出される独自の更新関数があります。同じことが各オブジェクトの Draw() 関数にも当てはまります。すべてのクラスはゲーム ウィンドウへのポインターを保持するため、これらのことを実行できます。また、現在押されているキーや経過時間 (移動計算の場合) など、Game からいくつかの変数も渡されます。

ここまではすべて順調に見えましたが、衝突が発生しました。それらがどのように機能するかの基本は理解していますが、それらを実装するために 2 つまたは 3 つの異なるアプローチを試みました。最初は、Player クラスに CollidesWith( Beetle& b ) や CollidesWith( Platform& plat ) などの関数を保持させることから始めました。明らかに、レベル内のすべてのオブジェクト (もちろん宝石を含む) に対してテストするとき、これは非常に骨の折れる作業であり、広範なフェーズの衝突検出を実装する方法を検討し始めました。次に、2 つの 2DVectors (SFML の組み込みクラス) で定義された AABB クラスを使用してみました。ここでちょっと行き詰まって、ここに来て助けを求めることにしました。純粋にスプライトのサイズを使用して衝突のテストに戻りました (ボックスで定義されているため、AABB のものと同じですよね?)。

ゲームの優れた基盤とは何かを深刻に混乱させる前に、ブロード フェーズとナロー フェーズの衝突検出を実装するための良い方法について、友好的なアドバイスをくれる人はいますか? ある段階では非常にうまく機能していましたが、プレイヤーがまだプラットフォームの側面を移動できることに気付きました。

衝突専用のクラスを作成する必要がありますか? または、各オブジェクトのスプライトのサイズを使用して、そのまま続行する必要があります(各オブジェクトには独自のスプライトと画像があります-実際に例を示します):

class BaseEntity
{
public:
// Constructors
BaseEntity();
BaseEntity(sf::RenderWindow* gameWin, string imgPath, sf::Vector2f position = sf::Vector2f(0,0), sf::Vector2f velocity = sf::Vector2f(0,0));
virtual ~BaseEntity();
// Setters
void SetCurrentPos(sf::Vector2f newPos); // Set the current position 
void SetPreviousPos(sf::Vector2f newPrevPos); // Shouldn't be needed but there may be rare circumstances
void SetCurrentVel(sf::Vector2f newVel); // Set the velocity

// Getters
sf::Vector2f GetCurrentPos(); // Returns the current position values
sf::Vector2f GetPreviousPos(); // Returns the previous position values
sf::Vector2f GetCurrentVel(); // Returns the current velocity values 

void virtual SetSprite(string imgPath); // Set up the images for the sprite

void virtual Update(float elapsedTime); // The function that handles the updating of movement
void virtual Draw(); // The function that handles the 'Draw' aspect of this object

protected:


sf::RenderWindow* p_GameWin; // A pointer to the game window (used for drawing)
sf::Vector2f currentPos;
sf::Vector2f previousPos;
sf::Vector2f currentVel;
sf::Sprite mySprite; // This objects sprite
sf::Image myImage; // This objects image
};

プレーヤー クラスはこれから継承し、CheckBoundaries、CollidesWith、Jump などのいくつかの追加関数を持ち、いくつかの変数も保持します - bool isColliding は、このシナリオで興味深い場合があります。

乾杯、そしてエッセイでごめんなさい!

4

2 に答える 2

0

扱うエンティティの量によっては、ゲーム内のすべてのオブジェクトの衝突をチェックするだけでも、メモリやパフォーマンスの面で大きなコストがかかる場合があります。

衝突チェックを簡素化するために、x 座標を増やすなど、オブジェクトを軸で分類するように前処理することをお勧めします。たとえば、レベルへの開始など、ゲームが始まる前にすべてのオブジェクトを準備して並べ替えると、さらに良い場合があります。最初の試みとして、それが私がそれを行うことを選択する方法だと思います。

于 2013-01-09T02:24:33.540 に答える