从这节开始,我把一些小模块集中介绍。
矩形(Rect)
xLua.module.Rect
模块主要用于处理矩形(Rect)对象。矩形对象在游戏开发中非常常见,用于表示区域、碰撞检测、UI布局等。
主要方法
new(x, y, width, height)
- 功能: 创建一个新的矩形对象。
参数:
x
(number): 矩形左下角的 x 坐标。y
(number): 矩形左下角的 y 坐标。width
(number): 矩形的宽度。height
(number): 矩形的高度。
- 返回值: 矩形对象 (
rect
类型)。
contains(x, y)
- 功能: 检查给定的点是否在矩形内。
参数:
x
(number): 点的 x 坐标。y
(number): 点的 y 坐标。
- 返回值: 布尔值,如果点在矩形内则返回
true
,否则返回false
。
intersects(otherRect)
- 功能: 检查当前矩形是否与另一个矩形相交。
参数:
otherRect
(rect): 另一个矩形对象。
- 返回值: 布尔值,如果两个矩形相交则返回
true
,否则返回false
。
move(dx, dy)
- 功能: 移动矩形。
参数:
dx
(number): 沿 x 轴移动的距离。dy
(number): 沿 y 轴移动的距离。
- 返回值: 无。
resize(dWidth, dHeight)
- 功能: 调整矩形的大小。
参数:
dWidth
(number): 宽度的变化量。dHeight
(number): 高度的变化量。
- 返回值: 无。
getCenter()
- 功能: 获取矩形的中心点坐标。
- 参数: 无。
- 返回值: 包含
x
和y
坐标的表。
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)效果。迷雾效果用于控制玩家视野范围,增加游戏的策略性和挑战性。
主要方法
rect(params)
- 功能: 设置指定矩形区域的迷雾状态。
参数:
params
(table): 包含以下字段的表:player
(player): 玩家对象。state
(string): 迷雾状态,可选值包括'visible'
(可见)、'fogged'
(迷雾)、'hidden'
(隐藏)。rect
(rect): 矩形区域对象。
- 返回值: 无。
circle(params)
- 功能: 设置指定圆形区域的迷雾状态。
参数:
params
(table): 包含以下字段的表:player
(player): 玩家对象。state
(string): 迷雾状态,可选值包括'visible'
(可见)、'fogged'
(迷雾)、'hidden'
(隐藏)。x
(number): 圆心的 x 坐标。y
(number): 圆心的 y 坐标。radius
(number): 圆的半径。
- 返回值: 无。
all(params)
- 功能: 设置整个地图的迷雾状态。
参数:
params
(table): 包含以下字段的表:player
(player): 玩家对象。state
(string): 迷雾状态,可选值包括'visible'
(可见)、'fogged'
(迷雾)、'hidden'
(隐藏)。
- 返回值: 无。
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)。镜头控制用于调整玩家的视野范围、跟随单位或特定位置等。
主要方法
setZ(height)
- 功能: 设置镜头的高度(Z轴位置)。
参数:
height
(number): 镜头的高度。
- 返回值: 无。
getZ()
- 功能: 获取镜头的高度(Z轴位置)。
- 参数: 无。
- 返回值: 镜头的高度(number 类型)。
setXY(x, y, time)
- 功能: 平移镜头到指定的 x 和 y 坐标。
参数:
x
(number): 目标 x 坐标。y
(number): 目标 y 坐标。time
(number): 平移时间(秒)。
- 返回值: 无。
SetWideScreen(enable)
- 功能: 启用或禁用宽屏模式。
参数:
enable
(boolean): 是否启用宽屏模式。
- 返回值: 无。
IsWideScreen()
- 功能: 检查是否启用了宽屏模式。
- 参数: 无。
- 返回值: 布尔值,如果启用了宽屏模式则返回
true
,否则返回false
。
BlackBorders(top, bottom)
- 功能: 设置镜头的黑边范围。
参数:
top
(number): 顶部黑边比例(0 到 1)。bottom
(number): 底部黑边比例(0 到 1)。
- 返回值: 无。
GetView()
- 功能: 获取当前镜头的视图矩阵。
- 参数: 无。
- 返回值: 视图矩阵对象(
Vec3
类型)。
WorldToScreen(worldPos)
- 功能: 将世界坐标转换为屏幕坐标。
参数:
worldPos
(table): 包含x
和y
字段的世界坐标。
- 返回值: 屏幕坐标(
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)