# BoxCore
**Repository Path**: Ling_2121/BoxCore
## Basic Information
- **Project Name**: BoxCore
- **Description**: Love2D开发框架
- **Primary Language**: Lua
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2020-08-08
- **Last Updated**: 2022-03-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## BoxCore
> Love2D游戏开发ECS框架,用于2D体素游戏的开发
## 框架结构
| 文件夹 | 功能 |
| ------- | ------------ |
| assets | 资源目录 |
| base | 基础拓展 |
| docs | 文档 |
| ecs | ECS对象目录 |
| library | 第三方库目录 |
| module | 程序模块 |
| test | 测试 |
## 框架安装
**需要Love2D 0.11以上版本**
**拷贝一份即可,不用安装,只需love2d引擎即可**
## class的用法
本框架为lua加入了一个简易的面对对象系统,可以方便的创建对象,通过class函数
类的创建
```lua
-- 一个类的创建形式如下
-- local TestClass = class("类名",继承列表){
-- 数据成员
-- }
-- function TestClas:__init__()
-- 这是构造函数
-- end
local Vector1D = class("Vector1D"){
x = 0
}
local Vector2D = class("Vector2D",Vector1D){
y = 0
}
function Vector2D:__init__(x,y)
self.x = x or 0
self.y = y or 0
end
```
类的实例化
```lua
local vec1 = Vector2D(100,200)
print(vec1.x,vec2.y)
--> 100 200
```
## ECS结构
> 无论什么类型的ecs对象,类名都是他的定义名称
#### ecs目录结构为
- ecs
- entity 实体
- component 组件
- system 系统
- shared 数据共享区
- utils 实用程序集
#### **Entity**
> ECS系统中的实体,一种数据表示的对象,区别于OOP,它只是包含数据,不包含操作。由组件组成。
实体存放于 ecs/entity 目录及其子目录
```lua
--player_entity.lua
local Entity = require"ecs/entity/entity"
--实体要继承Entity类。PlayerEntity为实体名称
local PlayerEntity = class("PlayerEntity",Entity){
--这是是实体需求组件的列表,填写组件类名称即可
"PositionComponent",
"RenderComponent"
}
--返回实体的函数形式调用则默认加入到系统中
return PlayerEntity()
```
#### Component
> ECS系统中的组件,在此框架中作为构造器。
组件存放于 ecs/component 目录及其子目录
```lua
local Component = require"ecs/component/component"
local PositionComponent = class("PositionComponent",Component){
--下面两行为组件的数据定义
--形式为 : {"组件名称",组件数据}
{"x",0},
{"y",0},
}
return PositionComponent()
```
#### System
> ECS系统中的系统,只是表示逻辑,不包含数据,会对拥有指定组件的实体进行更新和处理
```lua
local System = require"ecs/system/system"
local MoveSystem = class("MoveSystem",System){
--系统配置
system_config = {
type = SYSYTEM_TYPE_PROCESS,
is_default_add = true,
filter = {"PositionComponent"},
}
}
```
**system_config.type : [SYSYTEM_TYPE]**
| 类型名 | 说明 |
| ------------------------- | ------------ |
| SYSYTEM_TYPE_SYSTEM | 普通系统 |
| SYSYTEM_TYPE_PROCESS | 普通处理系统 |
| SYSYTEM_TYPE_SORT | 排序系统 |
| SYSYTEM_TYPE_SORT_PROCESS | 排序处理系统 |
**system_config.is_default_add : [true | false]**
为true时默认加入到时间
**system_config.filter : [table | function]**
实体过滤器,为table时配置需求的组件名称即可
```lua
--表示有 PositionComponent 和 VelocityComponent的对象才会加入到系统中
filter = {
"PositionComponent",
"VelocityComponent",
}
```
为function时
```lua
--返回true时表示entity通过过滤
filter = function(self,entity)
return entity.PositionComponent and entity.VelocityComponent
end
```
ecs基于tiny-ecs库的实现,过滤器的具体内容请看 [这里](http://bakpakin.github.io/tiny-ecs/doc/#Filter_functions),系统的回调及其数据请看[这里](http://bakpakin.github.io/tiny-ecs/doc/#System_functions)
#### Shared
> 这是存放共享数据的地方,系统和系统间不能直接通信,但可以通过共享区进行间接的通信
```lua
local Shared = require"ecs/shared/shared"
local CameraLibrary = require"library/camera"
--共享类继承自Shared
local Camera = class("Camera",Shared){
--重载_create函数来反馈需要加入共享区的对象,共享类的类名对应在共享区中的类名
_create = function()
return CameraLibrary()
end
}
return Camera()
```
获取共享数据的方式
```lua
local camera = box_core.get_shared("Camera")
```
#### Utils
> 这是用来操作或者设置的程序集
```lua
local Utils = require"ecs/utils/utils"
local RenderUtils = class("RenderUtils",Utils){}
function RenderUtils.draw(object)
-- ...code...
end
function RenderUtils.draw_rectangle(fill_mode,x,y,w,h)
-- ...code...
end
return RenderUtils()
```
获取程序集的方式
```lua
local RenderUtils = box_core.get_utils("RenderUtils")
```