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实时显示输出
Oct 02 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
Aug 07 PHP
破解.net程序(dll文件)编译和反编译方法
Jan 31 PHP
深入for,while,foreach遍历时间比较的详解
Jun 08 PHP
php中hashtable实现示例分享
Feb 13 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
PHP速成大法
Jan 30 PHP
php接口数据加密、解密、验证签名
Mar 12 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
Dec 28 PHP
PHP编程求最大公约数与最小公倍数的方法示例
May 29 PHP
PHP数据分析引擎计算余弦相似度算法示例
Aug 08 PHP
PHP实现页面静态化深入讲解
Mar 04 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+redis实现的悲观锁机制示例
2018/06/12 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
jquery选择器(常用选择器说明)
2010/09/28 Javascript
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
python写的一个文本编辑器
2014/01/23 Python
Python魔术方法详解
2015/02/14 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
建筑安全员岗位职责
2014/03/13 职场文书
五好关工委申报材料
2014/05/31 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
离婚财产分割协议书
2015/08/11 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
2021/12/06 MySQL
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技