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

📄 animation.cpp

📁 一个96K的3D游戏源码
💻 CPP
字号:
/*    Animation.CPP
 *
 *  provides Animation-Declarations & -operations
 *
 * Copyright 2003 by PaP / JTMK
*/

#include "stdio.h"
#include <windows.h>
#include "SystemIO.h"
#include "objekt.h"
#include "Animation.h"

tAnimationList *AktList;

tAnimFrame *FindFrame(tAnimFrame *Frame_1,long FramePos)
{
	while((Frame_1->Next!=NULL)&&(Frame_1->Next->StartCnt<=FramePos))
	{
		Frame_1=Frame_1->Next;
	}
	return(Frame_1);
}


void CalcObjUsingAnimationAndCountReal(tObjekt *Obj,tAnimation *Anim,long Cnt)
{
	tSkelList *SkelList;
	tAnimationList *AnimList;

	SkelList=Obj->SkelList;
	AnimList=Anim->NodeList;

	while(SkelList!=NULL)
	{
		AnimList->AktFrame=FindFrame(AnimList->Frame0,Cnt);
// Letzter Animationsschritt , no calc
		if(AnimList->AktFrame->Next==NULL)
		{
			if(Anim->LoopPoint!=-1) AnimList->AktFrame=AnimList->Frame0;
			SkelList->Node->ZielOrgPos=AnimList->AktFrame->Node->OrgPos;
			SkelList->Node->ZielRoll=AnimList->AktFrame->Node->Roll;
		} else 
		{
			SkelList->Node->ZielOrgPos=AnimList->AktFrame->Next->Node->OrgPos;
			SkelList->Node->ZielRoll=AnimList->AktFrame->Next->Node->Roll;
		}
//		SkelList->Node->Flags=AnimList->AktFrame->Node->Flags;
		SkelList=SkelList->Next;
		AnimList=AnimList->Next;
	}
}

void StartAnimationPlay(tObjekt *Obj,tAnimation *Anim)
{
	tSkelList *SkelList;
	tAnimationList *AnimList;

	SkelList=Obj->SkelList;
	AnimList=Anim->NodeList;

	while(SkelList!=NULL)
	{
// Letzter Animationsschritt , no calc
		SkelList->Node->OrgPos=AnimList->Frame0->Node->OrgPos;
		SkelList->Node->Roll=AnimList->Frame0->Node->Roll;
		SkelList->Node->Flags=AnimList->Frame0->Node->Flags;

		SkelList=SkelList->Next;
		AnimList=AnimList->Next;
	}

}

tAnimation *LoadAnimation(char *fname)
{
//	fwrite(Anim,sizeof(tAnimation),1,F);
		
	tAnimation *Anim;
	tAnimationList *List,*OldList;
	tAnimFrame *Frame,*OldFrame;
	char Ch;

	t_File_Handle *F;
	F=Load_File(fname);

	Anim=(tAnimation *) malloc(sizeof(tAnimation));
	FileRead(F,Anim,sizeof(tAnimation));
	Anim->FrameCounter=0;
	List=NULL;


	FileRead(F,&Ch,1);
	while(Ch!=_EndOfFile)
	{
		if(Ch==_ListItem)
		{
			OldList=List;
			List=(tAnimationList *)malloc(sizeof(tAnimationList));
			List->Next=NULL;
			List->Frame0=NULL;
			Frame=NULL;
			if(OldList==NULL)
			{
				Anim->NodeList=List;
			} else
			{
				OldList->Next=List;
			}
		}
		if(Ch==_Frame)
		{
//		    MessageBox (HWND_DESKTOP, "Test Message", "B-Clopd3D Interrupted", MB_OK | MB_ICONEXCLAMATION);
			OldFrame=Frame;
			Frame=(tAnimFrame*) malloc(sizeof(tAnimFrame));
			Frame->Pre=OldFrame;
			Frame->Next=NULL;
			FileRead(F,&Frame->StartCnt,4);
			Frame->Node=(tSkeletonNode*)malloc(sizeof(tSkeletonNode));

//			FileRead(F,Frame->Node,sizeof(tSkeletonNode));
			FileRead(F,&Frame->Node->OrgPos,sizeof(tP3D));
			FileRead(F,&Frame->Node->Flags,sizeof(char));
			FileRead(F,&Frame->Node->Roll,sizeof(float));

			if(OldFrame==NULL)
			{
				List->Frame0=Frame;
				List->AktFrame=Frame;
			} else
			{
				OldFrame->Next=Frame;
			}
		}
		FileRead(F,&Ch,1);
	}
	

	Close_File(F);
//    MessageBox (HWND_DESKTOP, "Test Message", "B-Clopd3D Interrupted", MB_OK | MB_ICONEXCLAMATION);
	return(Anim);
}

void LoadBaseAnimation(tObjekt *Obj,char *fname)
{
	tAnimation *Temp;
	tSkeletonNode *Node1,*Node2;
	tAnimationList *List;
	tSkelList *ListN;

	Temp=LoadAnimation(fname);
	List=Temp->NodeList;
	ListN=Obj->SkelList;

	while(List!=NULL)
	{
		Node1=ListN->Node;
		Node2=List->Frame0->Node;

		Node1->OrgPos=Node2->OrgPos;
		Node1->Roll=Node2->Roll;

		ListN=ListN->Next;
		List=List->Next;
	}

	ReCalcSkelNode(Obj->Skel,KartMatrix(),vNull);
	SetMeshAsItIs(Obj->Skel);
}

⌨️ 快捷键说明

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