适用于2D Tilemap的适当数据模型(C ++,Qt)

时间:2013-12-20 11:44:20

标签: c++ image qt datamodel

我制作了一个小型2D级别编辑器,您可以在其中创建基于2D图块的地图。但是,我的应用程序内部的性能确实非常糟糕。我目前正在考虑重新开始。

问题是,我目前使用QGraphicsItem来表示QGraphicsScene中的单个图块。瓷砖有一些属性......包括图像。创建地图时,我为每个图块创建一个项目,为每个图块绘制图像..这基本上是很多图形项目,它会减慢整个应用程序的速度。这是在创建地图后填充地图的功能:

    for(int i=0;i<map->m_rows;i++)
    {
        for(int j=0;j<map->m_cols;j++)
        {
            Tile* thetile=map->getAt(i,j);
            if(thetile)
            {
                if(map->getType()==twoditor::RECTANGLETILE)
                {
                    QGraphicsItem* item= new TileGraphicsItem(thetile);
                    m_scene->addItem(item);
                }
                else if(map->getType()==twoditor::HEXAGONTILE)
                {
                    QGraphicsItem* item= new HexagonGraphicsItem(thetile);
                    m_scene->addItem(item);
                }
            }
        }
    }

适用于100x100平铺的地图。但如果我想创建更大的地图......加载时间实在是难以承受.. 有人可以给我建议更好地表示瓷砖地图吗?是否有其他方便的方式来显示地图并编辑其中的单元格(图块)?

编辑:TileGraphicItem绘画功能:

void TileGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget){

setZValue(0);

if(!m_thetile->getImage().isNull())
{
  painter->drawImage(0,0,m_thetile->getImage());
}
QPainterPath circle_path;

QRect duwagrect(boundingRect().x(),boundingRect().y(),boundingRect().width(),boundingRect().height());
circle_path.addRect(duwagrect);

m_pen.setStyle(Qt::SolidLine);
m_pen.setColor(Qt::black);
m_pen.setWidth(1);
painter->setPen(m_pen);
painter->drawPath(circle_path);

if(m_thetile->getProperty()->getBlocks())
{
    QPainterPath circle_path;
    QRect duwagrect(boundingRect().x()+2,boundingRect().y()+2,boundingRect().width()-3,boundingRect().height()-3);
    circle_path.addRect(duwagrect);
    m_pen.setStyle(Qt::DotLine);
    m_pen.setColor(Qt::red);
    m_pen.setWidth(2);
    painter->setPen(m_pen);
    painter->drawPath(circle_path);
}
if(this->isSelected())
{
  QPainterPath circle_path;
  QRect duwagrect(boundingRect().x()+2,boundingRect().y()+2,boundingRect().width()-3,boundingRect().height()-3);
  circle_path.addRect(duwagrect);
  m_pen.setStyle(Qt::SolidLine);
  m_pen.setColor(Qt::green);
  m_pen.setWidth(3);
  painter->setPen(m_pen);
  painter->drawPath(circle_path);
}

if(option->state & QStyle::State_MouseOver)
{
  QPainterPath circle_path;
  QRect duwagrect(boundingRect().x()+2,boundingRect().y()+2,boundingRect().width()-3,boundingRect().height()-3);
  circle_path.addRect(duwagrect);
  m_pen.setStyle(Qt::SolidLine);
  m_pen.setColor(Qt::cyan);
  m_pen.setWidth(2);
  painter->setPen(m_pen);
  painter->drawPath(circle_path);
}

}

1 个答案:

答案 0 :(得分:0)

问题是,即使不需要的东西,你也要展示一切 您应该只创建可见项目(某些可见区域中的项目)。

另一种更快的方法是创建自定义QGraphicsItem,它绘制孔图,并仅绘制可见图块(没有图块作为子项)。