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
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
PHP中的正则表达式函数介绍
Feb 27 PHP
php5.3 goto函数介绍和示例
Mar 21 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
ThinkPHP分页实例
Oct 15 PHP
PHP实现QQ登录实例代码
Jan 14 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
php使用pecl方式安装扩展操作示例
Aug 12 PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
php实现文件下载(支持中文文名)
2013/12/04 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
PHP 实现链式操作
2021/03/09 PHP
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
express启用https使用小记
2019/05/21 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
理解python多线程(python多线程简明教程)
2014/06/09 Python
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
Python读写文件方法总结
2015/06/09 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
大四自我鉴定范文
2013/10/06 职场文书
市场营销专业推荐信
2013/11/03 职场文书
给老婆的保证书怎么写
2015/05/08 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
PHP控制循环操作的时间
2021/04/01 PHP
python实现简单的井字棋
2021/05/26 Python
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
Redis Lua脚本实现ip限流示例
2022/07/15 Redis