初次转移
This commit is contained in:
commit
9a250a816c
|
|
@ -0,0 +1 @@
|
|||
.vs/
|
||||
|
|
@ -0,0 +1 @@
|
|||
#include "BaseRead.h"
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
#pragma once
|
||||
#include <fstream>
|
||||
#include <Windows.h>
|
||||
#include <iostream>
|
||||
class BaseRead :public std::fstream
|
||||
{
|
||||
private:
|
||||
|
||||
const BYTE Key[256] = { 112,117,99,104,105,107,111,110,64,110,101,111,112,108,101,32,100,117,110,103,101,111,110,32,97,110,100,32,102,105,103,104,116,101,114,32,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,0 };
|
||||
|
||||
|
||||
public:
|
||||
//char* 转整数
|
||||
int CharToInt(char* Str)
|
||||
{
|
||||
return *(int*)Str;
|
||||
}
|
||||
|
||||
//char* 转Long
|
||||
long CharToLong(char* Str)
|
||||
{
|
||||
return *(long long*)Str;
|
||||
}
|
||||
|
||||
|
||||
//读整数
|
||||
int ReadInt()
|
||||
{
|
||||
char* CountBuffer = new char[4];
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
this->get(CountBuffer[i]);
|
||||
}
|
||||
int Count = CharToInt(CountBuffer);
|
||||
delete[]CountBuffer;
|
||||
return Count;
|
||||
}
|
||||
|
||||
//读字符串
|
||||
std::string ReadString()
|
||||
{
|
||||
char* CharBuffer = new char[1024];
|
||||
this->get(CharBuffer, 1024, '\0');
|
||||
std::string Str = CharBuffer;
|
||||
delete[]CharBuffer;
|
||||
this->seekg(1, std::ios::cur);
|
||||
return Str;
|
||||
}
|
||||
|
||||
//读取NPK信息
|
||||
std::string ReadInfo()
|
||||
{
|
||||
char* CharBuffer = new char[256];
|
||||
char var;
|
||||
int i = 0;
|
||||
while (i < 256)
|
||||
{
|
||||
this->get(var);
|
||||
CharBuffer[i] = var ^ Key[i];
|
||||
++i;
|
||||
}
|
||||
std::string Str = CharBuffer;
|
||||
delete[] CharBuffer;
|
||||
return Str;
|
||||
}
|
||||
|
||||
//读LONG
|
||||
int ReadLong()
|
||||
{
|
||||
char* CountBuffer = new char[8];
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
this->get(CountBuffer[i]);
|
||||
}
|
||||
long Count = CharToLong(CountBuffer);
|
||||
delete[]CountBuffer;
|
||||
return Count;
|
||||
}
|
||||
|
||||
//读指定长度数据
|
||||
BYTE* ReadCustomSize(int Size)
|
||||
{
|
||||
BYTE* CharBuffer = new BYTE[Size];
|
||||
for (int j = 0; j < Size; j++)
|
||||
{
|
||||
char var;
|
||||
this->get(var);
|
||||
CharBuffer[j] = var;
|
||||
}
|
||||
return CharBuffer;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,159 @@
|
|||
#pragma once
|
||||
|
||||
//创建按钮
|
||||
static SQInteger Create_Button(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SquirrelButtonPtr Button = new SquirrelButton();
|
||||
|
||||
//获取对象的唯一ID
|
||||
uint64_t UUID = Button->GetObjectID();
|
||||
|
||||
//将按钮对象存入Map管理
|
||||
ActorPtrMapObject[UUID] = Button;
|
||||
|
||||
sq_pushinteger(v, UUID);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//设置按钮状态纹理
|
||||
static SQInteger Button_Load_Texture(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
const SQChar* Path;
|
||||
sq_getstring(v, 3, &Path);
|
||||
|
||||
SQInteger Frame;
|
||||
sq_getinteger(v, 4, &Frame);
|
||||
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SquirrelButtonPtr Button = dynamic_cast<SquirrelButton*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
|
||||
TexturePtr t = SquirrelClassEx::GetTexturePtrByImg((char*)Path, Frame);
|
||||
Button->SetFrame(t);
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//初始化按钮
|
||||
static SQInteger Button_Init(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SquirrelButtonPtr Button = dynamic_cast<SquirrelButton*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
Button->Init();
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
//判断按钮是否被点击
|
||||
static SQInteger Button_IsPress(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
SQInteger Type;
|
||||
sq_getinteger(v, 3, &Type);
|
||||
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SquirrelButtonPtr Button = dynamic_cast<SquirrelButton*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
sq_pushbool(v, Button->IsPress(Type));
|
||||
}
|
||||
else {
|
||||
sq_pushnull(v);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//判断按钮是否悬停
|
||||
static SQInteger Button_IsHover(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SquirrelButtonPtr Button = dynamic_cast<SquirrelButton*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
sq_pushbool(v, Button->IsHover());
|
||||
}
|
||||
else {
|
||||
sq_pushnull(v);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//移除自己的Z轴序列
|
||||
static SQInteger Button_RemoveZorder(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SquirrelButtonPtr Button = dynamic_cast<SquirrelButton*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
Button->RemoveZorder();
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushnull(v);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -0,0 +1,218 @@
|
|||
#pragma once
|
||||
//演员对象智能指针Map
|
||||
extern std::map<uint64_t, ActorPtr>ActorPtrMapObject;
|
||||
|
||||
//创建画布
|
||||
static SQInteger Create_Canvas(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQFloat X;
|
||||
sq_getfloat(v, 2, &X);
|
||||
SQFloat Y;
|
||||
sq_getfloat(v, 3, &Y);
|
||||
|
||||
CanvasPtr _Canvas = new Canvas(PixelSize(X, Y));
|
||||
//获取对象的唯一ID
|
||||
uint64_t UUID = _Canvas->GetObjectID();
|
||||
|
||||
//将画布对象存入Map管理
|
||||
ActorPtrMapObject[UUID] = _Canvas;
|
||||
|
||||
sq_pushinteger(v, UUID);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//画布开始渲染
|
||||
static SQInteger Canvas_BeginDraw(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
CanvasPtr _Canvas = dynamic_cast<Canvas*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
CanvasRenderContextPtr _CanvasRenderContextPtr = _Canvas->GetContext2D();
|
||||
_CanvasRenderContextPtr->SetTextAntialiasMode(TextAntialiasMode::None);
|
||||
_CanvasRenderContextPtr->BeginDraw();
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//画布结束渲染
|
||||
static SQInteger Canvas_EndDraw(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
CanvasPtr _Canvas = dynamic_cast<Canvas*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
CanvasRenderContextPtr _CanvasRenderContextPtr = _Canvas->GetContext2D();
|
||||
_CanvasRenderContextPtr->EndDraw();
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//画布绘制纹理
|
||||
static SQInteger Canvas_DrawTexture(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
const SQChar* OutPutBuffer;
|
||||
sq_getstring(v, 3, &OutPutBuffer);
|
||||
|
||||
SQInteger gFrame;
|
||||
sq_getinteger(v, 4, &gFrame);
|
||||
|
||||
SQFloat X;
|
||||
sq_getfloat(v, 5, &X);
|
||||
SQFloat Y;
|
||||
sq_getfloat(v, 6, &Y);
|
||||
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
CanvasPtr _Canvas = dynamic_cast<Canvas*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
|
||||
CanvasRenderContextPtr _CanvasRenderContextPtr = _Canvas->GetContext2D();
|
||||
|
||||
//只有坐标参数
|
||||
if (Top == 6) {
|
||||
Vec2 POS = Vec2(X, Y);
|
||||
|
||||
TexturePtr t = SquirrelClassEx::GetTexturePtrByImg((char*)OutPutBuffer, gFrame);
|
||||
_CanvasRenderContextPtr->DrawTexture(t, POS);
|
||||
}
|
||||
else if (Top == 8) {
|
||||
SQFloat XSize;
|
||||
sq_getfloat(v, 7, &XSize);
|
||||
SQFloat YSize;
|
||||
sq_getfloat(v, 8, &YSize);
|
||||
|
||||
Vec2 POS = Vec2(X, Y);
|
||||
Vec2 Size = Vec2(X + XSize, Y + YSize);
|
||||
|
||||
TexturePtr t = SquirrelClassEx::GetTexturePtrByImg((char*)OutPutBuffer, gFrame);
|
||||
_CanvasRenderContextPtr->DrawTexture(t, POS, Size);
|
||||
}
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//画布绘制文字
|
||||
static SQInteger Canvas_DrawText(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
//得到Squirrel字符串 字体路径Key
|
||||
const SQChar* OutPutBuffer;
|
||||
sq_getstring(v, 3, &OutPutBuffer);
|
||||
|
||||
|
||||
//此操作会New出一个字符串需要手动销毁
|
||||
char* OutPutTextbuf = SquirrelClassEx::SquirrelU2W((char*)OutPutBuffer);
|
||||
std::string OutPutText = OutPutTextbuf;
|
||||
//销毁New出来的字符串
|
||||
delete[]OutPutTextbuf;
|
||||
|
||||
//通过字体创建文本样式
|
||||
if (Top == 7) {
|
||||
//得到Squirrel字符串 文字内容
|
||||
const SQChar* TextStringBuffer;
|
||||
sq_getstring(v, 4, &TextStringBuffer);
|
||||
//此操作会New出一个字符串需要手动销毁
|
||||
char* TextStringbuf = SquirrelClassEx::SquirrelU2W((char*)TextStringBuffer);
|
||||
//需要绘制的文字内容
|
||||
std::string TextString = TextStringbuf;
|
||||
//销毁New出来的字符串
|
||||
delete[]TextStringbuf;
|
||||
|
||||
SQInteger FontColor;
|
||||
sq_getinteger(v, 5, &FontColor);
|
||||
|
||||
SQFloat Xpos;
|
||||
sq_getfloat(v, 6, &Xpos);
|
||||
|
||||
SQFloat Ypos;
|
||||
sq_getfloat(v, 7, &Ypos);
|
||||
|
||||
|
||||
//从全局Map中获取画布对象
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
CanvasPtr _Canvas = dynamic_cast<Canvas*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
CanvasRenderContextPtr _CanvasRenderContextPtr = _Canvas->GetContext2D();
|
||||
TextStyle TsP = TextStyle(FontRecObject[OutPutText]);
|
||||
TsP.alignment = TextAlign::Center;
|
||||
/*
|
||||
// 创建线性渐变样式
|
||||
LinearGradientStyle fill_style = LinearGradientStyle(
|
||||
Point(_Canvas->GetWidth() / 3, 0.0f), // 线性样式起点
|
||||
Point(_Canvas->GetWidth() * 2 / 3, _Canvas->GetHeight()), // 线性样式终点
|
||||
{ GradientStop(0.0f, Color::Yellow), GradientStop(1.0f, Color::Green) }
|
||||
);
|
||||
*/
|
||||
|
||||
|
||||
BrushPtr fill_brush = new Brush(FontColor);
|
||||
_CanvasRenderContextPtr->SetFillBrush(fill_brush);
|
||||
_CanvasRenderContextPtr->DrawTextLayout(TextString, TsP, Point(Xpos, Ypos));
|
||||
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
#include "Cursor.h"
|
||||
#include "SquirrelClassEx.h"
|
||||
|
||||
//譜崔報炎貸辞
|
||||
void SetCursorGameLogic() {
|
||||
WindowPtr window = Application::GetInstance().GetWindow();
|
||||
int X = window->GetPosX();
|
||||
int MaxX = window->GetWidth() + X;
|
||||
|
||||
int Y = window->GetPosY();
|
||||
int MaxY = window->GetHeight() + Y;
|
||||
|
||||
|
||||
POINT pt = { 0, 0 };
|
||||
GetCursorPos(&pt);
|
||||
|
||||
if (pt.x >= X && pt.x <= MaxX && pt.y >= Y && pt.y <= MaxY /*&& GetForegroundWindow() == window->GetHandle()*/) {
|
||||
ShowCursor(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
Cursor::Cursor()
|
||||
{
|
||||
this->SetName("GameCursorObject");
|
||||
this->Retain();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Cursor::OnUpdate(Duration dt)
|
||||
{
|
||||
static bool Init = false;
|
||||
if (!Init) {
|
||||
TexturePtr ImageBuf = SquirrelClassEx::GetTexturePtrByImg("sprite/interface/cursor.img",0);
|
||||
this->SetFrame(ImageBuf);
|
||||
Init = true;
|
||||
}
|
||||
|
||||
////資函補秘
|
||||
Input& input = Input::GetInstance();
|
||||
|
||||
////譜崔"報炎"斤<>恫炎吉噐報炎恫炎
|
||||
this->SetPosition(input.GetMousePos());
|
||||
|
||||
//std::cout << (int)GetCursor() << std::endl;
|
||||
//譜崔報炎<E5A0B1>払議貸辞
|
||||
if ((int)GetCursor() == 65541) {
|
||||
SetCursorGameLogic();
|
||||
this->SetVisible(true);
|
||||
}
|
||||
else {
|
||||
this->SetVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
#pragma once
|
||||
|
||||
#include <kiwano/kiwano.h>
|
||||
using namespace kiwano;
|
||||
|
||||
class Cursor :public Sprite
|
||||
{
|
||||
public:
|
||||
Cursor();
|
||||
void OnUpdate(Duration dt) override;
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,191 @@
|
|||
#include "GameState.h"
|
||||
#include "SquirrelActor.h"
|
||||
|
||||
extern SquirrelClassEx* TObject;
|
||||
extern NPK_M* npk;
|
||||
std::map<std::string, Sound*>SoundRecObject;
|
||||
std::unordered_map<std::string, std::map<int,TexturePtr>>ImageRecObject;
|
||||
std::map<std::string, FontPtr>FontRecObject;
|
||||
WThreadPool threadPool;
|
||||
Cursor* Mouse_Object = new Cursor();
|
||||
|
||||
void InitSound(const TCHAR* directory)
|
||||
{
|
||||
WIN32_FIND_DATA fileInfo;
|
||||
TCHAR buffer[MAX_PATH];
|
||||
|
||||
// 构建搜索路径
|
||||
_tcscpy_s(buffer, directory);
|
||||
_tcscat_s(buffer, _T("\\*.*"));
|
||||
|
||||
// 查找第一个文件/目录
|
||||
HANDLE hFind = FindFirstFile(buffer, &fileInfo);
|
||||
if (hFind != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
do
|
||||
{
|
||||
// 排除 "." 和 ".."
|
||||
if (_tcscmp(fileInfo.cFileName, _T(".")) != 0 && _tcscmp(fileInfo.cFileName, _T("..")) != 0)
|
||||
{
|
||||
// 如果是目录,则递归遍历子目录
|
||||
if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
_tcscpy_s(buffer, directory);
|
||||
_tcscat_s(buffer, _T("\\"));
|
||||
_tcscat_s(buffer, fileInfo.cFileName);
|
||||
InitSound(buffer);
|
||||
}
|
||||
else {
|
||||
// 输出文件名
|
||||
//_tprintf(_T("%s\\%s\n"), directory, fileInfo.cFileName);
|
||||
|
||||
char output[1024];
|
||||
sprintf(output, "%ws\\%ws", directory,fileInfo.cFileName);
|
||||
std::string path = output;
|
||||
std::replace(path.begin(), path.end(), '\\', '/');
|
||||
|
||||
Sound* sou = new Sound(path);
|
||||
//sou->Preload(path);
|
||||
SoundRecObject[path] = sou;
|
||||
//std::cout << "音频资源___" << path << "____已加载" << std::endl;
|
||||
}
|
||||
}
|
||||
} while (FindNextFile(hFind, &fileInfo));
|
||||
|
||||
FindClose(hFind);
|
||||
}
|
||||
}
|
||||
|
||||
void InitFont(const TCHAR* directory)
|
||||
{
|
||||
WIN32_FIND_DATA fileInfo;
|
||||
TCHAR buffer[MAX_PATH];
|
||||
|
||||
// 构建搜索路径
|
||||
_tcscpy_s(buffer, directory);
|
||||
_tcscat_s(buffer, _T("\\*.*"));
|
||||
|
||||
// 查找第一个文件/目录
|
||||
HANDLE hFind = FindFirstFile(buffer, &fileInfo);
|
||||
if (hFind != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
do
|
||||
{
|
||||
// 排除 "." 和 ".."
|
||||
if (_tcscmp(fileInfo.cFileName, _T(".")) != 0 && _tcscmp(fileInfo.cFileName, _T("..")) != 0)
|
||||
{
|
||||
// 如果是目录,则递归遍历子目录
|
||||
if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
_tcscpy_s(buffer, directory);
|
||||
_tcscat_s(buffer, _T("\\"));
|
||||
_tcscat_s(buffer, fileInfo.cFileName);
|
||||
InitFont(buffer);
|
||||
}
|
||||
else {
|
||||
// 输出文件名
|
||||
//_tprintf(_T("%s\\%s\n"), directory, fileInfo.cFileName);
|
||||
|
||||
char output[1024];
|
||||
sprintf(output, "%ws\\%ws", directory, fileInfo.cFileName);
|
||||
std::string path = output;
|
||||
std::replace(path.begin(), path.end(), '\\', '/');
|
||||
|
||||
FontPtr FontBuf = new Font();
|
||||
FontBuf->Preload(path);
|
||||
FontRecObject[path] = FontBuf;
|
||||
}
|
||||
}
|
||||
} while (FindNextFile(hFind, &fileInfo));
|
||||
|
||||
FindClose(hFind);
|
||||
}
|
||||
}
|
||||
|
||||
void LoadingScene_Success()
|
||||
{
|
||||
KGE_DEBUG_LOG("资源加载完成");
|
||||
Stage* P_Stage = Director::GetInstance().GetCurrentStage().Get();
|
||||
SquirrelStage* Push_Stage = (SquirrelStage*)P_Stage;
|
||||
TObject->RunSceneScript("LoadingGame_Stage_Func", Push_Stage);
|
||||
}
|
||||
|
||||
void InitGameRecFunc() {
|
||||
|
||||
//加载List
|
||||
SquirrelClassEx::LoadingListScript();
|
||||
//Sleep(4000);
|
||||
//加载音频资源
|
||||
InitSound(L"SoundPacks2/music");
|
||||
//加载字体资源
|
||||
InitFont(L"Font");
|
||||
|
||||
//预加载一下选择角色那个背景不然有点卡
|
||||
for (size_t i = 0; i < 17; i++)
|
||||
{
|
||||
SquirrelClassEx::GetTexturePtrByImg("sprite/selectcharacter/background.img", i);
|
||||
}
|
||||
IMG* img = npk->ReadNpkTable("sprite/selectcharacter/background.img");
|
||||
npk->ReleaseNpkTable(img);
|
||||
|
||||
Application::GetInstance().PerformInMainThread(LoadingScene_Success);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//#include <irrKlang.h>
|
||||
//KGE_DECLARE_SMART_PTR(ISound);
|
||||
void Setup()
|
||||
{
|
||||
//线程池初始化
|
||||
threadPool.setMaxThreadNum(10);
|
||||
|
||||
//打开输入法
|
||||
WindowPtr window = Application::GetInstance().GetWindow();
|
||||
window->SetImmEnabled(true);
|
||||
|
||||
//New一个新线程去加载游戏所需资源
|
||||
threadPool.concurrentRun(InitGameRecFunc);
|
||||
|
||||
//打开渲染模式
|
||||
Director::GetInstance().SetRenderBorderEnabled(true);
|
||||
|
||||
//irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*SoundPtr SP = new Sound();
|
||||
SP*/
|
||||
/*loader.Load(fileData.get(), "ogg", memory.buffer);*/
|
||||
|
||||
//Renderer::GetInstance().GetContext().SetTextAntialiasMode(TextAntialiasMode::None);
|
||||
}
|
||||
|
||||
|
||||
void GameState::Run()
|
||||
{
|
||||
// 游戏设置
|
||||
Settings s;
|
||||
s.window.title = "Yosin - DOF"; // 窗口标题
|
||||
s.window.width = 1600; // 窗口宽度
|
||||
s.window.height = 900; // 窗口高度
|
||||
// 取消垂直同步
|
||||
s.vsync_enabled = false;
|
||||
// 设置帧间隔时间
|
||||
s.frame_interval = 1_sec / 10000;
|
||||
s.debug_mode = true;
|
||||
|
||||
// 开启日志系统
|
||||
//Logger::GetInstance().Enable();
|
||||
|
||||
//Application::GetInstance().Use(ImGuiModule::GetInstance());
|
||||
Application::GetInstance().Use(AudioModule::GetInstance());
|
||||
// 启动应用
|
||||
Application::GetInstance().Run(s, Setup);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
#pragma once
|
||||
#include "SquirrelClassEx.h"
|
||||
#include <map>
|
||||
|
||||
|
||||
|
||||
class GameState
|
||||
{
|
||||
public:
|
||||
void Run();
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,194 @@
|
|||
//#pragma once
|
||||
////演员对象智能指针Map
|
||||
//extern std::map<uint64_t, ActorPtr>ActorPtrMapObject;
|
||||
//
|
||||
//std::string UTF8toString(const std::string& strSrc)
|
||||
//{
|
||||
// int nwLen = MultiByteToWideChar(CP_UTF8, 0, strSrc.c_str(), -1, NULL, 0);
|
||||
//
|
||||
// wchar_t* pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴
|
||||
// memset(pwBuf, 0, nwLen * 2 + 2);
|
||||
//
|
||||
// MultiByteToWideChar(CP_UTF8, 0, strSrc.c_str(), strSrc.length(), pwBuf, nwLen);
|
||||
//
|
||||
// int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
|
||||
//
|
||||
// char* pBuf = new char[nLen + 1];
|
||||
// memset(pBuf, 0, nLen + 1);
|
||||
//
|
||||
// WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
|
||||
//
|
||||
// std::string retStr = pBuf;
|
||||
//
|
||||
// delete[]pBuf;
|
||||
// delete[]pwBuf;
|
||||
//
|
||||
// pBuf = NULL;
|
||||
// pwBuf = NULL;
|
||||
//
|
||||
// return retStr;
|
||||
//
|
||||
//}
|
||||
//
|
||||
//std::string string_To_UTF8(const std::string& strSrc)
|
||||
//{
|
||||
// int nwLen = ::MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), -1, NULL, 0);
|
||||
//
|
||||
// wchar_t* pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴
|
||||
// ZeroMemory(pwBuf, nwLen * 2 + 2);
|
||||
//
|
||||
// ::MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), strSrc.length(), pwBuf, nwLen);
|
||||
//
|
||||
// int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
|
||||
//
|
||||
// char* pBuf = new char[nLen + 1];
|
||||
// ZeroMemory(pBuf, nLen + 1);
|
||||
//
|
||||
// ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
|
||||
//
|
||||
// std::string retStr(pBuf);
|
||||
//
|
||||
// delete[]pwBuf;
|
||||
// delete[]pBuf;
|
||||
//
|
||||
// pwBuf = NULL;
|
||||
// pBuf = NULL;
|
||||
//
|
||||
// return retStr;
|
||||
//}
|
||||
//
|
||||
//void ControlPanel(const SQChar* Name)
|
||||
//{
|
||||
// ImGui::Begin(u8"测试窗口", 0, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove);
|
||||
//
|
||||
// sq_pushroottable(v);
|
||||
// sq_pushstring(v, Name, -1);
|
||||
// sq_get(v, -2);
|
||||
// sq_pushroottable(v);
|
||||
// sq_pushstring(v, _SST("Lenheart"), -1);
|
||||
// sq_call(v, 2, 0, 1);
|
||||
// sq_pop(v, 2);
|
||||
//
|
||||
//
|
||||
// ImGui::End();
|
||||
//}
|
||||
//
|
||||
//
|
||||
//
|
||||
////创建Imgui图层
|
||||
//static SQInteger Create_ImguiLayer(HSQUIRRELVM v)
|
||||
//{
|
||||
// SQInteger Top = sq_gettop(v);
|
||||
// if (Top <= 0)
|
||||
// {
|
||||
// sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
// return 0;
|
||||
// }
|
||||
//
|
||||
// const SQChar* ImguiName;
|
||||
// sq_getstring(v, 2, &ImguiName);
|
||||
//
|
||||
//
|
||||
// auto f1 = std::bind(&ControlPanel, ImguiName);
|
||||
//
|
||||
// // 创建 ImGui 图层
|
||||
// ImGuiLayerPtr layer = new ImGuiLayer((char*)ImguiName, f1);
|
||||
//
|
||||
// //获取对象的唯一ID
|
||||
// uint64_t UUID = layer->GetObjectID();
|
||||
//
|
||||
// //将画布对象存入Map管理
|
||||
// ActorPtrMapObject[UUID] = layer;
|
||||
//
|
||||
// sq_pushinteger(v, UUID);
|
||||
//
|
||||
// return 1;
|
||||
//}
|
||||
//
|
||||
//
|
||||
////创建Imgui文字
|
||||
//static SQInteger Imgui_Text(HSQUIRRELVM v)
|
||||
//{
|
||||
// SQInteger Top = sq_gettop(v);
|
||||
// if (Top <= 0)
|
||||
// {
|
||||
// sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
// return 0;
|
||||
// }
|
||||
//
|
||||
// const SQChar* ImguiName;
|
||||
// sq_getstring(v, 2, &ImguiName);
|
||||
//
|
||||
// ImGui::Text((char*)ImguiName);
|
||||
//
|
||||
// return 0;
|
||||
//}
|
||||
//
|
||||
////设置窗口大小
|
||||
//static SQInteger Imgui_SetWindowSize(HSQUIRRELVM v)
|
||||
//{
|
||||
// SQInteger Top = sq_gettop(v);
|
||||
// if (Top <= 0)
|
||||
// {
|
||||
// sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
// return 0;
|
||||
// }
|
||||
//
|
||||
// SQInteger X;
|
||||
// SQInteger Y;
|
||||
// sq_getinteger(v, 2, &X);
|
||||
// sq_getinteger(v, 3, &Y);
|
||||
//
|
||||
// ImGui::SetWindowSize(ImVec2(X, Y));
|
||||
// return 0;
|
||||
//}
|
||||
//
|
||||
////设置窗口坐标
|
||||
//static SQInteger Imgui_SetWindowPos(HSQUIRRELVM v)
|
||||
//{
|
||||
// SQInteger Top = sq_gettop(v);
|
||||
// if (Top <= 0)
|
||||
// {
|
||||
// sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
// return 0;
|
||||
// }
|
||||
//
|
||||
// SQInteger X;
|
||||
// SQInteger Y;
|
||||
// sq_getinteger(v, 2, &X);
|
||||
// sq_getinteger(v, 3, &Y);
|
||||
//
|
||||
// ImGui::SetWindowPos(ImVec2(X, Y));
|
||||
// return 0;
|
||||
//}
|
||||
//
|
||||
//
|
||||
////创建Imgui输入框
|
||||
//static SQInteger Imgui_InputText(HSQUIRRELVM v)
|
||||
//{
|
||||
// SQInteger Top = sq_gettop(v);
|
||||
// if (Top <= 0)
|
||||
// {
|
||||
// sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
// return 0;
|
||||
// }
|
||||
//
|
||||
// const SQChar* InPutName;
|
||||
// sq_getstring(v, 2, &InPutName);
|
||||
//
|
||||
// ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(0, 0, 0, 255));
|
||||
// static char buf[25] = u8"";
|
||||
// ImGui::InputText("##", buf, IM_ARRAYSIZE(buf));
|
||||
// ImGui::PopStyleColor();
|
||||
//
|
||||
//
|
||||
//
|
||||
// sq_pushroottable(v);
|
||||
// sq_pushstring(v, InPutName, -1);
|
||||
// sq_get(v, -2);
|
||||
// sq_pushroottable(v);
|
||||
// sq_pushstring(v, _SST(buf), -1);
|
||||
// sq_call(v, 2, 0, 1);
|
||||
// sq_pop(v, 2);
|
||||
// return 0;
|
||||
//}
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
#pragma once
|
||||
|
||||
#include <mutex>
|
||||
#include <iostream>
|
||||
|
||||
template <typename T>
|
||||
class LockQueue
|
||||
{
|
||||
public:
|
||||
LockQueue()
|
||||
{
|
||||
QueueNode *node = new QueueNode();
|
||||
node->next = nullptr;
|
||||
// head->next is the first node, _tail point to last node, not _tail->next
|
||||
_head = node;
|
||||
_tail = _head;
|
||||
};
|
||||
virtual ~LockQueue()
|
||||
{
|
||||
clear();
|
||||
delete _head;
|
||||
_head = nullptr;
|
||||
_tail = nullptr;
|
||||
};
|
||||
|
||||
struct QueueNode
|
||||
{
|
||||
T value;
|
||||
QueueNode *next;
|
||||
};
|
||||
|
||||
bool enQueue(T data)
|
||||
{
|
||||
QueueNode *node = new (std::nothrow) QueueNode();
|
||||
if (!node)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
node->value = data;
|
||||
node->next = nullptr;
|
||||
|
||||
std::unique_lock<std::mutex> locker(_mutex);
|
||||
_tail->next = node;
|
||||
_tail = node;
|
||||
_queueSize++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool deQueue(T &data)
|
||||
{
|
||||
std::unique_lock<std::mutex> locker(_mutex);
|
||||
QueueNode *currentFirstNode = _head->next;
|
||||
if (!currentFirstNode)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
_head->next = currentFirstNode->next;
|
||||
data = currentFirstNode->value;
|
||||
delete currentFirstNode;
|
||||
_queueSize--;
|
||||
if (_queueSize == 0)
|
||||
{
|
||||
_tail = _head;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
int64_t size()
|
||||
{
|
||||
return _queueSize;
|
||||
}
|
||||
|
||||
void clear()
|
||||
{
|
||||
T data;
|
||||
while(deQueue(data));
|
||||
}
|
||||
|
||||
bool empty()
|
||||
{
|
||||
return (_queueSize <= 0);
|
||||
}
|
||||
private:
|
||||
QueueNode *_head;
|
||||
QueueNode *_tail;
|
||||
int64_t _queueSize = 0;
|
||||
std::mutex _mutex;
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,394 @@
|
|||
#include "Npk.h"
|
||||
#include <fstream>
|
||||
#include <mutex>
|
||||
std::mutex Npk_ImgMutex;
|
||||
std::mutex Npk_PngMutex;
|
||||
|
||||
class ReadNpk :public std::ifstream
|
||||
{
|
||||
const BYTE Key[256] = { 112,117,99,104,105,107,111,110,64,110,101,111,112,108,101,32,100,117,110,103,101,111,110,32,97,110,100,32,102,105,103,104,116,101,114,32,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,68,78,70,0 };
|
||||
|
||||
public:
|
||||
//char* 转整数
|
||||
int CharToInt(char* Str)
|
||||
{
|
||||
return *(int*)Str;
|
||||
}
|
||||
|
||||
//char* 转Long
|
||||
long CharToLong(char* Str)
|
||||
{
|
||||
return *(long long*)Str;
|
||||
}
|
||||
|
||||
//读整数
|
||||
int ReadInt()
|
||||
{
|
||||
char* CountBuffer = new char[4];
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
this->get(CountBuffer[i]);
|
||||
}
|
||||
int Count = CharToInt(CountBuffer);
|
||||
delete[]CountBuffer;
|
||||
return Count;
|
||||
}
|
||||
|
||||
//读字符串
|
||||
std::string ReadString()
|
||||
{
|
||||
char* CharBuffer = new char[1024];
|
||||
this->get(CharBuffer, 1024, '\0');
|
||||
std::string Str = CharBuffer;
|
||||
delete[]CharBuffer;
|
||||
this->seekg(1, std::ios::cur);
|
||||
return Str;
|
||||
}
|
||||
|
||||
//读取信息
|
||||
std::string ReadInfo()
|
||||
{
|
||||
char* CharBuffer = new char[256];
|
||||
char var;
|
||||
int i = 0;
|
||||
while (i < 256)
|
||||
{
|
||||
this->get(var);
|
||||
CharBuffer[i] = var ^ Key[i];
|
||||
++i;
|
||||
}
|
||||
std::string Str = CharBuffer;
|
||||
delete[] CharBuffer;
|
||||
return Str;
|
||||
}
|
||||
|
||||
//读LONG
|
||||
int ReadLong()
|
||||
{
|
||||
char* CountBuffer = new char[8];
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
this->get(CountBuffer[i]);
|
||||
}
|
||||
long Count = CharToLong(CountBuffer);
|
||||
delete[]CountBuffer;
|
||||
return Count;
|
||||
}
|
||||
|
||||
//读指定长度数据
|
||||
BYTE* ReadCustomSize(int Size)
|
||||
{
|
||||
BYTE* CharBuffer = new BYTE[Size];
|
||||
for (int j = 0; j < Size; j++)
|
||||
{
|
||||
char var;
|
||||
this->get(var);
|
||||
CharBuffer[j] = var;
|
||||
}
|
||||
return CharBuffer;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
void ReadColor(BYTE* Tab, int Type, BYTE* SaveByte, int Offset)
|
||||
{
|
||||
BYTE a = 0;
|
||||
BYTE r = 0;
|
||||
BYTE g = 0;
|
||||
BYTE b = 0;
|
||||
switch (Type)
|
||||
{
|
||||
case 0x0e:
|
||||
a = (byte)(Tab[1] >> 7);
|
||||
r = (byte)((Tab[1] >> 2) & 0x1f);
|
||||
g = (byte)((Tab[0] >> 5) | ((Tab[1] & 3) << 3));
|
||||
b = (byte)(Tab[0] & 0x1f);
|
||||
a = (byte)(a * 0xff);
|
||||
r = (byte)((r << 3) | (r >> 2));
|
||||
g = (byte)((g << 3) | (g >> 2));
|
||||
b = (byte)((b << 3) | (b >> 2));
|
||||
break;
|
||||
case 0x0f:
|
||||
a = (byte)(Tab[1] & 0xf0);
|
||||
r = (byte)((Tab[1] & 0xf) << 4);
|
||||
g = (byte)(Tab[0] & 0xf0);
|
||||
b = (byte)((Tab[0] & 0xf) << 4);
|
||||
break;
|
||||
}
|
||||
SaveByte[Offset + 0] = b;
|
||||
SaveByte[Offset + 1] = g;
|
||||
SaveByte[Offset + 2] = r;
|
||||
SaveByte[Offset + 3] = a;
|
||||
}
|
||||
|
||||
NPK_M::NPK_M()
|
||||
{
|
||||
}
|
||||
|
||||
void NPK_M::init()
|
||||
{
|
||||
WIN32_FIND_DATAA lpdata;
|
||||
DWORD read;
|
||||
|
||||
HANDLE hFindFile = FindFirstFileA("ImagePacks2\\*.npk", &lpdata);
|
||||
do {
|
||||
//拼接完整路径
|
||||
char cat[256] = "ImagePacks2\\";
|
||||
strcat(cat, lpdata.cFileName);
|
||||
|
||||
ReadNpk Fs;
|
||||
Fs.open(cat, std::ios::in | std::ios::binary);
|
||||
|
||||
if (Fs)
|
||||
{
|
||||
std::string Header = Fs.ReadString();
|
||||
//如果是NPK
|
||||
if (Header._Equal("NeoplePack_Bill"))
|
||||
{
|
||||
//读取img数量
|
||||
int ImageCount = Fs.ReadInt();
|
||||
//读取头
|
||||
NpkInfo* ImgList = new NpkInfo[ImageCount];
|
||||
for (size_t i = 0; i < ImageCount; i++)
|
||||
{
|
||||
ImgList[i].Offset = Fs.ReadInt();
|
||||
ImgList[i].Length = Fs.ReadInt();
|
||||
ImgList[i].Path = Fs.ReadInfo();
|
||||
}
|
||||
for (int i = 0; i < ImageCount; i++)
|
||||
{
|
||||
IMG img;
|
||||
|
||||
img.imgOffset = ImgList[i].Offset;
|
||||
img.imgSize = ImgList[i].Length;
|
||||
img.img_index = i;
|
||||
img.lpBelongsFile = lpdata.cFileName;
|
||||
img.lpImgName = ImgList[i].Path;
|
||||
img.lp_lplist = NULL;
|
||||
img.png_sum = 0;
|
||||
|
||||
map_npk.insert(make_pair(img.lpImgName, img));
|
||||
}
|
||||
//销毁
|
||||
delete[]ImgList;
|
||||
}
|
||||
}
|
||||
Fs.close();
|
||||
} while (FindNextFileA(hFindFile, &lpdata));
|
||||
FindClose(hFindFile);
|
||||
|
||||
|
||||
|
||||
ReadNpkTable("sprite/interface2/event/chn_event_2016/160927_joustmatches/knight0.img");
|
||||
return;
|
||||
}
|
||||
|
||||
LPDWORD NPK_M::LoadImgToMem(IMG* p)
|
||||
{
|
||||
//拼接NPK名称
|
||||
char dirname[256] = "ImagePacks2\\";
|
||||
strcat(dirname, p->lpBelongsFile.c_str());
|
||||
|
||||
ReadNpk Fs;
|
||||
Fs.open(dirname, std::ios::in | std::ios::binary);
|
||||
|
||||
if (Fs)
|
||||
{
|
||||
Fs.seekg(p->imgOffset);
|
||||
std::string Flag = Fs.ReadString();
|
||||
if (Flag._Equal("Neople Img File"))
|
||||
{
|
||||
//索引表大小
|
||||
long TableLength = Fs.ReadLong();
|
||||
//img 版本 4字节
|
||||
int ver = Fs.ReadInt();
|
||||
//img 帧数
|
||||
int IndexCount = Fs.ReadInt();
|
||||
Npk_PngMutex.lock();
|
||||
//图片数量赋值
|
||||
p->png_sum = IndexCount;
|
||||
Npk_PngMutex.unlock();
|
||||
|
||||
//new出 Png数量的 结构体
|
||||
ImgInfo* PngList = new ImgInfo[IndexCount];
|
||||
|
||||
for (size_t i = 0; i < IndexCount; i++)
|
||||
{
|
||||
PngList[i].Type = Fs.ReadInt();
|
||||
if (PngList[i].Type == 17)
|
||||
{
|
||||
//引用贴图
|
||||
int frbuf = Fs.ReadInt();
|
||||
|
||||
continue;
|
||||
}
|
||||
//压缩类型
|
||||
PngList[i].CmpType = Fs.ReadInt();
|
||||
//宽度
|
||||
PngList[i].Width = Fs.ReadInt();
|
||||
//高度
|
||||
PngList[i].Height = Fs.ReadInt();
|
||||
//大小
|
||||
PngList[i].Size = Fs.ReadInt();
|
||||
//Xpos
|
||||
PngList[i].Xpos = Fs.ReadInt();
|
||||
//Ypos
|
||||
PngList[i].Ypos = Fs.ReadInt();
|
||||
//帧域X
|
||||
PngList[i].FrameXpos = Fs.ReadInt();
|
||||
//帧域Y
|
||||
PngList[i].FrameYpos = Fs.ReadInt();
|
||||
//计算偏移
|
||||
if (i == 0)PngList[i].Offset = 0 + p->imgOffset + TableLength + 32;
|
||||
else PngList[i].Offset = PngList[i - 1].Offset + PngList[i - 1].Size;
|
||||
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < IndexCount; i++)
|
||||
{
|
||||
Fs.seekg(PngList[i].Offset);
|
||||
BYTE* PngData = Fs.ReadCustomSize(PngList[i].Size);
|
||||
int DeSize = PngList[i].Width * PngList[i].Height * 4;
|
||||
BYTE* bByte = new BYTE[DeSize];
|
||||
ULONG RealSize = DeSize;
|
||||
int a = uncompress(bByte, &RealSize, PngData, (ULONG)PngList[i].Size);
|
||||
delete[]PngData;
|
||||
|
||||
|
||||
if (PngList[i].Type != 16)
|
||||
{
|
||||
int PngByteSize = DeSize * 2;
|
||||
PngList[i].PNGdata = new BYTE[PngByteSize];
|
||||
|
||||
for (int e = 0; e < PngByteSize; e += 4)
|
||||
{
|
||||
BYTE NeedData[2];
|
||||
memset(NeedData, 0, 2);
|
||||
memcpy(NeedData, bByte + (e / 4) * 2, 2);
|
||||
ReadColor(NeedData, PngList[i].Type, PngList[i].PNGdata, e);
|
||||
}
|
||||
|
||||
delete[]bByte;
|
||||
}
|
||||
else {
|
||||
PngList[i].PNGdata = bByte;
|
||||
}
|
||||
}
|
||||
|
||||
Npk_PngMutex.lock();
|
||||
p->lp_lplist = PngList;
|
||||
Npk_PngMutex.unlock();
|
||||
}
|
||||
}
|
||||
Fs.close();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
IMG* NPK_M::ReadNpkTable(const std::string imgpath)
|
||||
{
|
||||
std::cout << imgpath << std::endl;
|
||||
IMG* img = NULL;
|
||||
|
||||
Npk_ImgMutex.lock();
|
||||
std::map<std::string, IMG>::iterator itr;
|
||||
itr = map_npk.find(imgpath);
|
||||
if (itr == map_npk.end()) {
|
||||
std::string mes = "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!调用了不存在的Img : " + imgpath;
|
||||
//MessageBoxA(0, mes.c_str(), 0, 0);
|
||||
img = &map_npk["sprite/interface/base.img"];
|
||||
}
|
||||
else {
|
||||
img = &itr->second;
|
||||
}
|
||||
Npk_ImgMutex.unlock();
|
||||
|
||||
//如果图片数组不存在 或者 图片数据不存在都要重读
|
||||
if (!img->lp_lplist || !img->lp_lplist->PNGdata) {
|
||||
LoadImgToMem(img);
|
||||
}
|
||||
return img;
|
||||
}
|
||||
|
||||
void NPK_M::ReleaseNpkTable(IMG* p)
|
||||
{
|
||||
for (int i = 0; i < p->png_sum; i++) {
|
||||
if (p->lp_lplist[i].PNGdata) {
|
||||
delete p->lp_lplist[i].PNGdata;
|
||||
p->lp_lplist[i].PNGdata = 0;
|
||||
}
|
||||
else {
|
||||
int a = 0;
|
||||
}
|
||||
}
|
||||
//delete[] p->lp_lplist;
|
||||
|
||||
//p->lp_lplist = NULL;
|
||||
}
|
||||
|
||||
int Translate24Bto32B_cpp(char* des, char* src, int num)
|
||||
{
|
||||
for (int i = 0; i < (num / 4); i++) {
|
||||
unsigned short aword = *(unsigned short*)src;
|
||||
unsigned short A = aword >> 12;
|
||||
unsigned short R = 15 & aword >> 8;
|
||||
unsigned short G = 15 & aword >> 4;
|
||||
unsigned short B = 15 & aword >> 0;
|
||||
|
||||
A = (A * 255) / 15;
|
||||
B = (B * 255) / 15;
|
||||
G = (G * 255) / 15;
|
||||
R = (R * 255) / 15;
|
||||
|
||||
unsigned int aDword = 0;
|
||||
aDword |= A;
|
||||
aDword <<= 8;
|
||||
aDword |= R;
|
||||
aDword <<= 8;
|
||||
aDword |= G;
|
||||
aDword <<= 8;
|
||||
aDword |= B;
|
||||
|
||||
*(unsigned int*)des = aDword;
|
||||
|
||||
src += 2;
|
||||
des += 4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Translate16Bto32B_cpp(char* des, char* src, int num)
|
||||
{
|
||||
for (int i = 0; i < (num / 4); i++) {
|
||||
unsigned short aword = *(unsigned short*)src;
|
||||
unsigned short A = aword >> 15;
|
||||
unsigned short R = 31 & aword >> 10;
|
||||
unsigned short G = 31 & aword >> 5;
|
||||
unsigned short B = 31 & aword >> 0;
|
||||
|
||||
A = A * 255;
|
||||
B = (B * 255) / 31;
|
||||
G = (G * 255) / 31;
|
||||
R = (R * 255) / 31;
|
||||
|
||||
unsigned int aDword = 0;
|
||||
aDword |= A;
|
||||
aDword <<= 8;
|
||||
aDword |= R;
|
||||
aDword <<= 8;
|
||||
aDword |= G;
|
||||
aDword <<= 8;
|
||||
aDword |= B;
|
||||
|
||||
*(unsigned int*)des = aDword;
|
||||
|
||||
src += 2;
|
||||
des += 4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
NPK_M::~NPK_M()
|
||||
{
|
||||
map_npk.clear();
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
#pragma once
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <windows.h>
|
||||
#include <iostream>
|
||||
#include <zlib.h>
|
||||
|
||||
#define NPK_R_FLAG(b){if(!b)continue;}
|
||||
|
||||
//PNG结构体
|
||||
struct ImgInfo
|
||||
{
|
||||
//图片格式
|
||||
int Type;
|
||||
//压缩类型
|
||||
int CmpType;
|
||||
//宽度
|
||||
int Width;
|
||||
//高度
|
||||
int Height;
|
||||
//大小
|
||||
int Size;
|
||||
//Xpos
|
||||
int Xpos;
|
||||
//Ypos
|
||||
int Ypos;
|
||||
//帧域X
|
||||
int FrameXpos;
|
||||
//帧域Y
|
||||
int FrameYpos;
|
||||
//偏移
|
||||
int Offset;
|
||||
//Png位图数据
|
||||
BYTE* PNGdata;
|
||||
};
|
||||
|
||||
struct NpkInfo
|
||||
{
|
||||
int Offset;
|
||||
int Length;
|
||||
std::string Path;
|
||||
};
|
||||
|
||||
struct IMG //npk的img的结构体
|
||||
{
|
||||
std::string lpImgName; //img文件的路径
|
||||
int img_index; //img文件在npk文件里的序号
|
||||
unsigned imgOffset;
|
||||
unsigned imgSize;
|
||||
std::string lpBelongsFile; //这个img属于哪个npk文件
|
||||
int png_sum; //这个img文件有多少个 图片
|
||||
ImgInfo* lp_lplist; //图片的数组..
|
||||
};
|
||||
|
||||
class NPK_M {
|
||||
private:
|
||||
std::map <std::string, IMG> map_npk;
|
||||
public:
|
||||
NPK_M();
|
||||
void init();
|
||||
LPDWORD LoadImgToMem(IMG* p);
|
||||
IMG* ReadNpkTable(const std::string imgname);
|
||||
void ReleaseNpkTable(IMG* p);
|
||||
~NPK_M();
|
||||
};
|
||||
|
|
@ -0,0 +1,207 @@
|
|||
#pragma once
|
||||
#include "SoundManager.h"
|
||||
|
||||
//音频对象智能指针Map
|
||||
extern std::map<size_t, SoundPtr>SoundActorPtrMapObject;
|
||||
//音频资源Map
|
||||
extern std::map<std::string, Sound*>SoundRecObject;
|
||||
//音频管理器
|
||||
static SoundManagerPtr SoundEffectObject = new SoundManager();
|
||||
|
||||
|
||||
//Sound 创建音频对象
|
||||
static SQInteger Create_Sound(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
const SQChar* OutPutBuffer;
|
||||
sq_getstring(v, 2, &OutPutBuffer);
|
||||
|
||||
size_t Id = SoundEffectObject->Save_Load((char*)OutPutBuffer);
|
||||
|
||||
sq_pushinteger(v, Id);
|
||||
//if (SoundRecObject.count((char*)OutPutBuffer)) {
|
||||
// sq_pushuserpointer(v, SoundRecObject[(char*)OutPutBuffer]);
|
||||
//}
|
||||
//else {
|
||||
// Sound* Sound_Obj = new Sound();
|
||||
// Sound_Obj->Load((char*)OutPutBuffer);
|
||||
|
||||
// sq_pushuserpointer(v, Sound_Obj);
|
||||
//}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//Sound 设置音频工作
|
||||
static SQInteger Set_Sound_Task(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger SoundId;
|
||||
sq_getinteger(v, 2, &SoundId);
|
||||
|
||||
|
||||
SQInteger Type;
|
||||
sq_getinteger(v, 3, &Type);
|
||||
|
||||
//播放
|
||||
if (Type == 0) {
|
||||
//获取播放次数 -1 为无限循环
|
||||
SQInteger Count;
|
||||
sq_getinteger(v, 4, &Count);
|
||||
|
||||
SoundPtr Sound_Obj = SoundEffectObject->GetSaveSound(SoundId);
|
||||
Sound_Obj->Play(Count);
|
||||
}
|
||||
//暂停
|
||||
else if (Type == 1) {
|
||||
SoundPtr Sound_Obj = SoundEffectObject->GetSaveSound(SoundId);
|
||||
Sound_Obj->Pause();
|
||||
}
|
||||
//继续
|
||||
else if (Type == 2) {
|
||||
SoundPtr Sound_Obj = SoundEffectObject->GetSaveSound(SoundId);
|
||||
Sound_Obj->Resume();
|
||||
}
|
||||
//关闭
|
||||
else if (Type == 3) {
|
||||
SoundEffectObject->ReleaseSaveSoundByIndex(SoundId);
|
||||
//SoundPtr Sound_Obj = SoundEffectObject->GetSaveSound(SoundId);
|
||||
//Sound_Obj->Close();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//Sound 获取音频音量
|
||||
static SQInteger Get_Sound_Volume(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger SoundId;
|
||||
sq_getinteger(v, 2, &SoundId);
|
||||
|
||||
SoundPtr Sound_Obj = SoundEffectObject->GetSaveSound(SoundId);
|
||||
|
||||
sq_pushfloat(v, Sound_Obj->GetVolume());
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//Sound 设置音频音量
|
||||
static SQInteger Set_Sound_Volume(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger SoundId;
|
||||
sq_getinteger(v, 2, &SoundId);
|
||||
|
||||
SoundPtr Sound_Obj = SoundEffectObject->GetSaveSound(SoundId);
|
||||
|
||||
SQFloat VolumeCalue;
|
||||
sq_getfloat(v, 3, &VolumeCalue);
|
||||
|
||||
Sound_Obj->SetVolume(VolumeCalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//Sound 临时播放音效
|
||||
static SQInteger Squirrel_PlaySoundEffect(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
const SQChar* Name;
|
||||
sq_getstring(v, 2, &Name);
|
||||
|
||||
//此操作会New出一个字符串需要手动销毁
|
||||
char* Namebuf = SquirrelClassEx::SquirrelU2W((char*)Name);
|
||||
//需要绘制的文字内容
|
||||
std::string SoundName = Namebuf;
|
||||
//销毁New出来的字符串
|
||||
delete[]Namebuf;
|
||||
|
||||
if (SoundName.find(".ogg") != std::string::npos || SoundName.find(".mp3") != std::string::npos) {
|
||||
size_t Id = SoundEffectObject->Load(SoundName);
|
||||
SoundEffectObject->Play(Id, 0);
|
||||
}
|
||||
else {
|
||||
if (GameAudioList.count(SoundName)) {
|
||||
size_t Id = SoundEffectObject->Load(GameAudioList[SoundName]);
|
||||
SoundEffectObject->Play(Id, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
SoundPtr Sound_Obj = new Sound();
|
||||
Sound_Obj->Load(SoundName);
|
||||
|
||||
if (Top == 3) {
|
||||
SQFloat Volume;
|
||||
sq_getfloat(v, 3, &Volume);
|
||||
Sound_Obj->SetVolume(Volume);
|
||||
}
|
||||
|
||||
Sound_Obj->Play();
|
||||
|
||||
SoundEffectMap[Sound_Obj->GetObjectID()] = Sound_Obj;
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//Sound 释放临时音效
|
||||
static SQInteger Squirrel_ReleseSoundEffect(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//新架构自动调用析构函数
|
||||
//Map<size_t, SoundPtr> S_M = SoundEffectObject->GetAllSound();
|
||||
|
||||
|
||||
//for (auto it = SoundEffectVector.begin(); it != SoundEffectVector.end(); ++it) {
|
||||
// size_t id = *it;
|
||||
// if (!SoundEffectObject->IsPlaying(id)) {
|
||||
// //SoundPtr Sound_Obj = SoundEffectObject->GetSound(id);
|
||||
// //Sound_Obj->Close();
|
||||
// }
|
||||
//}
|
||||
//SoundEffectObject->ClearCache();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,210 @@
|
|||
#include "SoundManager.h"
|
||||
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
namespace kiwano
|
||||
{
|
||||
namespace audio
|
||||
{
|
||||
|
||||
SoundManager::SoundManager()
|
||||
: volume_rate(1.f)
|
||||
{
|
||||
}
|
||||
|
||||
SoundManager::~SoundManager()
|
||||
{
|
||||
ClearCache();
|
||||
}
|
||||
|
||||
size_t SoundManager::GetId(const String& file_path) const
|
||||
{
|
||||
return std::hash<String>()(file_path);
|
||||
}
|
||||
|
||||
size_t SoundManager::GetId(const Resource& res) const
|
||||
{
|
||||
return static_cast<size_t>(res.GetId());
|
||||
}
|
||||
|
||||
size_t SoundManager::Load(const String& file_path)
|
||||
{
|
||||
size_t id = GetId(file_path);
|
||||
if (sound_cache_.end() != sound_cache_.find(id))
|
||||
return id;
|
||||
|
||||
SoundPtr sound = MakePtr<Sound>(file_path);
|
||||
if (sound)
|
||||
{
|
||||
sound->SetVolume(volume_rate * 1.0);
|
||||
sound_cache_.insert(std::make_pair(id, sound));
|
||||
return id;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t SoundManager::Save_Load(const String& file_path)
|
||||
{
|
||||
size_t id = GetId(file_path);
|
||||
if (sound_save_.end() != sound_save_.find(id))
|
||||
return id;
|
||||
|
||||
SoundPtr sound = MakePtr<Sound>(file_path);
|
||||
if (sound)
|
||||
{
|
||||
sound->SetVolume(volume_rate * 1.0);
|
||||
sound_save_.insert(std::make_pair(id, sound));
|
||||
return id;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t SoundManager::Load(const Resource& res)
|
||||
{
|
||||
size_t id = GetId(res);
|
||||
if (sound_cache_.end() != sound_cache_.find(id))
|
||||
return id;
|
||||
|
||||
SoundPtr sound = MakePtr<Sound>(res);
|
||||
|
||||
if (sound)
|
||||
{
|
||||
sound->SetVolume(volume_rate * 1.0);
|
||||
sound_cache_.insert(std::make_pair(id, sound));
|
||||
return id;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SoundManager::Play(size_t id, int loop_count)
|
||||
{
|
||||
if (auto sound = GetSound(id))
|
||||
sound->Play(loop_count);
|
||||
}
|
||||
|
||||
void SoundManager::Pause(size_t id)
|
||||
{
|
||||
if (auto sound = GetSound(id))
|
||||
sound->Pause();
|
||||
}
|
||||
|
||||
void SoundManager::Resume(size_t id)
|
||||
{
|
||||
if (auto sound = GetSound(id))
|
||||
sound->Resume();
|
||||
}
|
||||
|
||||
void SoundManager::Stop(size_t id)
|
||||
{
|
||||
if (auto sound = GetSound(id))
|
||||
sound->Stop();
|
||||
}
|
||||
|
||||
bool SoundManager::IsPlaying(size_t id)
|
||||
{
|
||||
if (auto sound = GetSound(id))
|
||||
return sound->IsPlaying();
|
||||
return false;
|
||||
}
|
||||
|
||||
float SoundManager::GetVolumeRate() const
|
||||
{
|
||||
return volume_rate;
|
||||
}
|
||||
|
||||
void SoundManager::SetVolumeRate(float volume)
|
||||
{
|
||||
volume_rate = std::min(std::max(volume, -224.f), 224.f);
|
||||
for (auto& pair : sound_cache_)
|
||||
{
|
||||
pair.second->SetVolume(volume_rate);
|
||||
}
|
||||
}
|
||||
|
||||
SoundPtr SoundManager::GetSound(size_t id) const
|
||||
{
|
||||
auto iter = sound_cache_.find(id);
|
||||
if (iter != sound_cache_.end())
|
||||
return iter->second;
|
||||
return SoundPtr();
|
||||
}
|
||||
|
||||
SoundPtr SoundManager::GetSaveSound(size_t id) const
|
||||
{
|
||||
auto iter = sound_save_.find(id);
|
||||
if (iter != sound_save_.end())
|
||||
return iter->second;
|
||||
return SoundPtr();
|
||||
}
|
||||
|
||||
void SoundManager::PauseAll()
|
||||
{
|
||||
for (auto& pair : sound_cache_)
|
||||
{
|
||||
pair.second->Pause();
|
||||
}
|
||||
}
|
||||
|
||||
void SoundManager::ResumeAll()
|
||||
{
|
||||
for (auto& pair : sound_cache_)
|
||||
{
|
||||
pair.second->Resume();
|
||||
}
|
||||
}
|
||||
|
||||
void SoundManager::StopAll()
|
||||
{
|
||||
for (auto& pair : sound_cache_)
|
||||
{
|
||||
pair.second->Stop();
|
||||
}
|
||||
}
|
||||
|
||||
void SoundManager::ClearCache()
|
||||
{
|
||||
sound_cache_.clear();
|
||||
}
|
||||
|
||||
void SoundManager::ReleaseSoundByIndex(const size_t Id)
|
||||
{
|
||||
auto iter = sound_cache_.find(Id);
|
||||
if (iter != sound_cache_.end()) {
|
||||
iter->second->Close();
|
||||
sound_cache_.erase(Id);
|
||||
}
|
||||
}
|
||||
|
||||
void SoundManager::ReleaseSaveSoundByIndex(const size_t Id)
|
||||
{
|
||||
auto iter = sound_save_.find(Id);
|
||||
if (iter != sound_save_.end()) {
|
||||
iter->second->Close();
|
||||
sound_save_.erase(Id);
|
||||
}
|
||||
}
|
||||
|
||||
Map<size_t, SoundPtr> SoundManager::GetAllSound()
|
||||
{
|
||||
Map<size_t, SoundPtr> Buf;
|
||||
Buf.insert(sound_cache_.begin(), sound_cache_.end());
|
||||
return Buf;
|
||||
}
|
||||
} // namespace audio
|
||||
} // namespace kiwano
|
||||
|
|
@ -0,0 +1,162 @@
|
|||
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#pragma once
|
||||
#include <kiwano-audio/Sound.h>
|
||||
#include <kiwano/base/ObjectBase.h>
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
namespace audio
|
||||
{
|
||||
KGE_DECLARE_SMART_PTR(SoundManager);
|
||||
|
||||
/**
|
||||
* \addtogroup Audio
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 音频播放器
|
||||
*/
|
||||
class KGE_API SoundManager : public ObjectBase
|
||||
{
|
||||
public:
|
||||
SoundManager();
|
||||
|
||||
~SoundManager();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 加载本地音频文件
|
||||
/// @param file_path 本地音频文件路径
|
||||
/// @return 音频标识符
|
||||
size_t Load(const String& file_path);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 加载本地音频文件
|
||||
/// @param file_path 本地音频文件路径
|
||||
/// @return 音频标识符
|
||||
size_t Save_Load(const String& file_path);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 加载音频资源
|
||||
/// @param res 音频资源
|
||||
/// @return 音频标识符
|
||||
size_t Load(const Resource& res);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 播放音频
|
||||
/// @param id 音频标识符
|
||||
/// @param loop_count 播放循环次数,设置 -1 为循环播放
|
||||
void Play(size_t id, int loop_count = 0);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 暂停音频
|
||||
/// @param id 音频标识符
|
||||
void Pause(size_t id);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 继续播放音频
|
||||
/// @param id 音频标识符
|
||||
void Resume(size_t id);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 停止音频
|
||||
/// @param id 音频标识符
|
||||
void Stop(size_t id);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取音频播放状态
|
||||
/// @param id 音频标识符
|
||||
bool IsPlaying(size_t id);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取音量倍率
|
||||
float GetVolumeRate() const;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 设置音量
|
||||
/// @param volume 音量大小,1.0 为原始音量, 大于 1 为放大音量, 0 为最小音量
|
||||
void SetVolumeRate(float volume);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取本地音频文件id
|
||||
/// @param file_path 本地音频文件路径
|
||||
/// @return 音频标识符
|
||||
size_t GetId(const String& file_path) const;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取音频资源id
|
||||
/// @param res 音频资源
|
||||
/// @return 音频标识符
|
||||
size_t GetId(const Resource& res) const;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取音乐对象
|
||||
/// @param id 音频标识符
|
||||
SoundPtr GetSound(size_t id) const;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取音乐对象
|
||||
/// @param id 音频标识符
|
||||
SoundPtr GetSaveSound(size_t id) const;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 暂停所有音频
|
||||
void PauseAll();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 继续播放所有音频
|
||||
void ResumeAll();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 停止所有音频
|
||||
void StopAll();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 清除缓存
|
||||
void ClearCache();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 释放音乐对象
|
||||
/// @param id 音频标识符
|
||||
void ReleaseSoundByIndex(const size_t Id);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 释放音乐对象
|
||||
/// @param id 音频标识符
|
||||
void ReleaseSaveSoundByIndex(const size_t Id);
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取所有音乐对象
|
||||
Map<size_t, SoundPtr> GetAllSound();
|
||||
|
||||
private:
|
||||
float volume_rate;
|
||||
|
||||
using SoundMap = Map<size_t, SoundPtr>;
|
||||
SoundMap sound_cache_;
|
||||
SoundMap sound_save_;
|
||||
};
|
||||
|
||||
/** @} */
|
||||
} // namespace audio
|
||||
} // namespace kiwano
|
||||
|
|
@ -0,0 +1,373 @@
|
|||
#pragma once
|
||||
//演员对象智能指针Map
|
||||
extern std::map<uint64_t, ActorPtr>ActorPtrMapObject;
|
||||
|
||||
extern NPK_M* npk;
|
||||
//创建图像精灵
|
||||
static SQInteger Create_Image(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
const SQChar* gOutPutBuffer;
|
||||
sq_getstring(v, 2, &gOutPutBuffer);
|
||||
|
||||
SQInteger gFrame;
|
||||
sq_getinteger(v, 3, &gFrame);
|
||||
|
||||
//转化img名称
|
||||
std::string TextureName = (char*)gOutPutBuffer;
|
||||
|
||||
//构造纹理
|
||||
TexturePtr t = SquirrelClassEx::GetTexturePtrByImg(TextureName, gFrame);
|
||||
|
||||
//构造对象
|
||||
SpritePtr Png = new Sprite(t);
|
||||
|
||||
//获取对象的唯一ID
|
||||
uint64_t UUID = Png->GetObjectID();
|
||||
|
||||
//将精灵对象存入Map管理
|
||||
ActorPtrMapObject[UUID] = Png;
|
||||
|
||||
sq_pushinteger(v, UUID);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//创建高级图像精灵
|
||||
static SQInteger Create_ImageEx(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//赋予了初始纹理
|
||||
if (Top == 3) {
|
||||
const SQChar* gOutPutBuffer;
|
||||
sq_getstring(v, 2, &gOutPutBuffer);
|
||||
|
||||
SQInteger gFrame;
|
||||
sq_getinteger(v, 3, &gFrame);
|
||||
|
||||
std::string TextureName = (char*)gOutPutBuffer;
|
||||
|
||||
SpriteExPtr Png = new SpriteEx();
|
||||
|
||||
TexturePtr t = SquirrelClassEx::GetTexturePtrByImg(TextureName, gFrame);
|
||||
|
||||
Png->SetFrame(t);
|
||||
|
||||
//获取对象的唯一ID
|
||||
uint64_t UUID = Png->GetObjectID();
|
||||
|
||||
//将高级精灵对象存入Map管理
|
||||
ActorPtrMapObject[UUID] = Png;
|
||||
|
||||
sq_pushinteger(v, UUID);
|
||||
|
||||
}
|
||||
//空纹理
|
||||
else if (Top == 1) {
|
||||
|
||||
SpriteExPtr Png = new SpriteEx();
|
||||
|
||||
//获取对象的唯一ID
|
||||
uint64_t UUID = Png->GetObjectID();
|
||||
|
||||
//将高级精灵对象存入Map管理
|
||||
ActorPtrMapObject[UUID] = Png;
|
||||
|
||||
sq_pushinteger(v, UUID);
|
||||
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
//设置高级图像精灵混合模式
|
||||
static SQInteger Set_ImageEx_Mode(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
SQInteger gType;
|
||||
sq_getinteger(v, 3, &gType);
|
||||
|
||||
//从全局Map中获取高级精灵角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SpriteExPtr Png = dynamic_cast<SpriteEx*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
Png->SetMode(gType);
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//设置高级图像精灵帧
|
||||
static SQInteger Set_ImageEx_Frame(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
const SQChar* gOutPutBuffer;
|
||||
sq_getstring(v, 3, &gOutPutBuffer);
|
||||
|
||||
SQInteger gFrame;
|
||||
sq_getinteger(v, 4, &gFrame);
|
||||
|
||||
std::string TextureName = (char*)gOutPutBuffer;
|
||||
|
||||
//从全局Map中获取高级精灵角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SpriteExPtr Png = dynamic_cast<SpriteEx*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
|
||||
TexturePtr t = SquirrelClassEx::GetTexturePtrByImg(TextureName, gFrame);
|
||||
|
||||
Png->SetFrame(t);
|
||||
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
//设置高级精灵图像透明度
|
||||
static SQInteger Set_ImageEx_Alpha(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
SQFloat Alpha;
|
||||
sq_getfloat(v, 3, &Alpha);
|
||||
|
||||
|
||||
//从全局Map中获取高级精灵角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SpriteExPtr Png = dynamic_cast<SpriteEx*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
Png->SetOpacity(Alpha);
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//设置高级精灵图像帧信息
|
||||
static SQInteger Set_ImageEx_FrameInfo(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
std::vector<int> FrameDelay;
|
||||
sq_pushnull(v); // null iterator
|
||||
while (SQ_SUCCEEDED(sq_next(v, 3)))
|
||||
{
|
||||
SQInteger gDelay;
|
||||
sq_getinteger(v, -1, &gDelay);
|
||||
FrameDelay.push_back(gDelay);
|
||||
//这里-1是值,-2是键
|
||||
sq_pop(v, 2); //在下一次迭代之前弹出键和值
|
||||
}
|
||||
sq_pop(v, 1);
|
||||
|
||||
SQInteger Loop;
|
||||
sq_getinteger(v, 4, &Loop);
|
||||
|
||||
//从全局Map中获取高级精灵角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SpriteExPtr Png = dynamic_cast<SpriteEx*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
Png->SetFrameInfo(FrameDelay, Loop);
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//设置高级精灵图像播放动画
|
||||
static SQInteger Set_ImageEx_PlayAnimotion(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
SQBool Type;
|
||||
sq_getbool(v, 3, &Type);
|
||||
|
||||
//从全局Map中获取高级精灵角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SpriteExPtr Png = dynamic_cast<SpriteEx*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
Png->SetAnimotionPlay(Type);
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
//设置高级精灵Ani帧
|
||||
static SQInteger Set_ImageEx_Animotion_Frame(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
SQInteger Frame;
|
||||
sq_getinteger(v, 3, &Frame);
|
||||
|
||||
//从全局Map中获取高级精灵角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SpriteExPtr Png = dynamic_cast<SpriteEx*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
Png->SetAnimotionFrame(Frame);
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//设置高级精灵阴影
|
||||
static SQInteger Set_ImageEx_Shadow(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
//SQInteger Frame;
|
||||
//sq_getinteger(v, 3, &Frame);
|
||||
|
||||
//从全局Map中获取高级精灵角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SpriteExPtr Png = dynamic_cast<SpriteEx*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
Png->SetShadow();
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//设置裁切精灵
|
||||
static SQInteger Set_Image_CropRect(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
SQFloat L;
|
||||
sq_getfloat(v, 3, &L);
|
||||
|
||||
SQFloat U;
|
||||
sq_getfloat(v, 4, &U);
|
||||
|
||||
SQFloat R;
|
||||
sq_getfloat(v, 5, &R);
|
||||
|
||||
SQFloat D;
|
||||
sq_getfloat(v, 6, &D);
|
||||
|
||||
//从全局Map中获取高级精灵角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
SpritePtr Png = dynamic_cast<Sprite*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
|
||||
Png->SetCropRect(Rect(Point(L,U), Point(R, D)));
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -0,0 +1,187 @@
|
|||
#include "SpriteEx.h"
|
||||
#include "SquirrelClassEx.h"
|
||||
//#include "kiwano/render/DirectX/D3DDeviceResources.h"
|
||||
//#include "kiwano/render/DirectX/NativePtr.h"
|
||||
//#include "d2d1effects_2.h"
|
||||
|
||||
std::unordered_map<int, TexturePtr>ImageRecShadowObject;
|
||||
|
||||
#pragma comment(lib, "d2d1.lib")
|
||||
#pragma comment(lib, "dxguid.lib")
|
||||
|
||||
extern NPK_M* npk;
|
||||
|
||||
SpriteEx::SpriteEx(const std::string imgpath, const int frame)
|
||||
{
|
||||
SetFrame(SquirrelClassEx::GetTexturePtrByImg(imgpath, frame));
|
||||
}
|
||||
|
||||
void SpriteEx::SetPosition(const Point& point)
|
||||
{
|
||||
TexturePtr t = GetTexture();
|
||||
ImgInfo Img = *(ImgInfo*)t->GetUserData();
|
||||
Actor::SetPosition(Point((point.x + Img.Xpos), (point.y + Img.Ypos) * GetScale().y));
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void SpriteEx::SetScale(const Point& point)
|
||||
{
|
||||
//if (ShadowObject) {
|
||||
// ShadowObject->GetTransform().skew = Vec2((-20.0) * (GetParent()->GetScale().x), 0.0);
|
||||
|
||||
//}
|
||||
Sprite::SetScale(point);
|
||||
}
|
||||
|
||||
void SpriteEx::OnRender(RenderContext& ctx)
|
||||
{
|
||||
|
||||
//if (INTERPOLATION_MODE != D2D1_INTERPOLATION_MODE_FORCE_DWORD && COMPOSITE_MODE != D2D1_COMPOSITE_MODE_FORCE_DWORD)
|
||||
//{
|
||||
// auto bitmap = NativePtr::Get<ID2D1Bitmap>(GetFrame().GetTexture());
|
||||
|
||||
// auto d2d_res = graphics::directx::GetD2DDeviceResources();
|
||||
|
||||
// d2d_res->GetDeviceContext()->DrawImage(
|
||||
// bitmap.Get(),
|
||||
// INTERPOLATION_MODE,
|
||||
// COMPOSITE_MODE
|
||||
// );
|
||||
|
||||
// //auto bitmap = NativePtr::Get<ID2D1Bitmap>(GetFrame().GetTexture());
|
||||
// //auto m_d2dContext = graphics::directx::GetD2DDeviceResources()->GetDeviceContext();
|
||||
// //ComPtr<ID2D1Effect> chromakeyEffect;
|
||||
// //m_d2dContext->CreateEffect(CLSID_D2D1Emboss, &chromakeyEffect);
|
||||
|
||||
// //
|
||||
// //chromakeyEffect->SetInput(0, bitmap.Get());
|
||||
// ////chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_COLOR, Color{ 1.0f, 1.0f, 1.0f, 1.0f });
|
||||
// ////chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_TOLERANCE, 0.2f);
|
||||
// ////chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_INVERT_ALPHA, true);
|
||||
// //chromakeyEffect->SetValue(D2D1_EMBOSS_PROP_HEIGHT, 1.0f);
|
||||
// //chromakeyEffect->SetValue(D2D1_EMBOSS_PROP_DIRECTION, 0.0f);
|
||||
|
||||
// //m_d2dContext->DrawImage(chromakeyEffect.Get());
|
||||
//}
|
||||
//else {
|
||||
// this->Sprite::OnRender(ctx);
|
||||
//}
|
||||
|
||||
|
||||
switch (MyModel)
|
||||
{
|
||||
case -1: //-1原始模式
|
||||
ctx.SetBlendMode(BlendMode::SourceOver);
|
||||
break;
|
||||
case 0: //0线性减淡
|
||||
ctx.SetBlendMode(BlendMode::Add);
|
||||
break;
|
||||
default:
|
||||
ctx.SetBlendMode(BlendMode::SourceOver);
|
||||
break;
|
||||
}
|
||||
|
||||
this->Sprite::OnRender(ctx);
|
||||
|
||||
}
|
||||
|
||||
//void SpriteEx::OnUpdate(Duration dt) {
|
||||
// //当处于播放状态
|
||||
// if (is_Animotion_Play) {
|
||||
// //当前帧小于总帧时执行逻辑
|
||||
// if (NowFrameIndex < MaxFrameCount) {
|
||||
// if (OffsetTime == 0)OffsetTime = clock();
|
||||
// if ((clock() - OffsetTime) >= MyDelay[NowFrameIndex]) {
|
||||
// OffsetTime = clock();
|
||||
// NowFrameIndex++;
|
||||
// SquirrelClassEx::RunUpdateScript("AnimotionUpdateCallBack", this->GetObjectID(), NowFrameIndex);
|
||||
// }
|
||||
// }
|
||||
// //否则重置时间 重置当前帧
|
||||
// else {
|
||||
// OffsetTime = 0;
|
||||
// NowFrameIndex = 0;
|
||||
// MyLoop--;
|
||||
// if (MyLoop != 0) {
|
||||
// SquirrelClassEx::RunUpdateScript("AnimotionUpdateCallBack", this->GetObjectID(), NowFrameIndex);
|
||||
// }
|
||||
// else {
|
||||
// is_Animotion_Play = false;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
void SpriteEx::SetFrameInfo(std::vector<int> FrameDaley , const int Loop)
|
||||
{
|
||||
MyDelay = FrameDaley;
|
||||
MaxFrameCount = FrameDaley.size();
|
||||
MyLoop = Loop;
|
||||
}
|
||||
|
||||
void SpriteEx::SetAnimotionPlay(bool Type)
|
||||
{
|
||||
is_Animotion_Play = Type;
|
||||
//开始播放以后 第一次先传入第0帧
|
||||
SquirrelClassEx::RunUpdateScript("AnimotionUpdateCallBack", this->GetObjectID(), NowFrameIndex);
|
||||
}
|
||||
|
||||
void SpriteEx::SetAnimotionFrame(const int gFrame)
|
||||
{
|
||||
this->NowFrameIndex = gFrame;
|
||||
}
|
||||
|
||||
void SpriteEx::SetShadow()
|
||||
{
|
||||
|
||||
TexturePtr t;
|
||||
ImgInfo Img = *(ImgInfo*)GetTexture()->GetUserData();
|
||||
|
||||
if (ImageRecShadowObject.count(GetTexture()->GetObjectID())) {
|
||||
t = ImageRecShadowObject[GetTexture()->GetObjectID()];
|
||||
}
|
||||
else {
|
||||
|
||||
BYTE* Data = Img.PNGdata;
|
||||
BYTE* NewData = new BYTE[Img.Height * Img.Width * 4];
|
||||
|
||||
for (size_t i = 0; i < Img.Height * Img.Width * 4; i++)
|
||||
{
|
||||
if ((i + 1) % 4 == 0)
|
||||
NewData[i] = Data[i];
|
||||
else
|
||||
NewData[i] = 0;
|
||||
}
|
||||
|
||||
BinaryData data = { ((void*)NewData) ,(uint32_t)(Img.Height * Img.Width * 4) };
|
||||
t = new Texture();
|
||||
t->Load(PixelSize(Img.Width, Img.Height), data, PixelFormat::Bpp32BGRA);
|
||||
t->SetUserData(&Img);
|
||||
ImageRecShadowObject[GetTexture()->GetObjectID()] = t;
|
||||
|
||||
}
|
||||
|
||||
if (ShadowObject) {
|
||||
ShadowObject->SetFrame(t);
|
||||
}
|
||||
else {
|
||||
ShadowObject = new SpriteEx(t);
|
||||
ShadowObject->SetAnchor(1, 1);
|
||||
ShadowObject->SetOpacity(0.4);
|
||||
ShadowObject->SetZOrder(-1);
|
||||
AddChild(ShadowObject);
|
||||
//GetParent()->GetParent()->AddChild(ShadowObject);
|
||||
}
|
||||
|
||||
Transform B;
|
||||
B.scale = Vec2(1.0, 0.29);
|
||||
B.position = Point(GetWidth(), GetHeight() - 5);
|
||||
B.skew = Vec2((-20.0) * (GetParent()->GetScale().x), 0.0);
|
||||
ShadowObject->SetTransform(B);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
#pragma once
|
||||
#include <kiwano/kiwano.h>
|
||||
using namespace kiwano;
|
||||
//#include "kiwano/render/DirectX/NativePtr.h"
|
||||
|
||||
KGE_DECLARE_SMART_PTR(SpriteEx);
|
||||
|
||||
class SpriteEx : public Sprite
|
||||
{
|
||||
private:
|
||||
//D2D1_INTERPOLATION_MODE INTERPOLATION_MODE = D2D1_INTERPOLATION_MODE_FORCE_DWORD;
|
||||
//D2D1_COMPOSITE_MODE COMPOSITE_MODE = D2D1_COMPOSITE_MODE_FORCE_DWORD;
|
||||
int MyModel = -1;
|
||||
std::string TexturePtrName;
|
||||
//阴影对象
|
||||
SpriteExPtr ShadowObject = nullptr;
|
||||
|
||||
//播放动画的时间
|
||||
int OffsetTime = 0;
|
||||
//延迟集合
|
||||
std::vector<int> MyDelay;
|
||||
//是否是播放动画
|
||||
bool is_Animotion_Play = false;
|
||||
//当前帧数
|
||||
int NowFrameIndex = 0;
|
||||
//总帧数
|
||||
int MaxFrameCount = 0;
|
||||
//是否循环播放
|
||||
int MyLoop = -1;
|
||||
|
||||
|
||||
public:
|
||||
SpriteEx()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
SpriteEx(TexturePtr texture)
|
||||
{
|
||||
SetFrame(SpriteFrame(texture));
|
||||
}
|
||||
|
||||
SpriteEx(const std::string Path)
|
||||
{
|
||||
Load(Path);
|
||||
}
|
||||
|
||||
SpriteEx(const std::string imgpath, const int frame);
|
||||
|
||||
//带有NPK坐标变化的设置坐标
|
||||
void SetPosition(const Point& point)override;
|
||||
|
||||
//要改变阴影朝向
|
||||
void SetScale(const Point& point)override;
|
||||
|
||||
void OnRender(RenderContext& ctx) override;
|
||||
|
||||
void SetMode(int Type) {
|
||||
MyModel = Type;
|
||||
}
|
||||
|
||||
//void OnUpdate(Duration dt) override;
|
||||
|
||||
void SetFrameInfo(std::vector<int> FrameDaley,const int Loop);
|
||||
|
||||
void SetAnimotionPlay(bool Type);
|
||||
|
||||
void SetAnimotionFrame(const int gFrame);
|
||||
|
||||
void SetShadow();
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
#include "SquirrelActor.h"
|
||||
|
||||
extern SquirrelClassEx* TObject;
|
||||
|
||||
SquirrelActor::SquirrelActor(std::string gActorName)
|
||||
{
|
||||
ActorName = gActorName;
|
||||
}
|
||||
|
||||
|
||||
void SquirrelActor::OnUpdate(Duration dt)
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
#pragma once
|
||||
#include <string>
|
||||
#include "SquirrelClassEx.h"
|
||||
#include <kiwano/kiwano.h>
|
||||
using namespace kiwano;
|
||||
class SquirrelActor :public Actor
|
||||
{
|
||||
private:
|
||||
std::string ActorName;
|
||||
bool OnStartFrame = false;
|
||||
public:
|
||||
|
||||
SquirrelActor(std::string gActorName);
|
||||
void OnUpdate(Duration dt) override;
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
#include "SquirrelButton.h"
|
||||
#include "SquirrelClassEx.h"
|
||||
|
||||
|
||||
void SquirrelButton::OnClick(Event* evt) {
|
||||
//必须是按下态才有点击判断 实际是判断悬停态
|
||||
if (this->MyState != 3)return;
|
||||
auto mouse_evt = dynamic_cast<MouseClickEvent*>(evt);
|
||||
if (mouse_evt->button == MouseButton::Left)
|
||||
{
|
||||
SquirrelClassEx::RunUpdateScript("ButtonUpdateCallBack", this->GetObjectID(), 10);
|
||||
}
|
||||
else if (mouse_evt->button == MouseButton::Right)
|
||||
{
|
||||
SquirrelClassEx::RunUpdateScript("ButtonUpdateCallBack", this->GetObjectID(), 11);
|
||||
}
|
||||
else if (mouse_evt->button == MouseButton::Middle)
|
||||
{
|
||||
SquirrelClassEx::RunUpdateScript("ButtonUpdateCallBack", this->GetObjectID(), 12);
|
||||
}
|
||||
}
|
||||
|
||||
void SquirrelButton::OnHover() {
|
||||
//必须处于普通态时才会调用悬停态方法
|
||||
if (this->MyState == 0) {
|
||||
SetState(2);
|
||||
//this->_is_Hover = true;
|
||||
}
|
||||
}
|
||||
|
||||
void SquirrelButton::OnOut() {
|
||||
if (this->MyState == 1)return;
|
||||
//如果移出鼠标的时候处于按下态 那么也需要在调用一次OnUp
|
||||
if (this->MyState == 3) {
|
||||
SetState(2);
|
||||
this->SetPositionY(this->GetPositionY() - 1);
|
||||
}
|
||||
SetState(0);
|
||||
//this->_is_Hover = false;
|
||||
}
|
||||
|
||||
void SquirrelButton::OnDown(Event* evt) {
|
||||
if (this->MyState == 1)return;
|
||||
if (this->MyState == 2) {
|
||||
SetState(3);
|
||||
this->SetPositionY(this->GetPositionY() + 1);
|
||||
}
|
||||
}
|
||||
|
||||
void SquirrelButton::OnUp(Event* evt) {
|
||||
if (this->MyState == 1)return;
|
||||
if (this->MyState == 3) {
|
||||
SetState(2);
|
||||
this->SetPositionY(this->GetPositionY() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
bool SquirrelButton::IsPress(const int Type)
|
||||
{
|
||||
switch (Type)
|
||||
{
|
||||
case 0: {
|
||||
if (this->_is_Left_Press) {
|
||||
this->_is_Left_Press = false;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1: {
|
||||
if (this->_is_Right_Press) {
|
||||
this->_is_Right_Press = false;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2: {
|
||||
if (this->_is_Middle_Press) {
|
||||
this->_is_Middle_Press = false;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SquirrelButton::IsHover()
|
||||
{
|
||||
return this->_is_Hover;
|
||||
}
|
||||
|
||||
void SquirrelButton::SetState(const int state)
|
||||
{
|
||||
this->MyState = state;
|
||||
SquirrelClassEx::RunUpdateScript("ButtonUpdateCallBack", this->GetObjectID(), state);
|
||||
}
|
||||
|
||||
void SquirrelButton::Init()
|
||||
{
|
||||
//必须先调用父类的Init 初始化方法才可以成功注册UI类
|
||||
this->UiFrameWork::Init();
|
||||
|
||||
//监听器在父类的Init方法中已经装载 所以这里只需要新增监听信号的处理逻辑
|
||||
AddListener<MouseClickEvent>(Closure(this, &SquirrelButton::OnClick));
|
||||
AddListener<MouseDownEvent>(Closure(this, &SquirrelButton::OnDown));
|
||||
AddListener<MouseUpEvent>(Closure(this, &SquirrelButton::OnUp));
|
||||
|
||||
}
|
||||
|
||||
void SquirrelButton::OnUpdate(Duration dt) {
|
||||
//SquirrelClassEx::RunUpdateScript("ButtonUpdateCallBack", this->GetObjectID(), this->MyState);
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
#pragma once
|
||||
|
||||
#include "UiFrameWork.h"
|
||||
|
||||
KGE_DECLARE_SMART_PTR(SquirrelButton);
|
||||
|
||||
class SquirrelButton : public UiFrameWork
|
||||
{
|
||||
private:
|
||||
//正常态纹理
|
||||
std::string NORMAL = "ImagePacks2/Error/base.png";
|
||||
//禁用态纹理
|
||||
std::string DISABLE = "ImagePacks2/Error/base.png";
|
||||
//悬停态纹理
|
||||
std::string HOVER = "ImagePacks2/Error/base.png";
|
||||
//按下态纹理
|
||||
std::string PRESS = "ImagePacks2/Error/base.png";
|
||||
|
||||
//自身状态
|
||||
int MyState = 0;
|
||||
|
||||
//是否左键点击
|
||||
bool _is_Left_Press = false;
|
||||
//是否右键点击
|
||||
bool _is_Right_Press = false;
|
||||
//是否中键点击
|
||||
bool _is_Middle_Press = false;
|
||||
//是否悬停
|
||||
bool _is_Hover = false;
|
||||
|
||||
public:
|
||||
SquirrelButton() {
|
||||
Init();
|
||||
}
|
||||
|
||||
void Init() override;
|
||||
void OnClick(Event* evt);
|
||||
void OnHover()override;
|
||||
void OnOut()override;
|
||||
void OnDown(Event* evt);
|
||||
void OnUp(Event* evt);
|
||||
bool IsPress(const int Type);
|
||||
bool IsHover();
|
||||
|
||||
void SetState(const int state);
|
||||
|
||||
void OnUpdate(Duration dt) override;
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
#include "SquirrelCamera.h"
|
||||
#include "SquirrelClassEx.h"
|
||||
|
||||
void SquirrelCamera::OnUpdate(Duration dt)
|
||||
{
|
||||
SquirrelClassEx::RunUpdateScript("CameraUpdateCallBack", this->GetObjectID(),dt.GetMilliseconds());
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
#pragma once
|
||||
#include <kiwano/kiwano.h>
|
||||
using namespace kiwano;
|
||||
|
||||
KGE_DECLARE_SMART_PTR(SquirrelCamera);
|
||||
|
||||
|
||||
class SquirrelCamera :
|
||||
public Actor
|
||||
{
|
||||
public:
|
||||
void OnUpdate(Duration dt) override;
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,120 @@
|
|||
#pragma once
|
||||
|
||||
#include "include/squirrel.h"
|
||||
#include "include/sqstdaux.h"
|
||||
#include "include/sqstdblob.h"
|
||||
#include "include/sqstdio.h"
|
||||
#include "include/sqstdmath.h"
|
||||
#include "include/sqstdstring.h"
|
||||
#include "include/sqstdsystem.h"
|
||||
|
||||
|
||||
#include <kiwano/kiwano.h>
|
||||
using namespace kiwano;
|
||||
#include <kiwano-audio/kiwano-audio.h>
|
||||
using namespace kiwano::audio;
|
||||
#include <kiwano-imgui/kiwano-imgui.h>
|
||||
using namespace kiwano::imgui;
|
||||
#include "WThreadPool.h"
|
||||
|
||||
|
||||
#include "SquirrelStage.h"
|
||||
#include "SquirrelTownStage.h"
|
||||
#include "Cursor.h"
|
||||
#include "SquirrelButton.h"
|
||||
#include "SpriteEx.h"
|
||||
#include "SquirrelCamera.h"
|
||||
#include "Npk.h"
|
||||
#include "json.hpp"
|
||||
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
#include <thread>
|
||||
#include <tchar.h>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
|
||||
#ifdef SQUNICODE
|
||||
#define scfprintf fwprintf
|
||||
#define scfopen _wfopen
|
||||
#define scvprintf vwprintf
|
||||
#define _SST(a) (SQChar*)##a
|
||||
#else
|
||||
#define scfprintf fprintf
|
||||
#define scfopen fopen
|
||||
#define scvprintf vprintf
|
||||
#endif
|
||||
|
||||
|
||||
class SquirrelClassEx
|
||||
{
|
||||
|
||||
public://输出拓展
|
||||
static int Sout(HSQUIRRELVM v);//输出
|
||||
static int Error(HSQUIRRELVM v);//输出
|
||||
|
||||
public://API类
|
||||
//重载Nut脚本
|
||||
static SQInteger ReloadingScript();
|
||||
//退出游戏
|
||||
static SQInteger Exit(HSQUIRRELVM v);
|
||||
//执行Cmd
|
||||
static SQInteger Cmd(HSQUIRRELVM v);
|
||||
//调用脚本
|
||||
static void RunSceneScript(std::string FuncName, SquirrelStagePtr scene);
|
||||
static void RunSceneScript(std::string FuncName, SquirrelStagePtr scene,SQInteger dt);
|
||||
static void RunSceneScript(std::string FuncName, SquirrelStagePtr scene, SQFloat dt);
|
||||
static void RunSceneScript(std::string FuncName, SquirrelTownStagePtr scene);
|
||||
static void RunUpdateScript(std::string FuncName, SQInteger ObjectIdx);
|
||||
static void RunUpdateScript(std::string FuncName, std::string string);
|
||||
static void RunUpdateScript(std::string FuncName, SQInteger ObjectIdx, SQInteger Buf);
|
||||
static void RunUpdateScript(std::string FuncName, SQInteger ObjectIdx, SQInteger Buf , SQInteger Buf2);
|
||||
static void RunUpdateScriptPlayer(std::string FuncName, SQInteger ObjectIdx, SQFloat Buf);
|
||||
//Push图层对象至Map
|
||||
static void PushLayerActorPtrToMap(LayerActorPtr Ptr);
|
||||
//读取List
|
||||
static void LoadingListScript();
|
||||
|
||||
public: //纹理类
|
||||
static TexturePtr GetTexturePtrByImg(const std::string ImgPath , const int Frame);
|
||||
static void ReleaseTextureByImg(const std::string ImgPath);
|
||||
|
||||
public://类扩展
|
||||
//字符串类
|
||||
static void Split(const std::string& src, std::vector<std::string>& dest, const std::string& separator);
|
||||
static char* U8ToUnicode(const char* szU8);
|
||||
static char* SquirrelU2W(const char* Str);
|
||||
|
||||
|
||||
|
||||
|
||||
//文件类
|
||||
//static int WriteFile(HSQUIRRELVM v);//文件写出
|
||||
|
||||
|
||||
public://注册闭包函数
|
||||
//新增nut接口funcName绑定C语言函数funcAddr
|
||||
static void RegisterNutApi(const SQChar* funcName, void* funcAddr, HSQUIRRELVM v);
|
||||
//注册接口
|
||||
void R_Register_Nut(HSQUIRRELVM v);
|
||||
|
||||
|
||||
|
||||
|
||||
public:
|
||||
SquirrelClassEx();
|
||||
//初始化
|
||||
void Init();
|
||||
//运行
|
||||
void Run();
|
||||
//关闭
|
||||
void Close();
|
||||
};
|
||||
|
||||
static SquirrelClassEx* Object;
|
||||
static HSQUIRRELVM v;
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
#include "SquirrelStage.h"
|
||||
|
||||
#include "SquirrelClassEx.h"
|
||||
extern SquirrelClassEx* TObject;
|
||||
extern Cursor* Mouse_Object;
|
||||
|
||||
extern std::map<std::uint64_t, int>UI_HOVER_ZORDER;
|
||||
extern std::map<std::uint64_t, UiFrameWork*>UI_HOVER_OBJECT;
|
||||
|
||||
|
||||
|
||||
void SquirrelStage::OnEvent(Event* evt) {
|
||||
if (evt->IsType<KeyEvent>())
|
||||
{
|
||||
if (evt->IsType<KeyDownEvent>())
|
||||
{
|
||||
KeyCode key = dynamic_cast<KeyDownEvent*>(evt)->code;
|
||||
SquirrelClassEx::RunUpdateScript("KeyDownEventCallBack", (int)key);
|
||||
}
|
||||
else if (evt->IsType<KeyUpEvent>())
|
||||
{
|
||||
KeyCode key = dynamic_cast<KeyUpEvent*>(evt)->code;
|
||||
SquirrelClassEx::RunUpdateScript("KeyUpEventCallBack", (int)key);
|
||||
}
|
||||
else if (evt->IsType<KeyCharEvent>())
|
||||
{
|
||||
char ch = dynamic_cast<KeyCharEvent*>(evt)->value;
|
||||
SquirrelClassEx::RunUpdateScript("KeyCharEventCallBack", (int)ch);
|
||||
}
|
||||
else if (evt->IsType<IMEInputEvent>())
|
||||
{
|
||||
const auto& str = dynamic_cast<IMEInputEvent*>(evt)->value;
|
||||
const auto utf8_str = strings::WideToUTF8(strings::NarrowToWide(str));
|
||||
SquirrelClassEx::RunUpdateScript("KeyIMEInputEventCallBack", utf8_str.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SquirrelStage::InitKeyInPut()
|
||||
{
|
||||
AddListener<KeyDownEvent>(Closure(this, &SquirrelStage::OnEvent));
|
||||
AddListener<KeyUpEvent>(Closure(this, &SquirrelStage::OnEvent));
|
||||
AddListener<KeyCharEvent>(Closure(this, &SquirrelStage::OnEvent));
|
||||
AddListener<IMEInputEvent>(Closure(this, &SquirrelStage::OnEvent));
|
||||
}
|
||||
|
||||
void SquirrelStage::PushBaseUi()
|
||||
{
|
||||
//创建鼠标UI图层
|
||||
LayerActorPtr MouseUiLayer = new LayerActor();
|
||||
MouseUiLayer->SetName("Scene_Mouse_UI_Layer");
|
||||
//设置鼠标图层层级最高
|
||||
MouseUiLayer->SetZOrder(100000);
|
||||
SquirrelClassEx::PushLayerActorPtrToMap(MouseUiLayer);
|
||||
this->AddChild(MouseUiLayer);
|
||||
|
||||
//创建默认图层
|
||||
LayerActorPtr DefaultLayer = new LayerActor();
|
||||
DefaultLayer->SetName(this->GetName() + "_Default_Layer");
|
||||
SquirrelClassEx::PushLayerActorPtrToMap(DefaultLayer);
|
||||
this->AddChild(DefaultLayer);
|
||||
}
|
||||
|
||||
void SquirrelStage::OnEnter()
|
||||
{
|
||||
//将鼠标对象从父场景移除
|
||||
Mouse_Object->RemoveFromParent();
|
||||
|
||||
ActorPtr MouseUiLayer = this->GetChild("Scene_Mouse_UI_Layer");
|
||||
|
||||
//将鼠标对象设置为当前场景子对象
|
||||
MouseUiLayer->AddChild(Mouse_Object);
|
||||
|
||||
//场景进入
|
||||
if(this->GetName().find("GameMap") == std::string::npos)TObject->RunSceneScript(this->GetName() + "_Enter", this);
|
||||
//全局进入
|
||||
TObject->RunSceneScript("Game_Enter", this);
|
||||
}
|
||||
|
||||
void SquirrelStage::OnExit()
|
||||
{
|
||||
//清空UI类Map
|
||||
UI_HOVER_ZORDER.clear();
|
||||
UI_HOVER_OBJECT.clear();
|
||||
|
||||
//将鼠标对象从父场景移除
|
||||
Mouse_Object->RemoveFromParent();
|
||||
//场景退出
|
||||
if (this->GetName().find("GameMap") == std::string::npos)TObject->RunSceneScript(this->GetName() + "_Exit", this);
|
||||
//全局退出
|
||||
TObject->RunSceneScript("Game_Exit", this);
|
||||
}
|
||||
|
||||
|
||||
void SquirrelStage::OnUpdate(Duration dt)
|
||||
{
|
||||
static float TimeFlag = 0.0;
|
||||
|
||||
TimeFlag += dt.GetSeconds();
|
||||
|
||||
TObject->RunSceneScript("Game_Proc", this, dt.GetSeconds());
|
||||
|
||||
if (TimeFlag >= 0.00694) {
|
||||
//场景Proc
|
||||
if (this->GetName().find("GameMap") == std::string::npos)TObject->RunSceneScript(this->GetName() + "_Proc", this, TimeFlag);
|
||||
|
||||
|
||||
if (Director::GetInstance().GetCurrentStage()->GetHashName() == this->GetHashName() && this->GetName().find("LoadingGame") == std::string::npos) {
|
||||
//全局Proc
|
||||
TObject->RunSceneScript("Game_Proc_144", this, TimeFlag);
|
||||
//判断是否需要重载
|
||||
if (FILE* file = fopen("Yosin_Game_Reloading.Sign", "r")) {
|
||||
SquirrelClassEx::ReloadingScript();
|
||||
//OnExit();
|
||||
//OnEnter();
|
||||
fclose(file);
|
||||
remove("Yosin_Game_Reloading.Sign");
|
||||
}
|
||||
}
|
||||
|
||||
TimeFlag = 0.0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
#pragma once
|
||||
|
||||
|
||||
#include <kiwano/kiwano.h>
|
||||
using namespace kiwano;
|
||||
|
||||
KGE_DECLARE_SMART_PTR(SquirrelStage);
|
||||
class SquirrelStage :
|
||||
public Stage
|
||||
{
|
||||
private:
|
||||
float Base_X = 0;
|
||||
float Base_Y = 0;
|
||||
public:
|
||||
//构造函数必须有名字
|
||||
SquirrelStage(std::string gName) {
|
||||
this->SetName(gName);
|
||||
|
||||
InitKeyInPut();
|
||||
|
||||
PushBaseUi();
|
||||
|
||||
}
|
||||
|
||||
//创建按键事件回调
|
||||
void InitKeyInPut();
|
||||
|
||||
//创建基础图层
|
||||
void PushBaseUi();
|
||||
|
||||
//进入场景
|
||||
void OnEnter() override;
|
||||
//退出场景
|
||||
void OnExit()override;
|
||||
//渲染场景 Proc
|
||||
void OnUpdate(Duration dt)override;
|
||||
|
||||
|
||||
void OnEvent(Event* evt);
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
#include "SquirrelTownStage.h"
|
||||
#include "SquirrelClassEx.h"
|
||||
|
||||
extern SquirrelClassEx* TObject;
|
||||
extern Cursor* Mouse_Object;
|
||||
|
||||
extern std::map<std::uint64_t, int>UI_HOVER_ZORDER;
|
||||
extern std::map<std::uint64_t, UiFrameWork*>UI_HOVER_OBJECT;
|
||||
|
||||
void SquirrelTownStage::PushBaseUi()
|
||||
{
|
||||
//创建鼠标UI图层
|
||||
LayerActorPtr MouseUiLayer = new LayerActor();
|
||||
MouseUiLayer->SetName("Scene_Mouse_UI_Layer");
|
||||
//设置鼠标图层层级最高
|
||||
MouseUiLayer->SetZOrder(100000);
|
||||
SquirrelClassEx::PushLayerActorPtrToMap(MouseUiLayer);
|
||||
this->AddChild(MouseUiLayer);
|
||||
|
||||
//创建默认图层
|
||||
LayerActorPtr DefaultLayer = new LayerActor();
|
||||
DefaultLayer->SetName(this->GetName() + "_Default_Layer");
|
||||
SquirrelClassEx::PushLayerActorPtrToMap(DefaultLayer);
|
||||
this->AddChild(DefaultLayer);
|
||||
}
|
||||
|
||||
void SquirrelTownStage::OnEnter()
|
||||
{
|
||||
//将鼠标对象从父场景移除
|
||||
Mouse_Object->RemoveFromParent();
|
||||
|
||||
ActorPtr MouseUiLayer = this->GetChild("Scene_Mouse_UI_Layer");
|
||||
|
||||
//将鼠标对象设置为当前场景子对象
|
||||
MouseUiLayer->AddChild(Mouse_Object);
|
||||
|
||||
//场景进入
|
||||
//TObject->RunSceneScript(this->GetName() + "_Enter", this);
|
||||
//全局进入
|
||||
TObject->RunSceneScript("Game_Enter", this);
|
||||
}
|
||||
|
||||
void SquirrelTownStage::OnExit()
|
||||
{
|
||||
//清空UI类Map
|
||||
UI_HOVER_ZORDER.clear();
|
||||
UI_HOVER_OBJECT.clear();
|
||||
|
||||
//将鼠标对象从父场景移除
|
||||
Mouse_Object->RemoveFromParent();
|
||||
//全局退出
|
||||
TObject->RunSceneScript("Game_Exit", this);
|
||||
}
|
||||
|
||||
void SquirrelTownStage::OnUpdate(Duration dt)
|
||||
{
|
||||
if (Director::GetInstance().GetCurrentStage()->GetHashName() == this->GetHashName() && this->GetName().find("LoadingGame") == std::string::npos) {
|
||||
//全局Proc
|
||||
TObject->RunSceneScript("Game_Proc", this);
|
||||
//判断是否需要重载
|
||||
if (FILE* file = fopen("Yosin_Game_Reloading.Sign", "r")) {
|
||||
SquirrelClassEx::ReloadingScript();
|
||||
//OnExit();
|
||||
//OnEnter();
|
||||
fclose(file);
|
||||
remove("Yosin_Game_Reloading.Sign");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
#pragma once
|
||||
#include <kiwano/kiwano.h>
|
||||
using namespace kiwano;
|
||||
|
||||
#include "SquirrelStage.h"
|
||||
KGE_DECLARE_SMART_PTR(SquirrelTownStage);
|
||||
|
||||
class SquirrelTownStage :
|
||||
public Stage
|
||||
{
|
||||
private:
|
||||
float Base_X = 0;
|
||||
float Base_Y = 0;
|
||||
public:
|
||||
//构造函数必须有名字
|
||||
SquirrelTownStage(std::string gName) {
|
||||
this->SetName(gName);
|
||||
|
||||
PushBaseUi();
|
||||
}
|
||||
|
||||
//创建基础图层
|
||||
void PushBaseUi();
|
||||
//进入场景
|
||||
void OnEnter() override;
|
||||
//退出场景
|
||||
void OnExit()override;
|
||||
//渲染场景 Proc
|
||||
void OnUpdate(Duration dt)override;
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,358 @@
|
|||
#pragma once
|
||||
|
||||
//演员对象智能指针Map
|
||||
extern std::map<uint64_t, ActorPtr>ActorPtrMapObject;
|
||||
//淡入淡出动画智能指针Map
|
||||
std::map<uint32_t, FadeTransitionPtr>FadeTransitionPtrMapObject;
|
||||
//场景管理Map
|
||||
std::map<std::string, uint64_t>SquirrelStagePtrMapObject;
|
||||
|
||||
//重载场景
|
||||
static SQInteger Reset_Scene(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//获取传入场景
|
||||
SQInteger gscene;
|
||||
sq_getinteger(v, 2, &gscene);
|
||||
|
||||
//获取传入场景
|
||||
if (ActorPtrMapObject.count(gscene)) {
|
||||
SquirrelStagePtr scene = dynamic_cast<SquirrelStage*>(ActorPtrMapObject[gscene].Get());
|
||||
//移除场景所有子对象
|
||||
scene->RemoveAllChildren();
|
||||
//重新构造
|
||||
scene->PushBaseUi();
|
||||
//重新调用进入场景函数
|
||||
scene->OnEnter();
|
||||
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
//ActorPtr c = scene->GetChild("Scene_Default_Layer");
|
||||
//c->RemoveAllChildren();
|
||||
|
||||
//ActorList ChildList = scene->GetAllChildren();
|
||||
|
||||
//for (auto& child : ChildList)
|
||||
//{
|
||||
// if (!child->IsName("Scene_Mouse_UI_Layer")) {
|
||||
// child->RemoveAllChildren();
|
||||
// }
|
||||
//}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
//创建场景
|
||||
static SQInteger Create_Scene(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//获取传入名字
|
||||
const SQChar* StageName;
|
||||
sq_getstring(v, 2, &StageName);
|
||||
|
||||
//此操作会New出一个字符串需要手动销毁
|
||||
char* gStageName = SquirrelClassEx::SquirrelU2W((char*)StageName);
|
||||
|
||||
std::string RealStageName = gStageName;
|
||||
|
||||
//销毁New出来的字符串
|
||||
delete[]gStageName;
|
||||
|
||||
//创建场景
|
||||
SquirrelStagePtr scene = new SquirrelStage(RealStageName);
|
||||
|
||||
//获取对象的UUID
|
||||
uint32_t UUID = scene->GetObjectID();
|
||||
|
||||
//将场景对象存入Map管理
|
||||
ActorPtrMapObject[UUID] = scene;
|
||||
SquirrelStagePtrMapObject[RealStageName] = UUID;
|
||||
|
||||
sq_pushinteger(v, UUID);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//根据名字获取场景 如果不存在会自动创建
|
||||
static SQInteger Get_SceneByName(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//获取传入名字
|
||||
const SQChar* StageName;
|
||||
sq_getstring(v, 2, &StageName);
|
||||
|
||||
//此操作会New出一个字符串需要手动销毁
|
||||
char* gStageName = SquirrelClassEx::SquirrelU2W((char*)StageName);
|
||||
|
||||
std::string RealStageName = gStageName;
|
||||
|
||||
//销毁New出来的字符串
|
||||
delete[]gStageName;
|
||||
|
||||
if (SquirrelStagePtrMapObject.count(RealStageName) && ActorPtrMapObject.count(SquirrelStagePtrMapObject[RealStageName])) {
|
||||
sq_pushinteger(v, SquirrelStagePtrMapObject[RealStageName]);
|
||||
}
|
||||
else {
|
||||
//创建场景
|
||||
SquirrelStagePtr scene = new SquirrelStage(RealStageName);
|
||||
|
||||
//获取对象的UUID
|
||||
uint32_t UUID = scene->GetObjectID();
|
||||
|
||||
//将场景对象存入Map管理
|
||||
ActorPtrMapObject[UUID] = scene;
|
||||
SquirrelStagePtrMapObject[RealStageName] = UUID;
|
||||
|
||||
sq_pushinteger(v, UUID);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//根据名字获取城镇场景 如果不存在会自动创建
|
||||
static SQInteger Get_TownSceneByName(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//获取传入名字
|
||||
const SQChar* StageName;
|
||||
sq_getstring(v, 2, &StageName);
|
||||
|
||||
//此操作会New出一个字符串需要手动销毁
|
||||
char* gStageName = SquirrelClassEx::SquirrelU2W((char*)StageName);
|
||||
|
||||
std::string RealStageName = gStageName;
|
||||
|
||||
//销毁New出来的字符串
|
||||
delete[]gStageName;
|
||||
|
||||
if (SquirrelStagePtrMapObject.count(RealStageName) && ActorPtrMapObject.count(SquirrelStagePtrMapObject[RealStageName])) {
|
||||
sq_pushinteger(v, SquirrelStagePtrMapObject[RealStageName]);
|
||||
}
|
||||
else {
|
||||
//创建场景
|
||||
SquirrelTownStagePtr scene = new SquirrelTownStage(RealStageName);
|
||||
|
||||
//获取对象的UUID
|
||||
uint32_t UUID = scene->GetObjectID();
|
||||
|
||||
//将场景对象存入Map管理
|
||||
ActorPtrMapObject[UUID] = scene;
|
||||
SquirrelStagePtrMapObject[RealStageName] = UUID;
|
||||
|
||||
sq_pushinteger(v, UUID);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//导演切换场景
|
||||
static SQInteger Director_EnterStage(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//获取传入场景
|
||||
SQInteger gscene;
|
||||
sq_getinteger(v, 2, &gscene);
|
||||
|
||||
//获取传入场景
|
||||
if (ActorPtrMapObject.count(gscene)) {
|
||||
SquirrelStagePtr scene = dynamic_cast<SquirrelStage*>(ActorPtrMapObject[gscene].Get());
|
||||
if (Top == 2) {
|
||||
Director::GetInstance().EnterStage(scene);
|
||||
}
|
||||
else if (Top == 3) {
|
||||
SQInteger gTsn;
|
||||
sq_getinteger(v, 3, &gTsn);
|
||||
|
||||
if (FadeTransitionPtrMapObject.count(gTsn)) {
|
||||
FadeTransitionPtr Tsn = FadeTransitionPtrMapObject[gTsn];
|
||||
Director::GetInstance().EnterStage(scene, Tsn);
|
||||
}
|
||||
else {
|
||||
Director::GetInstance().EnterStage(scene);
|
||||
}
|
||||
}
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//导演切换场景
|
||||
static SQInteger Director_PushStage(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//获取传入场景
|
||||
SQInteger gscene;
|
||||
sq_getinteger(v, 2, &gscene);
|
||||
|
||||
//获取传入场景
|
||||
if (ActorPtrMapObject.count(gscene)) {
|
||||
SquirrelStagePtr scene = dynamic_cast<SquirrelStage*>(ActorPtrMapObject[gscene].Get());
|
||||
if (Top == 2) {
|
||||
Director::GetInstance().PushStage(scene);
|
||||
}
|
||||
else if (Top == 3) {
|
||||
SQInteger gTsn;
|
||||
sq_getinteger(v, 3, &gTsn);
|
||||
|
||||
if (FadeTransitionPtrMapObject.count(gTsn)) {
|
||||
FadeTransitionPtr Tsn = FadeTransitionPtrMapObject[gTsn];
|
||||
Director::GetInstance().PushStage(scene, Tsn);
|
||||
}
|
||||
else {
|
||||
Director::GetInstance().PushStage(scene);
|
||||
}
|
||||
}
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//导演切换场景
|
||||
static SQInteger Director_PopStage(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//获取传入场景
|
||||
SQInteger gscene;
|
||||
sq_getinteger(v, 2, &gscene);
|
||||
|
||||
//获取传入场景
|
||||
if (ActorPtrMapObject.count(gscene)) {
|
||||
SquirrelStagePtr scene = dynamic_cast<SquirrelStage*>(ActorPtrMapObject[gscene].Get());
|
||||
if (Top == 2) {
|
||||
Director::GetInstance().PopStage();
|
||||
}
|
||||
else if (Top == 3) {
|
||||
SQInteger gTsn;
|
||||
sq_getinteger(v, 3, &gTsn);
|
||||
|
||||
if (FadeTransitionPtrMapObject.count(gTsn)) {
|
||||
FadeTransitionPtr Tsn = FadeTransitionPtrMapObject[gTsn];
|
||||
Director::GetInstance().PopStage(Tsn);
|
||||
}
|
||||
else {
|
||||
Director::GetInstance().PopStage();
|
||||
}
|
||||
}
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//导演获取当前场景
|
||||
static SQInteger Director_GetScene(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t scene = Director::GetInstance().GetCurrentStage()->GetObjectID();
|
||||
sq_pushinteger(v, scene);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//导演退出当前场景并清空场景栈
|
||||
static SQInteger Director_ClearStages(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
Director::GetInstance().ClearStages();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//创建淡入淡出过渡动画
|
||||
static SQInteger Creat_FadeTransition(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger gDuration;
|
||||
SQBool gParallel;
|
||||
sq_getinteger(v, 2, &gDuration);
|
||||
sq_getbool(v, 3, &gParallel);
|
||||
|
||||
Duration Time = Duration(gDuration);
|
||||
FadeTransitionPtr Tsn = new FadeTransition(Time, gParallel);
|
||||
|
||||
//获取对象的UUID
|
||||
uint32_t UUID = Tsn->GetObjectID();
|
||||
|
||||
//将高级精灵对象存入Map管理
|
||||
FadeTransitionPtrMapObject[UUID] = Tsn;
|
||||
|
||||
sq_pushinteger(v, UUID);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -0,0 +1,427 @@
|
|||
#pragma once
|
||||
|
||||
extern std::map<uint64_t, ActorPtr>ActorPtrMapObject;
|
||||
extern std::map<std::string, FontPtr>FontRecObject;
|
||||
|
||||
//创建文字对象
|
||||
static SQInteger Squirrle_Create_Text_Object(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// 创建一个文本角色
|
||||
TextActorPtr text = new TextActor();
|
||||
|
||||
//获取文字对象的UUID
|
||||
uint64_t UUID = text->GetObjectID();
|
||||
|
||||
//将文字对象存入Map管理
|
||||
ActorPtrMapObject[UUID] = text;
|
||||
|
||||
//将HshName返回给虚拟机
|
||||
sq_pushinteger(v, UUID);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//设置文字对象文本
|
||||
static SQInteger Squirrle_Set_Text_Object_Text(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
//得到Squirrel字符串
|
||||
const SQChar* OutPutBuffer;
|
||||
sq_getstring(v, 3, &OutPutBuffer);
|
||||
|
||||
//此操作会New出一个字符串需要手动销毁
|
||||
char* OutPutText = SquirrelClassEx::SquirrelU2W((char*)OutPutBuffer);
|
||||
|
||||
//从全局Map中获取文本角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
TextActorPtr text = dynamic_cast<TextActor*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
text->SetText(OutPutText);
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
//销毁New出来的字符串
|
||||
delete[]OutPutText;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//设置文字对象颜色
|
||||
static SQInteger Squirrle_Set_Text_Object_Color(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
SQInteger TextColor;
|
||||
sq_getinteger(v, 3, &TextColor);
|
||||
|
||||
//从全局Map中获取文本角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
TextActorPtr text = dynamic_cast<TextActor*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
text->SetFillColor(TextColor);
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//设置文字对象字体样式
|
||||
static SQInteger Squirrle_Set_Text_Object_TextStyle(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
//得到Squirrel字符串 字体路径Key
|
||||
const SQChar* OutPutBuffer;
|
||||
sq_getstring(v, 3, &OutPutBuffer);
|
||||
|
||||
//此操作会New出一个字符串需要手动销毁
|
||||
char* OutPutText = SquirrelClassEx::SquirrelU2W((char*)OutPutBuffer);
|
||||
std::string FontName = OutPutText;
|
||||
//销毁New出来的字符串
|
||||
delete[]OutPutText;
|
||||
|
||||
|
||||
//通过字体创建文本样式
|
||||
if (Top == 3) {
|
||||
//从全局Map中获取文本角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
TextActorPtr text = dynamic_cast<TextActor*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
if (FontRecObject.count(FontName)) {
|
||||
TextStyle TsP = TextStyle(FontRecObject[FontName]);
|
||||
text->SetStyle(TsP);
|
||||
}
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
}
|
||||
else if (Top == 8) {
|
||||
//得到文字对其方式
|
||||
SQInteger gTextAlign;
|
||||
sq_getinteger(v, 4, &gTextAlign);
|
||||
|
||||
//得到文字自动换行宽度
|
||||
SQFloat gwrap_width;
|
||||
sq_getfloat(v, 5, &gwrap_width);
|
||||
|
||||
//得到文字行间距
|
||||
SQFloat gline_spacing;
|
||||
sq_getfloat(v, 6, &gline_spacing);
|
||||
|
||||
//得到文字显示下划线
|
||||
SQBool gshow_underline;
|
||||
sq_getbool(v, 7, &gshow_underline);
|
||||
|
||||
//得到文字显示删除线
|
||||
SQBool gshow_strikethrough;
|
||||
sq_getbool(v, 8, &gshow_strikethrough);
|
||||
|
||||
//从全局Map中获取文本角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
TextActorPtr text = dynamic_cast<TextActor*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
if (FontRecObject.count(FontName)) {
|
||||
TextStyle TsP = TextStyle(FontRecObject[FontName]);
|
||||
switch (gTextAlign)
|
||||
{
|
||||
case 0:
|
||||
TsP.alignment = TextAlign::Left;
|
||||
break;
|
||||
case 1:
|
||||
TsP.alignment = TextAlign::Right;
|
||||
break;
|
||||
case 2:
|
||||
TsP.alignment = TextAlign::Center;
|
||||
break;
|
||||
case 3:
|
||||
TsP.alignment = TextAlign::Justified;
|
||||
break;
|
||||
}
|
||||
TsP.wrap_width = gwrap_width;
|
||||
TsP.line_spacing = gline_spacing;
|
||||
TsP.show_underline = gshow_underline;
|
||||
TsP.show_strikethrough = gshow_strikethrough;
|
||||
text->SetStyle(TsP);
|
||||
}
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//设置文字对其方式
|
||||
static SQInteger Squirrle_Set_Text_Object_Alignment(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
SQInteger TextAlignment;
|
||||
sq_getinteger(v, 3, &TextAlignment);
|
||||
|
||||
//从全局Map中获取文本角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
TextActorPtr text = dynamic_cast<TextActor*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
switch (TextAlignment)
|
||||
{
|
||||
case 0:
|
||||
text->SetAlignment(TextAlign::Left);
|
||||
break;
|
||||
case 1:
|
||||
text->SetAlignment(TextAlign::Right);
|
||||
break;
|
||||
case 2:
|
||||
text->SetAlignment(TextAlign::Center);
|
||||
break;
|
||||
case 3:
|
||||
text->SetAlignment(TextAlign::Justified);
|
||||
break;
|
||||
}
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
//设置文字描边
|
||||
static SQInteger Squirrle_Set_Text_Object_Outline(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SQInteger ActorUUID;
|
||||
sq_getinteger(v, 2, &ActorUUID);
|
||||
|
||||
SQInteger OutlineStyle;
|
||||
sq_getinteger(v, 3, &OutlineStyle);
|
||||
|
||||
SQInteger OutlineColor;
|
||||
sq_getinteger(v, 4, &OutlineColor);
|
||||
|
||||
//从全局Map中获取文本角色
|
||||
if (ActorPtrMapObject.count(ActorUUID)) {
|
||||
TextActorPtr text = dynamic_cast<TextActor*>(ActorPtrMapObject[ActorUUID].Get());
|
||||
StrokeStylePtr SSP = new StrokeStyle(2);
|
||||
switch (OutlineStyle)
|
||||
{
|
||||
case 0 :
|
||||
SSP->SetWidth(3.0);
|
||||
//SSP->SetCapStyle(CapStyle::Flat);
|
||||
//SSP->SetLineJoinStyle(LineJoinStyle::Miter);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
text->SetOutlineStrokeStyle(SSP);
|
||||
text->SetOutlineColor(OutlineColor);
|
||||
|
||||
sq_pushbool(v, true);
|
||||
|
||||
|
||||
//TextStyle OldT = text->GetStyle();
|
||||
//std::string TString = text->GetText();
|
||||
|
||||
//TextActorPtr LeftUp = new TextActor(TString, OldT);
|
||||
//LeftUp->SetPosition(-1.0, -1.0);
|
||||
//LeftUp->SetFillColor(0xff000000);
|
||||
//LeftUp->SetZOrder(-1);
|
||||
//text->AddChild(LeftUp);
|
||||
//
|
||||
//TextActorPtr Left = new TextActor(TString, OldT);
|
||||
//Left->SetPosition(-1.0, 0);
|
||||
//Left->SetFillColor(0xff000000);
|
||||
//Left->SetZOrder(-1);
|
||||
//text->AddChild(Left);
|
||||
|
||||
//TextActorPtr LeftDown = new TextActor(TString, OldT);
|
||||
//LeftDown->SetPosition(-1.0, 1.0);
|
||||
//LeftDown->SetFillColor(0xff000000);
|
||||
//LeftDown->SetZOrder(-1);
|
||||
//text->AddChild(LeftDown);
|
||||
|
||||
//TextActorPtr Up = new TextActor(TString, OldT);
|
||||
//Up->SetPosition(0.0, -1.0);
|
||||
//Up->SetFillColor(0xff000000);
|
||||
//Up->SetZOrder(-1);
|
||||
//text->AddChild(Up);
|
||||
|
||||
//TextActorPtr Down = new TextActor(TString, OldT);
|
||||
//Down->SetPosition(0.0, 1.0);
|
||||
//Down->SetFillColor(0xff000000);
|
||||
//Down->SetZOrder(-1);
|
||||
//text->AddChild(Down);
|
||||
|
||||
//TextActorPtr RightUp = new TextActor(TString, OldT);
|
||||
//RightUp->SetPosition(1.0, -1.0);
|
||||
//RightUp->SetFillColor(0xff000000);
|
||||
//RightUp->SetZOrder(-1);
|
||||
//text->AddChild(RightUp);
|
||||
|
||||
//TextActorPtr Right = new TextActor(TString, OldT);
|
||||
//Right->SetPosition(1.0, 0.0);
|
||||
//Right->SetFillColor(0xff000000);
|
||||
//Right->SetZOrder(-1);
|
||||
//text->AddChild(Right);
|
||||
|
||||
//TextActorPtr RightDown = new TextActor(TString, OldT);
|
||||
//RightDown->SetPosition(1.0, 1.0);
|
||||
//RightDown->SetFillColor(0xff000000);
|
||||
//RightDown->SetZOrder(-1);
|
||||
//text->AddChild(RightDown);
|
||||
|
||||
//sq_pushbool(v, true);
|
||||
|
||||
|
||||
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//新建字体样式
|
||||
static SQInteger Squirrle_Create_Font(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//得到Squirrel字符串 字体路径Key
|
||||
const SQChar* gFontName;
|
||||
sq_getstring(v, 2, &gFontName);
|
||||
|
||||
//此操作会New出一个字符串需要手动销毁
|
||||
char* FontNamebuf = SquirrelClassEx::SquirrelU2W((char*)gFontName);
|
||||
std::string FontName = FontNamebuf;
|
||||
delete[]FontNamebuf;
|
||||
|
||||
//如果字体不存在就去创建字体
|
||||
if (!FontRecObject.count(FontName)) {
|
||||
//得到Squirrel字符串 字体路径Key
|
||||
const SQChar* OutPutBuffer;
|
||||
sq_getstring(v, 3, &OutPutBuffer);
|
||||
|
||||
//此操作会New出一个字符串需要手动销毁
|
||||
char* gFontPath = SquirrelClassEx::SquirrelU2W((char*)OutPutBuffer);
|
||||
std::string FontPath = gFontPath;
|
||||
delete[]gFontPath;
|
||||
|
||||
SQFloat gfont_size;
|
||||
sq_getfloat(v, 4, &gfont_size);
|
||||
|
||||
|
||||
FontPtr FontBuf = new Font(FontPath, gfont_size,400U,FontPosture::Normal,FontStretch::Normal);
|
||||
|
||||
FontRecObject[FontName] = FontBuf;
|
||||
sq_pushbool(v, true);
|
||||
}
|
||||
else {
|
||||
sq_pushbool(v, false);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void R_Register_Nut_Text() {
|
||||
//文字类
|
||||
SquirrelClassEx::RegisterNutApi(_SST("sq_Create_Text_Object"), Squirrle_Create_Text_Object, v);//创建文字对象
|
||||
SquirrelClassEx::RegisterNutApi(_SST("sq_Set_Text_Object_Text"), Squirrle_Set_Text_Object_Text, v);//设置文字对象文本
|
||||
SquirrelClassEx::RegisterNutApi(_SST("sq_Set_Text_Object_Color"), Squirrle_Set_Text_Object_Color, v);//设置文字对象颜色
|
||||
SquirrelClassEx::RegisterNutApi(_SST("sq_Set_Text_Object_TextStyle"), Squirrle_Set_Text_Object_TextStyle, v);//设置文字对象样式
|
||||
SquirrelClassEx::RegisterNutApi(_SST("sq_Set_Text_Object_Alignment"), Squirrle_Set_Text_Object_Alignment, v);//设置文字对其方式
|
||||
SquirrelClassEx::RegisterNutApi(_SST("sq_Set_Text_Object_Outline"), Squirrle_Set_Text_Object_Outline, v);//设置文字描边
|
||||
|
||||
|
||||
|
||||
|
||||
SquirrelClassEx::RegisterNutApi(_SST("sq_Create_Font"), Squirrle_Create_Font, v);//创建字体
|
||||
}
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
#pragma once
|
||||
//纹理Map
|
||||
extern std::unordered_map<std::string, std::map<int,TexturePtr>>ImageRecObject;
|
||||
std::mutex ImageRecObjectmutex;
|
||||
|
||||
extern NPK_M* npk;
|
||||
|
||||
extern WThreadPool threadPool;
|
||||
|
||||
void ThreadPreloadImg_Success(std::string Name , SQInteger Scene)
|
||||
{
|
||||
//调用回调
|
||||
sq_pushroottable(v);
|
||||
sq_pushstring(v, _SST(Name.c_str()), -1);
|
||||
sq_get(v, -2);
|
||||
sq_pushroottable(v);
|
||||
sq_pushinteger(v, Scene);
|
||||
sq_call(v, 2, 0, 1);
|
||||
sq_pop(v, 2);
|
||||
}
|
||||
|
||||
void ThreadPreloadImgFunc(std::vector<std::string> ImgList, std::string Name , SQInteger Scene) {
|
||||
//先遍历一次 把需要加载的img存下来
|
||||
std::vector<std::string> RealImgList;
|
||||
ImageRecObjectmutex.lock();
|
||||
for (auto it = ImgList.begin(); it != ImgList.end(); ++it) {
|
||||
std::string Iname = *it;
|
||||
if (!ImageRecObject.count(Iname)) {
|
||||
RealImgList.push_back(*it);
|
||||
}
|
||||
}
|
||||
ImageRecObjectmutex.unlock();
|
||||
|
||||
//开始加载img 并存入临时map
|
||||
std::map<std::string ,std::map<int,TexturePtr>> TexturePtrVL;
|
||||
for (auto it = RealImgList.begin(); it != RealImgList.end(); ++it) {
|
||||
std::string imgpath = *it;
|
||||
IMG* img = npk->ReadNpkTable(imgpath);
|
||||
|
||||
for (int i = 0; i < img->png_sum; i++)
|
||||
{
|
||||
std::string RealTextureName = imgpath;
|
||||
|
||||
DWORD Height = img->lp_lplist[i].Height;
|
||||
DWORD Width = img->lp_lplist[i].Width;
|
||||
BYTE* Data = img->lp_lplist[i].PNGdata;
|
||||
|
||||
BinaryData data = { ((void*)Data) ,Height * Width * 4 };
|
||||
TexturePtr t = new Texture;
|
||||
t->Load(PixelSize(Width, Height), data, PixelFormat::Bpp32BGRA);
|
||||
t->SetUserData(&img->lp_lplist[i]);
|
||||
|
||||
TexturePtrVL[RealTextureName][i] = t;
|
||||
}
|
||||
npk->ReleaseNpkTable(img);
|
||||
}
|
||||
|
||||
//拿锁 赋值map
|
||||
ImageRecObjectmutex.lock();
|
||||
for (auto it = TexturePtrVL.begin(); it != TexturePtrVL.end(); it++) {
|
||||
if (!ImageRecObject.count(it->first)) {
|
||||
ImageRecObject[it->first] = it->second;
|
||||
}
|
||||
}
|
||||
ImageRecObjectmutex.unlock();
|
||||
|
||||
|
||||
auto f1 = std::bind(&ThreadPreloadImg_Success, Name , Scene);
|
||||
Application::GetInstance().PerformInMainThread(f1);
|
||||
}
|
||||
|
||||
|
||||
//线程加载Img资源
|
||||
static SQInteger ThreadPreloadImg(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Top = sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, _SST("Incorrect function argument"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::vector<std::string> ImgList;
|
||||
sq_pushnull(v); // null iterator
|
||||
while (SQ_SUCCEEDED(sq_next(v, 2)))
|
||||
{
|
||||
const SQChar* path;
|
||||
sq_getstring(v, -1, &path);
|
||||
ImgList.push_back((char*)path);
|
||||
//这里-1是值,-2是键
|
||||
sq_pop(v, 2); //在下一次迭代之前弹出键和值
|
||||
}
|
||||
sq_pop(v, 1);
|
||||
|
||||
const SQChar* Name;
|
||||
sq_getstring(v, 3,&Name);
|
||||
|
||||
SQInteger SceneId;
|
||||
sq_getinteger(v, 4, &SceneId);
|
||||
|
||||
auto f1 = std::bind(&ThreadPreloadImgFunc, ImgList, (char*)Name, SceneId);
|
||||
|
||||
threadPool.concurrentRun(f1);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
#include "UiFrameWork.h"
|
||||
|
||||
std::map<uint64_t , int>UI_HOVER_ZORDER;
|
||||
std::map<uint64_t, UiFrameWork*>UI_HOVER_OBJECT;
|
||||
|
||||
void UiFrameWork::OnHoverEvent(Event* evt) {
|
||||
//每当UI类被悬停时就会像Map 书写自身位置
|
||||
UI_HOVER_ZORDER[this->GetObjectID()] = this->GetZOrder();
|
||||
UI_HOVER_OBJECT[this->GetObjectID()] = this;
|
||||
|
||||
//取的Map的最大层的对象名称
|
||||
auto MaxZorderMap = std::max_element(UI_HOVER_ZORDER.begin(), UI_HOVER_ZORDER.end(), [](std::pair<std::uint64_t, int> left, std::pair<std::uint64_t, int> right) { return left.second < right.second; });
|
||||
|
||||
std::map<uint64_t, UiFrameWork*>::reverse_iterator iter;
|
||||
for (iter = UI_HOVER_OBJECT.rbegin(); iter != UI_HOVER_OBJECT.rend(); iter++) {
|
||||
//如果是最大层那么调用悬停如果不是就调用移出悬停
|
||||
if (iter->first == MaxZorderMap->first) {
|
||||
iter->second->OnHover();
|
||||
}
|
||||
else {
|
||||
iter->second->OnOut();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void UiFrameWork::OnOutEvent(Event* evt) {
|
||||
//每当UI类不在被悬停时 就会从Map中 移除自身位置
|
||||
UI_HOVER_ZORDER.erase(this->GetObjectID());
|
||||
UI_HOVER_OBJECT.erase(this->GetObjectID());
|
||||
|
||||
this->OnOut();
|
||||
|
||||
//取的Map的最大层的对象名称
|
||||
auto MaxZorderMap = std::max_element(UI_HOVER_ZORDER.begin(), UI_HOVER_ZORDER.end(), [](std::pair<std::uint64_t, int> left, std::pair<std::uint64_t, int> right) { return left.second < right.second; });
|
||||
|
||||
std::map<uint64_t, UiFrameWork*>::reverse_iterator iter;
|
||||
for (iter = UI_HOVER_OBJECT.rbegin(); iter != UI_HOVER_OBJECT.rend(); iter++) {
|
||||
//如果是最大层那么调用悬停如果不是就调用移出悬停
|
||||
if (iter->first == MaxZorderMap->first) {
|
||||
iter->second->OnHover();
|
||||
}
|
||||
else {
|
||||
iter->second->OnOut();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UiFrameWork::RemoveZorder()
|
||||
{
|
||||
UI_HOVER_ZORDER.erase(this->GetObjectID());
|
||||
UI_HOVER_OBJECT.erase(this->GetObjectID());
|
||||
}
|
||||
|
||||
|
||||
void UiFrameWork::OnHover()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void UiFrameWork::OnOut()
|
||||
{
|
||||
}
|
||||
|
||||
void UiFrameWork::Init()
|
||||
{
|
||||
//UI类 都会增加鼠标监听
|
||||
ComponentPtr comp = new MouseSensor;
|
||||
AddComponent(0, comp);
|
||||
//增加悬停和移出的响应事件
|
||||
AddListener<MouseHoverEvent>(Closure(this, &UiFrameWork::OnHoverEvent));
|
||||
AddListener<MouseOutEvent>(Closure(this, &UiFrameWork::OnOutEvent));
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
#pragma once
|
||||
#include <kiwano/kiwano.h>
|
||||
using namespace kiwano;
|
||||
|
||||
/*
|
||||
UI层为80000 - 90000
|
||||
*/
|
||||
class UiFrameWork : public Sprite
|
||||
{
|
||||
private:
|
||||
|
||||
public:
|
||||
virtual void Init();
|
||||
//事件
|
||||
void OnHoverEvent(Event* evt);
|
||||
void OnOutEvent(Event* evt);
|
||||
void RemoveZorder();
|
||||
|
||||
//用于子类重载的事件下级调用
|
||||
virtual void OnHover();
|
||||
virtual void OnOut();
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,267 @@
|
|||
#include "WThreadPool.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
shared_ptr<WThreadPool> WThreadPool::s_threadPool;
|
||||
std::mutex WThreadPool::s_globleMutex;
|
||||
|
||||
WThreadPool::WThreadPool()
|
||||
{
|
||||
_mgrThread = make_shared<thread>(&WThreadPool::managerThread, this);
|
||||
}
|
||||
|
||||
WThreadPool::~WThreadPool()
|
||||
{
|
||||
stop();
|
||||
}
|
||||
|
||||
WThreadPool *WThreadPool::globalInstance()
|
||||
{
|
||||
if (!s_threadPool.get())
|
||||
{
|
||||
unique_lock<mutex> locker(s_globleMutex);
|
||||
if (!s_threadPool.get())
|
||||
{
|
||||
s_threadPool = make_shared<WThreadPool>();
|
||||
}
|
||||
}
|
||||
return s_threadPool.get();
|
||||
}
|
||||
|
||||
void WThreadPool::setMaxThreadNum(int maxNum)
|
||||
{
|
||||
if (maxNum > WPOOL_MAX_THREAD_NUM)
|
||||
{
|
||||
maxNum = WPOOL_MAX_THREAD_NUM;
|
||||
}
|
||||
else if (maxNum < WPOOL_MIN_THREAD_NUM)
|
||||
{
|
||||
maxNum = WPOOL_MIN_THREAD_NUM;
|
||||
}
|
||||
_maxThreadNum = maxNum;
|
||||
}
|
||||
|
||||
bool WThreadPool::waitForDone(int waitMs)
|
||||
{
|
||||
int waitedMs = 0;
|
||||
while(_busyThreadNum != 0 || !_eventQueue.empty())
|
||||
{
|
||||
this_thread::sleep_for(chrono::milliseconds(1));
|
||||
waitedMs++;
|
||||
if (waitMs > 0 && waitedMs >= waitMs)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void WThreadPool::enQueueEvent(EventFun fun)
|
||||
{
|
||||
bool res = _eventQueue.enQueue(fun);
|
||||
assert(res);
|
||||
}
|
||||
|
||||
EventFun WThreadPool::deQueueEvent()
|
||||
{
|
||||
EventFun fun;
|
||||
if (_eventQueue.deQueue(fun))
|
||||
{
|
||||
return fun;
|
||||
}
|
||||
else
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
return fun;
|
||||
}
|
||||
|
||||
void WThreadPool::run()
|
||||
{
|
||||
{
|
||||
unique_lock<mutex> locker(_threadIsRunMutex);
|
||||
_threadIsRunMap[this_thread::get_id()] = true;
|
||||
}
|
||||
while (!_exitAllFlag)
|
||||
{
|
||||
{
|
||||
unique_lock<mutex> locker(_workMutex);
|
||||
if (_eventQueue.empty() && !_exitAllFlag)
|
||||
{
|
||||
_workCondVar.wait(locker);
|
||||
}
|
||||
|
||||
if (_reduceThreadNum > 0)
|
||||
{
|
||||
_reduceThreadNum--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
_busyThreadNum++;
|
||||
while (!_exitAllFlag)
|
||||
{
|
||||
EventFun fun = deQueueEvent();
|
||||
if (!fun)
|
||||
{
|
||||
break;
|
||||
}
|
||||
fun();
|
||||
}
|
||||
_busyThreadNum--;
|
||||
}
|
||||
|
||||
{
|
||||
unique_lock<mutex> locker(_threadIsRunMutex);
|
||||
_threadIsRunMap[this_thread::get_id()] = false;
|
||||
}
|
||||
}
|
||||
|
||||
void WThreadPool::stop()
|
||||
{
|
||||
_exitAllFlag = true;
|
||||
{
|
||||
unique_lock<mutex> locker(_mgrMutex);
|
||||
_mgrCondVar.notify_all();
|
||||
}
|
||||
|
||||
if (_mgrThread->joinable())
|
||||
{
|
||||
_mgrThread->join();
|
||||
}
|
||||
}
|
||||
|
||||
void WThreadPool::managerThread()
|
||||
{
|
||||
startWorkThread();
|
||||
while (!_exitAllFlag)
|
||||
{
|
||||
{
|
||||
unique_lock<mutex> locker(_mgrMutex);
|
||||
auto now = std::chrono::system_clock::now();
|
||||
|
||||
// if the number of threads reaches the maximum or the number of idle threads is enough to
|
||||
// complete the task, sleep will be started
|
||||
if (((int)_workThreadList.size() >= _maxThreadNum ||
|
||||
_eventQueue.size() < ((int)_workThreadList.size() - _busyThreadNum - ADD_THREAD_BOUNDARY)) && !_exitAllFlag)
|
||||
{
|
||||
_mgrCondVar.wait_until(locker, now + chrono::seconds(WPOOL_MANAGE_SECONDS));
|
||||
}
|
||||
}
|
||||
if (_exitAllFlag)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
adjustWorkThread();
|
||||
// WThreadPool_log("get here to show work thread num:%d", _workThreadList.size());
|
||||
}
|
||||
stopWorkThread();
|
||||
}
|
||||
|
||||
void WThreadPool::startWorkThread()
|
||||
{
|
||||
for (int i = 0; i < _minThreadNum; i++)
|
||||
{
|
||||
shared_ptr<thread> threadPtr = make_shared<thread>(&WThreadPool::run, this);
|
||||
_workThreadList.emplace_back(threadPtr);
|
||||
}
|
||||
}
|
||||
|
||||
void WThreadPool::stopWorkThread()
|
||||
{
|
||||
{
|
||||
unique_lock<mutex> locker(_mgrMutex);
|
||||
_workCondVar.notify_all();
|
||||
}
|
||||
for (auto it = _workThreadList.begin(); it != _workThreadList.end(); it++)
|
||||
{
|
||||
if ((*it)->joinable())
|
||||
{
|
||||
(*it)->join();
|
||||
}
|
||||
}
|
||||
_workThreadList.clear();
|
||||
_threadIsRunMap.clear();
|
||||
_eventQueue.clear();
|
||||
}
|
||||
|
||||
void WThreadPool::adjustWorkThread()
|
||||
{
|
||||
int queueSize = _eventQueue.size();
|
||||
int busyThreadNum = _busyThreadNum;
|
||||
int liveThreadNum = _workThreadList.size();
|
||||
int maxThreadNum = _maxThreadNum;
|
||||
int stepThreadNum = _stepThreadNum;
|
||||
int minThreadNum = _minThreadNum;
|
||||
|
||||
// if rest thread can not run all task concurrently, add the thread
|
||||
if ((liveThreadNum < maxThreadNum) && (queueSize >= (liveThreadNum - busyThreadNum - ADD_THREAD_BOUNDARY)))
|
||||
{
|
||||
int restAllAddNum = maxThreadNum - liveThreadNum;
|
||||
int addThreadNum = restAllAddNum > stepThreadNum ? stepThreadNum : restAllAddNum;
|
||||
for (int i = 0; i < addThreadNum; i++)
|
||||
{
|
||||
shared_ptr<thread> threadPtr = make_shared<thread>(&WThreadPool::run, this);
|
||||
_workThreadList.emplace_back(threadPtr);
|
||||
}
|
||||
}
|
||||
else if ((liveThreadNum > minThreadNum) && (busyThreadNum*2 < liveThreadNum))
|
||||
{
|
||||
int resAllReduceNum = liveThreadNum - minThreadNum;
|
||||
int reduceThreadNum = resAllReduceNum > stepThreadNum ? stepThreadNum : resAllReduceNum;
|
||||
_reduceThreadNum = reduceThreadNum;
|
||||
int findExitThreadNum = 0;
|
||||
do
|
||||
{
|
||||
if (_exitAllFlag)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < (reduceThreadNum - findExitThreadNum); i++)
|
||||
{
|
||||
_workCondVar.notify_one();
|
||||
}
|
||||
|
||||
this_thread::sleep_for(chrono::milliseconds(1));
|
||||
{
|
||||
unique_lock<mutex> locker(_threadIsRunMutex);
|
||||
for (auto it = _workThreadList.begin(); it != _workThreadList.end();)
|
||||
{
|
||||
std::thread::id threadId = (*it)->get_id();
|
||||
auto threadIdIt = _threadIsRunMap.find(threadId);
|
||||
if ((threadIdIt != _threadIsRunMap.end()) && (_threadIsRunMap[threadId] == false))
|
||||
{
|
||||
findExitThreadNum++;
|
||||
_threadIsRunMap.erase(threadIdIt);
|
||||
(*it)->join();
|
||||
_workThreadList.erase(it++);
|
||||
}
|
||||
else
|
||||
{
|
||||
it++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (findExitThreadNum < reduceThreadNum)
|
||||
{
|
||||
this_thread::sleep_for(chrono::milliseconds(1));
|
||||
}
|
||||
|
||||
/*
|
||||
WThreadPool_log("get here 3 to show findExitThreadNum:%d, reduceThreadNum:%d, _reduceThreadNum:%d", findExitThreadNum, reduceThreadNum, (int)_reduceThreadNum);
|
||||
for (auto it = _workThreadList.begin(); it != _workThreadList.end(); it++)
|
||||
{
|
||||
WThreadPool_log("work thread pid:%lld", (*it)->get_id());
|
||||
}
|
||||
for (auto it = _threadIsRunMap.begin(); it != _threadIsRunMap.end(); it++)
|
||||
{
|
||||
WThreadPool_log("it->first:%lld, it->second:%d", it->first, it->second);
|
||||
}
|
||||
*/
|
||||
|
||||
} while(!(findExitThreadNum >= reduceThreadNum && _reduceThreadNum <= 0));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
#include <mutex>
|
||||
#include <list>
|
||||
#include <thread>
|
||||
#include <memory>
|
||||
#include <atomic>
|
||||
#include <stdio.h>
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#include <condition_variable>
|
||||
#include "LockQueue.hpp"
|
||||
#include <assert.h>
|
||||
|
||||
#define WThreadPool_log(fmt, ...) {printf(fmt, ##__VA_ARGS__);printf("\n");fflush(stdout);}
|
||||
|
||||
#define WPOOL_MIN_THREAD_NUM 4
|
||||
#define WPOOL_MAX_THREAD_NUM 256
|
||||
#define WPOOL_MANAGE_SECONDS 20
|
||||
#define ADD_THREAD_BOUNDARY 1
|
||||
|
||||
using EventFun = std::function<void ()>;
|
||||
using int64 = long long int;
|
||||
|
||||
class WThreadPool
|
||||
{
|
||||
public:
|
||||
WThreadPool();
|
||||
virtual ~WThreadPool();
|
||||
|
||||
static WThreadPool * globalInstance();
|
||||
|
||||
void setMaxThreadNum(int maxNum);
|
||||
bool waitForDone(int waitMs = -1);
|
||||
|
||||
template<typename Func, typename ...Arguments >
|
||||
void concurrentRun(Func func, Arguments... args) {
|
||||
EventFun queunFun = std::bind(func, args...);
|
||||
enQueueEvent(queunFun);
|
||||
if (((int)_workThreadList.size() < _maxThreadNum) &&
|
||||
(_eventQueue.size() >= ((int)_workThreadList.size() - _busyThreadNum - ADD_THREAD_BOUNDARY)))
|
||||
{
|
||||
_mgrCondVar.notify_one();
|
||||
}
|
||||
_workCondVar.notify_one();
|
||||
}
|
||||
|
||||
template<typename T> static int64_t threadIdToint64(T threadId)
|
||||
{
|
||||
std::string stid;
|
||||
stid.resize(32);
|
||||
snprintf((char *)stid.c_str(), 32, "%lld", threadId);
|
||||
long long int tid = std::stoll(stid);
|
||||
return tid;
|
||||
}
|
||||
|
||||
private:
|
||||
int _minThreadNum = WPOOL_MIN_THREAD_NUM;
|
||||
int _maxThreadNum = 8;
|
||||
std::atomic<int> _busyThreadNum = {0};
|
||||
int _stepThreadNum = 4;
|
||||
volatile bool _exitAllFlag = false;
|
||||
std::atomic<int> _reduceThreadNum = {0};
|
||||
|
||||
std::shared_ptr<std::thread> _mgrThread;
|
||||
LockQueue<EventFun> _eventQueue;
|
||||
std::list<std::shared_ptr<std::thread>> _workThreadList;
|
||||
|
||||
std::mutex _threadIsRunMutex;
|
||||
std::map<std::thread::id, bool> _threadIsRunMap;
|
||||
|
||||
std::condition_variable _workCondVar;
|
||||
std::mutex _workMutex;
|
||||
std::condition_variable _mgrCondVar;
|
||||
std::mutex _mgrMutex;
|
||||
|
||||
static std::shared_ptr<WThreadPool> s_threadPool;
|
||||
static std::mutex s_globleMutex;
|
||||
|
||||
void enQueueEvent(EventFun fun);
|
||||
EventFun deQueueEvent();
|
||||
void run();
|
||||
void managerThread();
|
||||
void stop();
|
||||
void startWorkThread();
|
||||
void stopWorkThread();
|
||||
void adjustWorkThread();
|
||||
};
|
||||
|
||||
Binary file not shown.
|
|
@ -0,0 +1,187 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.4.33122.133
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Yosin_Game", "Yosin_Game.vcxproj", "{26A5FEB5-A40D-4902-845C-2CB0635445CC}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kiwano", "H:\kiwano\projects\kiwano\kiwano.vcxproj", "{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kiwano-audio", "H:\kiwano\projects\kiwano-audio\kiwano-audio.vcxproj", "{1B97937D-8184-426C-BE71-29A163DC76C9}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "squirrel", "H:\squirrel_3_2_stable\squirrel3\squirrel\build\squirrel.vcxproj", "{35FBC183-03D6-307A-B4D7-3798A85056CD}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqstdlib", "H:\squirrel_3_2_stable\squirrel3\sqstdlib\build\sqstdlib.vcxproj", "{9F91073D-8955-376C-ACFA-90271B243628}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqstdlib_static", "H:\squirrel_3_2_stable\squirrel3\sqstdlib\build\sqstdlib_static.vcxproj", "{9FDC0714-6D07-3637-88C1-10E3A32F5458}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "squirrel_static", "H:\squirrel_3_2_stable\squirrel3\squirrel\build\squirrel_static.vcxproj", "{22BF092A-60A8-3196-B83B-4F16BA095260}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "H:\kiwano\projects\3rd-party\libogg\libogg.vcxproj", "{D8A5E8EC-3983-4028-9BA9-B1E337E75917}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbis", "H:\kiwano\projects\3rd-party\vorbis\libvorbis.vcxproj", "{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
MinSizeRel|x64 = MinSizeRel|x64
|
||||
MinSizeRel|x86 = MinSizeRel|x86
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
RelWithDebInfo|x64 = RelWithDebInfo|x64
|
||||
RelWithDebInfo|x86 = RelWithDebInfo|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.Debug|x64.Build.0 = Debug|x64
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.Debug|x86.Build.0 = Debug|Win32
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.MinSizeRel|x64.ActiveCfg = Release|x64
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.MinSizeRel|x64.Build.0 = Release|x64
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.MinSizeRel|x86.ActiveCfg = Release|Win32
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.MinSizeRel|x86.Build.0 = Release|Win32
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.Release|x64.ActiveCfg = Release|x64
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.Release|x64.Build.0 = Release|x64
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.Release|x86.ActiveCfg = Release|Win32
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.Release|x86.Build.0 = Release|Win32
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
|
||||
{26A5FEB5-A40D-4902-845C-2CB0635445CC}.RelWithDebInfo|x86.Build.0 = Release|Win32
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.Build.0 = Debug|x64
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.Build.0 = Debug|Win32
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.MinSizeRel|x64.ActiveCfg = Release|x64
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.MinSizeRel|x64.Build.0 = Release|x64
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.MinSizeRel|x86.ActiveCfg = Release|Win32
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.MinSizeRel|x86.Build.0 = Release|Win32
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x64.ActiveCfg = Release|x64
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x64.Build.0 = Release|x64
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x86.ActiveCfg = Release|Win32
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x86.Build.0 = Release|Win32
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
|
||||
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.RelWithDebInfo|x86.Build.0 = Release|Win32
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.Debug|x64.Build.0 = Debug|x64
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.Debug|x86.Build.0 = Debug|Win32
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.MinSizeRel|x64.ActiveCfg = Release|x64
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.MinSizeRel|x64.Build.0 = Release|x64
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.MinSizeRel|x86.ActiveCfg = Release|Win32
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.MinSizeRel|x86.Build.0 = Release|Win32
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.Release|x64.ActiveCfg = Release|x64
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.Release|x64.Build.0 = Release|x64
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.Release|x86.ActiveCfg = Release|Win32
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.Release|x86.Build.0 = Release|Win32
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
|
||||
{1B97937D-8184-426C-BE71-29A163DC76C9}.RelWithDebInfo|x86.Build.0 = Release|Win32
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.Debug|x64.Build.0 = Debug|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.Debug|x86.ActiveCfg = Debug|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.Debug|x86.Build.0 = Debug|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.MinSizeRel|x86.Build.0 = MinSizeRel|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.Release|x64.ActiveCfg = Release|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.Release|x64.Build.0 = Release|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.Release|x86.ActiveCfg = Release|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.Release|x86.Build.0 = Release|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
|
||||
{35FBC183-03D6-307A-B4D7-3798A85056CD}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.Debug|x64.Build.0 = Debug|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.Debug|x86.ActiveCfg = Debug|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.Debug|x86.Build.0 = Debug|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.MinSizeRel|x86.Build.0 = MinSizeRel|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.Release|x64.ActiveCfg = Release|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.Release|x64.Build.0 = Release|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.Release|x86.ActiveCfg = Release|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.Release|x86.Build.0 = Release|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
|
||||
{9F91073D-8955-376C-ACFA-90271B243628}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.Debug|x64.Build.0 = Debug|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.Debug|x86.ActiveCfg = Debug|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.Debug|x86.Build.0 = Debug|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.MinSizeRel|x86.Build.0 = MinSizeRel|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.Release|x64.ActiveCfg = Release|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.Release|x64.Build.0 = Release|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.Release|x86.ActiveCfg = Release|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.Release|x86.Build.0 = Release|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
|
||||
{9FDC0714-6D07-3637-88C1-10E3A32F5458}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.Debug|x64.Build.0 = Debug|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.Debug|x86.ActiveCfg = Debug|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.Debug|x86.Build.0 = Debug|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.MinSizeRel|x86.Build.0 = MinSizeRel|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.Release|x64.ActiveCfg = Release|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.Release|x64.Build.0 = Release|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.Release|x86.ActiveCfg = Release|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.Release|x86.Build.0 = Release|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
|
||||
{22BF092A-60A8-3196-B83B-4F16BA095260}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.Debug|x64.Build.0 = Debug|x64
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.Debug|x86.Build.0 = Debug|Win32
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.MinSizeRel|x64.Build.0 = Debug|x64
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.MinSizeRel|x86.ActiveCfg = Debug|Win32
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.MinSizeRel|x86.Build.0 = Debug|Win32
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.Release|x64.ActiveCfg = Release|x64
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.Release|x64.Build.0 = Release|x64
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.Release|x86.ActiveCfg = Release|Win32
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.Release|x86.Build.0 = Release|Win32
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
|
||||
{D8A5E8EC-3983-4028-9BA9-B1E337E75917}.RelWithDebInfo|x86.Build.0 = Release|Win32
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.Debug|x64.Build.0 = Debug|x64
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.Debug|x86.Build.0 = Debug|Win32
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.MinSizeRel|x64.ActiveCfg = Debug|x64
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.MinSizeRel|x64.Build.0 = Debug|x64
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.MinSizeRel|x86.ActiveCfg = Debug|Win32
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.MinSizeRel|x86.Build.0 = Debug|Win32
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.Release|x64.ActiveCfg = Release|x64
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.Release|x64.Build.0 = Release|x64
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.Release|x86.ActiveCfg = Release|Win32
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.Release|x86.Build.0 = Release|Win32
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.RelWithDebInfo|x64.ActiveCfg = Release|x64
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
|
||||
{B62E3DE6-812D-4CE6-90D9-18FD4FEA8EB2}.RelWithDebInfo|x86.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {C4FDA2BA-AA6C-49FB-93F6-471AC5BE927A}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
@ -0,0 +1,205 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{26a5feb5-a40d-4902-845c-2cb0635445cc}</ProjectGuid>
|
||||
<RootNamespace>YosinGame</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<IncludePath>I:\Yosin_Game\Yosin_Game\include;$(IncludePath)</IncludePath>
|
||||
<OutDir>I:\YosinGame\</OutDir>
|
||||
<LibraryPath>$(LibraryPath)</LibraryPath>
|
||||
<ReferencePath>$(ReferencePath)</ReferencePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;NOMINMAX;_SQ64;SQUNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>H:\kiwano\src;H:\kiwano\src\3rd-party;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>sqstdlib.lib;squirrel.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>I:\Yosin_Game\Yosin_Game\lib</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="BaseRead.cpp" />
|
||||
<ClCompile Include="Cursor.cpp" />
|
||||
<ClCompile Include="GameState.cpp" />
|
||||
<ClCompile Include="Npk.cpp" />
|
||||
<ClCompile Include="main.cpp" />
|
||||
<ClCompile Include="SoundManager.cpp" />
|
||||
<ClCompile Include="SpriteEx.cpp" />
|
||||
<ClCompile Include="SquirrelActor.cpp" />
|
||||
<ClCompile Include="SquirrelButton.cpp" />
|
||||
<ClCompile Include="SquirrelCamera.cpp" />
|
||||
<ClCompile Include="SquirrelClassEx.cpp" />
|
||||
<ClCompile Include="SquirrelStage.cpp" />
|
||||
<ClCompile Include="SquirrelTownStage.cpp" />
|
||||
<ClCompile Include="UiFrameWork.cpp" />
|
||||
<ClCompile Include="WThreadPool.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="BaseRead.h" />
|
||||
<ClInclude Include="ButtonActorRegister.h" />
|
||||
<ClInclude Include="CanvasActorRegister.h" />
|
||||
<ClInclude Include="Cursor.h" />
|
||||
<ClInclude Include="GameState.h" />
|
||||
<ClInclude Include="ImguiLayerActorRegister.h" />
|
||||
<ClInclude Include="include\json.hpp" />
|
||||
<ClInclude Include="LockQueue.hpp" />
|
||||
<ClInclude Include="Npk.h" />
|
||||
<ClInclude Include="SoundActorRegister.h" />
|
||||
<ClInclude Include="SoundManager.h" />
|
||||
<ClInclude Include="SpriteActorRegister.h" />
|
||||
<ClInclude Include="SpriteEx.h" />
|
||||
<ClInclude Include="SquirrelActor.h" />
|
||||
<ClInclude Include="SquirrelButton.h" />
|
||||
<ClInclude Include="SquirrelCamera.h" />
|
||||
<ClInclude Include="SquirrelClassEx.h" />
|
||||
<ClInclude Include="SquirrelStage.h" />
|
||||
<ClInclude Include="SquirrelTownStage.h" />
|
||||
<ClInclude Include="StageActorRegister.h" />
|
||||
<ClInclude Include="TextActorRegister.h" />
|
||||
<ClInclude Include="ThreadRegister.h" />
|
||||
<ClInclude Include="UiFrameWork.h" />
|
||||
<ClInclude Include="WThreadPool.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="H:\kiwano\projects\3rd-party\libogg\libogg.vcxproj">
|
||||
<Project>{d8a5e8ec-3983-4028-9ba9-b1e337e75917}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="H:\kiwano\projects\kiwano-audio\kiwano-audio.vcxproj">
|
||||
<Project>{1b97937d-8184-426c-be71-29a163dc76c9}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="H:\kiwano\projects\kiwano\kiwano.vcxproj">
|
||||
<Project>{ff7f943d-a89c-4e6c-97cf-84f7d8ff8edf}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
<Import Project="packages\zlib-msvc14-x64.1.2.11.7795\build\native\zlib-msvc14-x64.targets" Condition="Exists('packages\zlib-msvc14-x64.1.2.11.7795\build\native\zlib-msvc14-x64.targets')" />
|
||||
</ImportGroup>
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('packages\zlib-msvc14-x64.1.2.11.7795\build\native\zlib-msvc14-x64.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\zlib-msvc14-x64.1.2.11.7795\build\native\zlib-msvc14-x64.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,159 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="源文件">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="头文件">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="资源文件">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="头文件\BaseToolClass">
|
||||
<UniqueIdentifier>{0d071ac7-fac4-49ac-8710-9e288f776542}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="源文件\BaseToolClass">
|
||||
<UniqueIdentifier>{d1c0efa4-8635-4763-8881-888e78127822}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="头文件\SquirrelActorClass">
|
||||
<UniqueIdentifier>{d55ea374-ebc7-4345-8e15-dfb18c8dc856}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="源文件\SquirrelActorClass">
|
||||
<UniqueIdentifier>{7c17ea16-1631-4176-a371-194092bc82e3}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="头文件\SquirrelRegister">
|
||||
<UniqueIdentifier>{8eaaa8e3-81bc-4b00-89f4-1c716f5639fa}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="ogg">
|
||||
<UniqueIdentifier>{53dcb392-061b-469f-957c-4af7c786f9dc}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="main.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="BaseRead.cpp">
|
||||
<Filter>源文件\BaseToolClass</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Npk.cpp">
|
||||
<Filter>源文件\BaseToolClass</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="GameState.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SquirrelClassEx.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SquirrelActor.cpp">
|
||||
<Filter>源文件\SquirrelActorClass</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Cursor.cpp">
|
||||
<Filter>源文件\BaseToolClass</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SquirrelStage.cpp">
|
||||
<Filter>源文件\BaseToolClass</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SquirrelButton.cpp">
|
||||
<Filter>源文件\BaseToolClass</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SpriteEx.cpp">
|
||||
<Filter>源文件\BaseToolClass</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="WThreadPool.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SquirrelTownStage.cpp">
|
||||
<Filter>源文件\SquirrelActorClass</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="UiFrameWork.cpp">
|
||||
<Filter>源文件\SquirrelActorClass</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SquirrelCamera.cpp">
|
||||
<Filter>源文件\SquirrelActorClass</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SoundManager.cpp">
|
||||
<Filter>源文件\SquirrelActorClass</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="BaseRead.h">
|
||||
<Filter>头文件\BaseToolClass</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Npk.h">
|
||||
<Filter>头文件\BaseToolClass</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="GameState.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SquirrelClassEx.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SquirrelActor.h">
|
||||
<Filter>头文件\SquirrelActorClass</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Cursor.h">
|
||||
<Filter>头文件\BaseToolClass</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SquirrelStage.h">
|
||||
<Filter>头文件\BaseToolClass</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SquirrelButton.h">
|
||||
<Filter>头文件\BaseToolClass</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SpriteEx.h">
|
||||
<Filter>头文件\BaseToolClass</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="TextActorRegister.h">
|
||||
<Filter>头文件\SquirrelRegister</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SpriteActorRegister.h">
|
||||
<Filter>头文件\SquirrelRegister</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SoundActorRegister.h">
|
||||
<Filter>头文件\SquirrelRegister</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="StageActorRegister.h">
|
||||
<Filter>头文件\SquirrelRegister</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CanvasActorRegister.h">
|
||||
<Filter>头文件\SquirrelRegister</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ButtonActorRegister.h">
|
||||
<Filter>头文件\SquirrelRegister</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ImguiLayerActorRegister.h">
|
||||
<Filter>头文件\SquirrelRegister</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="include\json.hpp">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="LockQueue.hpp">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="WThreadPool.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ThreadRegister.h">
|
||||
<Filter>头文件\SquirrelRegister</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SquirrelCamera.h">
|
||||
<Filter>头文件\SquirrelActorClass</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SquirrelTownStage.h">
|
||||
<Filter>头文件\SquirrelActorClass</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="UiFrameWork.h">
|
||||
<Filter>头文件\SquirrelActorClass</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SoundManager.h">
|
||||
<Filter>头文件\SquirrelActorClass</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LocalDebuggerWorkingDirectory>I:\YosinGame</LocalDebuggerWorkingDirectory>
|
||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
[Window][Debug##Default]
|
||||
Pos=60,60
|
||||
Size=400,400
|
||||
Collapsed=0
|
||||
|
||||
[Window][测试窗口]
|
||||
Pos=398,335
|
||||
Size=54,120
|
||||
Collapsed=0
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,146 @@
|
|||
|
||||
#ifdef _SQ64
|
||||
|
||||
#ifdef _MSC_VER
|
||||
typedef __int64 SQInteger;
|
||||
typedef unsigned __int64 SQUnsignedInteger;
|
||||
typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/
|
||||
#else
|
||||
typedef long long SQInteger;
|
||||
typedef unsigned long long SQUnsignedInteger;
|
||||
typedef unsigned long long SQHash; /*should be the same size of a pointer*/
|
||||
#endif
|
||||
typedef int SQInt32;
|
||||
typedef unsigned int SQUnsignedInteger32;
|
||||
#else
|
||||
typedef int SQInteger;
|
||||
typedef int SQInt32; /*must be 32 bits(also on 64bits processors)*/
|
||||
typedef unsigned int SQUnsignedInteger32; /*must be 32 bits(also on 64bits processors)*/
|
||||
typedef unsigned int SQUnsignedInteger;
|
||||
typedef unsigned int SQHash; /*should be the same size of a pointer*/
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef SQUSEDOUBLE
|
||||
typedef double SQFloat;
|
||||
#else
|
||||
typedef float SQFloat;
|
||||
#endif
|
||||
|
||||
#if defined(SQUSEDOUBLE) && !defined(_SQ64) || !defined(SQUSEDOUBLE) && defined(_SQ64)
|
||||
#ifdef _MSC_VER
|
||||
typedef __int64 SQRawObjectVal; //must be 64bits
|
||||
#else
|
||||
typedef long long SQRawObjectVal; //must be 64bits
|
||||
#endif
|
||||
#define SQ_OBJECT_RAWINIT() { _unVal.raw = 0; }
|
||||
#else
|
||||
typedef SQUnsignedInteger SQRawObjectVal; //is 32 bits on 32 bits builds and 64 bits otherwise
|
||||
#define SQ_OBJECT_RAWINIT()
|
||||
#endif
|
||||
|
||||
#ifndef SQ_ALIGNMENT // SQ_ALIGNMENT shall be less than or equal to SQ_MALLOC alignments, and its value shall be power of 2.
|
||||
#if defined(SQUSEDOUBLE) || defined(_SQ64)
|
||||
#define SQ_ALIGNMENT 8
|
||||
#else
|
||||
#define SQ_ALIGNMENT 4
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef void* SQUserPointer;
|
||||
typedef SQUnsignedInteger SQBool;
|
||||
typedef SQInteger SQRESULT;
|
||||
|
||||
#ifdef SQUNICODE
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
|
||||
|
||||
typedef wchar_t SQChar;
|
||||
|
||||
|
||||
#define scstrcmp wcscmp
|
||||
#ifdef _WIN32
|
||||
#define scsprintf _snwprintf
|
||||
#else
|
||||
#define scsprintf swprintf
|
||||
#endif
|
||||
#define scstrlen wcslen
|
||||
#define scstrtod wcstod
|
||||
#ifdef _SQ64
|
||||
#define scstrtol wcstoll
|
||||
#else
|
||||
#define scstrtol wcstol
|
||||
#endif
|
||||
#define scstrtoul wcstoul
|
||||
#define scvsprintf vswprintf
|
||||
#define scstrstr wcsstr
|
||||
#define scprintf wprintf
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WCHAR_SIZE 2
|
||||
#define WCHAR_SHIFT_MUL 1
|
||||
#define MAX_CHAR 0xFFFF
|
||||
#else
|
||||
#define WCHAR_SIZE 4
|
||||
#define WCHAR_SHIFT_MUL 2
|
||||
#define MAX_CHAR 0xFFFFFFFF
|
||||
#endif
|
||||
|
||||
#define _SC(a) L##a
|
||||
|
||||
|
||||
#define scisspace iswspace
|
||||
#define scisdigit iswdigit
|
||||
#define scisprint iswprint
|
||||
#define scisxdigit iswxdigit
|
||||
#define scisalpha iswalpha
|
||||
#define sciscntrl iswcntrl
|
||||
#define scisalnum iswalnum
|
||||
|
||||
|
||||
#define sq_rsl(l) ((l)<<WCHAR_SHIFT_MUL)
|
||||
|
||||
#else
|
||||
typedef char SQChar;
|
||||
#define _SC(a) a
|
||||
#define scstrcmp strcmp
|
||||
#ifdef _MSC_VER
|
||||
#define scsprintf _snprintf
|
||||
#else
|
||||
#define scsprintf snprintf
|
||||
#endif
|
||||
#define scstrlen strlen
|
||||
#define scstrtod strtod
|
||||
#ifdef _SQ64
|
||||
#ifdef _MSC_VER
|
||||
#define scstrtol _strtoi64
|
||||
#else
|
||||
#define scstrtol strtoll
|
||||
#endif
|
||||
#else
|
||||
#define scstrtol strtol
|
||||
#endif
|
||||
#define scstrtoul strtoul
|
||||
#define scvsprintf vsnprintf
|
||||
#define scstrstr strstr
|
||||
#define scisspace isspace
|
||||
#define scisdigit isdigit
|
||||
#define scisprint isprint
|
||||
#define scisxdigit isxdigit
|
||||
#define sciscntrl iscntrl
|
||||
#define scisalpha isalpha
|
||||
#define scisalnum isalnum
|
||||
#define scprintf printf
|
||||
#define MAX_CHAR 0xFF
|
||||
|
||||
#define sq_rsl(l) (l)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef _SQ64
|
||||
#define _PRINT_INT_PREC _SC("ll")
|
||||
#define _PRINT_INT_FMT _SC("%lld")
|
||||
#else
|
||||
#define _PRINT_INT_FMT _SC("%d")
|
||||
#endif
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTD_AUXLIB_H_
|
||||
#define _SQSTD_AUXLIB_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
SQUIRREL_API void sqstd_seterrorhandlers(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sqstd_printcallstack(HSQUIRRELVM v);
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_throwerrorf(HSQUIRRELVM v,const SQChar *err,...);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /* _SQSTD_AUXLIB_H_ */
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTDBLOB_H_
|
||||
#define _SQSTDBLOB_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
SQUIRREL_API SQUserPointer sqstd_createblob(HSQUIRRELVM v, SQInteger size);
|
||||
SQUIRREL_API SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr);
|
||||
SQUIRREL_API SQInteger sqstd_getblobsize(HSQUIRRELVM v,SQInteger idx);
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_register_bloblib(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /*_SQSTDBLOB_H_*/
|
||||
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTDIO_H_
|
||||
#define _SQSTDIO_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#define SQSTD_STREAM_TYPE_TAG 0x80000000
|
||||
|
||||
struct SQStream {
|
||||
virtual ~SQStream() {}
|
||||
virtual SQInteger Read(void *buffer, SQInteger size) = 0;
|
||||
virtual SQInteger Write(void *buffer, SQInteger size) = 0;
|
||||
virtual SQInteger Flush() = 0;
|
||||
virtual SQInteger Tell() = 0;
|
||||
virtual SQInteger Len() = 0;
|
||||
virtual SQInteger Seek(SQInteger offset, SQInteger origin) = 0;
|
||||
virtual bool IsValid() = 0;
|
||||
virtual bool EOS() = 0;
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SQ_SEEK_CUR 0
|
||||
#define SQ_SEEK_END 1
|
||||
#define SQ_SEEK_SET 2
|
||||
|
||||
typedef void* SQFILE;
|
||||
|
||||
SQUIRREL_API SQFILE sqstd_fopen(const SQChar *,const SQChar *);
|
||||
SQUIRREL_API SQInteger sqstd_fread(SQUserPointer, SQInteger, SQInteger, SQFILE);
|
||||
SQUIRREL_API SQInteger sqstd_fwrite(const SQUserPointer, SQInteger, SQInteger, SQFILE);
|
||||
SQUIRREL_API SQInteger sqstd_fseek(SQFILE , SQInteger , SQInteger);
|
||||
SQUIRREL_API SQInteger sqstd_ftell(SQFILE);
|
||||
SQUIRREL_API SQInteger sqstd_fflush(SQFILE);
|
||||
SQUIRREL_API SQInteger sqstd_fclose(SQFILE);
|
||||
SQUIRREL_API SQInteger sqstd_feof(SQFILE);
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_createfile(HSQUIRRELVM v, SQFILE file,SQBool own);
|
||||
SQUIRREL_API SQRESULT sqstd_getfile(HSQUIRRELVM v, SQInteger idx, SQFILE *file);
|
||||
|
||||
//compiler helpers
|
||||
SQUIRREL_API SQRESULT sqstd_loadfile(HSQUIRRELVM v,const SQChar *filename,SQBool printerror);
|
||||
SQUIRREL_API SQRESULT sqstd_dofile(HSQUIRRELVM v,const SQChar *filename,SQBool retval,SQBool printerror);
|
||||
SQUIRREL_API SQRESULT sqstd_writeclosuretofile(HSQUIRRELVM v,const SQChar *filename);
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_register_iolib(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /*_SQSTDIO_H_*/
|
||||
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTD_MATH_H_
|
||||
#define _SQSTD_MATH_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_register_mathlib(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /*_SQSTD_MATH_H_*/
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTD_STRING_H_
|
||||
#define _SQSTD_STRING_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef unsigned int SQRexBool;
|
||||
typedef struct SQRex SQRex;
|
||||
|
||||
typedef struct {
|
||||
const SQChar *begin;
|
||||
SQInteger len;
|
||||
} SQRexMatch;
|
||||
|
||||
SQUIRREL_API SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error);
|
||||
SQUIRREL_API void sqstd_rex_free(SQRex *exp);
|
||||
SQUIRREL_API SQBool sqstd_rex_match(SQRex* exp,const SQChar* text);
|
||||
SQUIRREL_API SQBool sqstd_rex_search(SQRex* exp,const SQChar* text, const SQChar** out_begin, const SQChar** out_end);
|
||||
SQUIRREL_API SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* text_end,const SQChar** out_begin, const SQChar** out_end);
|
||||
SQUIRREL_API SQInteger sqstd_rex_getsubexpcount(SQRex* exp);
|
||||
SQUIRREL_API SQBool sqstd_rex_getsubexp(SQRex* exp, SQInteger n, SQRexMatch *subexp);
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen,SQChar **output);
|
||||
|
||||
SQUIRREL_API void sqstd_pushstringf(HSQUIRRELVM v,const SQChar *s,...);
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_register_stringlib(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /*_SQSTD_STRING_H_*/
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTD_SYSTEMLIB_H_
|
||||
#define _SQSTD_SYSTEMLIB_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
SQUIRREL_API SQInteger sqstd_register_systemlib(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /* _SQSTD_SYSTEMLIB_H_ */
|
||||
|
|
@ -0,0 +1,411 @@
|
|||
/*
|
||||
Copyright (c) 2003-2022 Alberto Demichelis
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
#ifndef _SQUIRREL_H_
|
||||
#define _SQUIRREL_H_
|
||||
|
||||
#ifdef _SQ_CONFIG_INCLUDE
|
||||
#include _SQ_CONFIG_INCLUDE
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef SQUIRREL_API
|
||||
#define SQUIRREL_API extern
|
||||
#endif
|
||||
|
||||
#if (defined(_WIN64) || defined(_LP64))
|
||||
#ifndef _SQ64
|
||||
#define _SQ64
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#define SQTrue (1)
|
||||
#define SQFalse (0)
|
||||
|
||||
struct SQVM;
|
||||
struct SQTable;
|
||||
struct SQArray;
|
||||
struct SQString;
|
||||
struct SQClosure;
|
||||
struct SQGenerator;
|
||||
struct SQNativeClosure;
|
||||
struct SQUserData;
|
||||
struct SQFunctionProto;
|
||||
struct SQRefCounted;
|
||||
struct SQClass;
|
||||
struct SQInstance;
|
||||
struct SQDelegable;
|
||||
struct SQOuter;
|
||||
|
||||
#ifdef _UNICODE
|
||||
#define SQUNICODE
|
||||
#endif
|
||||
|
||||
#include "sqconfig.h"
|
||||
|
||||
#define SQUIRREL_VERSION _SC("Squirrel 3.2 stable")
|
||||
#define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2022 Alberto Demichelis")
|
||||
#define SQUIRREL_AUTHOR _SC("Alberto Demichelis")
|
||||
#define SQUIRREL_VERSION_NUMBER 320
|
||||
|
||||
#define SQ_VMSTATE_IDLE 0
|
||||
#define SQ_VMSTATE_RUNNING 1
|
||||
#define SQ_VMSTATE_SUSPENDED 2
|
||||
|
||||
#define SQUIRREL_EOB 0
|
||||
#define SQ_BYTECODE_STREAM_TAG 0xFAFA
|
||||
|
||||
#define SQOBJECT_REF_COUNTED 0x08000000
|
||||
#define SQOBJECT_NUMERIC 0x04000000
|
||||
#define SQOBJECT_DELEGABLE 0x02000000
|
||||
#define SQOBJECT_CANBEFALSE 0x01000000
|
||||
|
||||
#define SQ_MATCHTYPEMASKSTRING (-99999)
|
||||
|
||||
#define _RT_MASK 0x00FFFFFF
|
||||
#define _RAW_TYPE(type) (type&_RT_MASK)
|
||||
|
||||
#define _RT_NULL 0x00000001
|
||||
#define _RT_INTEGER 0x00000002
|
||||
#define _RT_FLOAT 0x00000004
|
||||
#define _RT_BOOL 0x00000008
|
||||
#define _RT_STRING 0x00000010
|
||||
#define _RT_TABLE 0x00000020
|
||||
#define _RT_ARRAY 0x00000040
|
||||
#define _RT_USERDATA 0x00000080
|
||||
#define _RT_CLOSURE 0x00000100
|
||||
#define _RT_NATIVECLOSURE 0x00000200
|
||||
#define _RT_GENERATOR 0x00000400
|
||||
#define _RT_USERPOINTER 0x00000800
|
||||
#define _RT_THREAD 0x00001000
|
||||
#define _RT_FUNCPROTO 0x00002000
|
||||
#define _RT_CLASS 0x00004000
|
||||
#define _RT_INSTANCE 0x00008000
|
||||
#define _RT_WEAKREF 0x00010000
|
||||
#define _RT_OUTER 0x00020000
|
||||
|
||||
typedef enum tagSQObjectType{
|
||||
OT_NULL = (_RT_NULL|SQOBJECT_CANBEFALSE),
|
||||
OT_INTEGER = (_RT_INTEGER|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
|
||||
OT_FLOAT = (_RT_FLOAT|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
|
||||
OT_BOOL = (_RT_BOOL|SQOBJECT_CANBEFALSE),
|
||||
OT_STRING = (_RT_STRING|SQOBJECT_REF_COUNTED),
|
||||
OT_TABLE = (_RT_TABLE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
|
||||
OT_ARRAY = (_RT_ARRAY|SQOBJECT_REF_COUNTED),
|
||||
OT_USERDATA = (_RT_USERDATA|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
|
||||
OT_CLOSURE = (_RT_CLOSURE|SQOBJECT_REF_COUNTED),
|
||||
OT_NATIVECLOSURE = (_RT_NATIVECLOSURE|SQOBJECT_REF_COUNTED),
|
||||
OT_GENERATOR = (_RT_GENERATOR|SQOBJECT_REF_COUNTED),
|
||||
OT_USERPOINTER = _RT_USERPOINTER,
|
||||
OT_THREAD = (_RT_THREAD|SQOBJECT_REF_COUNTED) ,
|
||||
OT_FUNCPROTO = (_RT_FUNCPROTO|SQOBJECT_REF_COUNTED), //internal usage only
|
||||
OT_CLASS = (_RT_CLASS|SQOBJECT_REF_COUNTED),
|
||||
OT_INSTANCE = (_RT_INSTANCE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
|
||||
OT_WEAKREF = (_RT_WEAKREF|SQOBJECT_REF_COUNTED),
|
||||
OT_OUTER = (_RT_OUTER|SQOBJECT_REF_COUNTED) //internal usage only
|
||||
}SQObjectType;
|
||||
|
||||
#define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED)
|
||||
|
||||
|
||||
typedef union tagSQObjectValue
|
||||
{
|
||||
struct SQTable *pTable;
|
||||
struct SQArray *pArray;
|
||||
struct SQClosure *pClosure;
|
||||
struct SQOuter *pOuter;
|
||||
struct SQGenerator *pGenerator;
|
||||
struct SQNativeClosure *pNativeClosure;
|
||||
struct SQString *pString;
|
||||
struct SQUserData *pUserData;
|
||||
SQInteger nInteger;
|
||||
SQFloat fFloat;
|
||||
SQUserPointer pUserPointer;
|
||||
struct SQFunctionProto *pFunctionProto;
|
||||
struct SQRefCounted *pRefCounted;
|
||||
struct SQDelegable *pDelegable;
|
||||
struct SQVM *pThread;
|
||||
struct SQClass *pClass;
|
||||
struct SQInstance *pInstance;
|
||||
struct SQWeakRef *pWeakRef;
|
||||
SQRawObjectVal raw;
|
||||
}SQObjectValue;
|
||||
|
||||
|
||||
typedef struct tagSQObject
|
||||
{
|
||||
SQObjectType _type;
|
||||
SQObjectValue _unVal;
|
||||
}SQObject;
|
||||
|
||||
typedef struct tagSQMemberHandle{
|
||||
SQBool _static;
|
||||
SQInteger _index;
|
||||
}SQMemberHandle;
|
||||
|
||||
typedef struct tagSQStackInfos{
|
||||
const SQChar* funcname;
|
||||
const SQChar* source;
|
||||
SQInteger line;
|
||||
}SQStackInfos;
|
||||
|
||||
typedef struct SQVM* HSQUIRRELVM;
|
||||
typedef SQObject HSQOBJECT;
|
||||
typedef SQMemberHandle HSQMEMBERHANDLE;
|
||||
typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM);
|
||||
typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size);
|
||||
typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/);
|
||||
typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...);
|
||||
typedef void (*SQDEBUGHOOK)(HSQUIRRELVM /*v*/, SQInteger /*type*/, const SQChar * /*sourcename*/, SQInteger /*line*/, const SQChar * /*funcname*/);
|
||||
typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger);
|
||||
typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger);
|
||||
|
||||
typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer);
|
||||
|
||||
typedef struct tagSQRegFunction{
|
||||
const SQChar *name;
|
||||
SQFUNCTION f;
|
||||
SQInteger nparamscheck;
|
||||
const SQChar *typemask;
|
||||
}SQRegFunction;
|
||||
|
||||
typedef struct tagSQFunctionInfo {
|
||||
SQUserPointer funcid;
|
||||
const SQChar *name;
|
||||
const SQChar *source;
|
||||
SQInteger line;
|
||||
}SQFunctionInfo;
|
||||
|
||||
/*vm*/
|
||||
SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize);
|
||||
SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize);
|
||||
SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_close(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p);
|
||||
SQUIRREL_API SQUserPointer sq_getforeignptr(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_setsharedforeignptr(HSQUIRRELVM v,SQUserPointer p);
|
||||
SQUIRREL_API SQUserPointer sq_getsharedforeignptr(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_setvmreleasehook(HSQUIRRELVM v,SQRELEASEHOOK hook);
|
||||
SQUIRREL_API SQRELEASEHOOK sq_getvmreleasehook(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_setsharedreleasehook(HSQUIRRELVM v,SQRELEASEHOOK hook);
|
||||
SQUIRREL_API SQRELEASEHOOK sq_getsharedreleasehook(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc,SQPRINTFUNCTION errfunc);
|
||||
SQUIRREL_API SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v);
|
||||
SQUIRREL_API SQPRINTFUNCTION sq_geterrorfunc(HSQUIRRELVM v);
|
||||
SQUIRREL_API SQRESULT sq_suspendvm(HSQUIRRELVM v);
|
||||
SQUIRREL_API SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror,SQBool throwerror);
|
||||
SQUIRREL_API SQInteger sq_getvmstate(HSQUIRRELVM v);
|
||||
SQUIRREL_API SQInteger sq_getversion();
|
||||
|
||||
/*compiler*/
|
||||
SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror);
|
||||
SQUIRREL_API SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror);
|
||||
SQUIRREL_API void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable);
|
||||
SQUIRREL_API void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable);
|
||||
SQUIRREL_API void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f);
|
||||
|
||||
/*stack operations*/
|
||||
SQUIRREL_API void sq_push(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop);
|
||||
SQUIRREL_API void sq_poptop(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_remove(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQInteger sq_gettop(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_settop(HSQUIRRELVM v,SQInteger newtop);
|
||||
SQUIRREL_API SQRESULT sq_reservestack(HSQUIRRELVM v,SQInteger nsize);
|
||||
SQUIRREL_API SQInteger sq_cmp(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx);
|
||||
|
||||
/*object creation handling*/
|
||||
SQUIRREL_API SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size);
|
||||
SQUIRREL_API void sq_newtable(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_newtableex(HSQUIRRELVM v,SQInteger initialcapacity);
|
||||
SQUIRREL_API void sq_newarray(HSQUIRRELVM v,SQInteger size);
|
||||
SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars);
|
||||
SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);
|
||||
SQUIRREL_API SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_setclosureroot(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_getclosureroot(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len);
|
||||
SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f);
|
||||
SQUIRREL_API void sq_pushinteger(HSQUIRRELVM v,SQInteger n);
|
||||
SQUIRREL_API void sq_pushbool(HSQUIRRELVM v,SQBool b);
|
||||
SQUIRREL_API void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p);
|
||||
SQUIRREL_API void sq_pushnull(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_pushthread(HSQUIRRELVM v, HSQUIRRELVM thread);
|
||||
SQUIRREL_API SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_typeof(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQInteger sq_getsize(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQHash sq_gethash(HSQUIRRELVM v, SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQBool sq_instanceof(HSQUIRRELVM v);
|
||||
SQUIRREL_API SQRESULT sq_tostring(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b);
|
||||
SQUIRREL_API SQRESULT sq_getstringandsize(HSQUIRRELVM v,SQInteger idx,const SQChar **c,SQInteger *size);
|
||||
SQUIRREL_API SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c);
|
||||
SQUIRREL_API SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
|
||||
SQUIRREL_API SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
|
||||
SQUIRREL_API SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b);
|
||||
SQUIRREL_API SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread);
|
||||
SQUIRREL_API SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p);
|
||||
SQUIRREL_API SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag);
|
||||
SQUIRREL_API SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
|
||||
SQUIRREL_API SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
|
||||
SQUIRREL_API void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook);
|
||||
SQUIRREL_API SQRELEASEHOOK sq_getreleasehook(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize);
|
||||
SQUIRREL_API SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi);
|
||||
SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQInteger *nparams,SQInteger *nfreevars);
|
||||
SQUIRREL_API SQRESULT sq_getclosurename(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name);
|
||||
SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p);
|
||||
SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag,SQBool throwerror);
|
||||
SQUIRREL_API SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize);
|
||||
SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
|
||||
SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API void sq_weakref(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t);
|
||||
SQUIRREL_API SQRESULT sq_getmemberhandle(HSQUIRRELVM v,SQInteger idx,HSQMEMBERHANDLE *handle);
|
||||
SQUIRREL_API SQRESULT sq_getbyhandle(HSQUIRRELVM v,SQInteger idx,const HSQMEMBERHANDLE *handle);
|
||||
SQUIRREL_API SQRESULT sq_setbyhandle(HSQUIRRELVM v,SQInteger idx,const HSQMEMBERHANDLE *handle);
|
||||
|
||||
/*object manipulation*/
|
||||
SQUIRREL_API void sq_pushroottable(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_pushconsttable(HSQUIRRELVM v);
|
||||
SQUIRREL_API SQRESULT sq_setroottable(HSQUIRRELVM v);
|
||||
SQUIRREL_API SQRESULT sq_setconsttable(HSQUIRRELVM v);
|
||||
SQUIRREL_API SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic);
|
||||
SQUIRREL_API SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
|
||||
SQUIRREL_API SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
|
||||
SQUIRREL_API SQRESULT sq_newmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic);
|
||||
SQUIRREL_API SQRESULT sq_rawnewmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic);
|
||||
SQUIRREL_API SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
|
||||
SQUIRREL_API SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize);
|
||||
SQUIRREL_API SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_arrayremove(HSQUIRRELVM v,SQInteger idx,SQInteger itemidx);
|
||||
SQUIRREL_API SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos);
|
||||
SQUIRREL_API SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
|
||||
SQUIRREL_API SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx);
|
||||
|
||||
/*calls*/
|
||||
SQUIRREL_API SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror);
|
||||
SQUIRREL_API SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror);
|
||||
SQUIRREL_API const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
|
||||
SQUIRREL_API SQRESULT sq_getcallee(HSQUIRRELVM v);
|
||||
SQUIRREL_API const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
|
||||
SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err);
|
||||
SQUIRREL_API SQRESULT sq_throwobject(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_reseterror(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);
|
||||
SQUIRREL_API SQRESULT sq_tailcall(HSQUIRRELVM v, SQInteger nparams);
|
||||
|
||||
/*raw object handling*/
|
||||
SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);
|
||||
SQUIRREL_API void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj);
|
||||
SQUIRREL_API void sq_addref(HSQUIRRELVM v,HSQOBJECT *po);
|
||||
SQUIRREL_API SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po);
|
||||
SQUIRREL_API SQUnsignedInteger sq_getrefcount(HSQUIRRELVM v,HSQOBJECT *po);
|
||||
SQUIRREL_API void sq_resetobject(HSQOBJECT *po);
|
||||
SQUIRREL_API const SQChar *sq_objtostring(const HSQOBJECT *o);
|
||||
SQUIRREL_API SQBool sq_objtobool(const HSQOBJECT *o);
|
||||
SQUIRREL_API SQInteger sq_objtointeger(const HSQOBJECT *o);
|
||||
SQUIRREL_API SQFloat sq_objtofloat(const HSQOBJECT *o);
|
||||
SQUIRREL_API SQUserPointer sq_objtouserpointer(const HSQOBJECT *o);
|
||||
SQUIRREL_API SQRESULT sq_getobjtypetag(const HSQOBJECT *o,SQUserPointer * typetag);
|
||||
SQUIRREL_API SQUnsignedInteger sq_getvmrefcount(HSQUIRRELVM v, const HSQOBJECT *po);
|
||||
|
||||
|
||||
/*GC*/
|
||||
SQUIRREL_API SQInteger sq_collectgarbage(HSQUIRRELVM v);
|
||||
SQUIRREL_API SQRESULT sq_resurrectunreachable(HSQUIRRELVM v);
|
||||
|
||||
/*serialization*/
|
||||
SQUIRREL_API SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
|
||||
SQUIRREL_API SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up);
|
||||
|
||||
/*mem allocation*/
|
||||
SQUIRREL_API void *sq_malloc(SQUnsignedInteger size);
|
||||
SQUIRREL_API void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize);
|
||||
SQUIRREL_API void sq_free(void *p,SQUnsignedInteger size);
|
||||
|
||||
/*debug*/
|
||||
SQUIRREL_API SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si);
|
||||
SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sq_setnativedebughook(HSQUIRRELVM v,SQDEBUGHOOK hook);
|
||||
|
||||
/*UTILITY MACRO*/
|
||||
#define sq_isnumeric(o) ((o)._type&SQOBJECT_NUMERIC)
|
||||
#define sq_istable(o) ((o)._type==OT_TABLE)
|
||||
#define sq_isarray(o) ((o)._type==OT_ARRAY)
|
||||
#define sq_isfunction(o) ((o)._type==OT_FUNCPROTO)
|
||||
#define sq_isclosure(o) ((o)._type==OT_CLOSURE)
|
||||
#define sq_isgenerator(o) ((o)._type==OT_GENERATOR)
|
||||
#define sq_isnativeclosure(o) ((o)._type==OT_NATIVECLOSURE)
|
||||
#define sq_isstring(o) ((o)._type==OT_STRING)
|
||||
#define sq_isinteger(o) ((o)._type==OT_INTEGER)
|
||||
#define sq_isfloat(o) ((o)._type==OT_FLOAT)
|
||||
#define sq_isuserpointer(o) ((o)._type==OT_USERPOINTER)
|
||||
#define sq_isuserdata(o) ((o)._type==OT_USERDATA)
|
||||
#define sq_isthread(o) ((o)._type==OT_THREAD)
|
||||
#define sq_isnull(o) ((o)._type==OT_NULL)
|
||||
#define sq_isclass(o) ((o)._type==OT_CLASS)
|
||||
#define sq_isinstance(o) ((o)._type==OT_INSTANCE)
|
||||
#define sq_isbool(o) ((o)._type==OT_BOOL)
|
||||
#define sq_isweakref(o) ((o)._type==OT_WEAKREF)
|
||||
#define sq_type(o) ((o)._type)
|
||||
|
||||
/* deprecated */
|
||||
#define sq_createslot(v,n) sq_newslot(v,n,SQFalse)
|
||||
|
||||
#define SQ_OK (0)
|
||||
#define SQ_ERROR (-1)
|
||||
|
||||
#define SQ_FAILED(res) (res<0)
|
||||
#define SQ_SUCCEEDED(res) (res>=0)
|
||||
|
||||
#ifdef __GNUC__
|
||||
# define SQ_UNUSED_ARG(x) x __attribute__((__unused__))
|
||||
#else
|
||||
# define SQ_UNUSED_ARG(x) x
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /*_SQUIRREL_H_*/
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,36 @@
|
|||
|
||||
#include "SquirrelClassEx.h"
|
||||
#include "GameState.h"
|
||||
//Èë¿Ú²ÎÊý
|
||||
/*
|
||||
1. Token
|
||||
2. GameMode
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
SquirrelClassEx* TObject;
|
||||
NPK_M* npk;
|
||||
#include <atlimage.h>
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if (argc < 2) {
|
||||
|
||||
}
|
||||
|
||||
npk = new NPK_M();
|
||||
npk->init();
|
||||
|
||||
SquirrelClassEx* V = new SquirrelClassEx();
|
||||
V->Init();
|
||||
|
||||
GameState* Game = new GameState();
|
||||
Game->Run();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="zlib-msvc14-x64" version="1.2.11.7795" targetFramework="native" />
|
||||
</packages>
|
||||
Binary file not shown.
|
|
@ -0,0 +1,368 @@
|
|||
|
||||
Frequently Asked Questions about zlib
|
||||
|
||||
|
||||
If your question is not there, please check the zlib home page
|
||||
http://zlib.net/ which may have more recent information.
|
||||
The lastest zlib FAQ is at http://zlib.net/zlib_faq.html
|
||||
|
||||
|
||||
1. Is zlib Y2K-compliant?
|
||||
|
||||
Yes. zlib doesn't handle dates.
|
||||
|
||||
2. Where can I get a Windows DLL version?
|
||||
|
||||
The zlib sources can be compiled without change to produce a DLL. See the
|
||||
file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the
|
||||
precompiled DLL are found in the zlib web site at http://zlib.net/ .
|
||||
|
||||
3. Where can I get a Visual Basic interface to zlib?
|
||||
|
||||
See
|
||||
* http://marknelson.us/1997/01/01/zlib-engine/
|
||||
* win32/DLL_FAQ.txt in the zlib distribution
|
||||
|
||||
4. compress() returns Z_BUF_ERROR.
|
||||
|
||||
Make sure that before the call of compress(), the length of the compressed
|
||||
buffer is equal to the available size of the compressed buffer and not
|
||||
zero. For Visual Basic, check that this parameter is passed by reference
|
||||
("as any"), not by value ("as long").
|
||||
|
||||
5. deflate() or inflate() returns Z_BUF_ERROR.
|
||||
|
||||
Before making the call, make sure that avail_in and avail_out are not zero.
|
||||
When setting the parameter flush equal to Z_FINISH, also make sure that
|
||||
avail_out is big enough to allow processing all pending input. Note that a
|
||||
Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be
|
||||
made with more input or output space. A Z_BUF_ERROR may in fact be
|
||||
unavoidable depending on how the functions are used, since it is not
|
||||
possible to tell whether or not there is more output pending when
|
||||
strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a
|
||||
heavily annotated example.
|
||||
|
||||
6. Where's the zlib documentation (man pages, etc.)?
|
||||
|
||||
It's in zlib.h . Examples of zlib usage are in the files test/example.c
|
||||
and test/minigzip.c, with more in examples/ .
|
||||
|
||||
7. Why don't you use GNU autoconf or libtool or ...?
|
||||
|
||||
Because we would like to keep zlib as a very small and simple package.
|
||||
zlib is rather portable and doesn't need much configuration.
|
||||
|
||||
8. I found a bug in zlib.
|
||||
|
||||
Most of the time, such problems are due to an incorrect usage of zlib.
|
||||
Please try to reproduce the problem with a small program and send the
|
||||
corresponding source to us at zlib@gzip.org . Do not send multi-megabyte
|
||||
data files without prior agreement.
|
||||
|
||||
9. Why do I get "undefined reference to gzputc"?
|
||||
|
||||
If "make test" produces something like
|
||||
|
||||
example.o(.text+0x154): undefined reference to `gzputc'
|
||||
|
||||
check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
|
||||
/usr/X11R6/lib. Remove any old versions, then do "make install".
|
||||
|
||||
10. I need a Delphi interface to zlib.
|
||||
|
||||
See the contrib/delphi directory in the zlib distribution.
|
||||
|
||||
11. Can zlib handle .zip archives?
|
||||
|
||||
Not by itself, no. See the directory contrib/minizip in the zlib
|
||||
distribution.
|
||||
|
||||
12. Can zlib handle .Z files?
|
||||
|
||||
No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
|
||||
the code of uncompress on your own.
|
||||
|
||||
13. How can I make a Unix shared library?
|
||||
|
||||
By default a shared (and a static) library is built for Unix. So:
|
||||
|
||||
make distclean
|
||||
./configure
|
||||
make
|
||||
|
||||
14. How do I install a shared zlib library on Unix?
|
||||
|
||||
After the above, then:
|
||||
|
||||
make install
|
||||
|
||||
However, many flavors of Unix come with a shared zlib already installed.
|
||||
Before going to the trouble of compiling a shared version of zlib and
|
||||
trying to install it, you may want to check if it's already there! If you
|
||||
can #include <zlib.h>, it's there. The -lz option will probably link to
|
||||
it. You can check the version at the top of zlib.h or with the
|
||||
ZLIB_VERSION symbol defined in zlib.h .
|
||||
|
||||
15. I have a question about OttoPDF.
|
||||
|
||||
We are not the authors of OttoPDF. The real author is on the OttoPDF web
|
||||
site: Joel Hainley, jhainley@myndkryme.com.
|
||||
|
||||
16. Can zlib decode Flate data in an Adobe PDF file?
|
||||
|
||||
Yes. See http://www.pdflib.com/ . To modify PDF forms, see
|
||||
http://sourceforge.net/projects/acroformtool/ .
|
||||
|
||||
17. Why am I getting this "register_frame_info not found" error on Solaris?
|
||||
|
||||
After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib
|
||||
generates an error such as:
|
||||
|
||||
ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so:
|
||||
symbol __register_frame_info: referenced symbol not found
|
||||
|
||||
The symbol __register_frame_info is not part of zlib, it is generated by
|
||||
the C compiler (cc or gcc). You must recompile applications using zlib
|
||||
which have this problem. This problem is specific to Solaris. See
|
||||
http://www.sunfreeware.com for Solaris versions of zlib and applications
|
||||
using zlib.
|
||||
|
||||
18. Why does gzip give an error on a file I make with compress/deflate?
|
||||
|
||||
The compress and deflate functions produce data in the zlib format, which
|
||||
is different and incompatible with the gzip format. The gz* functions in
|
||||
zlib on the other hand use the gzip format. Both the zlib and gzip formats
|
||||
use the same compressed data format internally, but have different headers
|
||||
and trailers around the compressed data.
|
||||
|
||||
19. Ok, so why are there two different formats?
|
||||
|
||||
The gzip format was designed to retain the directory information about a
|
||||
single file, such as the name and last modification date. The zlib format
|
||||
on the other hand was designed for in-memory and communication channel
|
||||
applications, and has a much more compact header and trailer and uses a
|
||||
faster integrity check than gzip.
|
||||
|
||||
20. Well that's nice, but how do I make a gzip file in memory?
|
||||
|
||||
You can request that deflate write the gzip format instead of the zlib
|
||||
format using deflateInit2(). You can also request that inflate decode the
|
||||
gzip format using inflateInit2(). Read zlib.h for more details.
|
||||
|
||||
21. Is zlib thread-safe?
|
||||
|
||||
Yes. However any library routines that zlib uses and any application-
|
||||
provided memory allocation routines must also be thread-safe. zlib's gz*
|
||||
functions use stdio library routines, and most of zlib's functions use the
|
||||
library memory allocation routines by default. zlib's *Init* functions
|
||||
allow for the application to provide custom memory allocation routines.
|
||||
|
||||
Of course, you should only operate on any given zlib or gzip stream from a
|
||||
single thread at a time.
|
||||
|
||||
22. Can I use zlib in my commercial application?
|
||||
|
||||
Yes. Please read the license in zlib.h.
|
||||
|
||||
23. Is zlib under the GNU license?
|
||||
|
||||
No. Please read the license in zlib.h.
|
||||
|
||||
24. The license says that altered source versions must be "plainly marked". So
|
||||
what exactly do I need to do to meet that requirement?
|
||||
|
||||
You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In
|
||||
particular, the final version number needs to be changed to "f", and an
|
||||
identification string should be appended to ZLIB_VERSION. Version numbers
|
||||
x.x.x.f are reserved for modifications to zlib by others than the zlib
|
||||
maintainers. For example, if the version of the base zlib you are altering
|
||||
is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and
|
||||
ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also
|
||||
update the version strings in deflate.c and inftrees.c.
|
||||
|
||||
For altered source distributions, you should also note the origin and
|
||||
nature of the changes in zlib.h, as well as in ChangeLog and README, along
|
||||
with the dates of the alterations. The origin should include at least your
|
||||
name (or your company's name), and an email address to contact for help or
|
||||
issues with the library.
|
||||
|
||||
Note that distributing a compiled zlib library along with zlib.h and
|
||||
zconf.h is also a source distribution, and so you should change
|
||||
ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes
|
||||
in zlib.h as you would for a full source distribution.
|
||||
|
||||
25. Will zlib work on a big-endian or little-endian architecture, and can I
|
||||
exchange compressed data between them?
|
||||
|
||||
Yes and yes.
|
||||
|
||||
26. Will zlib work on a 64-bit machine?
|
||||
|
||||
Yes. It has been tested on 64-bit machines, and has no dependence on any
|
||||
data types being limited to 32-bits in length. If you have any
|
||||
difficulties, please provide a complete problem report to zlib@gzip.org
|
||||
|
||||
27. Will zlib decompress data from the PKWare Data Compression Library?
|
||||
|
||||
No. The PKWare DCL uses a completely different compressed data format than
|
||||
does PKZIP and zlib. However, you can look in zlib's contrib/blast
|
||||
directory for a possible solution to your problem.
|
||||
|
||||
28. Can I access data randomly in a compressed stream?
|
||||
|
||||
No, not without some preparation. If when compressing you periodically use
|
||||
Z_FULL_FLUSH, carefully write all the pending data at those points, and
|
||||
keep an index of those locations, then you can start decompression at those
|
||||
points. You have to be careful to not use Z_FULL_FLUSH too often, since it
|
||||
can significantly degrade compression. Alternatively, you can scan a
|
||||
deflate stream once to generate an index, and then use that index for
|
||||
random access. See examples/zran.c .
|
||||
|
||||
29. Does zlib work on MVS, OS/390, CICS, etc.?
|
||||
|
||||
It has in the past, but we have not heard of any recent evidence. There
|
||||
were working ports of zlib 1.1.4 to MVS, but those links no longer work.
|
||||
If you know of recent, successful applications of zlib on these operating
|
||||
systems, please let us know. Thanks.
|
||||
|
||||
30. Is there some simpler, easier to read version of inflate I can look at to
|
||||
understand the deflate format?
|
||||
|
||||
First off, you should read RFC 1951. Second, yes. Look in zlib's
|
||||
contrib/puff directory.
|
||||
|
||||
31. Does zlib infringe on any patents?
|
||||
|
||||
As far as we know, no. In fact, that was originally the whole point behind
|
||||
zlib. Look here for some more information:
|
||||
|
||||
http://www.gzip.org/#faq11
|
||||
|
||||
32. Can zlib work with greater than 4 GB of data?
|
||||
|
||||
Yes. inflate() and deflate() will process any amount of data correctly.
|
||||
Each call of inflate() or deflate() is limited to input and output chunks
|
||||
of the maximum value that can be stored in the compiler's "unsigned int"
|
||||
type, but there is no limit to the number of chunks. Note however that the
|
||||
strm.total_in and strm_total_out counters may be limited to 4 GB. These
|
||||
counters are provided as a convenience and are not used internally by
|
||||
inflate() or deflate(). The application can easily set up its own counters
|
||||
updated after each call of inflate() or deflate() to count beyond 4 GB.
|
||||
compress() and uncompress() may be limited to 4 GB, since they operate in a
|
||||
single call. gzseek() and gztell() may be limited to 4 GB depending on how
|
||||
zlib is compiled. See the zlibCompileFlags() function in zlib.h.
|
||||
|
||||
The word "may" appears several times above since there is a 4 GB limit only
|
||||
if the compiler's "long" type is 32 bits. If the compiler's "long" type is
|
||||
64 bits, then the limit is 16 exabytes.
|
||||
|
||||
33. Does zlib have any security vulnerabilities?
|
||||
|
||||
The only one that we are aware of is potentially in gzprintf(). If zlib is
|
||||
compiled to use sprintf() or vsprintf(), then there is no protection
|
||||
against a buffer overflow of an 8K string space (or other value as set by
|
||||
gzbuffer()), other than the caller of gzprintf() assuring that the output
|
||||
will not exceed 8K. On the other hand, if zlib is compiled to use
|
||||
snprintf() or vsnprintf(), which should normally be the case, then there is
|
||||
no vulnerability. The ./configure script will display warnings if an
|
||||
insecure variation of sprintf() will be used by gzprintf(). Also the
|
||||
zlibCompileFlags() function will return information on what variant of
|
||||
sprintf() is used by gzprintf().
|
||||
|
||||
If you don't have snprintf() or vsnprintf() and would like one, you can
|
||||
find a portable implementation here:
|
||||
|
||||
http://www.ijs.si/software/snprintf/
|
||||
|
||||
Note that you should be using the most recent version of zlib. Versions
|
||||
1.1.3 and before were subject to a double-free vulnerability, and versions
|
||||
1.2.1 and 1.2.2 were subject to an access exception when decompressing
|
||||
invalid compressed data.
|
||||
|
||||
34. Is there a Java version of zlib?
|
||||
|
||||
Probably what you want is to use zlib in Java. zlib is already included
|
||||
as part of the Java SDK in the java.util.zip package. If you really want
|
||||
a version of zlib written in the Java language, look on the zlib home
|
||||
page for links: http://zlib.net/ .
|
||||
|
||||
35. I get this or that compiler or source-code scanner warning when I crank it
|
||||
up to maximally-pedantic. Can't you guys write proper code?
|
||||
|
||||
Many years ago, we gave up attempting to avoid warnings on every compiler
|
||||
in the universe. It just got to be a waste of time, and some compilers
|
||||
were downright silly as well as contradicted each other. So now, we simply
|
||||
make sure that the code always works.
|
||||
|
||||
36. Valgrind (or some similar memory access checker) says that deflate is
|
||||
performing a conditional jump that depends on an uninitialized value.
|
||||
Isn't that a bug?
|
||||
|
||||
No. That is intentional for performance reasons, and the output of deflate
|
||||
is not affected. This only started showing up recently since zlib 1.2.x
|
||||
uses malloc() by default for allocations, whereas earlier versions used
|
||||
calloc(), which zeros out the allocated memory. Even though the code was
|
||||
correct, versions 1.2.4 and later was changed to not stimulate these
|
||||
checkers.
|
||||
|
||||
37. Will zlib read the (insert any ancient or arcane format here) compressed
|
||||
data format?
|
||||
|
||||
Probably not. Look in the comp.compression FAQ for pointers to various
|
||||
formats and associated software.
|
||||
|
||||
38. How can I encrypt/decrypt zip files with zlib?
|
||||
|
||||
zlib doesn't support encryption. The original PKZIP encryption is very
|
||||
weak and can be broken with freely available programs. To get strong
|
||||
encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib
|
||||
compression. For PKZIP compatible "encryption", look at
|
||||
http://www.info-zip.org/
|
||||
|
||||
39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
|
||||
|
||||
"gzip" is the gzip format, and "deflate" is the zlib format. They should
|
||||
probably have called the second one "zlib" instead to avoid confusion with
|
||||
the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
|
||||
correctly points to the zlib specification in RFC 1950 for the "deflate"
|
||||
transfer encoding, there have been reports of servers and browsers that
|
||||
incorrectly produce or expect raw deflate data per the deflate
|
||||
specification in RFC 1951, most notably Microsoft. So even though the
|
||||
"deflate" transfer encoding using the zlib format would be the more
|
||||
efficient approach (and in fact exactly what the zlib format was designed
|
||||
for), using the "gzip" transfer encoding is probably more reliable due to
|
||||
an unfortunate choice of name on the part of the HTTP 1.1 authors.
|
||||
|
||||
Bottom line: use the gzip format for HTTP 1.1 encoding.
|
||||
|
||||
40. Does zlib support the new "Deflate64" format introduced by PKWare?
|
||||
|
||||
No. PKWare has apparently decided to keep that format proprietary, since
|
||||
they have not documented it as they have previous compression formats. In
|
||||
any case, the compression improvements are so modest compared to other more
|
||||
modern approaches, that it's not worth the effort to implement.
|
||||
|
||||
41. I'm having a problem with the zip functions in zlib, can you help?
|
||||
|
||||
There are no zip functions in zlib. You are probably using minizip by
|
||||
Giles Vollant, which is found in the contrib directory of zlib. It is not
|
||||
part of zlib. In fact none of the stuff in contrib is part of zlib. The
|
||||
files in there are not supported by the zlib authors. You need to contact
|
||||
the authors of the respective contribution for help.
|
||||
|
||||
42. The match.asm code in contrib is under the GNU General Public License.
|
||||
Since it's part of zlib, doesn't that mean that all of zlib falls under the
|
||||
GNU GPL?
|
||||
|
||||
No. The files in contrib are not part of zlib. They were contributed by
|
||||
other authors and are provided as a convenience to the user within the zlib
|
||||
distribution. Each item in contrib has its own license.
|
||||
|
||||
43. Is zlib subject to export controls? What is its ECCN?
|
||||
|
||||
zlib is not subject to export controls, and so is classified as EAR99.
|
||||
|
||||
44. Can you please sign these lengthy legal documents and fax them back to us
|
||||
so that we can use your software in our product?
|
||||
|
||||
No. Go away. Shoo.
|
||||
|
|
@ -0,0 +1,115 @@
|
|||
ZLIB DATA COMPRESSION LIBRARY
|
||||
|
||||
zlib 1.2.11 is a general purpose data compression library. All the code is
|
||||
thread safe. The data format used by the zlib library is described by RFCs
|
||||
(Request for Comments) 1950 to 1952 in the files
|
||||
http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
|
||||
rfc1952 (gzip format).
|
||||
|
||||
All functions of the compression library are documented in the file zlib.h
|
||||
(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
|
||||
of the library is given in the file test/example.c which also tests that
|
||||
the library is working correctly. Another example is given in the file
|
||||
test/minigzip.c. The compression library itself is composed of all source
|
||||
files in the root directory.
|
||||
|
||||
To compile all files and run the test program, follow the instructions given at
|
||||
the top of Makefile.in. In short "./configure; make test", and if that goes
|
||||
well, "make install" should work for most flavors of Unix. For Windows, use
|
||||
one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use
|
||||
make_vms.com.
|
||||
|
||||
Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant
|
||||
<info@winimage.com> for the Windows DLL version. The zlib home page is
|
||||
http://zlib.net/ . Before reporting a problem, please check this site to
|
||||
verify that you have the latest version of zlib; otherwise get the latest
|
||||
version and check whether the problem still exists or not.
|
||||
|
||||
PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help.
|
||||
|
||||
Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
|
||||
issue of Dr. Dobb's Journal; a copy of the article is available at
|
||||
http://marknelson.us/1997/01/01/zlib-engine/ .
|
||||
|
||||
The changes made in version 1.2.11 are documented in the file ChangeLog.
|
||||
|
||||
Unsupported third party contributions are provided in directory contrib/ .
|
||||
|
||||
zlib is available in Java using the java.util.zip package, documented at
|
||||
http://java.sun.com/developer/technicalArticles/Programming/compression/ .
|
||||
|
||||
A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available
|
||||
at CPAN (Comprehensive Perl Archive Network) sites, including
|
||||
http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .
|
||||
|
||||
A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is
|
||||
available in Python 1.5 and later versions, see
|
||||
http://docs.python.org/library/zlib.html .
|
||||
|
||||
zlib is built into tcl: http://wiki.tcl.tk/4610 .
|
||||
|
||||
An experimental package to read and write files in .zip format, written on top
|
||||
of zlib by Gilles Vollant <info@winimage.com>, is available in the
|
||||
contrib/minizip directory of zlib.
|
||||
|
||||
|
||||
Notes for some targets:
|
||||
|
||||
- For Windows DLL versions, please see win32/DLL_FAQ.txt
|
||||
|
||||
- For 64-bit Irix, deflate.c must be compiled without any optimization. With
|
||||
-O, one libpng test fails. The test works in 32 bit mode (with the -n32
|
||||
compiler flag). The compiler bug has been reported to SGI.
|
||||
|
||||
- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works
|
||||
when compiled with cc.
|
||||
|
||||
- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is
|
||||
necessary to get gzprintf working correctly. This is done by configure.
|
||||
|
||||
- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
|
||||
other compilers. Use "make test" to check your compiler.
|
||||
|
||||
- gzdopen is not supported on RISCOS or BEOS.
|
||||
|
||||
- For PalmOs, see http://palmzlib.sourceforge.net/
|
||||
|
||||
|
||||
Acknowledgments:
|
||||
|
||||
The deflate format used by zlib was defined by Phil Katz. The deflate and
|
||||
zlib specifications were written by L. Peter Deutsch. Thanks to all the
|
||||
people who reported problems and suggested various improvements in zlib; they
|
||||
are too numerous to cite here.
|
||||
|
||||
Copyright notice:
|
||||
|
||||
(C) 1995-2017 Jean-loup Gailly and Mark Adler
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
Jean-loup Gailly Mark Adler
|
||||
jloup@gzip.org madler@alumni.caltech.edu
|
||||
|
||||
If you use the zlib library in a product, we would appreciate *not* receiving
|
||||
lengthy legal documents to sign. The sources are provided for free but without
|
||||
warranty of any kind. The library has been entirely written by Jean-loup
|
||||
Gailly and Mark Adler; it does not include third-party code.
|
||||
|
||||
If you redistribute modified sources, we would appreciate that you include in
|
||||
the file ChangeLog history information documenting your changes. Please read
|
||||
the FAQ for more information on the distribution of modified source versions.
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,536 @@
|
|||
/* zconf.h -- configuration of the zlib compression library
|
||||
* Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#ifndef ZCONF_H
|
||||
#define ZCONF_H
|
||||
/* #undef Z_PREFIX */
|
||||
/* #undef Z_HAVE_UNISTD_H */
|
||||
|
||||
/*
|
||||
* If you *really* need a unique prefix for all types and library functions,
|
||||
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
|
||||
* Even better than compiling with -DZ_PREFIX would be to use configure to set
|
||||
* this permanently in zconf.h using "./configure --zprefix".
|
||||
*/
|
||||
#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
|
||||
# define Z_PREFIX_SET
|
||||
|
||||
/* all linked symbols and init macros */
|
||||
# define _dist_code z__dist_code
|
||||
# define _length_code z__length_code
|
||||
# define _tr_align z__tr_align
|
||||
# define _tr_flush_bits z__tr_flush_bits
|
||||
# define _tr_flush_block z__tr_flush_block
|
||||
# define _tr_init z__tr_init
|
||||
# define _tr_stored_block z__tr_stored_block
|
||||
# define _tr_tally z__tr_tally
|
||||
# define adler32 z_adler32
|
||||
# define adler32_combine z_adler32_combine
|
||||
# define adler32_combine64 z_adler32_combine64
|
||||
# define adler32_z z_adler32_z
|
||||
# ifndef Z_SOLO
|
||||
# define compress z_compress
|
||||
# define compress2 z_compress2
|
||||
# define compressBound z_compressBound
|
||||
# endif
|
||||
# define crc32 z_crc32
|
||||
# define crc32_combine z_crc32_combine
|
||||
# define crc32_combine64 z_crc32_combine64
|
||||
# define crc32_z z_crc32_z
|
||||
# define deflate z_deflate
|
||||
# define deflateBound z_deflateBound
|
||||
# define deflateCopy z_deflateCopy
|
||||
# define deflateEnd z_deflateEnd
|
||||
# define deflateGetDictionary z_deflateGetDictionary
|
||||
# define deflateInit z_deflateInit
|
||||
# define deflateInit2 z_deflateInit2
|
||||
# define deflateInit2_ z_deflateInit2_
|
||||
# define deflateInit_ z_deflateInit_
|
||||
# define deflateParams z_deflateParams
|
||||
# define deflatePending z_deflatePending
|
||||
# define deflatePrime z_deflatePrime
|
||||
# define deflateReset z_deflateReset
|
||||
# define deflateResetKeep z_deflateResetKeep
|
||||
# define deflateSetDictionary z_deflateSetDictionary
|
||||
# define deflateSetHeader z_deflateSetHeader
|
||||
# define deflateTune z_deflateTune
|
||||
# define deflate_copyright z_deflate_copyright
|
||||
# define get_crc_table z_get_crc_table
|
||||
# ifndef Z_SOLO
|
||||
# define gz_error z_gz_error
|
||||
# define gz_intmax z_gz_intmax
|
||||
# define gz_strwinerror z_gz_strwinerror
|
||||
# define gzbuffer z_gzbuffer
|
||||
# define gzclearerr z_gzclearerr
|
||||
# define gzclose z_gzclose
|
||||
# define gzclose_r z_gzclose_r
|
||||
# define gzclose_w z_gzclose_w
|
||||
# define gzdirect z_gzdirect
|
||||
# define gzdopen z_gzdopen
|
||||
# define gzeof z_gzeof
|
||||
# define gzerror z_gzerror
|
||||
# define gzflush z_gzflush
|
||||
# define gzfread z_gzfread
|
||||
# define gzfwrite z_gzfwrite
|
||||
# define gzgetc z_gzgetc
|
||||
# define gzgetc_ z_gzgetc_
|
||||
# define gzgets z_gzgets
|
||||
# define gzoffset z_gzoffset
|
||||
# define gzoffset64 z_gzoffset64
|
||||
# define gzopen z_gzopen
|
||||
# define gzopen64 z_gzopen64
|
||||
# ifdef _WIN32
|
||||
# define gzopen_w z_gzopen_w
|
||||
# endif
|
||||
# define gzprintf z_gzprintf
|
||||
# define gzputc z_gzputc
|
||||
# define gzputs z_gzputs
|
||||
# define gzread z_gzread
|
||||
# define gzrewind z_gzrewind
|
||||
# define gzseek z_gzseek
|
||||
# define gzseek64 z_gzseek64
|
||||
# define gzsetparams z_gzsetparams
|
||||
# define gztell z_gztell
|
||||
# define gztell64 z_gztell64
|
||||
# define gzungetc z_gzungetc
|
||||
# define gzvprintf z_gzvprintf
|
||||
# define gzwrite z_gzwrite
|
||||
# endif
|
||||
# define inflate z_inflate
|
||||
# define inflateBack z_inflateBack
|
||||
# define inflateBackEnd z_inflateBackEnd
|
||||
# define inflateBackInit z_inflateBackInit
|
||||
# define inflateBackInit_ z_inflateBackInit_
|
||||
# define inflateCodesUsed z_inflateCodesUsed
|
||||
# define inflateCopy z_inflateCopy
|
||||
# define inflateEnd z_inflateEnd
|
||||
# define inflateGetDictionary z_inflateGetDictionary
|
||||
# define inflateGetHeader z_inflateGetHeader
|
||||
# define inflateInit z_inflateInit
|
||||
# define inflateInit2 z_inflateInit2
|
||||
# define inflateInit2_ z_inflateInit2_
|
||||
# define inflateInit_ z_inflateInit_
|
||||
# define inflateMark z_inflateMark
|
||||
# define inflatePrime z_inflatePrime
|
||||
# define inflateReset z_inflateReset
|
||||
# define inflateReset2 z_inflateReset2
|
||||
# define inflateResetKeep z_inflateResetKeep
|
||||
# define inflateSetDictionary z_inflateSetDictionary
|
||||
# define inflateSync z_inflateSync
|
||||
# define inflateSyncPoint z_inflateSyncPoint
|
||||
# define inflateUndermine z_inflateUndermine
|
||||
# define inflateValidate z_inflateValidate
|
||||
# define inflate_copyright z_inflate_copyright
|
||||
# define inflate_fast z_inflate_fast
|
||||
# define inflate_table z_inflate_table
|
||||
# ifndef Z_SOLO
|
||||
# define uncompress z_uncompress
|
||||
# define uncompress2 z_uncompress2
|
||||
# endif
|
||||
# define zError z_zError
|
||||
# ifndef Z_SOLO
|
||||
# define zcalloc z_zcalloc
|
||||
# define zcfree z_zcfree
|
||||
# endif
|
||||
# define zlibCompileFlags z_zlibCompileFlags
|
||||
# define zlibVersion z_zlibVersion
|
||||
|
||||
/* all zlib typedefs in zlib.h and zconf.h */
|
||||
# define Byte z_Byte
|
||||
# define Bytef z_Bytef
|
||||
# define alloc_func z_alloc_func
|
||||
# define charf z_charf
|
||||
# define free_func z_free_func
|
||||
# ifndef Z_SOLO
|
||||
# define gzFile z_gzFile
|
||||
# endif
|
||||
# define gz_header z_gz_header
|
||||
# define gz_headerp z_gz_headerp
|
||||
# define in_func z_in_func
|
||||
# define intf z_intf
|
||||
# define out_func z_out_func
|
||||
# define uInt z_uInt
|
||||
# define uIntf z_uIntf
|
||||
# define uLong z_uLong
|
||||
# define uLongf z_uLongf
|
||||
# define voidp z_voidp
|
||||
# define voidpc z_voidpc
|
||||
# define voidpf z_voidpf
|
||||
|
||||
/* all zlib structs in zlib.h and zconf.h */
|
||||
# define gz_header_s z_gz_header_s
|
||||
# define internal_state z_internal_state
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__MSDOS__) && !defined(MSDOS)
|
||||
# define MSDOS
|
||||
#endif
|
||||
#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
|
||||
# define OS2
|
||||
#endif
|
||||
#if defined(_WINDOWS) && !defined(WINDOWS)
|
||||
# define WINDOWS
|
||||
#endif
|
||||
#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
|
||||
# ifndef WIN32
|
||||
# define WIN32
|
||||
# endif
|
||||
#endif
|
||||
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
|
||||
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
|
||||
# ifndef SYS16BIT
|
||||
# define SYS16BIT
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more
|
||||
* than 64k bytes at a time (needed on systems with 16-bit int).
|
||||
*/
|
||||
#ifdef SYS16BIT
|
||||
# define MAXSEG_64K
|
||||
#endif
|
||||
#ifdef MSDOS
|
||||
# define UNALIGNED_OK
|
||||
#endif
|
||||
|
||||
#ifdef __STDC_VERSION__
|
||||
# ifndef STDC
|
||||
# define STDC
|
||||
# endif
|
||||
# if __STDC_VERSION__ >= 199901L
|
||||
# ifndef STDC99
|
||||
# define STDC99
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
|
||||
# define STDC
|
||||
#endif
|
||||
#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
|
||||
# define STDC
|
||||
#endif
|
||||
|
||||
#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
|
||||
# define STDC
|
||||
#endif
|
||||
|
||||
#ifndef STDC
|
||||
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
|
||||
# define const /* note: need a more gentle solution here */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(ZLIB_CONST) && !defined(z_const)
|
||||
# define z_const const
|
||||
#else
|
||||
# define z_const
|
||||
#endif
|
||||
|
||||
#ifdef Z_SOLO
|
||||
typedef unsigned long z_size_t;
|
||||
#else
|
||||
# define z_longlong long long
|
||||
# if defined(NO_SIZE_T)
|
||||
typedef unsigned NO_SIZE_T z_size_t;
|
||||
# elif defined(STDC)
|
||||
# include <stddef.h>
|
||||
typedef size_t z_size_t;
|
||||
# else
|
||||
typedef unsigned long z_size_t;
|
||||
# endif
|
||||
# undef z_longlong
|
||||
#endif
|
||||
|
||||
/* Maximum value for memLevel in deflateInit2 */
|
||||
#ifndef MAX_MEM_LEVEL
|
||||
# ifdef MAXSEG_64K
|
||||
# define MAX_MEM_LEVEL 8
|
||||
# else
|
||||
# define MAX_MEM_LEVEL 9
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Maximum value for windowBits in deflateInit2 and inflateInit2.
|
||||
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
|
||||
* created by gzip. (Files created by minigzip can still be extracted by
|
||||
* gzip.)
|
||||
*/
|
||||
#ifndef MAX_WBITS
|
||||
# define MAX_WBITS 15 /* 32K LZ77 window */
|
||||
#endif
|
||||
|
||||
/* The memory requirements for deflate are (in bytes):
|
||||
(1 << (windowBits+2)) + (1 << (memLevel+9))
|
||||
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
|
||||
plus a few kilobytes for small objects. For example, if you want to reduce
|
||||
the default memory requirements from 256K to 128K, compile with
|
||||
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
|
||||
Of course this will generally degrade compression (there's no free lunch).
|
||||
|
||||
The memory requirements for inflate are (in bytes) 1 << windowBits
|
||||
that is, 32K for windowBits=15 (default value) plus about 7 kilobytes
|
||||
for small objects.
|
||||
*/
|
||||
|
||||
/* Type declarations */
|
||||
|
||||
#ifndef OF /* function prototypes */
|
||||
# ifdef STDC
|
||||
# define OF(args) args
|
||||
# else
|
||||
# define OF(args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef Z_ARG /* function prototypes for stdarg */
|
||||
# if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||
# define Z_ARG(args) args
|
||||
# else
|
||||
# define Z_ARG(args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* The following definitions for FAR are needed only for MSDOS mixed
|
||||
* model programming (small or medium model with some far allocations).
|
||||
* This was tested only with MSC; for other MSDOS compilers you may have
|
||||
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
|
||||
* just define FAR to be empty.
|
||||
*/
|
||||
#ifdef SYS16BIT
|
||||
# if defined(M_I86SM) || defined(M_I86MM)
|
||||
/* MSC small or medium model */
|
||||
# define SMALL_MEDIUM
|
||||
# ifdef _MSC_VER
|
||||
# define FAR _far
|
||||
# else
|
||||
# define FAR far
|
||||
# endif
|
||||
# endif
|
||||
# if (defined(__SMALL__) || defined(__MEDIUM__))
|
||||
/* Turbo C small or medium model */
|
||||
# define SMALL_MEDIUM
|
||||
# ifdef __BORLANDC__
|
||||
# define FAR _far
|
||||
# else
|
||||
# define FAR far
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(WINDOWS) || defined(WIN32)
|
||||
/* If building or using zlib as a DLL, define ZLIB_DLL.
|
||||
* This is not mandatory, but it offers a little performance increase.
|
||||
*/
|
||||
# ifdef ZLIB_DLL
|
||||
# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
|
||||
# ifdef ZLIB_INTERNAL
|
||||
# define ZEXTERN extern __declspec(dllexport)
|
||||
# else
|
||||
# define ZEXTERN extern __declspec(dllimport)
|
||||
# endif
|
||||
# endif
|
||||
# endif /* ZLIB_DLL */
|
||||
/* If building or using zlib with the WINAPI/WINAPIV calling convention,
|
||||
* define ZLIB_WINAPI.
|
||||
* Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
|
||||
*/
|
||||
# ifdef ZLIB_WINAPI
|
||||
# ifdef FAR
|
||||
# undef FAR
|
||||
# endif
|
||||
# include <windows.h>
|
||||
/* No need for _export, use ZLIB.DEF instead. */
|
||||
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
|
||||
# define ZEXPORT WINAPI
|
||||
# ifdef WIN32
|
||||
# define ZEXPORTVA WINAPIV
|
||||
# else
|
||||
# define ZEXPORTVA FAR CDECL
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined (__BEOS__)
|
||||
# ifdef ZLIB_DLL
|
||||
# ifdef ZLIB_INTERNAL
|
||||
# define ZEXPORT __declspec(dllexport)
|
||||
# define ZEXPORTVA __declspec(dllexport)
|
||||
# else
|
||||
# define ZEXPORT __declspec(dllimport)
|
||||
# define ZEXPORTVA __declspec(dllimport)
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef ZEXTERN
|
||||
# define ZEXTERN extern
|
||||
#endif
|
||||
#ifndef ZEXPORT
|
||||
# define ZEXPORT
|
||||
#endif
|
||||
#ifndef ZEXPORTVA
|
||||
# define ZEXPORTVA
|
||||
#endif
|
||||
|
||||
#ifndef FAR
|
||||
# define FAR
|
||||
#endif
|
||||
|
||||
#if !defined(__MACTYPES__)
|
||||
typedef unsigned char Byte; /* 8 bits */
|
||||
#endif
|
||||
typedef unsigned int uInt; /* 16 bits or more */
|
||||
typedef unsigned long uLong; /* 32 bits or more */
|
||||
|
||||
#ifdef SMALL_MEDIUM
|
||||
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
|
||||
# define Bytef Byte FAR
|
||||
#else
|
||||
typedef Byte FAR Bytef;
|
||||
#endif
|
||||
typedef char FAR charf;
|
||||
typedef int FAR intf;
|
||||
typedef uInt FAR uIntf;
|
||||
typedef uLong FAR uLongf;
|
||||
|
||||
#ifdef STDC
|
||||
typedef void const *voidpc;
|
||||
typedef void FAR *voidpf;
|
||||
typedef void *voidp;
|
||||
#else
|
||||
typedef Byte const *voidpc;
|
||||
typedef Byte FAR *voidpf;
|
||||
typedef Byte *voidp;
|
||||
#endif
|
||||
|
||||
#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
|
||||
# include <limits.h>
|
||||
# if (UINT_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned
|
||||
# elif (ULONG_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned long
|
||||
# elif (USHRT_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned short
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef Z_U4
|
||||
typedef Z_U4 z_crc_t;
|
||||
#else
|
||||
typedef unsigned long z_crc_t;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
|
||||
# define Z_HAVE_UNISTD_H
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
|
||||
# define Z_HAVE_STDARG_H
|
||||
#endif
|
||||
|
||||
#ifdef STDC
|
||||
# ifndef Z_SOLO
|
||||
# include <sys/types.h> /* for off_t */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||
# ifndef Z_SOLO
|
||||
# include <stdarg.h> /* for va_list */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
# ifndef Z_SOLO
|
||||
# include <stddef.h> /* for wchar_t */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
|
||||
* "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
|
||||
* though the former does not conform to the LFS document), but considering
|
||||
* both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
|
||||
* equivalently requesting no 64-bit operations
|
||||
*/
|
||||
#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
|
||||
# undef _LARGEFILE64_SOURCE
|
||||
#endif
|
||||
|
||||
#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
|
||||
# define Z_HAVE_UNISTD_H
|
||||
#endif
|
||||
#ifndef Z_SOLO
|
||||
# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
|
||||
# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
|
||||
# ifdef VMS
|
||||
# include <unixio.h> /* for off_t */
|
||||
# endif
|
||||
# ifndef z_off_t
|
||||
# define z_off_t off_t
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
|
||||
# define Z_LFS64
|
||||
#endif
|
||||
|
||||
#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
|
||||
# define Z_LARGE64
|
||||
#endif
|
||||
|
||||
#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
|
||||
# define Z_WANT64
|
||||
#endif
|
||||
|
||||
#if !defined(SEEK_SET) && !defined(Z_SOLO)
|
||||
# define SEEK_SET 0 /* Seek from beginning of file. */
|
||||
# define SEEK_CUR 1 /* Seek from current position. */
|
||||
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
|
||||
#endif
|
||||
|
||||
#ifndef z_off_t
|
||||
# define z_off_t long
|
||||
#endif
|
||||
|
||||
#if !defined(_WIN32) && defined(Z_LARGE64)
|
||||
# define z_off64_t off64_t
|
||||
#else
|
||||
# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
|
||||
# define z_off64_t __int64
|
||||
# else
|
||||
# define z_off64_t z_off_t
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* MVS linker does not support external names larger than 8 bytes */
|
||||
#if defined(__MVS__)
|
||||
#pragma map(deflateInit_,"DEIN")
|
||||
#pragma map(deflateInit2_,"DEIN2")
|
||||
#pragma map(deflateEnd,"DEEND")
|
||||
#pragma map(deflateBound,"DEBND")
|
||||
#pragma map(inflateInit_,"ININ")
|
||||
#pragma map(inflateInit2_,"ININ2")
|
||||
#pragma map(inflateEnd,"INEND")
|
||||
#pragma map(inflateSync,"INSY")
|
||||
#pragma map(inflateSetDictionary,"INSEDI")
|
||||
#pragma map(compressBound,"CMBND")
|
||||
#pragma map(inflate_table,"INTABL")
|
||||
#pragma map(inflate_fast,"INFA")
|
||||
#pragma map(inflate_copyright,"INCOPY")
|
||||
#endif
|
||||
|
||||
#endif /* ZCONF_H */
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
BIN
packages/zlib-msvc14-x64.1.2.11.7795/build/native/lib_debug/zlibstaticd.lib
vendored
Normal file
BIN
packages/zlib-msvc14-x64.1.2.11.7795/build/native/lib_debug/zlibstaticd.lib
vendored
Normal file
Binary file not shown.
Binary file not shown.
BIN
packages/zlib-msvc14-x64.1.2.11.7795/build/native/lib_release/zlibstatic.lib
vendored
Normal file
BIN
packages/zlib-msvc14-x64.1.2.11.7795/build/native/lib_release/zlibstatic.lib
vendored
Normal file
Binary file not shown.
|
|
@ -0,0 +1,149 @@
|
|||
.TH ZLIB 3 "15 Jan 2017"
|
||||
.SH NAME
|
||||
zlib \- compression/decompression library
|
||||
.SH SYNOPSIS
|
||||
[see
|
||||
.I zlib.h
|
||||
for full description]
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.I zlib
|
||||
library is a general purpose data compression library.
|
||||
The code is thread safe, assuming that the standard library functions
|
||||
used are thread safe, such as memory allocation routines.
|
||||
It provides in-memory compression and decompression functions,
|
||||
including integrity checks of the uncompressed data.
|
||||
This version of the library supports only one compression method (deflation)
|
||||
but other algorithms may be added later
|
||||
with the same stream interface.
|
||||
.LP
|
||||
Compression can be done in a single step if the buffers are large enough
|
||||
or can be done by repeated calls of the compression function.
|
||||
In the latter case,
|
||||
the application must provide more input and/or consume the output
|
||||
(providing more output space) before each call.
|
||||
.LP
|
||||
The library also supports reading and writing files in
|
||||
.IR gzip (1)
|
||||
(.gz) format
|
||||
with an interface similar to that of stdio.
|
||||
.LP
|
||||
The library does not install any signal handler.
|
||||
The decoder checks the consistency of the compressed data,
|
||||
so the library should never crash even in the case of corrupted input.
|
||||
.LP
|
||||
All functions of the compression library are documented in the file
|
||||
.IR zlib.h .
|
||||
The distribution source includes examples of use of the library
|
||||
in the files
|
||||
.I test/example.c
|
||||
and
|
||||
.IR test/minigzip.c,
|
||||
as well as other examples in the
|
||||
.IR examples/
|
||||
directory.
|
||||
.LP
|
||||
Changes to this version are documented in the file
|
||||
.I ChangeLog
|
||||
that accompanies the source.
|
||||
.LP
|
||||
.I zlib
|
||||
is built in to many languages and operating systems, including but not limited to
|
||||
Java, Python, .NET, PHP, Perl, Ruby, Swift, and Go.
|
||||
.LP
|
||||
An experimental package to read and write files in the .zip format,
|
||||
written on top of
|
||||
.I zlib
|
||||
by Gilles Vollant (info@winimage.com),
|
||||
is available at:
|
||||
.IP
|
||||
http://www.winimage.com/zLibDll/minizip.html
|
||||
and also in the
|
||||
.I contrib/minizip
|
||||
directory of the main
|
||||
.I zlib
|
||||
source distribution.
|
||||
.SH "SEE ALSO"
|
||||
The
|
||||
.I zlib
|
||||
web site can be found at:
|
||||
.IP
|
||||
http://zlib.net/
|
||||
.LP
|
||||
The data format used by the
|
||||
.I zlib
|
||||
library is described by RFC
|
||||
(Request for Comments) 1950 to 1952 in the files:
|
||||
.IP
|
||||
http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format)
|
||||
.br
|
||||
http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format)
|
||||
.br
|
||||
http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format)
|
||||
.LP
|
||||
Mark Nelson wrote an article about
|
||||
.I zlib
|
||||
for the Jan. 1997 issue of Dr. Dobb's Journal;
|
||||
a copy of the article is available at:
|
||||
.IP
|
||||
http://marknelson.us/1997/01/01/zlib-engine/
|
||||
.SH "REPORTING PROBLEMS"
|
||||
Before reporting a problem,
|
||||
please check the
|
||||
.I zlib
|
||||
web site to verify that you have the latest version of
|
||||
.IR zlib ;
|
||||
otherwise,
|
||||
obtain the latest version and see if the problem still exists.
|
||||
Please read the
|
||||
.I zlib
|
||||
FAQ at:
|
||||
.IP
|
||||
http://zlib.net/zlib_faq.html
|
||||
.LP
|
||||
before asking for help.
|
||||
Send questions and/or comments to zlib@gzip.org,
|
||||
or (for the Windows DLL version) to Gilles Vollant (info@winimage.com).
|
||||
.SH AUTHORS AND LICENSE
|
||||
Version 1.2.11
|
||||
.LP
|
||||
Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
|
||||
.LP
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
.LP
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
.LP
|
||||
.nr step 1 1
|
||||
.IP \n[step]. 3
|
||||
The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
.IP \n+[step].
|
||||
Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
.IP \n+[step].
|
||||
This notice may not be removed or altered from any source distribution.
|
||||
.LP
|
||||
Jean-loup Gailly Mark Adler
|
||||
.br
|
||||
jloup@gzip.org madler@alumni.caltech.edu
|
||||
.LP
|
||||
The deflate format used by
|
||||
.I zlib
|
||||
was defined by Phil Katz.
|
||||
The deflate and
|
||||
.I zlib
|
||||
specifications were written by L. Peter Deutsch.
|
||||
Thanks to all the people who reported problems and suggested various
|
||||
improvements in
|
||||
.IR zlib ;
|
||||
who are too numerous to cite here.
|
||||
.LP
|
||||
UNIX manual page by R. P. C. Rodgers,
|
||||
U.S. National Library of Medicine (rodgers@nlm.nih.gov).
|
||||
.\" end of man page
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
prefix=D:/GIT/zlib/build-nuget
|
||||
exec_prefix=D:/GIT/zlib/build-nuget
|
||||
libdir=D:/GIT/zlib/build-nuget/lib
|
||||
sharedlibdir=D:/GIT/zlib/build-nuget/lib
|
||||
includedir=D:/GIT/zlib/build-nuget/include
|
||||
|
||||
Name: zlib
|
||||
Description: zlib compression library
|
||||
Version: 1.2.11
|
||||
|
||||
Requires:
|
||||
Libs: -L${libdir} -L${sharedlibdir} -lz
|
||||
Cflags: -I${includedir}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemDefinitionGroup Label="Release and x64" Condition="( $(Configuration.ToLower().IndexOf('debug')) == -1 ) And '$(Platform.ToLower())' == 'x64'">
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>HAS_zlib;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)../..//build/native/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)../..//build/native/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>$(MSBuildThisFileDirectory)../..//build/native/lib_release/zlibstatic.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Label="Debug and x64" Condition="( $(Configuration.ToLower().IndexOf('debug')) > -1 ) And '$(Platform.ToLower())' == 'x64'">
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>HAS_zlib;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)../..//build/native/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)../..//build/native/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>$(MSBuildThisFileDirectory)../..//build/native/lib_debug/zlibstaticd.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<Target Name="zlib-msvc">
|
||||
</Target>
|
||||
</Project>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue