2013-04-22 83 views
1

我正在阅读http://www.tonypa.pri.ee/tbw/tut02.html的tile引擎教程,但是当我将Flash代码翻译成C++时,我陷入了困境。到目前为止,我理解和翻译这一部分: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 =函数(){}声明新的对象原型当我们得到的。 0从地图数组中,我们将使用Tile0作为模板在该位置创建新的图块对象。“

这是否意味着将数组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(); 

为共谋检测?

+0

您可以创建一个对象数组,是的,但它不能是类型'无符号int'的,但类型'瓷砖*',而这又需要一个超类既'Tile0'和'Tile1'。否则,它会给你输入错误。 – 2013-04-22 19:35:02

+0

@RefugnicEternium据我所知,编译器需要类型来确定数据的大小。 Tile0和Tile1是从Tile开始扩展的,并且由于扩展类可以大于其基类,Tile MAPOBJS []可以保持Tile0和Tile1吗?这不是无效的吗? – 2013-04-22 20:30:12

+0

不,这不会无效,只要您存储指向平铺对象的指针即可。无论指向哪个对象(整数大小,32位系统上的4字节),每个指针都具有相同的大小。多态性101:每个孩子班也是一个父班。因此,每个孩子类都可以毫无问题地转换成父类。通过这种方式,您可以节省大量内存,只需每个tile有一个对象,并将对这些tile的引用复制到您的阵列中即可......您将只有两个实际对象,但只有两个实际对象。 – 2013-04-22 20:37:18

回答

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; 
     } 
    } 
} 
+0

我明白了!非常感谢你! :) – 2013-04-22 20:45:45

+0

不客气 – evilruff 2013-04-22 20:46:04