正六边形:平铺

项目需要,最新在学习正六边形的相关知识,做个记录。

正六边形的相关特性不多说了,网上有很多介绍,直接上代码

平铺代码如下:

const double sqrt3 = 1.732051;
const int sideLen = 50;
const int rowGridNum = 14;
const int colGridNum = 8;


void HelloWorld::addSixSideGrid()
{
	char buff[32] = { 0 };
	for (int i = 0; i <= rowGridNum; i++)
	{
		for (int j = 0; j <= colGridNum; ++j) 
		{
			auto sp = Sprite::create("six_side.png");
			auto pos = this->getPosByGrid(i, j);
			sp->setPosition(pos);
			this->addChild(sp);

			auto txt = ui::Text::create();
			if (i == rowGridNum / 2 && j == colGridNum / 2)
			{
				txt->setString("start");
			}
			else
			{
				sprintf(buff, "%d,%d", i, j);
				txt->setString(buff);
			}
			txt->setTextColor(Color4B::BLACK);
			txt->setFontSize(24);
			sp->addChild(txt);
			txt->setPosition(sp->getContentSize() * 0.5);
		}
	}
}

//根据网格信息计算坐标
Vec2 HelloWorld::getPosByGrid(const int& gridX, const int& gridY)
{
	Vec2 pos = Vec2::ZERO;
	pos.x = gridX * sideLen * 1.5;
	if (gridX % 2 == 0)
	{
		pos.y = sideLen * sqrt3 * gridY;
	}
	else
	{
		pos.y = sideLen * sqrt3 * (gridY - 0.5);
	}
	return pos;
}

//根据坐标计算网格信息
Vec2 HelloWorld::getGridByPos(const Vec2& pos)
{
	int girdX = pos.x/ (1.5 * sideLen)+0.5;
	int girdY = 0;
	if (girdX % 2 == 0)
	{
		girdY = pos.y / (sideLen * sqrt3) + 0.5;
	}
	else
	{
		girdY = pos.y / (sideLen * sqrt3) + 1;
	}
	return Vec2(girdX, girdY);
}

效果图如下【其他平铺方式可以通过偏移坐标实现】:

猜你喜欢

转载自blog.csdn.net/auccy/article/details/115618258