1

我正在通过http://www.tonypa.pri.ee/tbw/tut02.html阅读磁贴引擎教程,但是当我将 Flash 代码翻译成 C++ 时我被卡住了。到目前为止,我理解并翻译了这部分:

unsigned int MAPDATA[6][8] = {
    { 1, 1, 1, 1, 1, 1, 1, 1 },
    { 1, 0, 0, 0, 0, 0, 0, 1 },
    { 1, 0, 1, 0, 0, 0, 0, 1 },
    { 1, 0, 0, 0, 0, 1, 0, 1 },
    { 1, 0, 0, 0, 0, 0, 0, 1 },
    { 1, 1, 1, 1, 1, 1, 1, 1 }
};

class Tile0 {
    public:
        Tile0();
        bool walkable = true;
        unsigned int frame = 0;
};

class Tile1 {
    public:
        Tile1();
        bool walkable = false;
        unsigned int frame = 1;
};

但在这条线上,它说,

“第一行 game.Tile0= function () {} 声明了新的对象原型。当我们从地图数组中得到 0 时,我们将使用 Tile0 作为模板在该位置创建新的 tile 对象。”

这是否意味着将数组 MAPDATA 转换为对象数组?

unsigned int MAPOBJS[6][8] = {
    { Tile1, Tile1, Tile1, Tile1, Tile1, Tile1, Tile1, Tile1 },
    { Tile1, Tile0, Tile0, Tile0, Tile0, Tile0, Tile0, Tile1 },
    { Tile1, Tile0, Tile1, Tile0, Tile0, Tile0, Tile0, Tile1 },
    { Tile1, Tile0, Tile0, Tile0, Tile0, Tile1, Tile0, Tile1 },
    { Tile1, Tile0, Tile0, Tile0, Tile0, Tile0, Tile0, Tile1 },
    { Tile1, Tile1, Tile1, Tile1, Tile1, Tile1, Tile1, Tile1 }
};

或者这是否意味着使用 Tile0 间接引用 0?你如何在 C++ 上做到这一点,所以以后你可以......

if ( MAPOBJS[1][5].walkable )
    player.moveLeft();

用于串通检测?

4

1 回答 1

0

必须先阅读原始文章。好吧,我认为那里提出的建议可以用类似的东西代替(不要假装优化或其他),但我希望它能给你一个大致的想法。

class Tile {
   public:
     enum {
        TILE0,
        TILE1
     };

     Tile(int type) : m_type(type) {};
   protected:
     int m_type;   
};

class Tile1 : public Tile {
     Tile1( Tile::TILE0 );
};

class Tile2 : public Tile {
     Tile2( Tile::TILE1 );
};

int mapData[6][8] = {
     { Tile::TILE0, Tile::TILE1, ... }, 
     { ... }
};

Tile * mapObject[6][8];


initMap() {
   for (int i=0;i<6;i++) 
     for (int j=0;j<8;j++) {
       switch (mapData[i][j]) {
           case Tile::TILE0:
              mapObect[i][j] = new Tile1();
           break;
           case Tile::TILE1:
              mapObject[i][j] = new Tile2();
           break;
           default:
              mapObject = NULL;
           break;
       }
   }
}
于 2013-04-22T19:28:00.703 回答