lua 实例化 StateMachine状态机, 捕鱼游戏状态机

 最近开始研究微信小游戏,有兴趣的 可以关注一下 公众号, 记录一些心路历程和源代码。

定义了一个状态机(StateMachine)类 :lua StateMachine状态机

举例 做一个 捕鱼游戏状态机,确保游戏在不同状态下能够正确地响应玩家的操作。通过状态机模式,可以清晰地定义和切换游戏的不同状态,提高代码的可维护性和可扩展性。

通过状态机(State Machine)来管理游戏的不同状态,如准备开始、倒计时、蓄力、撒网和落网等。下面是对代码的详细解释:

### 引入了多个状态类

  • `ReadyStartState`(准备开始)、
  • `CountDownState`(倒计时)、
  • `IdleState`(蓄力之前)、
  • `ChargingState`(蓄力中)、
  • `NetFlyingState`(撒网中)
  • `HitState`(落网)。

### 初始化方法
- `initialize`方法:初始化状态机,并创建各个状态对象。

### 设置代理方法
- `setAgent`方法:设置状态机的代理对象,这个代理对象通常是游戏中的某个实体,如钓鱼者。

### 状态转换方法
- `changeIntoReadyStart`、`startReady`、`changeIntoIdle`、`changeIntoCharging`、`changeIntoNetFlying`和`changeIntoHit`方法:这些方法用于在不同状态之间进行转换,并传递必要的参数。

### 状态检查方法
- `isNetFlyingState`、`isChargingState`、`isIdleState`、`isReadyStartState`和`isHitState`方法:这些方法用于检查当前状态机是否处于某个特定状态。

### 返回类
- `return NetFishingStateContext`:返回`NetFishingStateContext`类的实例。

### 注意事项
- **状态机**:状态机是一种设计模式,用于管理对象在不同状态下的行为。在这个脚本中,状态机用于管理钓鱼游戏的不同状态。
- **状态转换**:状态转换是通过调用状态机的方法来实现的,例如`changeState`方法。
 

local NetFishingStateContext = SimpleClassUtil:class()
local ReadyStartState = require "Topjoy.Tkw.NetFishing.State.ReadyStartState"  -- 开始前
local CountDownState = require "Topjoy.Tkw.NetFishing.State.CountDownState"    -- 倒计时(镜头移动)
local IdleState = require "Topjoy.Tkw.NetFishing.State.IdleState" --蓄力之前(生成鱼、光圈特效)/重新生成鱼
local ChargingState = require "Topjoy.Tkw.NetFishing.State.ChargingState" -- 蓄力中
local NetFlyingState = require "Topjoy.Tkw.NetFishing.State.NetFlyingState"    -- 撒网中
local HitState = require "Topjoy.Tkw.NetFishing.State.HitState"  -- 落网 

function NetFishingStateContext:initialize()
    self._stateMachine = StateMachine:new()
    self._readyStartState = ReadyStartState:new()
    self._countDownState = CountDownState:new()
    self._idleState = IdleState:new()
    self._chargingState = ChargingState:new()
    self._netFlyingState = NetFlyingState:new()
    self._hitState = HitState:new()
end

---@param agent NetFishEntityManager
function NetFishingStateContext:setAgent(agent)
    self._stateMachine:setAgent(agent)
end

function NetFishingStateContext:changeIntoReadyStart()
    self._stateMachine:changeState(self._readyStartState)
end

function NetFishingStateContext:startReady()
    self._stateMachine:changeState(self._countDownState)
end

function NetFishingStateContext:changeIntoIdle(isFromCharging, score)
    self._stateMachine:changeState(self._idleState, isFromCharging, score)
end

function NetFishingStateContext:changeIntoCharging()
    self._stateMachine:changeState(self._chargingState)
end

function NetFishingStateContext:changeIntoNetFlying(flyDistance)
    self._stateMachine:changeState(self._netFlyingState, flyDistance)
end

function NetFishingStateContext:changeIntoHit(flyDistance)
    self._stateMachine:changeState(self._hitState)
end

function NetFishingStateContext:isNetFlyingState()
    return self._stateMachine:getCurrentState() == self._netFlyingState
end

function NetFishingStateContext:isChargingState()
    return self._stateMachine:getCurrentState() == self._chargingState
end

function NetFishingStateContext:isIdleState()
    return self._stateMachine:getCurrentState() == self._idleState
end

function NetFishingStateContext:isReadyStartState()
    return self._stateMachine:getCurrentState() == self._readyStartState
end

function NetFishingStateContext:isHitState()
    return self._stateMachine:getCurrentState() == self._hitState
end

return NetFishingStateContext

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在导出一个lua状态的所有函数时,首先需要明确导出哪些函数。在Lua中可以通过在C语言中调用该状态的函数来实现与Lua中定义的函数交互,因此我们需要将需要导出的函数在C语言中进行实现。 导出函数时需要注意以下几点: 1. 需要使用luaL_Reg结构定义需要导出的函数属性,其中包含函数名和函数指针; 2. 在实现C语言函数时,需要将其与Lua中的参数和返回值进行对应; 3. 调用luaL_register函数注册需要导出的函数,传入函数表名和函数表属性,同时借助luaL_newlib函数创建新的函数表。 例如,我们需要导出以下三个函数: 1. 输出Hello World:printHello() 2. 计算两个数字的和:add(x, y) 3. 判断一个数是否为正数:isPositive(num) 那么在C语言中,可以这样实现: static int l_printHello(lua_State *L) { printf("Hello World\n"); return 0; } static int l_add(lua_State *L) { double x = luaL_checknumber(L, 1); double y = luaL_checknumber(L, 2); lua_pushnumber(L, x + y); return 1; } static int l_isPositive(lua_State *L) { double num = luaL_checknumber(L, 1); lua_pushboolean(L, num > 0); return 1; } 然后我们需要将其存到一个luaL_Reg结构体数组里,如下: static const struct luaL_Reg myfuncs[] = { {"printHello", l_printHello}, {"add", l_add}, {"isPositive", l_isPositive}, {NULL, NULL} }; 最后,我们可以在Lua中这样使用这些函数: local mylib = require("mylib") mylib.printHello() -- 输出Hello World print(mylib.add(1, 2)) -- 输出3 print(mylib.isPositive(-1)) -- 输出false 因此,以上就是导出一个lua状态的所有函数的步骤和实现方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值