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 上传文件的方法(类)
Jul 30 PHP
php设计模式 State (状态模式)
Jun 26 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
Jul 29 PHP
php析构函数的简单使用说明
Aug 24 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
浅谈PHP错误类型及屏蔽方法
May 27 PHP
php设计模式之单例模式用法经典示例分析
Sep 20 PHP
php使用json-schema模块实现json校验示例
Sep 28 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 30 PHP
php慢查询日志和错误日志使用详解
Feb 27 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 Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
php 发送带附件邮件示例
2014/01/23 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
美国最值得信赖的宠物药房:Allivet
2019/03/23 全球购物
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
品学兼优的大学生自我评价
2013/09/20 职场文书
高三体育教学反思
2014/01/29 职场文书
校园广播稿500字
2014/02/04 职场文书
年终工作总结范文2014
2014/11/27 职场文书
大学生操行评语大全
2014/12/31 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书