示例#1
0
// 设置阻挡
void CShape::SetBlock(int x, int y, unsigned short block)
{
	assert(GetFather());
	switch(block) 
	{
	case CRegion::BLOCK_SHAPE:
		for (int i=x-GetFigure(); i<=x+GetFigure(); i++)
		{
			for (int j=y-GetFigure(); j<=y+GetFigure(); j++)
			{
				CRegion::tagCell* pCell = ((CRegion*)GetFather())->GetCell(i,j);
				if( pCell && pCell->bBlock == CRegion::BLOCK_NO )
				{
					pCell->bBlock = CRegion::BLOCK_SHAPE;
				}
			}
		}
		break;

	case CRegion::BLOCK_NO:
		for (int i=x-GetFigure(); i<=x+GetFigure(); i++)
		{
			for (int j=y-GetFigure(); j<=y+GetFigure(); j++)
			{
				CRegion::tagCell* pCell = ((CRegion*)GetFather())->GetCell(i,j);
				if( pCell && pCell->bBlock == CRegion::BLOCK_SHAPE )
				{
					pCell->bBlock = CRegion::BLOCK_NO;
				}
			}
		}
		break;
	}
}
示例#2
0
void CMonster::SetPosXY(float x, float y)
{
	// 将之前位置的阻挡去除
	if(GetFather())
		SetBlock(GetTileX(), GetTileY(), CRegion::BLOCK_NO);
	CShape::SetPosXY(x,y);
	// 设置新的阻挡位置
	if(GetFather())
		SetBlock(GetTileX(), GetTileY(), GetBlockType());
}
示例#3
0
// 可否攻击
bool CGate::IsAttackAble(CMoveShape* pAttackShape)
{
	if(!GetUnAttack()) return false;
	if(pAttackShape == NULL)	return false;

	if(GetState() == STATE_DIED || IsDied()) return false;
	//城门打开时不可攻击
	if(GetAction()==ACT_OPEN) return false;

	CServerRegion* pRegion = (CServerRegion*)GetFather();
	if(pRegion == NULL) return false;

	//城门在非战斗时间不能被攻击
	bool bResult = false;

	switch( pAttackShape -> GetType() )
		{
		case TYPE_PLAYER:
			{
			
			}
			break;


		}

	return bResult;
}
示例#4
0
	void Work(void){
		for(long i=1;i<=k;i++){
			long x=son[i],ans=0;
			for(Party* point=p[i];point;point=point->next){
				long y=point->y;
				long t=GetFather(x,y);
				if(deep[x]+deep[y]-(deep[t]<<1)>ans)
					ans=deep[x]+deep[y]-(deep[t]<<1);
			}
			if(i!=k)printf("%ld\n",ans);else printf("%ld",ans);
		}
	}
示例#5
0
double Kruskal(int nodenum)
{
    int cnt=0,i,f1,f2;
    double sumh=0.0,sumd=0.0;
    QSort(0,edgenum-1); 
    for (i=1;i<=nodenum;i++) father[i]=i;  //初始化并查集 
    for (i=0;i<edgenum;i++)
    {
        f1=GetFather(edge[i].u);
        f2=GetFather(edge[i].v);
        if (f1!=f2)
        {
            father[f1]=f2;
            //res+=edge[i].w;
            //下面两行是迭代的处理方式
            sumh+=edge[i].h;     
            sumd+=edge[i].dis;
            cnt++;
            if (cnt==nodenum-1) break;    //已经加入了n-1条边,完成最小生成树 
        }
    }
    return (sumh/sumd);  //返回新的迭代值 
}
示例#6
0
void EERIE_CreateCedricData(EERIE_3DOBJ * eobj) {
	
	eobj->m_skeleton = new Skeleton();

	if(eobj->grouplist.size() <= 0) {
		// If no groups were specified

		// Make one bone
		eobj->m_skeleton->bones.resize(1);
		
		Bone & bone = eobj->m_skeleton->bones[0];

		// Add all vertices to the bone
		for(size_t i = 0; i < eobj->vertexlist.size(); i++) {
			bone.idxvertices.push_back(i);
		}

		// Initialize the bone
		bone.init.quat = glm::quat();
		bone.anim.quat = glm::quat();
		bone.init.scale = Vec3f_ZERO;
		bone.anim.scale = Vec3f_ZERO;
		bone.init.trans = Vec3f_ZERO;
		bone.transinit_global = bone.init.trans;
		bone.father = -1;
	} else {
		// Groups were specified

		// Alloc the bones
		eobj->m_skeleton->bones.resize(eobj->grouplist.size());
		
		bool * temp = new bool[eobj->vertexlist.size()];
		memset(temp, 0, eobj->vertexlist.size());

		for(long i = eobj->grouplist.size() - 1; i >= 0; i--) {
			VertexGroup & group = eobj->grouplist[i];
			Bone & bone = eobj->m_skeleton->bones[i];

			EERIE_VERTEX * v_origin = &eobj->vertexlist[group.origin];

			for(size_t j = 0; j < group.indexes.size(); j++) {
				if(!temp[group.indexes[j]]) {
					temp[group.indexes[j]] = true;
					bone.idxvertices.push_back(group.indexes[j]);
				}
			}

			bone.init.quat = glm::quat();
			bone.anim.quat = glm::quat();
			bone.init.scale = Vec3f_ZERO;
			bone.anim.scale = Vec3f_ZERO;
			bone.init.trans = Vec3f(v_origin->v.x, v_origin->v.y, v_origin->v.z);
			bone.transinit_global = bone.init.trans;
			bone.father = GetFather(eobj, group.origin, i - 1);
		}

		delete[] temp;

		// Try to correct lonely vertex
		for(size_t i = 0; i < eobj->vertexlist.size(); i++) {
			long ok = 0;

			for(size_t j = 0; j < eobj->grouplist.size(); j++) {
				for(size_t k = 0; k < eobj->grouplist[j].indexes.size(); k++) {
					if((size_t)eobj->grouplist[j].indexes[k] == i) {
						ok = 1;
						break;
					}
				}

				if(ok)
					break;
			}

			if(!ok) {
				eobj->m_skeleton->bones[0].idxvertices.push_back(i);
			}
		}
		
		for(long i = eobj->grouplist.size() - 1; i >= 0; i--) {
			Bone & bone = eobj->m_skeleton->bones[i];

			if(bone.father >= 0) {
				long father = bone.father;
				bone.init.trans -= eobj->m_skeleton->bones[father].init.trans;
			}
			bone.transinit_global = bone.init.trans;
		}

	}

	/* Build proper mesh */
	{
		Skeleton* obj = eobj->m_skeleton;

		for(size_t i = 0; i != obj->bones.size(); i++) {
			Bone & bone = obj->bones[i];

			if(bone.father >= 0) {
				/* Rotation*/
				bone.anim.quat = obj->bones[bone.father].anim.quat * bone.init.quat;
				/* Translation */
				bone.anim.trans = obj->bones[bone.father].anim.quat * bone.init.trans;
				bone.anim.trans = obj->bones[bone.father].anim.trans + bone.anim.trans;
			} else {
				/* Rotation*/
				bone.anim.quat = bone.init.quat;
				/* Translation */
				bone.anim.trans = bone.init.trans;
			}
			bone.anim.scale = Vec3f_ONE;
		}

		eobj->vertexlocal = new Vec3f[eobj->vertexlist.size()];
		// TODO constructor is better than memset
		memset(eobj->vertexlocal, 0, sizeof(Vec3f)*eobj->vertexlist.size());

		for(size_t i = 0; i != obj->bones.size(); i++) {
			Vec3f vector = obj->bones[i].anim.trans;
			
			for(size_t v = 0; v != obj->bones[i].idxvertices.size(); v++) {
				
				long idx = obj->bones[i].idxvertices[v];
				const EERIE_VERTEX & inVert = eobj->vertexlist[idx];
				Vec3f & outVert = eobj->vertexlocal[idx];
				
				Vec3f temp = inVert.v - vector;
				temp = glm::inverse(obj->bones[i].anim.quat) * temp;
				outVert.x = temp.x;
				outVert.y = temp.y;
				outVert.z = temp.z;
			}
		}
	}
}
示例#7
0
int GetFather(int x)
{
    if (x!=father[x]) father[x]=GetFather(father[x]); //路径合并 
    return father[x];
}