PHP网页游戏学习之Xnova(ogame)源码解读(二)


Posted in PHP onJune 23, 2014

三、 安装(install/index.php)

这个文件是安装页面,一开始就可以看到定义了两个常量:

define('INSIDE' , true);
define('INSTALL' , true);

因为这两个常量在接下来的代码中总是用到,所以在这里先说明下。INSIDE是用来防止攻击的;INSTALL是用来记录现在是否处于安装游戏的进程中。

接下来Include两个文件:extension.inc和common,这两个都是正宗的php文件。首先extension.inc里面加入了防止攻击的代码,并且把php文件的扩展名隐藏起来,就是这句$phpEx = “php”。那么'common.'.$phpEx其实就是common.php了。

includeLang('install/install');

这句是load语言文件,includeLang()函数声明在includes/unlocalised.php文件中,这个文件中还有很多的小函数。

function includeLang ($filename, $ext = '.mo') {
 global $xnova_root_path, $lang, $user;
 if ($user['lang'] != '') {
 $SelLanguage = $user['lang'];
 } else {
 $SelLanguage = DEFAULT_LANG;
 }
 include ($xnova_root_path . "language/". $SelLanguage ."/". $filename.$ext);
}

函数的功能是个根据用户的所用的语种 include 相应的代码,XnovaTC3版本里面是支持每个用户使用不同的语言的,我使用的版本无此功能。

继续往下,取得当前要显示的页面内容,就是到了安装步骤几了;然后进入一个大的switch。在这之前有一个这样的语句:

$MainTPL = gettemplate('install/ins_body');

Gettemplate()函数同样声明在includes/unlocalised.php文件中,

function gettemplate ($templatename) {
 global $xnova_root_path;
 $filename = $xnova_root_path . TEMPLATE_DIR . TEMPLATE_NAME . '/' . $templatename . ".tpl";
 return ReadFromFile($filename);
}

函数的功能是取得一个指定文件的内容,这个指定的文件是这样构成的:

$ugamela_root_path . TEMPLATE_DIR . TEMPLATE_NAME . '/' . $templatename . ".tpl";

TEMPLATE_DIR的值是'templates/',TEMPLATE_NAME的值是'OpenGame',那么前面的 gettemplate

('install/ins_body')就是取得templates/OpenGame/install/ins_body.tpl文件中的内容。这样的函数还有几个,大家都要记住,后面会经常用到。

case ‘intro':

一看就应该知道,是说明介绍的页面,不过里面有个我们首次见到的函数parsetemplate(),声明在includes/unlocalised.php文件中,

function parsetemplate ($template, $array) {
return preg_replace('#\{([a-z0-9\-_]*?)\}#Ssie', '( ( isset($array[\'\1\']) ) ? $array[\'\1\'] : \'\' );', $template);
}

函数的功能是利用正则表达式,对$template中的特定字符串(就是由 {} 括起来的内容),用$array的值进行替换,来实现多语言功能。

case ‘ins':

这个分枝是具体安装过程,分成4个步骤页面,由$page变量控制显示哪一个页面。

1. 当$page值为1时,先进行一些错误判断;如果没有错误,就读取 templates/install/ins_form.tpl模板,parse出并构成有服务器地址、数据库名、表名前缀、用户名和密码的页面。安装者输入数据后,点击install进入下一步的流程。

2. 当$page值为2时,取得第一步输入的数据,并尝试连接数据库;如果连接不上数据库则提示错误;连上数据库则继续后续的过程,包括:在config.php文件中写入数据库连接信息;根据includes/databaseinfos.php文件内容创建表结构。

3. 当$page值为3时,判断上一步是否发生错误,没有发生则显示一些信息并parse出创建管理员帐号的表单,进入下一个流程。

4. 当$page值为4时,取得上一步输入的数据,有帐号、密码、email等;一些判断之后创建这个管理员帐号,创建的过程以后注册的时候再详细说明。

至此,安装主要过程就结束了,主要步骤就是这些,代码也不难理解。最后还有一个函数要讲解下,就是display(),声明在includes/function.php文件中,

function display ($page, $title = '', $topnav = true, $metatags = '', $AdminPage = false) {
global $link, $game_config, $debug, $user, $planetrow;
if (!$AdminPage) {
$DisplayPage = StdUserHeader ($title, $metatags);
} else {
$DisplayPage = AdminUserHeader ($title, $metatags);
}
if ($topnav) {
$DisplayPage .= ShowTopNavigationBar( $user, $planetrow );
}
$DisplayPage .= "<center>\n". $page ."\n</center>\n";
// Affichage du Debug si necessaire
if ($user['authlevel'] == 1 || $user['authlevel'] == 3) {
if ($game_config['debug'] == 1) $debug->echo_log();
}
$DisplayPage .= StdFooter();
if (isset($link)) {
@mysql_close($link);
}
echo $DisplayPage;
die();
}

函数的功能是显示普通用户页眉和管理员页眉的区分,是否显示顶部的信息栏等,此函数中还调用了其他函数,如:StdUserHeader()、AdminUserHeader()、ShowTopNavigationBar()和 StdFooter()都不复杂,其实现都是前面介绍过的 parsetempalte()和gettemplate(),这里就不详细说明了。

PHP 相关文章推荐
ThinkPHP中实例Model方法的区别说明
Aug 21 PHP
php中rename函数用法分析
Nov 15 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
Mar 24 PHP
PHP网络操作函数汇总
May 18 PHP
php操作memcache缓存方法分享
Jun 03 PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 PHP
php实现登录tplink WR882N获取IP和重启的方法
Jul 20 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
yii2多图上传组件的使用教程
May 10 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
May 09 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
Aug 06 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
Jun 23 #PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 #PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 #PHP
ThinkPHP实现事务回滚示例代码
Jun 23 #PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
Jun 23 #PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
Jun 23 #PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 #PHP
You might like
PHP开发过程中常用函数收藏
2009/12/14 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
PHP模板引擎Smarty自定义变量调解器用法
2016/04/11 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
微信小程序服务器日期格式化问题
2020/01/07 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
pycharm 使用心得(四)显示行号
2014/06/05 Python
Python中super的用法实例
2015/05/28 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
用python实现的线程池实例代码
2018/01/06 Python
python3.6数独问题的解决
2019/01/21 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
python如何实现单链表的反转
2020/02/10 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
Python如何使用input函数获取输入
2020/08/06 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
物业经理求职自我评价
2013/09/22 职场文书
事业单位请假制度
2014/01/13 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
初中学习计划书范文
2014/09/15 职场文书
政协会议宣传标语
2014/10/09 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
司机岗位职责范本
2015/04/10 职场文书
公司处罚决定书
2015/06/24 职场文书
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL
python中使用redis用法详解
2022/12/24 Redis