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

📄 sspritemanager.cpp

📁 用VC++及DirectX实现的SuperMario小游戏
💻 CPP
字号:
/*
Author: Bear

This source is free to anybody.
If you have any problem with this or some advice to me, please:
    mailto: heyang22118952.student@sina.com
        or  yang45249.student@sina.com
or you can contact me through my QQ:     261570581

Welcome to discuss game programming techniques with me :)
And I like to play games!
*/
#include ".\sspritemanager.h"
#include <fstream>
#include <string>

SSpriteManager::SSpriteManager(void)
: loaded(false), m_factory(NULL)
{
}

SSpriteManager::~SSpriteManager(void)
{
	UnLoad();
}

bool SSpriteManager::Load(SSpriteFactory *pSpriteFactory, const char* monsterDefineFileName)
{
	assert(pSpriteFactory != NULL);
	assert(monsterDefineFileName != NULL && monsterDefineFileName != "");

	if(loaded) {
		UnLoad();
	}
	m_factory = pSpriteFactory;
	std::ifstream ifs(monsterDefineFileName);
	assert(ifs);
	char buf[256];
	ifs.getline(buf, 255);	//comment
	std::string name;
	int posX, posY;
	while(!ifs.eof()) {
		ifs>>name>>posX>>posY;
		assert(posX >= 0 && posX <= MAP_WIDTH);
		assert(posY >= 0 && posY <= MAP_HEIGHT);
		SSprite* aSprite = pSpriteFactory->Create(name.c_str(), posX*SLICE_WIDTH, posY*SLICE_HEIGHT);
		if(aSprite == NULL) {
			return false;
		}
		sprites.push_back(aSprite);
	}

	loaded = true;
	return loaded;
}

void SSpriteManager::UnLoad(void)
{
	std::vector<SSprite*>::iterator it;
	for(it = sprites.begin(); it!=sprites.end(); it++) {
		delete (SSprite*)(*it);
	}
	sprites.clear();
	loaded = false;
}

bool SSpriteManager::Draw(BDirectDrawSurface* pDest, int worldX, int worldY)
{
	assert(loaded);
	assert(pDest != NULL);

	std::vector<SSprite*>::iterator it;
	for(it = sprites.begin(); it!=sprites.end(); it++) {
		if(!((SSprite*)(*it))->Draw(pDest, worldX, worldY)) {
			DXTRACE_MSG("SSpriteManager::Draw(): Draw sprite failed");
		}
	}
	return true;
}

void SSpriteManager::Anim(void)
{
	assert(loaded);

	int length = (int)sprites.size();
	for(int i=0; i<length; i++) {
		sprites[i]->Anim();
	}
}

int SSpriteManager::GetCount(void)
{
	return (int)this->sprites.size();
}

SSprite* SSpriteManager::GetSprite(int index)
{
	assert(loaded);
	assert(index >= 0 && index < (int)sprites.size());

	return (SSprite*)(sprites[index]);
}

bool SSpriteManager::Delete(SSprite* sprite)
{
	assert(loaded);
	assert(sprite != NULL);

	std::vector<SSprite*>::iterator it;
	for(it = sprites.begin(); it!=sprites.end(); it++) {
		if(sprite == (SSprite*)(*it)) {
			sprites.erase(it);
			break;
		}
	}
	delete sprite;

	return true;
}

bool SSpriteManager::Add(int row, int col, int index)
{
	assert(row >= 0 && row <= MAP_HEIGHT);
	assert(col >= 0 && col <= MAP_WIDTH);
	assert(index >=0 && index < SPRITE_KINDS);

	std::vector<SSprite*>::iterator it;
	for(it = sprites.begin(); it!=sprites.end(); it++) {
		if(col == ((SSprite*)(*it))->GetX()/SLICE_WIDTH && row == ((SSprite*)(*it))->GetY()/SLICE_HEIGHT) {
			return true;
		}
	}
	SSprite* aSprite = m_factory->Create(index, col*SLICE_WIDTH, row*SLICE_HEIGHT);
	assert(aSprite != NULL);
	sprites.push_back(aSprite);

	return true;
}

bool SSpriteManager::Save(char* fileName)
{
	assert(fileName != NULL && fileName != "");

	std::ofstream ofs(fileName);
	assert(ofs);
	ofs<<";Name	x	y";
	std::vector<SSprite*>::iterator it;
	for(it = sprites.begin(); it!=sprites.end(); it++) {
		ofs<<std::endl<<((SSprite*)(*it))->GetName()<<"\t"<<((SSprite*)(*it))->GetX()/SLICE_WIDTH<<"\t"<<((SSprite*)(*it))->GetY()/SLICE_HEIGHT;
	}

	return true;
}

⌨️ 快捷键说明

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