PHP网页游戏学习之Xnova(ogame)源码解读(十五)


Posted in PHP onJune 30, 2014

十八、舰队活动(FlyingFleetHandler.php)

在前文中我们曾经初步研究过舰队活动的源码,提到过舰队活动的触发。现在我进一步分析Xnova中舰队活动,这些在本质上是由玩家触发的,并不是由定时器在进行定时计算。舰队活动的触发是在common.php中进行的,所以入口就在这文件中,代码如下:

//检查是否有到达目的地的舰队
$_fleets = doquery("SELECT * FROM {{table}} WHERE 'fleet_start_time' <= '".time()."';", 'fleets'); // OR fleet_end_time <= ".time()
//循环处理每个舰队
while ($row = mysql_fetch_array($_fleets)) {
$array        = array();
$array['galaxy']   = $row['fleet_start_galaxy'];
$array['system']   = $row['fleet_start_system'];
$array['planet']   = $row['fleet_start_planet'];
$array['planet_type'] = $row['fleet_start_type'];
//舰队处理函数
$temp = FlyingFleetHandler ($array);
}
//检查是否有返回出发地的舰队
$_fleets = doquery("SELECT * FROM {{table}} WHERE 'fleet_end_time' <= '".time()."';", 'fleets'); // OR fleet_end_time <= ".time()
//循环处理每个舰队
while ($row = mysql_fetch_array($_fleets)) {
$array        = array();
$array['galaxy']   = $row['fleet_end_galaxy'];
$array['system']   = $row['fleet_end_system'];
$array['planet']   = $row['fleet_end_planet'];
$array['planet_type'] = $row['fleet_end_type'];
//舰队处理函数
$temp = FlyingFleetHandler ($array);
}

大家看到了,前面这段代码其实写的不好,因为这里每次都会被调用,效率太低了。因此我们在这里可以进行优化,使每次循环只需要一个舰队的ID传递给函数即可;相应的函数也要做修改,有兴趣的自己修改下。

接下来看看函数FlyingFleetHandler(),这是集中调用舰队活动的函数。

//锁表,防止出现数据不同步等问题
doquery("LOCK TABLE {{table}}lunas WRITE, {{table}}rw WRITE, 
{{table}}errors WRITE, {{table}}messages WRITE, {{table}}fleets WRITE, 
{{table}}planets WRITE, {{table}}galaxy WRITE ,{{table}}users WRITE", "");
//这里一大段就是取得舰队数组,参数完全可以使用舰队ID,优化之
$QryFleet  = "SELECT * FROM {{table}} ";
$QryFleet .= "WHERE (";
$QryFleet .= "( ";
$QryFleet .= "`fleet_start_galaxy` = ". $planet['galaxy']   ." AND ";
$QryFleet .= "`fleet_start_system` = ". $planet['system']   ." AND ";
$QryFleet .= "`fleet_start_planet` = ". $planet['planet']   ." AND ";
$QryFleet .= "`fleet_start_type` = ".  $planet['planet_type'] ." ";
$QryFleet .= ") OR ( ";
$QryFleet .= "`fleet_end_galaxy` = ".  $planet['galaxy']   ." AND ";
$QryFleet .= "`fleet_end_system` = ".  $planet['system']   ." AND ";
$QryFleet .= "`fleet_end_planet` = ".  $planet['planet']   ." ) AND ";
$QryFleet .= "`fleet_end_type`= ".   $planet['planet_type'] ." ) AND ";
$QryFleet .= "( `fleet_start_time` < '". time() ."' OR `fleet_end_time` < '". time() ."' );";
$fleetquery = doquery( $QryFleet, 'fleets' );
//根据舰队活动的目标不同,分别进入不同的函数处理
while ($CurrentFleet = mysql_fetch_array($fleetquery)) {
 switch ($CurrentFleet["fleet_mission"]) {
 case 1:
  // 普通攻击
  MissionCaseAttack ( $CurrentFleet );
  break;
 case 2:
  // 这里应该是ACS攻击或者是其他攻击,但是现在没有用
  doquery ("DELETE FROM {{table}} WHERE `fleet_id` = '". $CurrentFleet['fleet_id'] ."';", 'fleets');
  break;
 case 3:
  // 运输
  MissionCaseTransport ( $CurrentFleet );
  break;
 case 4:
  // 派遣
  MissionCaseStay ( $CurrentFleet );
  break;
 case 5:
  // 联合派遣,即ACS防御
 MissionCaseStayAlly ( $CurrentFleet );
  break;
 case 6:
  // 侦查
  MissionCaseSpy ( $CurrentFleet );
  break;
 case 7:
  // 殖民
  MissionCaseColonisation ( $CurrentFleet );
  break;
 case 8:
  // 回收
  MissionCaseRecycling ( $CurrentFleet );
  break;
 case 9:
  // 毁月,厉害了
  MissionCaseDestruction ( $CurrentFleet );
  break;
 case 10:
  // 保留 !!
 
  break;
 case 15:
  // 远征、探险
  MissionCaseExpedition ( $CurrentFleet );
  break;
 //其他情况删除舰队,这个是好习惯
 default: {
  doquery("DELETE FROM {{table}} WHERE `fleet_id` = '". $CurrentFleet['fleet_id'] ."';", 'fleets');
 }
 }
}
//解锁表
doquery("UNLOCK TABLES", "");

上面的函数结构清晰,代码明了,注释也讲的很清楚了。

PHP 相关文章推荐
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
Dec 05 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
php遍历目录输出目录及其下的所有文件示例
Jan 27 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
php的curl封装类用法实例
Nov 07 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
Dec 26 PHP
typecho插件编写教程(一):Hello World
May 28 PHP
php如何修改SESSION的生存存储时间的实例代码
Jul 05 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
laravel 实现用户登录注销并限制功能
Oct 24 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 #PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 #PHP
PHP把数字转成人民币大写的函数分享
Jun 30 #PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
Jun 30 #PHP
PHP把JPEG图片转换成Progressive JPEG的方法
Jun 30 #PHP
PHP把小数转成整数3种方法
Jun 30 #PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
Jun 29 #PHP
You might like
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
php发送post请求函数分享
2014/03/06 PHP
php目录拷贝实现方法
2015/07/10 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
jQuery each()方法的使用方法
2010/03/18 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
Python决策树和随机森林算法实例详解
2018/01/30 Python
python迭代dict的key和value的方法
2018/07/06 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
python支付宝支付示例详解
2019/08/22 Python
Django之form组件自动校验数据实现
2020/01/14 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
《藤野先生》教学反思
2014/02/19 职场文书
数学检讨书1000字
2014/02/24 职场文书
我的理想演讲稿
2014/04/30 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
怎么写工作检讨书
2014/11/16 职场文书
2015共产党员公开承诺书
2015/01/22 职场文书
个人工作总结怎么写?
2019/04/09 职场文书