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 相关文章推荐
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
Mar 10 PHP
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 PHP
PHP统计二维数组元素个数的方法
Nov 12 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
php实现网页缓存的工具类分享
Jul 14 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
Aug 04 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
php使用curl下载指定大小的文件实例代码
Sep 30 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 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仿discuz分页效果代码
2008/10/02 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
php设计模式 Composite (组合模式)
2011/06/26 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
Python中的迭代器漫谈
2015/02/03 Python
详解Python迭代和迭代器
2016/03/28 Python
python遍历序列enumerate函数浅析
2017/10/17 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
linux面试题参考答案(9)
2015/01/07 面试题
业务代表的岗位职责
2013/11/16 职场文书
结婚喜宴家长答谢词
2014/01/15 职场文书
古诗之感恩老师
2019/10/24 职场文书