⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 triangleview.cpp

📁 详细介绍c++编程
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}

void CTriangleView::OnScenemodel() 
{
	if(TRUE == m_bSceneMode)
	{
		m_bSceneMode = FALSE;
	}else
	{
		m_bSceneMode = TRUE;
	}

	Invalidate(FALSE);
}

void CTriangleView::OnUpdateScenemodel(CCmdUI* pCmdUI) 
{
	if(TRUE == m_bSceneMode)
	{
		pCmdUI->SetCheck(TRUE);
	}else
	{
		pCmdUI->SetCheck(FALSE);
	}
}

void CTriangleView::OnRefreshscreen() 
{
	Invalidate(FALSE);	
}

void CTriangleView::LinkFrame(LPFRAME pFrame, LPFRAME pLast)
{
	pFrame->next = pLast->next;
	pFrame->prev = pLast;
	pLast->next->prev = pFrame;
	pLast->next = pFrame;
}

void CTriangleView::DelFrame(LPFRAME pLast)
{
	pLast->next->prev = pLast->prev;
	pLast->prev->next = pLast->next;

	LocalFree(pLast);
}

void CTriangleView::DelGroup(LPANIMATION pLastAnim, BOOL bClearString)
{
	pLastAnim->next->prev =  pLastAnim->prev;
	pLastAnim->prev->next = pLastAnim->next;
	
	CMainFrame *pMainFrame;
	pMainFrame = (CMainFrame*)AfxGetMainWnd();

	CString str;
	str.GetBuffer(20);
	str.Format("%s", pLastAnim->name);

	if(bClearString == TRUE)
		pMainFrame->DelGroupString(&str);

	ClearGroupFrame(pLastAnim);

	LocalFree(pLastAnim);
}

void CTriangleView::ClearGroupFrame(LPANIMATION pAnim)
{
	LPFRAME current;
	LPFRAME last;
	LPFRAME die;

	current = &pAnim->FrameList;
	last = &pAnim->FrameList;

	do
	{
		if(current->m_iFrame != 1)
		{
			die = current;
			current = current->next;
			DelFrame(die);
		}else
		{
			current = current->next;
		}
	}
	while(current != last);
}

void CTriangleView::AddGroup(CString *str)
{
	LPANIMATION pAnim;
	LPANIMATION pLastAnim = Anim.prev;

	m_iTotalGroup ++;

	pAnim = (LPANIMATION)LocalAlloc(LPTR, sizeof(ANIMATION));

	if(pAnim == NULL)
	{
		AfxMessageBox("Error of add group into list");
		return;
	}

	pAnim->m_iID = pLastAnim->m_iID + 1;
	
	strcpy(pAnim->name, (char*)(LPCSTR)(LPCTSTR)*str);

	pAnim->FrameList.next = pAnim->FrameList.prev = &pAnim->FrameList;

	pAnim->m_iTotalFrame = 1;
	pAnim->m_iCurrentFrame = 1;

	pAnim->m_fBaseHeight = 0.0f;

	pAnim->FrameList.m_iFrame = 1;

	pAnim->FrameList.m_fHeadX = 0.0f;
	pAnim->FrameList.m_fHeadY = 0.0f;

	pAnim->FrameList.m_fShoulderX = 0.0f;
	pAnim->FrameList.m_fShoulderY = 0.0f;

	pAnim->FrameList.m_fLeftUpperArmX = 0.0f;
	pAnim->FrameList.m_fLeftUpperArmY = 0.0f;

	pAnim->FrameList.m_fLeftLowerArmX = 0.0f;
	pAnim->FrameList.m_fLeftLowerArmY = 0.0f;

	pAnim->FrameList.m_fLeftHandX = 0.0f;
	pAnim->FrameList.m_fLeftHandY = 0.0f;

	pAnim->FrameList.m_fRightUpperArmX = 0.0f;
	pAnim->FrameList.m_fRightUpperArmY = 0.0f;

	pAnim->FrameList.m_fRightLowerArmX = 0.0f;
	pAnim->FrameList.m_fRightLowerArmY = 0.0f;

	pAnim->FrameList.m_fRightHandX = 0.0f;
	pAnim->FrameList.m_fRightHandY = 0.0f;

	pAnim->FrameList.m_fUpperBodyX = 0.0f;
	pAnim->FrameList.m_fUpperBodyY = 0.0f;

	pAnim->FrameList.m_fLowerBodyX = 0.0f;
	pAnim->FrameList.m_fLowerBodyY = 0.0f;

	pAnim->FrameList.m_fLeftUpperLegX = 0.0f;
	pAnim->FrameList.m_fLeftUpperLegY = 0.0f;

	pAnim->FrameList.m_fLeftLowerLegX = 0.0f;
	pAnim->FrameList.m_fLeftLowerLegY = 0.0f;

	pAnim->FrameList.m_fLeftFootX = 0.0f;
	pAnim->FrameList.m_fLeftFootY = 0.0f;

	pAnim->FrameList.m_fRightUpperLegX = 0.0f;
	pAnim->FrameList.m_fRightUpperLegY = 0.0f;

	pAnim->FrameList.m_fRightLowerLegX = 0.0f;
	pAnim->FrameList.m_fRightLowerLegY = 0.0f;

	pAnim->FrameList.m_fRightFootX = 0.0f;
	pAnim->FrameList.m_fRightFootY = 0.0f;

	pAnim->FrameList.m_fTranslateY = 0.0f;	

	m_pCurrentAnim = pAnim;

	this->LinkGroup(pAnim, pLastAnim);
}

void CTriangleView::LinkGroup(LPANIMATION pAnim, LPANIMATION pLastAnim)
{
	pAnim->next = pLastAnim->next;
	pAnim->prev = pLastAnim;
	pLastAnim->next->prev = pAnim;
	pLastAnim->next = pAnim;
}

void CTriangleView::AddFrame(LPANIMATION pAnim)
{
	LPFRAME pFrame;

	pAnim->m_iTotalFrame ++;
	pAnim->m_iCurrentFrame = pAnim->m_iTotalFrame;

	pFrame = (LPFRAME)LocalAlloc(LPTR, sizeof(FRAME));

	if(pFrame == NULL)
	{
		AfxMessageBox("Error of add frame into list");
		return;
	}

	LPFRAME pLast;
	pLast = pAnim->FrameList.prev;

	pFrame->m_iFrame = pLast->m_iFrame + 1;

	pFrame->m_fHeadX = pLast->m_fHeadX;
	pFrame->m_fHeadY = pLast->m_fHeadY;

	pFrame->m_fShoulderX = pLast->m_fShoulderX;
	pFrame->m_fShoulderY = pLast->m_fShoulderY;

	pFrame->m_fLeftUpperArmX = pLast->m_fLeftUpperArmX;
	pFrame->m_fLeftUpperArmY = pLast->m_fLeftUpperArmY;

	pFrame->m_fLeftLowerArmX = pLast->m_fLeftLowerArmX;
	pFrame->m_fLeftLowerArmY= pLast->m_fLeftLowerArmY;

	pFrame->m_fLeftHandX = pLast->m_fLeftHandX;
	pFrame->m_fLeftHandY = pLast->m_fLeftHandY;

	pFrame->m_fRightUpperArmX = pLast->m_fRightUpperArmX;
	pFrame->m_fRightUpperArmY = pLast->m_fRightUpperArmY;

	pFrame->m_fRightLowerArmX = pLast->m_fRightLowerArmX;
	pFrame->m_fRightLowerArmY= pLast->m_fRightLowerArmY;

	pFrame->m_fRightHandX = pLast->m_fRightHandX;
	pFrame->m_fRightHandY = pLast->m_fRightHandY;

	pFrame->m_fUpperBodyX = pLast->m_fUpperBodyX;
	pFrame->m_fUpperBodyY = pLast->m_fUpperBodyY;

	pFrame->m_fLowerBodyX = pLast->m_fLowerBodyX;
	pFrame->m_fLowerBodyY = pLast->m_fLowerBodyY;

	pFrame->m_fLeftUpperLegX = pLast->m_fLeftUpperLegX;
	pFrame->m_fLeftUpperLegY = pLast->m_fLeftUpperLegY;

	pFrame->m_fLeftLowerLegX = pLast->m_fLeftLowerLegX;
	pFrame->m_fLeftLowerLegY = pLast->m_fLeftLowerLegY;

	pFrame->m_fLeftFootX = pLast->m_fLeftFootX;
	pFrame->m_fLeftFootY = pLast->m_fLeftFootY;

	pFrame->m_fRightUpperLegX = pLast->m_fRightUpperLegX;
	pFrame->m_fRightUpperLegY = pLast->m_fRightUpperLegY;

	pFrame->m_fRightLowerLegX = pLast->m_fRightLowerLegX;
	pFrame->m_fRightLowerLegY = pLast->m_fRightLowerLegY;

	pFrame->m_fRightFootX = pLast->m_fRightFootX;
	pFrame->m_fRightFootY = pLast->m_fRightFootY;

	pFrame->m_fTranslateY = pLast->m_fTranslateY;

	LinkFrame(pFrame, pLast);
}

LPFRAME CTriangleView::GetCurrentFrame(LPANIMATION pAnim)
{
	LPFRAME current;
	LPFRAME last;

	current = &pAnim->FrameList;
	last = &pAnim->FrameList;

	do
	{
		if(current->m_iFrame == pAnim->m_iCurrentFrame)
		{
			return current;
		}
		current = current->next;
	}//do-while
	while(current != last);

	return &pAnim->FrameList;
}

LPANIMATION CTriangleView::GetCurrentAnimation(void)
{
	return m_pCurrentAnim;
}

void CTriangleView::PlaySpeed(int updown)
{
	if(updown == UP)
	{
		m_iPlaySpeed--;
		if(m_iPlaySpeed <= 0)
		{
			m_iPlaySpeed = 0;
		}
	}else
	{
		m_iPlaySpeed ++;
		if(m_iPlaySpeed >= 30)
		{
			m_iPlaySpeed = 30;
		}
	}

	CMainFrame *pMainFrame;
	pMainFrame = (CMainFrame*)AfxGetMainWnd();

	pMainFrame->UpdatePlaySpeedInfo(30 - m_iPlaySpeed);
}

void CTriangleView::ChangeCurrentAnimation(int i, CString& str)
{
	LPANIMATION current;
	LPANIMATION last;

	current = &Anim;
	last = &Anim;

//	int index = 0;
	CString name;
	name.GetBuffer(20);
	do
	{
		name.Format("%s", current->name);
		if(str == name)
		{
			m_pCurrentAnim =  current;
			m_pCurrentAnim->m_iCurrentFrame = 1;
			this->UpdateFrameInfo();
			Invalidate(FALSE);
			return;
		}
		current = current->next;
//		index++;
	}//do-while
	while(current != last);

	this->UpdateFrameInfo();
	m_pCurrentAnim = &Anim;
	m_pCurrentAnim->m_iCurrentFrame = 1;
	Invalidate(FALSE);
}

void CTriangleView::UpdateGroupInfo(void)
{
}

void CTriangleView::UpdateFrameInfo(void)
{
	float x, y;
	CMainFrame *pMainFrame;
	pMainFrame = (CMainFrame*)AfxGetMainWnd();

	LPANIMATION pAnim = this->GetCurrentAnimation();
	LPFRAME pFrame = this->GetCurrentFrame(pAnim);
	pMainFrame->UpdateFrame(pAnim->m_iCurrentFrame, pAnim->m_iTotalFrame);

	this->GetMotionBody(pFrame, body_id, &x, &y);

	pMainFrame->UpdateOrientation(body_id, x, y);
	pMainFrame->UpdatePosition(pFrame->m_fTranslateY);
}

void CTriangleView::ChangeGroupName()
{
	LPANIMATION pAnim = GetCurrentAnimation();
	NameDlg dlg;
	CString sName;
	CString temp;
	
	temp.GetBuffer(20);
	sName.GetBuffer(20);

	if(dlg.DoModal() == IDOK)
	{
		sName = dlg.m_sName;
	
	
	CMainFrame *pMainFrame;
	pMainFrame = (CMainFrame*)AfxGetMainWnd();
	
	temp.Format("%s", pAnim->name);

	pMainFrame->DelGroupString(&temp);

	strcpy(pAnim->name, (char*)(LPCSTR)(LPCTSTR)sName);

	pMainFrame->AddGroupString(&sName);
	pMainFrame->SetCurrentAnim(&sName);
	this->ChangeCurrentAnimation(0, sName);
	}
}

void CTriangleView::GetMotionBody(LPFRAME pFrame, int body_id, float *fOffsetX, float *fOffsetY)
{
	switch(body_id)
	{
	  case HEAD:
		  *fOffsetX = pFrame->m_fHeadX;
		  *fOffsetY = pFrame->m_fHeadY;
	  break;

	  case SHOULDER:
		  *fOffsetX = pFrame->m_fShoulderX;
		  *fOffsetY = pFrame->m_fShoulderY;
	  break;

	  case UPPER_BODY:
		  *fOffsetX = pFrame->m_fUpperBodyX;
		  *fOffsetY = pFrame->m_fUpperBodyY;
	  break;

	  case LOWER_BODY:
		  *fOffsetX = pFrame->m_fLowerBodyX;
		  *fOffsetY = pFrame->m_fLowerBodyY;
	  break;

	  case LEFT_UPPER_ARM:
		  *fOffsetX = pFrame->m_fLeftUpperArmX;
		  *fOffsetY = pFrame->m_fLeftUpperArmY;
	  break;

	  case LEFT_LOWER_ARM:
		  *fOffsetX = pFrame->m_fLeftLowerArmX;
		  *fOffsetY = pFrame->m_fLeftLowerArmY;
	  break;

	  case LEFT_HAND:
		  *fOffsetX = pFrame->m_fLeftHandX;
		  *fOffsetY = pFrame->m_fLeftHandY;
	  break;

	  case RIGHT_UPPER_ARM:
		  *fOffsetX = pFrame->m_fRightUpperArmX;
		  *fOffsetY = pFrame->m_fRightUpperArmY;
	  break;

	  case RIGHT_LOWER_ARM:
		  *fOffsetX = pFrame->m_fRightLowerArmX;
		  *fOffsetY = pFrame->m_fRightLowerArmY;
	  break;

	  case RIGHT_HAND:
		  *fOffsetX = pFrame->m_fRightHandX;
		  *fOffsetY = pFrame->m_fRightHandY;
	  break;

	  case LEFT_UPPER_LEG:
		  *fOffsetX = pFrame->m_fLeftUpperLegX;
		  *fOffsetY = pFrame->m_fLeftUpperLegY;
	  break;

	  case LEFT_LOWER_LEG:
		  *fOffsetX = pFrame->m_fLeftLowerLegX;
		  *fOffsetY = pFrame->m_fLeftLowerLegY;
	  break;

	  case LEFT_FOOT:
		  *fOffsetX = pFrame->m_fLeftFootX;
		  *fOffsetY = pFrame->m_fLeftFootY;
	  break;

	  case RIGHT_UPPER_LEG:
		  *fOffsetX = pFrame->m_fRightUpperLegX;
		  *fOffsetY = pFrame->m_fRightUpperLegY;
	  break;

	  case RIGHT_LOWER_LEG:
		  *fOffsetX = pFrame->m_fRightLowerLegX;
		  *fOffsetY = pFrame->m_fRightLowerLegY;
	  break;

	  case RIGHT_FOOT:
		  *fOffsetX = pFrame->m_fRightFootX;
		  *fOffsetY = pFrame->m_fRightFootY;
	  break;

	  default:
		  *fOffsetX = 0;
		  *fOffsetY = 0;
	  break;
	}
}

void CTriangleView::CheckAngle(float *x, float *y)
{
	if(*x > 360.0f)
	{
		*x -= 360.0f;
	} 

	if(*x < 0.0f)
	{
		*x += 360.0f;
	}

	if(*y > 360.0f)
	{
		*y -= 360.0f;
	} 

	if(*y < 0.0f)
	{
		*y+= 360.0f;
	}
}

void CTriangleView::SetMotionBody(LPFRAME pFrame, int body_id, float fOffsetX, float fOffsetY)
{
	switch(body_id)
	{
	  case HEAD:
		  pFrame->m_fHeadX = fOffsetX;
		  pFrame->m_fHeadY = fOffsetY;
		  this->CheckAngle(&pFrame->m_fHeadX, &pFrame->m_fHeadY);
	  break;

	  case SHOULDER:
		  pFrame->m_fShoulderX = fOffsetX;
		  pFrame->m_fShoulderY = fOffsetY;
		  this->CheckAngle(&pFrame->m_fShoulderX, &pFrame->m_fShoulderY);
	  break;

	  case UPPER_BODY:
		  pFrame->m_fUpperBodyX = fOffsetX;
		  pFrame->m_fUpperBodyY = fOffsetY;
		  this->CheckAngle(&pFrame->m_fUpperBodyX, &pFrame->m_fUpperBodyY);
	  break;

	  case LOWER_BODY:
		  pFrame->m_fLowerBodyX = fOffsetX;
		  pFrame->m_fLowerBodyY = fOffsetY;
		  this->CheckAngle(&pFrame->m_fLowerBodyX, &pFrame->m_fLowerBodyY);
	  break;

	  case LEFT_UPPER_ARM:
		  pFrame->m_fLeftUpperArmX = fOffsetX;
		  pFrame->m_fLeftUpperArmY = fOffsetY;
		  this->CheckAngle(&pFrame->m_fLeftUpperArmX, &pFrame->m_fLeftUpperArmY);
	  break;

	  case LEFT_LOWER_ARM:
		  pFrame->m_fLeftLowerArmX = fOffsetX;
		  pFrame->m_fLeftLowerArmY = fOffsetY;
		  this->CheckAngle(&pFrame->m_fLeftLowerArmX, &pFrame->m_fLeftLowerArmY);
	  break;

	  case LEFT_HAND:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -