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+ACCESS 文章管理程序代码
Jun 21 PHP
几个有用的php字符串过滤,转换函数代码
May 01 PHP
深入PHP操作MongoDB的技术总结
Jun 02 PHP
discuz图片顺序混乱解决方案
Jul 29 PHP
PHP微信开发之查询微信精选文章
Jun 23 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
Oct 14 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
Dec 15 PHP
Yii框架用户登录session丢失问题解决方法
Jan 07 PHP
PHP用户注册邮件激活账户的实现代码
May 31 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
PHP实现的日历功能示例
Sep 01 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
php的大小写敏感问题整理
2011/12/29 PHP
php获取数组元素中头一个数组元素值的实现方法
2014/12/20 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
php xhprof使用实例详解
2019/04/15 PHP
jquery插件validate验证的小例子
2013/05/08 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
玩转Koa之核心原理分析
2018/12/29 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
python对象及面向对象技术详解
2016/07/19 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
python实现发送邮件及附件功能
2021/03/02 Python
Django中使用Celery的教程详解
2018/08/24 Python
Django REST framework 分页的实现代码
2019/06/19 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
娱乐地球:Entertainment Earth
2020/01/08 全球购物
室内设计专业学生的自我评价分享
2013/11/27 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
母亲节感恩活动记录
2014/03/16 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
低碳生活的宣传标语
2014/06/23 职场文书
数学教研活动总结
2014/07/02 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书