Để thuận tiện trong việc sử dụng và quản lý sprite, ta bổ sung lớp CSpriteManager vào gametutor để quản lý các sprite. Lớp này cũng tương tự như CImageManager được giới thiệu trong phần trước
CSpriteManager.h
#ifndef __CIMAGEMANAGER_H__
#define __CIMAGEMANAGER_H__
#include "Header.h"
#include "CSingleton.h"
#include "CImage.h"
#include "Stream.h"
#include "CResourceLookupTable.h"
using namespace std;
namespace GameTutor
{
class CSpriteManager: public CSingleton<CSpriteManager>, public CResourceLookupTable<CSprite>
{
friend class CSingleton<CSpriteManager>;
protected:
CSpriteManager() {}
public:
virtual ~CSpriteManager() {}
};
}
#endif
Để thuận tiện hơn cho việc sử dụng sprite, bổ sung hàm AddSprite để load dữ liệu:
namespace GameTutor
{
class CSpriteManager: public CSingleton<CSpriteManager>, public CResourceLookupTable<CSprite>
{
friend class CSingleton<CSpriteManager>;
protected:
CSpriteManager() {}
public:
virtual ~CSpriteManager() {}
template <class IODriver> CSprite* AddSprite(const char* name, const char* spriteDbName)
{
CSprite* spr = Get(name);
if (!spr)
{
CSpriteDBManagement::GetInstance()->AddSpriteDBFromTextFile<IODriver>(spriteDbName);
spr = new CSprite(CSpriteDBManagement::GetInstance()->Get(spriteDbName));
this->Add(name, spr);
}
return spr;
}
};
}
#endif
Add 2 file mới CStateIngame.h và CStateIngame.cpp vào project "game". (2 file này phải được lưu trong thư mục source). Lớp CStateIngame thừa kế từ lớp CState
CStateIngame.h
#ifndef __CSTATEINGAME_H__
#define __CSTATEINGAME_H__
#include "gametutor.h"
class CStateIngame :public CState
{
public:
CStateIngame(): CState() {}
~CStateIngame() {}
void Init();
void Update();
void Render();
void Exit();
void OnControllerEvent(SControllerEvent Event);
};
#endif
CStateIngame.cpp
#include "CStateIngame.h"
void CStateIngame::Init(){
}
void CStateIngame::Update() {}
void CStateIngame::Render() {
}
void CStateIngame::Exit() {}
void CStateIngame::OnControllerEvent(SControllerEvent Event) {}
#define MAX_CELL 25
#define SPR_CELL TOSTRING(cell.spr)
void CStateIngame::Init()
{
char buffer [50];
char buffer2 [50];
for (int i = 0; i < MAX_CELL; i++)
{
sprintf (buffer, "CELL_%d", i+1);
sprintf (buffer2, "%d", i);
CSprite *spr = CSpriteManager::GetInstance()->AddSprite<CFileWin32Driver>(buffer, SPR_CELL);
spr->SetAnimation(buffer2);
}
CGraphics2D::GetInstance()->Reset();
}
Do có 3 mode chơi: 3x3, 4x4, 5x5 do đó có tối đa 25 cell, ta định nghĩa MAX_CELL là 25
#define MAX_CELL 25
SPR_CELL chứa chuỗi "cep.spr" - tên của sprite cần dùng (xem bước build data).
#define SPR_CELL TOSTRING(cell.spr)
Trong Init(), tiến hành tạo MAX_CELL (25) các sprite, mỗi sprite thể hiện một animation tương ứng với số của cell:
sprintf (buffer, "CELL_%d", i+1);
Các sprite sẽ có tên "CELL_1", "CELL_2", ... , "CELL_25"sprintf (buffer2, "%d", i);
Tên các animation được qui định trong cell.spr, có tên từ "1" đến "25"CSprite *spr = CSpriteManager::GetInstance()->AddSprite<CFileWin32Driver>(buffer, SPR_CELL);
spr->SetAnimation(buffer2);
Lúc này, sprite "CELL_1" sẽ hiển thị animation "1", "CELL_2" sẽ hiển thị animation "2", ...
Tiến hành reset Graphics2D để chuẩn bị cho quá trình render
CGraphics2D::GetInstance()->Reset();
void CStateIngame::Render()
{
CGraphics2D::GetInstance()->Clear(SColor<float>(0, 0, 0, 1));
CSpriteManager::GetInstance()->Get("CELL_25")->RenderAnimation(CGraphics2D::GetInstance());
CGraphics2D::GetInstance()->Flush();
}