code-check-project/Game2D/include/struct.h

211 lines
6.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "Config.h"
// 封装图片结构
struct MImage {
static std::map<std::string, IMAGE*> imageMap; // 存放所有图片
static IMAGE* createImage(LPCSTR name) {
IMAGE* image = new IMAGE;
loadimage(image, name);
return image;
}
static void deleteImage() {
for(auto it = imageMap.begin(); it != imageMap.end(); ++it) {
if(it->second != nullptr) {
delete it->second;
imageMap[it->first] = nullptr;
}
}
}
};
// 音乐封装类
struct Music {
// 使用 LPCSTR 作为键值有重大隐患,可能会有离开作用域导致键值丢失的情况出现
static std::map<std::string, Music*> musicMap; // 存放所有音乐
// 获取音乐路径
Music(LPCSTR name): command("") { strcat_s(command, name); }
static Music* createMusic(std::string name) { return new Music(name.c_str()); }
static void deleteMusic() {
for(auto it = musicMap.begin(); it != musicMap.end(); ++it) {
delete it->second;
musicMap[it->first] = nullptr;
}
}
// 返回开头
void toStart() {
char command_name[BUF_SIZE] = "seek ";
strcat_s(command_name, command);
strcat_s(command_name, " to start");
mciSendString(command_name, 0, 0, 0);
}
void open() {
char command_name[BUF_SIZE] = "open ";
strcat_s(command_name, command);
mciSendString(command_name, 0, 0, 0);
}
void play(bool repeat = false) {
char buf[BUF_SIZE];
status(buf);
// 如果音乐没有在播放,就播放音乐
if(buf[0] != 'p') {
char command_name[BUF_SIZE] = "play ";
strcat_s(command_name, command);
if(repeat) {
strcat_s(command_name, " repeat");
}
mciSendString(command_name, 0, 0, 0);
}
}
void pause() {
char command_name[BUF_SIZE] = "pause ";
strcat_s(command_name, command);
mciSendString(command_name, 0, 0, 0);
}
void resume() {
char command_name[BUF_SIZE] = "resume ";
strcat_s(command_name, command);
mciSendString(command_name, 0, 0, 0);
}
void stop() {
char command_name[BUF_SIZE] = "stop ";
strcat_s(command_name, command);
mciSendString(command_name, 0, 0, 0);
}
void close() {
char command_name[BUF_SIZE] = "close ";
strcat_s(command_name, command);
mciSendString(command_name, 0, 0, 0);
}
// 设置音量
void setVolume(int volume) {
char command_name[BUF_SIZE] = "setaudio ";
strcat_s(command_name, command);
strcat_s(command_name, " volume to");
char volume_buf[BUF_SIZE];
sprintf_s(volume_buf, " %d", volume);
strcat_s(command_name, volume_buf);
// 设置音量
mciSendString(command_name, 0, 0, 0);
}
// 音乐长度
void length(char buf[]) {
char command_name[BUF_SIZE] = "status ";
strcat_s(command_name, command);
strcat_s(command_name, " length");
// 记录状态
mciSendString(command_name, buf, BUF_SIZE, 0);
}
// 获取播放状态
void status(char buf[]) {
char command_name[BUF_SIZE] = "status ";
strcat_s(command_name, command);
strcat_s(command_name, " mode");
// 记录状态
mciSendString(command_name, buf, BUF_SIZE, 0);
}
char command[BUF_SIZE];
};
// 定时器封装
struct Timer {
static Timer* createTimer(const int ID, const DWORD interval) {
Timer* timer = new Timer(ID, interval);
timerMap[ID] = timer;
return timer;
}
static void deleteTimer() {
for(auto it = timerMap.begin(); it != timerMap.end(); ++it) {
delete it->second;
timerMap[it->first] = nullptr;
timerMap.erase(it);
}
}
static void deleteTimer(const int ID) {
if(timerMap[ID] != nullptr) {
delete timerMap[ID];
timerMap[ID] = nullptr;
timerMap.erase(ID);
}
}
// 开启定时器,同时返回指针
static Timer* start(const int ID) {
Timer* timer = timerMap[ID];
if(!timer->on) {
timer->t = clock();
timer->on = true;
}
return timer;
}
void start() {
t = clock();
on = true;
}
void stop() { on = false; }
bool onTime() {
if(on) {
DWORD t2 = clock();
if(t2 - t > interval) {
t = t2;
return true;
}
}
return false;
}
DWORD now() {
// 返回持续时间
if(on) {
return clock() - t;
}
return 0;
}
// 保存所有的定时器
static std::map<int, Timer*> timerMap;
Timer(const int ID, const DWORD interval): t(0), ID(ID), interval(interval), on(false) {}
DWORD t;
const DWORD interval;
const int ID;
bool on;
};
// 数据
struct Data {
static Data* readSrc(std::fstream& fp); // 特殊资源映射
static Data* readObject(std::fstream& fp); // 读取物体,返回数据指针
static void readFramework(std::fstream& fp, std::vector<Data*>& dataList);
static void readNote(std::fstream& fp); // 读取注释
// 读取数据,返回数据指针
static void read(LPCSTR name, std::map<std::string, Data*>& dataMap);
static void read(LPCSTR name, std::map<std::string, Data*>& dataMap, Mode mode);
static std::string freeStr(); // 产生随机字符串
std::map<std::string, double> singles; // 单变量
std::map<std::string, POINT> points; // 点变量
std::map<std::string, std::string> details; // 描述
};
struct Event {
static std::map<int, Event*> eventMap; // 所有事件映射,通过 id 访问
static void read(LPCSTR name); // 读取所有事件
static Event* readEvent(std::fstream& fp); // 读取 {} 中的事件
static void deleteEvent(); // 删除所有事件
// 事件同样不需要保存 id其 id 通过 eventMap 的键值隐式地使用
std::vector<std::string>::iterator eIt; // 保存指令迭代器,当为 commandList.end 则结束
std::vector<std::string> commandList; // 指令列表
std::vector<int> intList; // 数值表
};