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 相关文章推荐
一个阿拉伯数字转中文数字的函数
Oct 09 PHP
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
PHP 裁剪图片成固定大小代码方法
Sep 09 PHP
php 错误处理经验分享
Oct 11 PHP
destoon二次开发模板及调用语法汇总
Jun 21 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
PHP 实现类似js中alert() 提示框
Mar 18 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
Mar 14 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
Nov 14 PHP
详解php与ethereum客户端交互
Apr 28 PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 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 excel类 phpExcel使用方法介绍
2010/08/21 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
js chrome浏览器判断代码
2010/03/28 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
python中对list去重的多种方法
2014/09/18 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
python3实现的zip格式压缩文件夹操作示例
2019/08/17 Python
python3.7添加dlib模块的方法
2020/07/01 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
旅游项目开发策划书
2014/01/18 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
党风廉政教育心得体会2016
2016/01/22 职场文书
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python