私は大学の仕事のために (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 は、このシナリオで興味深い場合があります。
乾杯、そしてエッセイでごめんなさい!