RPG要素のある迷路を中心としたシンプルな2Dゲームを書いています。主に、クラス設計、グラフ理論アルゴリズム、データ構造の使用、および 2D グラフィックスの使用を練習するための学習目的です。
プログラムの概要:
ゲーム自体はタイルベースです。現在、迷路を生成して画面に描画し、プレイヤーの移動と壁の衝突検出を可能にします。さらに、より大きな迷路の画面スクロールを処理できます。
とにかく、今私はマップの周りにオブジェクトを配置するオブジェクトの構築に取り組んでいます。リストの最初は金貨で、次にハートやアイテムなどです。継承とポリモーフィズムを実践する良い機会になると思いましたが、この種の設計に関する正式なトレーニングは受けていません。ヘッダーファイルは次のとおりです。
#ifndef MAP_OBJECT_H
#define MAP_OBJECT_H
#include "Common.h"
#include "Utility Functions.h"
const int TILE_SIZE = 80;
class MapObject
{
public:
MapObject(unsigned int nClips, unsigned int r, unsigned int c, unsigned int cSize) :
sheet(0), clips(0), row(r), col(c), numClips(nClips), clipSize(cSize)
{
//For those of you who aren't familiar with sprite sheet usage, basically this
// handles which part of the sprite sheet your on, so it will draw the correct sprite to the screen
if(numClips > 0) clips = new SDL_Rect[numClips];
box.h = clipSize;
box.w = clipSize;
}
virtual ~MapObject() //NOt sure if this is right. All the derived classes will
// behave the same upon deletion, since the only resource
// that got allocated was for the box SDL_rect
{
if(clips) delete[] clips;
}
void initBox(int modX, int modY);
//I think each object will draw a little different, so I made it virtual
virtual void draw() = 0;
//Same with interaction--although I'm not sure how my player class is going to be able to handle this yet
virtual void interact() = 0;
SDL_Rect getBox() const;
private:
SDL_Surface* sheet;
SDL_Rect box;
SDL_Rect* clips;
unsigned int row, col;
unsigned int numClips;
unsigned int clipSize;
MapObject() {} //Made this private because I want the memory to be allocated, and
// numClips needs to be initialized for that to happen, so
//basically I'm forcing the user to use the constructor with parameters
};
class Coin : public MapObject
{
enum CoinFace //This represents all the different coin facings in the sprite
//sheet, so that is can animate. Used in the draw function.
{
FRONT,
TURN1,
TURN2,
TURN3,
USED
};
CoinFace active;
public:
virtual void draw(SDL_Surface* destination);
virtual void interact();
};
#endif //MAP_OBJECTS
私の最大の質問は一般的なものです。これは私のデザインの良いスタートですか? 彼らの明白な問題はありますか?OOD の原則/慣例の誤用?
そのように仮想デストラクタを定義すると、すべての派生クラスがそれを使用できるようになりますか? または、派生クラスごとに定義する必要がありますか?
これは大変なことだと思います。助けていただければ幸いです。私は本当にOODとポリモーフィズムの使用方法を理解しようとしているので、何人かのプロからの助けが信じられないほど役に立ちます.
再度、感謝します。
EDIT:私が持っている大きな質問は、派生クラスのプライベートデータメンバーを変更できるようになるという問題です。これを行う必要がある場合、クラスの設計が悪いと聞きましたが、適切なインターフェイスを作成する方法がわかりません。