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与MySQL开发中页面乱码的产生与解决
Mar 27 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
spl_autoload_register与autoload的区别详解
Jun 03 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
php操作MongoDB类实例
Jun 17 PHP
前端必学之PHP语法基础
Jan 01 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
Apr 01 PHP
验证坐标在某坐标区域内php代码
Oct 08 PHP
PHP面向对象程序设计组合模式与装饰模式详解
Dec 02 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 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
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
php批量删除操作代码分享
2017/02/26 PHP
新闻内页-JS分页
2006/06/07 Javascript
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
JavaScript window.location对象
2014/11/14 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
js里面的变量范围分享
2020/07/18 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
Vue $attrs &amp; inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python简单操作sqlite3的方法示例
2017/03/22 Python
Python实现进程同步和通信的方法
2018/01/02 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
python爬虫实现获取下一页代码
2020/03/13 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
关于幼儿的自我评价
2013/12/18 职场文书
大学生励志演讲稿
2014/04/25 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
小石潭记导游词
2015/02/03 职场文书
婚宴新娘致辞
2015/07/28 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android
SQL Server中搜索特定的对象
2022/05/25 SQL Server