从这节开始,我把一些小模块集中介绍。

矩形(Rect)

xLua.module.Rect 模块主要用于处理矩形(Rect)对象。矩形对象在游戏开发中非常常见,用于表示区域、碰撞检测、UI布局等。

主要方法

  1. new(x, y, width, height)

    • 功能: 创建一个新的矩形对象。
    • 参数:

      • x (number): 矩形左下角的 x 坐标。
      • y (number): 矩形左下角的 y 坐标。
      • width (number): 矩形的宽度。
      • height (number): 矩形的高度。
    • 返回值: 矩形对象 (rect 类型)。
  2. contains(x, y)

    • 功能: 检查给定的点是否在矩形内。
    • 参数:

      • x (number): 点的 x 坐标。
      • y (number): 点的 y 坐标。
    • 返回值: 布尔值,如果点在矩形内则返回 true,否则返回 false
  3. intersects(otherRect)

    • 功能: 检查当前矩形是否与另一个矩形相交。
    • 参数:

      • otherRect (rect): 另一个矩形对象。
    • 返回值: 布尔值,如果两个矩形相交则返回 true,否则返回 false
  4. move(dx, dy)

    • 功能: 移动矩形。
    • 参数:

      • dx (number): 沿 x 轴移动的距离。
      • dy (number): 沿 y 轴移动的距离。
    • 返回值: 无。
  5. resize(dWidth, dHeight)

    • 功能: 调整矩形的大小。
    • 参数:

      • dWidth (number): 宽度的变化量。
      • dHeight (number): 高度的变化量。
    • 返回值: 无。
  6. getCenter()

    • 功能: 获取矩形的中心点坐标。
    • 参数: 无。
    • 返回值: 包含 xy 坐标的表。
  7. getArea()

    • 功能: 获取矩形的面积。
    • 参数: 无。
    • 返回值: 矩形的面积(number 类型)。

使用案例

下面是一个具体的案例,展示了如何使用 xLua.module.Rect 模块创建、移动、调整大小、检查包含关系和相交关系的矩形。

案例:创建和操作矩形

-- 引入 Rect 模块
local rectModule = require "xLua.module.Rect"

-- 创建一个新的矩形
local rect1 = rectModule.new(10, 10, 50, 30)
print("矩形1: x=" .. rect1.x .. ", y=" .. rect1.y .. ", width=" .. rect1.width .. ", height=" .. rect1.height)

-- 创建另一个矩形
local rect2 = rectModule.new(30, 20, 40, 20)
print("矩形2: x=" .. rect2.x .. ", y=" .. rect2.y .. ", width=" .. rect2.width .. ", height=" .. rect2.height)

-- 检查点是否在矩形内
local pointInside = rect1:contains(20, 20)
print("点 (20, 20) 是否在矩形1内: " .. tostring(pointInside))

-- 移动矩形1
rect1:move(10, 10)
print("移动后的矩形1: x=" .. rect1.x .. ", y=" .. rect1.y .. ", width=" .. rect1.width .. ", height=" .. rect1.height)

-- 调整矩形1的大小
rect1:resize(20, 10)
print("调整大小后的矩形1: x=" .. rect1.x .. ", y=" .. rect1.y .. ", width=" .. rect1.width .. ", height=" .. rect1.height)

-- 检查两个矩形是否相交
local isIntersecting = rect1:intersects(rect2)
print("矩形1和矩形2是否相交: " .. tostring(isIntersecting))

-- 获取矩形1的中心点
local center = rect1:getCenter()
print("矩形1的中心点: x=" .. center.x .. ", y=" .. center.y)

-- 获取矩形1的面积
local area = rect1:getArea()
print("矩形1的面积: " .. area)

迷雾(Fog)

xLua.module.Fog 模块主要用于处理游戏中的迷雾(Fog)效果。迷雾效果用于控制玩家视野范围,增加游戏的策略性和挑战性。

主要方法

  1. rect(params)

    • 功能: 设置指定矩形区域的迷雾状态。
    • 参数:

      • params (table): 包含以下字段的表:

        • player (player): 玩家对象。
        • state (string): 迷雾状态,可选值包括 'visible'(可见)、'fogged'(迷雾)、'hidden'(隐藏)。
        • rect (rect): 矩形区域对象。
    • 返回值: 无。
  2. circle(params)

    • 功能: 设置指定圆形区域的迷雾状态。
    • 参数:

      • params (table): 包含以下字段的表:

        • player (player): 玩家对象。
        • state (string): 迷雾状态,可选值包括 'visible'(可见)、'fogged'(迷雾)、'hidden'(隐藏)。
        • x (number): 圆心的 x 坐标。
        • y (number): 圆心的 y 坐标。
        • radius (number): 圆的半径。
    • 返回值: 无。
  3. all(params)

    • 功能: 设置整个地图的迷雾状态。
    • 参数:

      • params (table): 包含以下字段的表:

        • player (player): 玩家对象。
        • state (string): 迷雾状态,可选值包括 'visible'(可见)、'fogged'(迷雾)、'hidden'(隐藏)。
    • 返回值: 无。
  4. toggle(params)

    • 功能: 切换指定矩形区域的迷雾状态。
    • 参数:

      • params (table): 包含以下字段的表:

        • player (player): 玩家对象。
        • rect (rect): 矩形区域对象。
    • 返回值: 无。

使用案例

下面是一个具体的案例,展示了如何使用 xLua.module.Fog 模块设置和操作迷雾效果。

案例:设置和操作迷雾效果

-- 引入必要的模块
local fog = require "xLua.module.Fog"
local rectModule = require "xLua.module.Rect"
local playerModule = require "xLua.module.Player"

-- 获取玩家对象(假设玩家1)
local player1 = playerModule[1]

-- 创建一个新的矩形区域
local rect1 = rectModule.new(100, 100, 200, 150)
print("矩形区域: x=" .. rect1.x .. ", y=" .. rect1.y .. ", width=" .. rect1.width .. ", height=" .. rect1.height)

-- 设置矩形区域为可见
fog:rect({
    player = player1,
    state = 'visible',
    rect = rect1
})
print("矩形区域设置为可见")

-- 创建一个新的圆形区域
local circleX = 300
local circleY = 300
local circleRadius = 100
print("圆形区域: x=" .. circleX .. ", y=" .. circleY .. ", radius=" .. circleRadius)

-- 设置圆形区域为迷雾
fog:circle({
    player = player1,
    state = 'fogged',
    x = circleX,
    y = circleY,
    radius = circleRadius
})
print("圆形区域设置为迷雾")

-- 设置整个地图为隐藏
fog:all({
    player = player1,
    state = 'hidden'
})
print("整个地图设置为隐藏")

-- 切换矩形区域的迷雾状态
fog:toggle({
    player = player1,
    rect = rect1
})
print("矩形区域的迷雾状态已切换")

下面是一个更复杂的案例,展示了如何动态更新迷雾效果,例如在游戏过程中根据玩家的位置动态显示或隐藏某些区域。

扩展案例:动态更新迷雾效果

-- 引入必要的模块
local fog = require "xLua.module.Fog"
local rectModule = require "xLua.module.Rect"
local playerModule = require "xLua.module.Player"
local timer = require "xLua.module.Timer"

-- 获取玩家对象(假设玩家1)
local player1 = playerModule[1]

-- 创建一个新的矩形区域
local rect1 = rectModule.new(100, 100, 200, 150)
print("矩形区域: x=" .. rect1.x .. ", y=" .. rect1.y .. ", width=" .. rect1.width .. ", height=" .. rect1.height)

-- 设置矩形区域为可见
fog:rect({
    player = player1,
    state = 'visible',
    rect = rect1
})
print("矩形区域设置为可见")

-- 创建一个新的圆形区域
local circleX = 300
local circleY = 300
local circleRadius = 100
print("圆形区域: x=" .. circleX .. ", y=" .. circleY .. ", radius=" .. circleRadius)

-- 设置圆形区域为迷雾
fog:circle({
    player = player1,
    state = 'fogged',
    x = circleX,
    y = circleY,
    radius = circleRadius
})
print("圆形区域设置为迷雾")

-- 设置整个地图为隐藏
fog:all({
    player = player1,
    state = 'hidden'
})
print("整个地图设置为隐藏")

-- 定义一个计时器,每秒切换矩形区域的迷雾状态
local toggleTimer = timer:new()
toggleTimer:start(1, function(event, params)
    fog:toggle({
        player = player1,
        rect = rect1
    })
    print("矩形区域的迷雾状态已切换")
end, true)

-- 定义一个计时器,每2秒切换圆形区域的迷雾状态
local circleToggleTimer = timer:new()
circleToggleTimer:start(2, function(event, params)
    fog:circle({
        player = player1,
        state = fog:circle({
            player = player1,
            x = circleX,
            y = circleY,
            radius = circleRadius
        }) == 'fogged' and 'visible' or 'fogged',
        x = circleX,
        y = circleY,
        radius = circleRadius
    })
    print("圆形区域的迷雾状态已切换")
end, true)

镜头(Camera)

xLua.module.Camera 模块主要用于控制游戏中的镜头(Camera)。镜头控制用于调整玩家的视野范围、跟随单位或特定位置等。

主要方法

  1. setZ(height)

    • 功能: 设置镜头的高度(Z轴位置)。
    • 参数:

      • height (number): 镜头的高度。
    • 返回值: 无。
  2. getZ()

    • 功能: 获取镜头的高度(Z轴位置)。
    • 参数: 无。
    • 返回值: 镜头的高度(number 类型)。
  3. setXY(x, y, time)

    • 功能: 平移镜头到指定的 x 和 y 坐标。
    • 参数:

      • x (number): 目标 x 坐标。
      • y (number): 目标 y 坐标。
      • time (number): 平移时间(秒)。
    • 返回值: 无。
  4. SetWideScreen(enable)

    • 功能: 启用或禁用宽屏模式。
    • 参数:

      • enable (boolean): 是否启用宽屏模式。
    • 返回值: 无。
  5. IsWideScreen()

    • 功能: 检查是否启用了宽屏模式。
    • 参数: 无。
    • 返回值: 布尔值,如果启用了宽屏模式则返回 true,否则返回 false
  6. BlackBorders(top, bottom)

    • 功能: 设置镜头的黑边范围。
    • 参数:

      • top (number): 顶部黑边比例(0 到 1)。
      • bottom (number): 底部黑边比例(0 到 1)。
    • 返回值: 无。
  7. GetView()

    • 功能: 获取当前镜头的视图矩阵。
    • 参数: 无。
    • 返回值: 视图矩阵对象(Vec3 类型)。
  8. WorldToScreen(worldPos)

    • 功能: 将世界坐标转换为屏幕坐标。
    • 参数:

      • worldPos (table): 包含 xy 字段的世界坐标。
    • 返回值: 屏幕坐标(Vec3 类型)。

使用案例

下面是一个具体的案例,展示了如何使用 xLua.module.Camera 模块控制镜头的高度、位置、宽屏模式和黑边范围。

案例:控制镜头

-- 引入必要的模块
local camera = require "xLua.module.Camera"
local timer = require "xLua.module.Timer"

-- 设置镜头高度
camera.setZ(1000)
print("镜头高度设置为: " .. camera.getZ())

-- 平移镜头到指定位置
camera.setXY(500, 500, 2)
print("镜头平移到 (500, 500) 用时 2 秒")

-- 启用宽屏模式
camera.SetWideScreen(true)
print("宽屏模式已启用: " .. tostring(camera.IsWideScreen()))

-- 设置黑边范围
camera.BlackBorders(0.020, 0.130)
print("黑边范围设置为: 顶部 0.020, 底部 0.130")

-- 获取当前视图矩阵
local viewMatrix = camera.GetView()
print("当前视图矩阵: x=" .. viewMatrix.x .. ", y=" .. viewMatrix.y .. ", z=" .. viewMatrix.z)

-- 将世界坐标转换为屏幕坐标
local worldPos = {x = 500, y = 500}
local screenPos = camera.WorldToScreen(worldPos)
print("世界坐标 (500, 500) 转换为屏幕坐标: x=" .. screenPos.x .. ", y=" .. screenPos.y)

-- 使用计时器动态调整镜头位置
local moveTimer = timer:new()
moveTimer:start(5, function(event, params)
    camera.setXY(1000, 1000, 2)
    print("镜头平移到 (1000, 1000) 用时 2 秒")
end, false)

-- 使用计时器动态调整镜头高度
local heightTimer = timer:new()
heightTimer:start(10, function(event, params)
    camera.setZ(1500)
    print("镜头高度设置为: " .. camera.getZ())
end, false)

扩展案例:跟随单位移动

下面是一个更复杂的案例,展示了如何使用 xLua.module.Camera 模块动态跟随一个单位移动。

扩展案例:跟随单位移动

-- 引入必要的模块
local camera = require "xLua.module.Camera"
local unitModule = require "xLua.module.Unit"
local timer = require "xLua.module.Timer"

-- 获取玩家对象(假设玩家1)
local player1 = playerModule[1]

-- 创建一个新的单位(假设单位类型为 'hpea')
local unit = unitModule:new({
    player = player1,
    id = 'hpea',
    x = 500,
    y = 500
})
print("单位创建成功,位置: x=" .. unit.x .. ", y=" .. unit.y)

-- 启用宽屏模式
camera.SetWideScreen(true)
print("宽屏模式已启用: " .. tostring(camera.IsWideScreen()))

-- 设置黑边范围
camera.BlackBorders(0.020, 0.130)
print("黑边范围设置为: 顶部 0.020, 底部 0.130")

-- 定义一个计时器,每秒更新镜头位置以跟随单位
local followTimer = timer:new()
followTimer:start(1, function(event, params)
    if unit and unit.x and unit.y then
        camera.setXY(unit.x, unit.y, 1)
        print("镜头跟随单位,位置: x=" .. unit.x .. ", y=" .. unit.y)
    end
end, true)

-- 定义一个计时器,每5秒调整镜头高度
local heightTimer = timer:new()
heightTimer:start(5, function(event, params)
    local currentHeight = camera.getZ()
    local newHeight = currentHeight + 100
    camera.setZ(newHeight)
    print("镜头高度调整为: " .. newHeight)
end, true)

-- 定义一个计时器,每10秒切换宽屏模式
local wideScreenTimer = timer:new()
wideScreenTimer:start(10, function(event, params)
    local isWideScreen = camera.IsWideScreen()
    camera.SetWideScreen(not isWideScreen)
    print("宽屏模式已切换: " .. tostring(camera.IsWideScreen()))
end, true)