To give you an idea of how this ID stuff works I'll show you my animation class system.
Note this class is for Windows GDI. DirectX would look just a tad different.
CAnimSystem.h
Code:
#ifndef CANIMSYSTEM
#define CANIMSYSTEM
#include "CTileSystem.h"
class CAnimSequence;
class CAnimFrame
{
friend class CAnimSequence;
DWORD m_dwTileID;
float m_fFrameDuration;
CPoint m_XYOffsets;
public:
CAnimFrame(void):m_dwTileID(0),m_fFrameDuration(0.0f),
m_XYOffsets(0,0) {}
void Create(DWORD dwID,float fFrameDuration,CPoint XYOffsets)
{
m_dwTileID=dwID;
m_fFrameDuration=fFrameDuration;
m_XYOffsets=XYOffsets;
}
};
class CAnimSequence
{
std::vector<CAnimFrame *> AnimFrames;
CPoint m_Position;
DWORD m_dwCurFrame;
float m_fAccumTime;
CTileManager *m_pTileManager;
bool m_bLooping;
public:
CAnimSequence(void):m_dwCurFrame(0),m_Position(0,0),m_bLooping(false),
m_fAccumTime(0.0f) {}
virtual ~CAnimSequence(void)
{
AnimFrames.clear();
}
void Create(CPoint pos,CTileManager *ptrTileManager,bool bLooping=true)
{
m_Position.x=pos.x;
m_Position.y=pos.y;
m_dwCurFrame=0;
m_pTileManager=ptrTileManager;
m_bLooping=bLooping;
m_fAccumTime=0.0f;
}
void AddFrame(DWORD dwID,float fFrameDuration,CPoint XYOffsets)
{
CAnimFrame *frame=new CAnimFrame();
frame->Create(dwID,fFrameDuration,XYOffsets);
AnimFrames.push_back(frame);
}
void SetFrameData(DWORD dwID,float fFrameDuration,CPoint XYOffsets)
{
if (dwID<AnimFrames.size())
{
AnimFrames[dwID]->m_fFrameDuration=fFrameDuration;
AnimFrames[dwID]->m_XYOffsets=XYOffsets;
}
}
void Reset(void) {m_dwCurFrame=0,m_fAccumTime=0.0f;}
void Update(float fTimeDelta);
void Draw(CDC *pDC,int iScrollX=0,int iScrollY=0);
};
class CAnimSequenceContainer
{
std::vector<CAnimSequence *> AnimSeqs;
public:
CAnimSequenceContainer(void) {}
virtual ~CAnimSequenceContainer(void)
{
AnimSeqs.clear();
}
void AddSeq(CAnimSequence *ptrSeq)
{
AnimSeqs.push_back(ptrSeq);
}
void Update(float fTimeDelta)
{
for (DWORD i=0;i<AnimSeqs.size();i++)
{
AnimSeqs[i]->Update(fTimeDelta);
}
}
void Draw(CDC *pDC,int iScrollX=0,int iScrollY=0)
{
for (DWORD i=0;i<AnimSeqs.size();i++)
{
AnimSeqs[i]->Draw(pDC,iScrollX,iScrollY);
}
}
};
#endif
CAnimSystem.cpp
Code:
#include <stdafx.h>
#include "CAnimSystem.h"
#include "MainFrm.h"
#include "ZeldaEditorView.h"
void CAnimSequence::Update(float fTimeDelta)
{
m_fAccumTime+=fTimeDelta;
if (m_fAccumTime>=AnimFrames[m_dwCurFrame]->m_fFrameDuration)
{
m_fAccumTime=0.0f;
m_dwCurFrame++;
if (m_dwCurFrame>AnimFrames.size())
{
m_dwCurFrame=0;
m_fAccumTime=0.0f;
}
}
}
void CAnimSequence::Draw(CDC *pDC,int iScrollX,int iScrollY)
{
//Draw to pDC with TileDC
if (AnimFrames.size()>0)
{
CRect rect;
CMainFrame *ptrFrame=(CMainFrame *)AfxGetMainWnd();
CZeldaEditorView *ptrView=(CZeldaEditorView *)ptrFrame->GetActiveView();
ptrView->m_wndTileRenderer.GetClientRect(&rect);
DWORD m_dwTileID=AnimFrames[m_dwCurFrame]->m_dwTileID;
CDC *TileDC=m_pTileManager->GetDC(m_dwTileID);
int ScreenX=m_Position.x+AnimFrames[m_dwCurFrame]->m_XYOffsets.x;
int ScreenY=m_Position.y+AnimFrames[m_dwCurFrame]->m_XYOffsets.y;
m_Position.x=ScreenX;
m_Position.y=ScreenY;
ScreenX+=iScrollX;
ScreenY+=iScrollY;
if (ScreenX>rect.left && ScreenX<rect.right && ScreenY>rect.top &&
ScreenY<rect.bottom)
{
pDC->BitBlt(ScreenX,ScreenY,
ptrView->m_wndTileRenderer.m_RenderInfo.dwViewTileSize,
ptrView->m_wndTileRenderer.m_RenderInfo.dwViewTileSize,
TileDC,
0,0,
SRCCOPY);
}
}
}