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默认安装产生系统漏洞
Oct 09 PHP
批量修改RAR文件注释的php代码
Nov 20 PHP
php中使用DOM类读取XML文件的实现代码
Dec 14 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
php检测useragent版本示例
Mar 24 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
Jan 04 PHP
CodeIgniter生成静态页的方法
May 17 PHP
php抽象方法和抽象类实例分析
Dec 07 PHP
PHP执行shell脚本运行程序不产生core文件的方法
Dec 28 PHP
详解PHP防止直接访问.php 文件的实现方法
Jul 28 PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 PHP
Laravel等框架模型关联的可用性浅析
Dec 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
BBS(php &amp; mysql)完整版(六)
2006/10/09 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
实例讲解python函数式编程
2014/06/09 Python
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
scrapy爬虫实例分享
2017/12/28 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
个人自荐信
2013/12/05 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
小学生表扬稿范文
2015/05/05 职场文书
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
2021/04/01 PHP
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
Python深度学习之实现卷积神经网络
2021/06/05 Python
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB