ActionButton的处理流程

【1】控件类型是WoWLook/ActionButton
packet.layout.xml  
  <Window Type="WoWLook/ActionButton" Name="PacketButton_8" >
   <Property Name="BtnAnimation" Value="" />
   <Property Name="Checked" Value="False" />
   <Property Name="ClippedByParent" Value="False" />
   <Property Name="Default" Value="False" />
   <Property Name="DragThreshold" Value="0.000000" />
   <Property Name="DraggingEnabled" Value="True" />
   <Property Name="Empty" Value="False" />
   <Property Name="Gloom" Value="False" />
   <Property Name="UnifiedAreaRect" Value="{{0.000000,56.000000},{0.000000,140.000000},{0.000000,90.000000},{0.000000,174.000000}}" />
   <Event Name="Clicked" Function="Packet_ItemBtnSubClicked(8);" />
   <!--右键单击使用物品的函数 -->
   <Event Name="RBClicked" Function="Packet_ItemBtnClicked(8);" />
  </Window>

 

【2】WoWLook/ActionButton的右键单击函数
packet.lua
function Packet_ItemBtnClicked(nIndex)

 if(nIndex < 1 or nIndex > PACKAGE_BUTTONS_NUM) then
  return;
 end

-- if( g_bCtrlPressed == 0 )then
--  PACKAGE_BUTTONS[nIndex]:DoAction();
-- elseif( g_bCtrlPressed == 1 )then
--  LifeAbility:Open_Compose_Gem_Page( 0, nIndex - 1 );
-- end
 
 if ( g_bCtrlPressed == 1 )then
      LifeAbility:Open_Compose_Gem_Page( 0, nIndex - 1 );
 
 elseif( g_bShiftPressed == 1 )then
  
      Open_Rework_Equip( 0, nIndex-1 );
 
 else
 
      PACKAGE_BUTTONS[nIndex]:DoAction();--**
 end

end

 

<!--这个是UISystem导出的Lua接口函数
客户端UI对应的lua脚本只使用两类lua函数,
一个是UI控件导出的函数,在UI_CEHUI/UILuaControl.cpp里的,里面有各种控件导出的函数。
另一个是Game导出的游戏逻辑函数,在Game/Interface/GMInterface_Lua.h里说明的

 

【3】DoAction();lua函数
Client/UI_CEGUI/UILuaControl.h(177):  
INT  Lua_DoAction(LuaPlus::LuaState* pState); 
INT ActionButton::Lua_DoAction(LuaPlus::LuaState* pState)
{
 if(m_pActionItem)
  m_pActionItem->DoAction();// 调用子类的函数,tActionItem*  m_pActionItem;

 return 0;
}


【4】tActionItem是GameInterface里的函数接口
tActionItem*  m_pActionItem;
我们查看所有Game里的继承自tActionItem的类,其实就是
Game/Action目录下的类。

可见有很多类型的ActionButton。背包对应的就是GMActionSystem_Item.cpp
这个Action模块有个公共的基类
class CActionItem : public tActionItem

CActionItem 派生类型
 CActionItem_ChangeSuit
 CActionItem_ChatMood
 CActionItem_Item
 CActionItem_LifeAbility
 CActionItem_MouseCmd_Exchange
 CActionItem_MouseCmd_Friend
 CActionItem_MouseCmd_Identify
 CActionItem_MouseCmd_Repair
 CActionItem_PetSkill
 CActionItem_Skill
 
【5】找到CActionItem_Item的DoAction
这里说一下,物品有不同的种类,可以放在不同的背包里,
也就是有不同的背包,多种背包,
 //物品归属
 enum ITEM_OWNER
 {
  IO_UNKNOWN,

  IO_MYSELF_EQUIP,  //玩家自己身上的装备
  IO_MYSELF_PACKET,  //玩家自己身上的包中
  IO_MYSELF_BANK,   //玩家自己身上的银行中
  IO_MYSELF_MOUNT,        //玩家自己的坐骑                              [7/20/2010]
  IO_PLAYEROTHER_EQUIP, //其他玩家身上的装备
  IO_ITEMBOX,    //打开的宝箱中
  IO_BOOTH,    //商人的货架
  IO_MYEXBOX,    //自己的交易盒
  IO_OTHEREXBOX,   //对方的交易盒
//  IO_ENCHASEPAGE,   // 宝石合成/镶嵌界面
  IO_MISSIONBOX,   //任务递交盒
  IO_MYSTALLBOX,   //自己的摊位盒
  IO_OTSTALLBOX,   //对方的摊位盒
//  IO_APPENDITEM,   //装备上附加的宝石
  IO_QUESTVIRTUALITEM, // 任务奖励的(虚拟)物品,只用于显示。
  IO_PS_SELFBOX,   //
  IO_PS_OTHERBOX,   //
  IO_ITEMDROP,   //掉落
  IO_ITEMTRANSFER, //用于传送的物品
  IO_ITEMIBSHOP,  //IBShop

 };
 
 ...
   //玩家自己身上的包中
 case tObject_Item::IO_MYSELF_PACKET:
  {
   DoAction_Packet();
  }
  break;

 ...
 
...
GameProjct/trunk/Client/game/Action/GMActionSystem_Item.cpp
line:4176
  普通情况下的使用物品操作:
   
 
【6】。调用了GMGameInterface.h

cpp:GMGameInterface.cpp
line:1022
的函数


 //------------------------------------------------
 //使用包裹里的物品_通用
 virtual VOID PacketItem_UserItem(tActionItem* pActionItem, int nTargetServerID, fVector2& fvPos) = 0;
 //使用包裹里的物品_对象
 virtual VOID PacketItem_UserItem_ToTarget( INT nIndex, UINT nTargetID) = 0;
 //使用包裹里的物品_装备
 virtual VOID PacketItem_UserEquip( INT nIndex )     = 0;
 //使用包裹里的物品_宝石
 virtual VOID PacketItem_UserGem(INT nGemIndex, INT EquipIndex) = 0;
 //销毁包裹里的物品
 virtual VOID PacketItem_Destroy(INT nIndex)      = 0;

 

CGameProcedure::s_pGameInterface->PacketItem_UserEquip 装备
{
 ...
 //进行一系列逻辑验证,最终发送这个包到服务端
 CGUseEquip msg;
 msg.setBagIndex( nIndex );
 CNetManager::GetMe()->SendPacket( &msg );
 // 服务端返回这个包请求的结果,有可能是多个,伴随着其他属性改变的packet
 // GCUseItemResult
 //
}
返回结果的数据包在
Game/Network/Handler/GC.../7.Item/中

CGameProcedure::s_pGameInterface->PacketItem_UserItem 普通物品
{
  //能够直接使用
  CGUseItem msg;
  msg.SetBagIndex( pItem->GetPosIndex() );
  msg.SetTargetObjID(objID);
  msg.SetTargetPetGUID(petID);
  msg.SetTargetPos(&posTarget);

  CNetManager::GetMe()->SendPacket( &msg );
  return;
  
  // server返回结果: GCUseEquipResult
  
}
CGameProcedure::s_pGameInterface->PacketItem_EquipMount 坐骑
{

 CGManipulateMount msg;
 msg.setBagIndex(nIndex);
 msg.setMountOperator(CGManipulateMount::MANIPULATE_EQUIP_MOUNT);
 CNetManager::GetMe()->SendPacket( &msg );
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现员工的登录和注册功能,我们需要使用SpringBoot,Mybatis-Plus,Ajax,Layui和MySQL等技术实现。 前置条件: - 已经安装了Java(JDK8+) - 已经安装了Maven - 已经安装了MySQL数据库 - 已经学习过SpringBoot,Mybatis-Plus,Ajax和Layui 1. 创建一个SpringBoot项目 在IDE中创建一个新的SpringBoot项目。 2. 添加依赖 添加Mybatis-Plus的依赖。 ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.1</version> </dependency> ``` 添加Lombok的依赖。 ``` <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> ``` 添加Ajax和Layui的CDN链接。 ``` <!-- Ajax --> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <!-- Layui --> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/layui/2.5.7/css/layui.min.css"> <script src="https://cdn.bootcdn.net/ajax/libs/layui/2.5.7/layui.all.min.js"></script> ``` 3. 创建数据库 创建一个名为employee的数据库,并创建employee表。 ``` CREATE DATABASE employee; CREATE TABLE `employee` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `name` varchar(30) DEFAULT NULL COMMENT '员工姓名', `password` varchar(30) DEFAULT NULL COMMENT '登录密码', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表'; ``` 4. 配置数据库连接 在application.properties文件中配置数据库连接。 ``` spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/employee?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=root ``` 5. 创建实体类 创建一个Employee实体类,并使用Lombok注解简化代码。 ```java @Data @AllArgsConstructor @NoArgsConstructor public class Employee { private Long id; private String name; private String password; } ``` 6. 创建Mapper类 创建一个EmployeeMapper接口,并继承Mybatis-Plus的BaseMapper接口,用于操作employee表。 ```java @Mapper public interface EmployeeMapper extends BaseMapper<Employee> { } ``` 7. 创建Service类 创建一个EmployeeService类,并注入EmployeeMapper,实现员工的登录和注册功能。其中,登录功能通过查询指定用户名和密码的员工记录进行验证,注册功能通过新增员工记录实现。 ```java @Service public class EmployeeService { @Autowired private EmployeeMapper employeeMapper; public Employee login(String name, String password) { QueryWrapper<Employee> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name", name); queryWrapper.eq("password", password); return employeeMapper.selectOne(queryWrapper); } public boolean register(Employee employee) { return employeeMapper.insert(employee) > 0; } } ``` 8. 创建Controller类 创建一个EmployeeController类,并注入EmployeeService,实现员工的登录和注册请求处理方法。 ```java @RestController @RequestMapping("/employee") public class EmployeeController { @Autowired private EmployeeService employeeService; @PostMapping("/login") public Result login(@RequestParam String name, @RequestParam String password) { Employee employee = employeeService.login(name, password); if (employee != null) { return Result.success("登录成功"); } else { return Result.error("用户名或密码错误"); } } @PostMapping("/register") public Result register(@RequestBody Employee employee) { boolean result = employeeService.register(employee); if (result) { return Result.success("注册成功"); } else { return Result.error("注册失败"); } } } ``` 9. 创建Result类 创建一个Result类,并封装请求响应数据,用于统一管理请求响应格式。 ```java @Data @AllArgsConstructor @NoArgsConstructor public class Result { private Integer code; private String msg; private Object data; public static Result success(String msg) { return new Result(200, msg, null); } public static Result success(String msg, Object data) { return new Result(200, msg, data); } public static Result error(String msg) { return new Result(500, msg, null); } public static Result error(String msg, Object data) { return new Result(500, msg, data); } } ``` 10. 创建HTML页面 创建一个login.html页面和register.html页面,分别用于员工的登录和注册操作。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/layui/2.5.7/css/layui.min.css"> <script src="https://cdn.bootcdn.net/ajax/libs/layui/2.5.7/layui.all.min.js"></script> </head> <body> <div style="margin: 100px auto; width: 400px;"> <form class="layui-form" action=""> <div class="layui-form-item"> <label class="layui-form-label">用户名</label> <div class="layui-input-block"> <input type="text" name="name" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">密码</label> <div class="layui-input-block"> <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit lay-filter="login">登录</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> </div> <script> layui.use(['form', 'layer'], function(){ var form = layui.form; var layer = layui.layer; // 监听表单提交按钮 form.on('submit(login)', function(data){ $.ajax({ url: '/employee/login', type: 'POST', data: { name: data.field.name, password: data.field.password }, success: function(res) { if (res.code === 200) { layer.msg(res.msg); setTimeout(function() { window.location.href = '/index.html'; }, 1000); } else { layer.msg(res.msg); } }, error: function() { layer.msg('系统异常,请稍后重试'); } }); return false; }); }); </script> </body> </html> ``` ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/layui/2.5.7/css/layui.min.css"> <script src="https://cdn.bootcdn.net/ajax/libs/layui/2.5.7/layui.all.min.js"></script> </head> <body> <div style="margin: 100px auto; width: 400px;"> <form class="layui-form" action=""> <div class="layui-form-item"> <label class="layui-form-label">用户名</label> <div class="layui-input-block"> <input type="text" name="name" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">密码</label> <div class="layui-input-block"> <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit lay-filter="register">注册</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> </div> <script> layui.use(['form', 'layer'], function(){ var form = layui.form; var layer = layui.layer; // 监听表单提交按钮 form.on('submit(register)', function(data){ $.ajax({ url: '/employee/register', type: 'POST', contentType: 'application/json', data: JSON.stringify({ name: data.field.name, password: data.field.password }), success: function(res) { if (res.code === 200) { layer.msg(res.msg); setTimeout(function() { window.location.href = '/login.html'; }, 1000); } else { layer.msg(res.msg); } }, error: function() { layer.msg('系统异常,请稍后重试'); } }); return false; }); }); </script> </body> </html> ``` 至此,我们已经完成了员工的登录和注册功能实现。可以通过运行SpringBoot应用来访问/login.html和/register.html页面,并进行登录和注册操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值