169 lines
3.9 KiB
C
169 lines
3.9 KiB
C
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include "Tetris.h"
|
|||
|
|
|
|||
|
|
// 计时器
|
|||
|
|
class Timer {
|
|||
|
|
public:
|
|||
|
|
Timer() {
|
|||
|
|
interval = 0;
|
|||
|
|
t_start = 0;
|
|||
|
|
open_timer = false;
|
|||
|
|
}
|
|||
|
|
Timer(DWORD _interval): interval(_interval) {
|
|||
|
|
t_start = 0;
|
|||
|
|
open_timer = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 设置间隔
|
|||
|
|
void set(DWORD _interval) { interval = _interval; }
|
|||
|
|
// 开启和关闭计时器
|
|||
|
|
void open() {
|
|||
|
|
open_timer = true;
|
|||
|
|
t_start = clock();
|
|||
|
|
}
|
|||
|
|
void close() { open_timer = false; }
|
|||
|
|
// 获得状态
|
|||
|
|
bool status() { return open_timer; }
|
|||
|
|
// 确认是否经过了间隔时间
|
|||
|
|
bool t_time() {
|
|||
|
|
if(open_timer && clock() - t_start > interval) {
|
|||
|
|
t_start = clock();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
DWORD t_start;
|
|||
|
|
DWORD interval;
|
|||
|
|
bool open_timer;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 音乐封装类
|
|||
|
|
class Music {
|
|||
|
|
public:
|
|||
|
|
// 获取音乐路径
|
|||
|
|
Music(const char _arr[]): command("") { strcat_s(command, _arr); }
|
|||
|
|
|
|||
|
|
void init(); // 初始化
|
|||
|
|
void open(); // 打开
|
|||
|
|
void play(); // 播放
|
|||
|
|
void pause(); // 暂停
|
|||
|
|
void resume(); // 继续
|
|||
|
|
void stop(); // 停止
|
|||
|
|
void close(); // 关闭
|
|||
|
|
|
|||
|
|
void length(char[]); // 音乐长度
|
|||
|
|
void status(char[]); // 音乐播放状态
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
char command[BUF_SIZE];
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 矩形类,用于碰撞检测
|
|||
|
|
class Rect {
|
|||
|
|
public:
|
|||
|
|
Rect(): width(RECT_SIZE), height(RECT_SIZE) {}
|
|||
|
|
Rect(int _left, int _top): left(_left), top(_top), width(RECT_SIZE), height(RECT_SIZE) {
|
|||
|
|
right = left + width;
|
|||
|
|
bottom = top + height;
|
|||
|
|
}
|
|||
|
|
Rect(int _left, int _top, int _width, int _height): left(_left), top(_top), width(_width), height(_height) {
|
|||
|
|
right = left + width;
|
|||
|
|
bottom = top + height;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 返回碰撞的index,否则返回-1
|
|||
|
|
bool collision(const Rect*);
|
|||
|
|
int collision(int, Rect**);
|
|||
|
|
// 判断点是否在其中
|
|||
|
|
bool point_in(int, int);
|
|||
|
|
|
|||
|
|
// 显示矩形
|
|||
|
|
void show();
|
|||
|
|
// 返回是否移动成功
|
|||
|
|
bool move(Direct);
|
|||
|
|
// 返回原位
|
|||
|
|
void back(Direct);
|
|||
|
|
|
|||
|
|
// 绕定点顺时针旋转90度
|
|||
|
|
bool rotate_clock(int, int);
|
|||
|
|
// 逆时针旋转90度
|
|||
|
|
void rotate_anticlock(int, int);
|
|||
|
|
|
|||
|
|
int left, right, top, bottom, width, height;
|
|||
|
|
static Timer move_timer;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
class Rect_Size {
|
|||
|
|
public:
|
|||
|
|
// 设置存储方块
|
|||
|
|
void set(Type _type, const int _id_list[]) {
|
|||
|
|
// 通过id获取方块指针
|
|||
|
|
type = _type;
|
|||
|
|
for(int i = 0; i < 4; i++) {
|
|||
|
|
rect[i] = rect_list[_id_list[i]];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 移动我的形状
|
|||
|
|
bool move(Direct);
|
|||
|
|
// 顺时针旋转我的形状
|
|||
|
|
void rotate();
|
|||
|
|
// 获得旋转中心
|
|||
|
|
void rotate_center(int&, int&);
|
|||
|
|
|
|||
|
|
static void show();
|
|||
|
|
// 静态创建形状
|
|||
|
|
static void create();
|
|||
|
|
// 销毁
|
|||
|
|
static void distory(Rect*);
|
|||
|
|
static void test_line(); // 消去一行
|
|||
|
|
|
|||
|
|
static bool get_live() { return alive; }
|
|||
|
|
|
|||
|
|
// 创建存储类
|
|||
|
|
static void create_rect() {
|
|||
|
|
if(rect_list == nullptr) {
|
|||
|
|
rect_list = new Rect*[MAX_NUM];
|
|||
|
|
alive = true;
|
|||
|
|
// 开启计时器
|
|||
|
|
Rect::move_timer.open();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
static Rect_Size* share_rect() {
|
|||
|
|
if(my_rect == nullptr) {
|
|||
|
|
my_rect = new Rect_Size;
|
|||
|
|
}
|
|||
|
|
return my_rect;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 清空
|
|||
|
|
static void delete_rect() {
|
|||
|
|
if(rect_list != nullptr) {
|
|||
|
|
for(int i = 0; i < count; i++) {
|
|||
|
|
delete rect_list[i];
|
|||
|
|
rect_list[i] = nullptr;
|
|||
|
|
}
|
|||
|
|
delete[] rect_list;
|
|||
|
|
rect_list = nullptr;
|
|||
|
|
delete my_rect;
|
|||
|
|
my_rect = nullptr;
|
|||
|
|
count = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
Type type;
|
|||
|
|
// 方块成员指针列表
|
|||
|
|
Rect* rect[4];
|
|||
|
|
|
|||
|
|
// 存放所有方块
|
|||
|
|
static bool alive;
|
|||
|
|
static int count;
|
|||
|
|
static Rect_Size* my_rect;
|
|||
|
|
static Type show_type;
|
|||
|
|
static Rect** rect_list;
|
|||
|
|
};
|