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 相关文章推荐
做个自己站内搜索引擎
Oct 09 PHP
php循环检测目录是否存在并创建(循环创建目录)
Jan 06 PHP
php超快高效率统计大文件行数
Jul 05 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
php json转换相关知识(小结)
Dec 21 PHP
YII框架模块化处理操作示例
Apr 26 PHP
php集成开发环境详解
Sep 24 PHP
php 策略模式原理与应用深入理解
Sep 25 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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
PHP4之COOKIE支持详解
2006/10/09 PHP
PHP读取目录下所有文件的代码
2008/01/07 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
JavaScript之IE的fireEvent方法详细解析
2013/11/20 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
2018/06/14 Javascript
React key值的作用和使用详解
2018/08/23 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
python pdb调试方法分享
2014/01/21 Python
python获取网页状态码示例
2014/03/30 Python
改进Django中的表单的简单方法
2015/07/17 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
车间组长岗位职责
2013/12/20 职场文书
倡议书范文
2014/04/16 职场文书
大学毕业生推荐信
2014/07/09 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书