最近开始研究微信小游戏,有兴趣的 可以关注一下 公众号, 记录一些心路历程和源代码。
定义了一个状态机(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