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 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
php 获取select下拉列表框的值
May 08 PHP
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
PHP sprintf()函数用例解析
May 18 PHP
PHP基础知识介绍
Sep 17 PHP
PHP swfupload图片上传的实例代码
Sep 30 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
Nov 26 PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
May 11 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
PHPMailer使用教程(PHPMailer发送邮件实例分析)
2012/12/06 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
event.srcElement+表格应用
2006/08/29 Javascript
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
JS实现的另类手风琴效果网页内容切换代码
2015/09/08 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
如何编写jquery插件
2017/03/29 jQuery
Vue组件中slot的用法
2018/01/30 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
python编写爬虫小程序
2015/05/14 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
python3使用GUI统计代码量
2019/09/18 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
结构和类有什么异同
2012/07/16 面试题
工程预算与管理应届生求职信
2013/10/06 职场文书
拾金不昧表扬信范文
2014/01/11 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
技校毕业生自荐信
2014/06/03 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
如何利用opencv判断两张图片是否相同详解
2021/07/07 Python